/* * Copyright (c) 2006-2007, XenSource Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef XEN_ON_NORMAL_EXIT_H #define XEN_ON_NORMAL_EXIT_H #include enum xen_on_normal_exit { /** * destroy the VM state */ XEN_ON_NORMAL_EXIT_DESTROY, /** * restart the VM */ XEN_ON_NORMAL_EXIT_RESTART }; typedef struct xen_on_normal_exit_set { size_t size; enum xen_on_normal_exit contents[]; } xen_on_normal_exit_set; /** * Allocate a xen_on_normal_exit_set of the given size. */ extern xen_on_normal_exit_set * xen_on_normal_exit_set_alloc(size_t size); /** * Free the given xen_on_normal_exit_set. The given set must have been * allocated by this library. */ extern void xen_on_normal_exit_set_free(xen_on_normal_exit_set *set); /** * Return the name corresponding to the given code. This string must * not be modified or freed. */ extern const char * xen_on_normal_exit_to_string(enum xen_on_normal_exit val); /** * Return the correct code for the given string, or set the session * object to failure and return an undefined value if the given string does * not match a known code. */ extern enum xen_on_normal_exit xen_on_normal_exit_from_string(xen_session *session, const char *str); #endif ' value='d018e026142b9903a6f51b0a76ab109e86c4c59b'/>
path: root/libs/subcircuit/demo.cc
blob: 149dc6aa0e60b67723b2d60fba068abcb1601e58 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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;
}