mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	s/((Claire|Xen|Xenia|Clifford)\s+)+(Wolf|Xen)\s+<(claire|clifford)@(symbioticeda.com|clifford.at|yosyshq.com)>/Claire Xenia Wolf <claire@yosyshq.com>/gi; s/((Nina|Nak|N\.)\s+)+Engelhardt\s+<nak@(symbioticeda.com|yosyshq.com)>/N. Engelhardt <nak@yosyshq.com>/gi; s/((David)\s+)+Shah\s+<(dave|david)@(symbioticeda.com|yosyshq.com|ds0.me)>/David Shah <dave@ds0.me>/gi; s/((Miodrag)\s+)+Milanovic\s+<(miodrag|micko)@(symbioticeda.com|yosyshq.com)>/Miodrag Milanovic <micko@yosyshq.com>/gi; s,https?://www.clifford.at/yosys/,http://yosyshq.net/yosys/,g;
		
			
				
	
	
		
			155 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  *  SubCircuit -- An implementation of the Ullmann Subgraph Isomorphism
 | |
|  *                algorithm for coarse grain logic networks
 | |
|  *
 | |
|  *  Copyright (C) 2013  Claire Xenia Wolf <claire@yosyshq.com>
 | |
|  *
 | |
|  *  Permission to use, copy, modify, and/or distribute this software for any
 | |
|  *  purpose with or without fee is hereby granted, provided that the above
 | |
|  *  copyright notice and this permission notice appear in all copies.
 | |
|  *
 | |
|  *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 | |
|  *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 | |
|  *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 | |
|  *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 | |
|  *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 | |
|  *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 | |
|  *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #ifndef SUBCIRCUIT_H
 | |
| #define SUBCIRCUIT_H
 | |
| 
 | |
| #include <string>
 | |
| #include <vector>
 | |
| #include <set>
 | |
| #include <map>
 | |
| 
 | |
| namespace SubCircuit
 | |
| {
 | |
| 	class SolverWorker;
 | |
| 
 | |
| 	class Graph
 | |
| 	{
 | |
| 	protected:
 | |
| 		struct BitRef {
 | |
| 			int nodeIdx, portIdx, bitIdx;
 | |
| 			BitRef(int nodeIdx = -1, int portIdx = -1, int bitIdx = -1) : nodeIdx(nodeIdx), portIdx(portIdx), bitIdx(bitIdx) { };
 | |
| 			bool operator < (const BitRef &other) const;
 | |
| 		};
 | |
| 
 | |
| 		struct Edge {
 | |
| 			std::set<BitRef> portBits;
 | |
| 			int constValue;
 | |
| 			bool isExtern;
 | |
| 			Edge() : constValue(0), isExtern(false) { };
 | |
| 		};
 | |
| 
 | |
| 		struct PortBit {
 | |
| 			int edgeIdx;
 | |
| 			PortBit() : edgeIdx(-1) { };
 | |
| 		};
 | |
| 
 | |
| 		struct Port {
 | |
| 			std::string portId;
 | |
| 			int minWidth;
 | |
| 			std::vector<PortBit> bits;
 | |
| 			Port() : minWidth(-1) { };
 | |
| 		};
 | |
| 
 | |
| 		struct Node {
 | |
| 			std::string nodeId, typeId;
 | |
| 			std::map<std::string, int> portMap;
 | |
| 			std::vector<Port> ports;
 | |
| 			void *userData;
 | |
| 			bool shared;
 | |
| 			Node() : userData(NULL), shared(false) { };
 | |
| 		};
 | |
| 
 | |
| 		bool allExtern;
 | |
| 		std::map<std::string, int> nodeMap;
 | |
| 		std::vector<Node> nodes;
 | |
| 		std::vector<Edge> edges;
 | |
| 
 | |
| 	public:
 | |
| 		Graph() : allExtern(false) { };
 | |
| 		Graph(const Graph &other, const std::vector<std::string> &otherNodes);
 | |
| 
 | |
| 		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);
 | |
| 		void createConstant(std::string toNodeId, std::string toPortId, int toBit, int constValue);
 | |
| 		void createConstant(std::string toNodeId, std::string toPortId, int constValue);
 | |
| 		void markExtern(std::string nodeId, std::string portId, int bit = -1);
 | |
| 		void markAllExtern();
 | |
| 		void print();
 | |
| 
 | |
| 		friend class SolverWorker;
 | |
| 	};
 | |
