mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 19:52:31 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			134 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #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;
 | |
| }
 | |
| 
 |