From bc8d94b4aeb43fd7cc6b77725bb379650a0575a3 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Sun, 3 Mar 2013 21:19:55 +0100 Subject: [PATCH] Added "shared nodes" feature to the subcircuit library --- libs/subcircuit/README | 4 +++- libs/subcircuit/subcircuit.cc | 6 ++++-- libs/subcircuit/subcircuit.h | 5 +++-- passes/extract/extract.cc | 8 ++++---- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/libs/subcircuit/README b/libs/subcircuit/README index f304d2a53..757a9f540 100644 --- a/libs/subcircuit/README +++ b/libs/subcircuit/README @@ -266,7 +266,9 @@ After this code has been executed, the results vector contains all non-overlapping matches of the three macrocells. The method clearOverlapHistory() can be used to reset the internal state used for this feature. The default value for the third argument to solve() -is true (allow overlapping). +is true (allow overlapping). The optional boolean fourth argument to the +Graph::createNode() method can be used to mark a node as shareable even +in non-overlapping solver mode. The solve() method also has a fourth optional integer argument. If it is set to a positive integer, this integer specifies the maximum number of solutions to diff --git a/libs/subcircuit/subcircuit.cc b/libs/subcircuit/subcircuit.cc index 73152c3b8..f05aeaa28 100644 --- a/libs/subcircuit/subcircuit.cc +++ b/libs/subcircuit/subcircuit.cc @@ -100,7 +100,7 @@ bool SubCircuit::Graph::BitRef::operator < (const BitRef &other) const return bitIdx < other.bitIdx; } -void SubCircuit::Graph::createNode(std::string nodeId, std::string typeId, void *userData) +void SubCircuit::Graph::createNode(std::string nodeId, std::string typeId, void *userData, bool shared) { assert(nodeMap.count(nodeId) == 0); nodeMap[nodeId] = nodes.size(); @@ -110,6 +110,7 @@ void SubCircuit::Graph::createNode(std::string nodeId, std::string typeId, void newNode.nodeId = nodeId; newNode.typeId = typeId; newNode.userData = userData; + newNode.shared = shared; } void SubCircuit::Graph::createPort(std::string nodeId, std::string portId, int width, int minWidth) @@ -1074,7 +1075,8 @@ class SubCircuit::SolverWorker } for (int j = 0; j < int(enumerationMatrix.size()); j++) - haystack.usedNodes[*enumerationMatrix[j].begin()] = true; + if (!haystack.graph.nodes[*enumerationMatrix[j].begin()].shared) + haystack.usedNodes[*enumerationMatrix[j].begin()] = true; if (verbose) { my_printf("\nSolution:\n"); diff --git a/libs/subcircuit/subcircuit.h b/libs/subcircuit/subcircuit.h index b9399a99d..80eafbc36 100644 --- a/libs/subcircuit/subcircuit.h +++ b/libs/subcircuit/subcircuit.h @@ -63,7 +63,8 @@ namespace SubCircuit std::map portMap; std::vector ports; void *userData; - Node() : userData(NULL) { }; + bool shared; + Node() : userData(NULL), shared(false) { }; }; bool allExtern; @@ -75,7 +76,7 @@ namespace SubCircuit Graph() : allExtern(false) { }; Graph(const Graph &other, const std::vector &otherNodes); - void createNode(std::string nodeId, std::string typeId, void *userData = NULL); + void createNode(std::string nodeId, std::string typeId, void *userData = NULL, bool shared = false); void createPort(std::string nodeId, std::string portId, int width = 1, int minWidth = -1); void createConnection(std::string fromNodeId, std::string fromPortId, int fromBit, std::string toNodeId, std::string toPortId, int toBit, int width = 1); void createConnection(std::string fromNodeId, std::string fromPortId, std::string toNodeId, std::string toPortId); diff --git a/passes/extract/extract.cc b/passes/extract/extract.cc index 5c40e3adf..19a5b4c80 100644 --- a/passes/extract/extract.cc +++ b/passes/extract/extract.cc @@ -52,10 +52,10 @@ namespace } if (constports) { - graph.createNode("$const$0", "$const$0"); - graph.createNode("$const$1", "$const$1"); - graph.createNode("$const$x", "$const$x"); - graph.createNode("$const$z", "$const$z"); + graph.createNode("$const$0", "$const$0", NULL, true); + graph.createNode("$const$1", "$const$1", NULL, true); + graph.createNode("$const$x", "$const$x", NULL, true); + graph.createNode("$const$z", "$const$z", NULL, true); graph.createPort("$const$0", "\\Y", 1); graph.createPort("$const$1", "\\Y", 1); graph.createPort("$const$x", "\\Y", 1); -- 2.30.2