diff options
author | Clifford Wolf <clifford@clifford.at> | 2013-03-03 20:33:55 +0100 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2013-03-03 20:33:55 +0100 |
commit | 40646d3516c27210fed90666e448c0915690e3a1 (patch) | |
tree | 8046f9e9a5c58bb3cfab72a4fae39ae104c10e3e /libs | |
parent | b9b990ca2cc3e9545d08abc8ea80593ab4002ec3 (diff) | |
download | yosys-40646d3516c27210fed90666e448c0915690e3a1.tar.gz yosys-40646d3516c27210fed90666e448c0915690e3a1.tar.bz2 yosys-40646d3516c27210fed90666e448c0915690e3a1.zip |
Fixed subcircuit allowOverlap=false corner case
Diffstat (limited to 'libs')
-rw-r--r-- | libs/subcircuit/subcircuit.cc | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/libs/subcircuit/subcircuit.cc b/libs/subcircuit/subcircuit.cc index 0138d5a0f..73152c3b8 100644 --- a/libs/subcircuit/subcircuit.cc +++ b/libs/subcircuit/subcircuit.cc @@ -844,7 +844,7 @@ class SubCircuit::SolverWorker return true; } - bool pruneEnumerationMatrix(std::vector<std::set<int>> &enumerationMatrix, const GraphData &needle, const GraphData &haystack, int &nextRow) + bool pruneEnumerationMatrix(std::vector<std::set<int>> &enumerationMatrix, const GraphData &needle, const GraphData &haystack, int &nextRow, bool allowOverlap) { bool didSomething = true; while (didSomething) @@ -854,10 +854,12 @@ class SubCircuit::SolverWorker for (int i = 0; i < int(enumerationMatrix.size()); i++) { std::set<int> newRow; for (int j : enumerationMatrix[i]) { - if (checkEnumerationMatrix(enumerationMatrix, i, j, needle, haystack)) - newRow.insert(j); - else + if (!checkEnumerationMatrix(enumerationMatrix, i, j, needle, haystack)) + didSomething = true; + else if (!allowOverlap && haystack.usedNodes[j]) didSomething = true; + else + newRow.insert(j); } if (newRow.size() == 0) return false; @@ -1028,7 +1030,7 @@ class SubCircuit::SolverWorker void ullmannRecursion(std::vector<Solver::Result> &results, std::vector<std::set<int>> &enumerationMatrix, int iter, const GraphData &needle, GraphData &haystack, bool allowOverlap, int limitResults) { int i = -1; - if (!pruneEnumerationMatrix(enumerationMatrix, needle, haystack, i)) + if (!pruneEnumerationMatrix(enumerationMatrix, needle, haystack, i, allowOverlap)) return; if (i < 0) |