| 
 | |
| 	class Solver
 | |
| 	{
 | |
| 	public:
 | |
| 		struct ResultNodeMapping {
 | |
| 			std::string needleNodeId, haystackNodeId;
 | |
| 			void *needleUserData, *haystackUserData;
 | |
| 			std::map<std::string, std::string> portMapping;
 | |
| 		};
 | |
| 		struct Result {
 | |
| 			std::string needleGraphId, haystackGraphId;
 | |
| 			std::map<std::string, ResultNodeMapping> mappings;
 | |
| 		};
 | |
| 
 | |
| 		struct MineResultNode {
 | |
| 			std::string nodeId;
 | |
| 			void *userData;
 | |
| 		};
 | |
| 		struct MineResult {
 | |
| 			std::string graphId;
 | |
| 			int totalMatchesAfterLimits;
 | |
| 			std::map<std::string, int> matchesPerGraph;
 | |
| 			std::vector<MineResultNode> nodes;
 | |
| 		};
 | |
| 
 | |
| 	private:
 | |
| 		SolverWorker *worker;
 | |
| 
 | |
| 	protected:
 | |
| 		virtual bool userCompareNodes(const std::string &needleGraphId, const std::string &needleNodeId, void *needleUserData,
 | |
| 				const std::string &haystackGraphId, const std::string &haystackNodeId, void *haystackUserData, const std::map<std::string, std::string> &portMapping);
 | |
| 
 | |
| 		virtual std::string userAnnotateEdge(const std::string &graphId, const std::string &fromNodeId, void *fromUserData, const std::string &toNodeId, void *toUserData);
 | |
| 
 | |
| 		virtual bool userCompareEdge(const std::string &needleGraphId, const std::string &needleFromNodeId, void *needleFromUserData, const std::string &needleToNodeId, void *needleToUserData,
 | |
| 				const std::string &haystackGraphId, const std::string &haystackFromNodeId, void *haystackFromUserData, const std::string &haystackToNodeId, void *haystackToUserData);
 | |
| 
 | |
| 		virtual bool userCheckSolution(const Result &result);
 | |
| 
 | |
| 		friend class SolverWorker;
 | |
| 
 | |
| 	public:
 | |
| 		Solver();
 | |
| 		virtual ~Solver();
 | |
| 
 | |
| 		void setVerbose();
 | |
| 		void addGraph(std::string graphId, const Graph &graph);
 | |
| 		void addCompatibleTypes(std::string needleTypeId, std::string haystackTypeId);
 | |
| 		void addCompatibleConstants(int needleConstant, int haystackConstant);
 | |
| 		void addSwappablePorts(std::string needleTypeId, std::string portId1, std::string portId2, std::string portId3 = std::string(), std::string portId4 = std::string());
 | |
| 		void addSwappablePorts(std::string needleTypeId, std::set<std::string> ports);
 | |
| 		void addSwappablePortsPermutation(std::string needleTypeId, std::map<std::string, std::string> portMapping);
 | |
| 
 | |
| 		void solve(std::vector<Result> &results, std::string needleGraphId, std::string haystackGraphId, bool allowOverlap = true, int maxSolutions = -1);
 | |
| 		void solve(std::vector<Result> &results, std::string needleGraphId, std::string haystackGraphId,
 | |
| 				const std::map<std::string, std::set<std::string>> &initialMapping, bool allowOverlap = true, int maxSolutions = -1);
 | |
| 
 | |
| 		void mine(std::vector<MineResult> &results, int minNodes, int maxNodes, int minMatches, int limitMatchesPerGraph = -1);
 | |
| 
 | |
| 		void clearOverlapHistory();
 | |
| 		void clearConfig();
 | |
| 	};
 | |
| }
 | |
| 
 | |
| #endif /* SUBCIRCUIT_H */
 |