summaryrefslogtreecommitdiff
path: root/libs/subcircuit/demo.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/subcircuit/demo.cc')
-rw-r--r--libs/subcircuit/demo.cc134
1 files changed, 134 insertions, 0 deletions
diff --git a/libs/subcircuit/demo.cc b/libs/subcircuit/demo.cc
new file mode 100644
index 00000000..149dc6aa
--- /dev/null
+++ b/libs/subcircuit/demo.cc
@@ -0,0 +1,134 @@
+#include "subcircuit.h"
+#include <stdio.h>
+
+#define VERBOSE
+
+int main()
+{
+ SubCircuit::Graph needle, haystack;
+
+ // create needle graph
+
+ needle.createNode("mul_1", "product");
+ needle.createPort("mul_1", "A", 4);
+ needle.createPort("mul_1", "B", 4);
+ needle.createPort("mul_1", "Y", 4);
+ needle.markExtern("mul_1", "A");
+ needle.markExtern("mul_1", "B");
+
+ needle.createNode("mul_2", "product");
+ needle.createPort("mul_2", "A", 4);
+ needle.createPort("mul_2", "B", 4);
+ needle.createPort("mul_2", "Y", 4);
+ needle.markExtern("mul_2", "A");
+ needle.markExtern("mul_2", "B");
+
+ needle.createNode("add_1", "sum");
+ needle.createPort("add_1", "A", 4);
+ needle.createPort("add_1", "B", 4);
+ needle.createPort("add_1", "Y", 4);
+ needle.markExtern("add_1", "Y");
+
+ needle.createConnection("mul_1", "Y", "add_1", "A");
+ needle.createConnection("mul_2", "Y", "add_1", "B");
+
+#ifdef VERBOSE
+ printf("\n");
+ needle.print();
+#endif
+
+ // create haystack graph
+
+#if 0
+ for (int i = 0; i < 4; i++) {
+ char id[100];
+ snprintf(id, 100, "mul_%d", i);
+ haystack.createNode(id, "mul");
+ haystack.createPort(id, "A", 4);
+ haystack.createPort(id, "B", 4);
+ haystack.createPort(id, "Y", 4);
+ haystack.markExtern(id, "A");
+ haystack.markExtern(id, "B");
+ }
+
+ for (int i = 0; i < 3; i++) {
+ char id[100];
+ snprintf(id, 100, "add_%d", i);
+ haystack.createNode(id, "add");
+ haystack.createPort(id, "A", 4);
+ haystack.createPort(id, "B", 4);
+ haystack.createPort(id, "Y", 4);
+ }
+
+ haystack.createConnection("mul_0", "Y", "add_0", "A");
+ haystack.createConnection("mul_1", "Y", "add_0", "B");
+
+ haystack.createConnection("mul_2", "Y", "add_1", "A");
+ haystack.createConnection("mul_3", "Y", "add_1", "B");
+
+ haystack.createConnection("add_0", "Y", "add_2", "A");
+ haystack.createConnection("add_1", "Y", "add_2", "B");
+ haystack.markExtern("add_2", "Y");
+#else
+ std::vector<std::string> cellIds;
+ srand48(12345);
+
+ for (int i = 0; i < 45; i++) {
+ char id[100];
+ snprintf(id, 100, "cell_%02d", i);
+ haystack.createNode(id, i < 30 ? "mul" : "add");
+ haystack.createPort(id, "A", 4);
+ haystack.createPort(id, "B", 4);
+ haystack.createPort(id, "Y", 4);
+ cellIds.push_back(id);
+ }
+
+ for (int i = 0; i < int(cellIds.size()); i++) {
+ if (lrand48() % (i < 20 ? 3 : 2) != 0)
+ continue;
+ const std::string &id = cellIds[i];
+ const std::string &id_left = cellIds[lrand48() % cellIds.size()];
+ const std::string &id_right = cellIds[lrand48() % cellIds.size()];
+ haystack.createConnection(id_left, "Y", id, "A");
+ haystack.createConnection(id_right, "Y", id, "B");
+ }
+#endif
+
+#ifdef VERBOSE
+ printf("\n");
+ haystack.print();
+#endif
+
+ // search needle in haystack
+
+ SubCircuit::Solver solver;
+ std::vector<SubCircuit::Solver::Result> results;
+
+#ifdef VERBOSE
+ solver.setVerbose();
+#endif
+
+ solver.addCompatibleTypes("product", "mul");
+ solver.addCompatibleTypes("sum", "add");
+
+ solver.addSwappablePorts("product", "A", "B");
+ solver.addSwappablePorts("sum", "A", "B");
+
+ solver.addGraph("needle", needle);
+ solver.addGraph("haystack", haystack);
+ solver.solve(results, "needle", "haystack");
+
+ for (int i = 0; i < int(results.size()); i++) {
+ printf("\nMatch #%d: (%s in %s)\n", i, results[i].needleGraphId.c_str(), results[i].haystackGraphId.c_str());
+ for (const auto &it : results[i].mappings) {
+ printf(" %s -> %s", it.first.c_str(), it.second.haystackNodeId.c_str());
+ for (const auto &it2 : it.second.portMapping)
+ printf(" %s:%s", it2.first.c_str(), it2.second.c_str());
+ printf("\n");
+ }
+ }
+
+ printf("\n");
+ return 0;
+}
+