7 function makeNAND(net, id)
11 net["${id}_VDD"] = "${id}_pa S";
12 net["${id}_VSS"] = "${id}_nb S";
14 net["${id}_A"] = "${id}_pa G";
15 net["${id}_B"] = "${id}_pb G";
16 net["${id}_Y"] = "${id}_pb D";
19 : node ${id}_pa pmos S 1 D 1 G 1
20 : node ${id}_pb pmos S 1 D 1 G 1
21 : node ${id}_na nmos S 1 D 1 G 1
22 : node ${id}_nb nmos S 1 D 1 G 1
23 : connect ${id}_pa S ${id}_pb S
24 : connect ${id}_pa D ${id}_pb D
25 : connect ${id}_pa D ${id}_na D
26 : connect ${id}_na S ${id}_nb D
27 : connect ${id}_pa G ${id}_na G
28 : connect ${id}_pb G ${id}_nb G
32 function makeNOR(net, id)
36 net["${id}_VDD"] = "${id}_pa S";
37 net["${id}_VSS"] = "${id}_nb S";
39 net["${id}_A"] = "${id}_pa G";
40 net["${id}_B"] = "${id}_pb G";
41 net["${id}_Y"] = "${id}_pb D";
44 : node ${id}_pa pmos S 1 D 1 G 1
45 : node ${id}_pb pmos S 1 D 1 G 1
46 : node ${id}_na nmos S 1 D 1 G 1
47 : node ${id}_nb nmos S 1 D 1 G 1
48 : connect ${id}_pa D ${id}_pb S
49 : connect ${id}_pb D ${id}_na D
50 : connect ${id}_pb D ${id}_nb D
51 : connect ${id}_na S ${id}_nb S
52 : connect ${id}_pa G ${id}_na G
53 : connect ${id}_pb G ${id}_nb G
57 function makeGraph(seed, gates, primaryInputs, primaryOutputs)
62 var net, vdd, vss, outputs;
64 for (var i = 0; i < gates; i++)
66 var id = fmt("G%d", idx++);
68 code ~= makeNAND(net, id);
70 code ~= makeNOR(net, id);
73 vdd = net["${id}_VDD"];
74 vss = net["${id}_VSS"];
77 : connect $vdd ${net["${id}_VDD"]}
78 : connect $vss ${net["${id}_VSS"]}
82 var inIdx1 = rand((elementsof outputs) + 1);
83 if (inIdx1 < elementsof outputs) {
84 code ~= " connect ${outputs[inIdx1]} ${net["${id}_A"]}\n";
85 delete unusedOutpus[outputs[inIdx1]];
87 push primaryInputs, net["${id}_A"];
89 var inIdx2 = rand((elementsof outputs) + 1);
90 if (inIdx2 < elementsof outputs) {
91 code ~= " connect ${outputs[inIdx2]} ${net["${id}_B"]}\n";
92 delete unusedOutpus[outputs[inIdx2]];
94 push primaryInputs, net["${id}_B"];
96 unusedOutpus[net["${id}_Y"]] = 1;
97 push outputs, net["${id}_Y"];
100 foreach netDecl (unusedOutpus)
101 push primaryOutputs, netDecl;
106 function makeConnections(fromNets, toNets)
109 foreach[] toNet (toNets) {
110 var fromNet = fromNets[rand(elementsof fromNets)];
111 code != " connect $fromNet $toNet\n";
120 <?spl var net = []; ?>
121 ${makeNAND(net, "nand")}
122 : extern ${net["nand_VDD"]}
123 : extern ${net["nand_VSS"]}
124 : extern ${net["nand_A"]}
125 : extern ${net["nand_B"]}
126 : extern ${net["nand_Y"]}
130 ${makeNOR(net, "nor")}
131 : extern ${net["nor_VDD"]}
132 : extern ${net["nor_VSS"]}
133 : extern ${net["nor_A"]}
134 : extern ${net["nor_B"]}
135 : extern ${net["nor_Y"]}
140 ${makeGraph(1, 100, ports, ports)}
141 <?spl numNodes["needle_1"] = idx*4; ?>
142 <spl:foreach var="[]net" list="ports">
149 ${makeGraph(2, 200, ports, ports)}
150 <?spl numNodes["needle_2"] = idx*4; ?>
151 <spl:foreach var="[]net" list="ports">
158 ${makeGraph(3, 300, ports, ports)}
159 <?spl numNodes["needle_3"] = idx*4; ?>
160 <spl:foreach var="[]net" list="ports">
167 <?spl count_nand=0; count_nor=0; ?>
169 <?spl var inPorts1, outPorts1; ?>
170 ${makeGraph(1, 100, inPorts1, outPorts1)}
172 <?spl var inPorts2, outPorts2; ?>
173 ${makeGraph(2, 200, inPorts2, outPorts2)}
175 <?spl var inPorts3, outPorts3; ?>
176 ${makeGraph(3, 300, inPorts3, outPorts3)}
178 <?spl var inPorts4, outPorts4; ?>
179 ${makeGraph(2, 200, inPorts4, outPorts4)}
181 <?spl var inPorts5, outPorts5; ?>
182 ${makeGraph(1, 100, inPorts5, outPorts5)}
183 <?spl numNodes["haystack"] = idx*4; ?>
185 ${makeConnections(outPorts1, inPorts2)}
186 ${makeConnections(outPorts2, inPorts3)}
187 ${makeConnections(outPorts3, inPorts4)}
188 ${makeConnections(outPorts4, inPorts5)}
192 : solve nand haystack false
196 : solve nor haystack false
200 : solve needle_1 haystack false
203 : solve needle_2 haystack false
206 : solve needle_3 haystack false
210 numNodes["haystack"] -= numNodes["needle_3"];
211 numNodes["needle_3"] -= numNodes["needle_2"];
212 numNodes["needle_2"] -= numNodes["needle_1"];
216 : # Needle_1: ${numNodes["needle_1"]} transistors
217 : # Needle_2: ${numNodes["needle_2"]} transistors
218 : # Needle_3: ${numNodes["needle_3"]} transistors
219 : # Haystack: ${numNodes["haystack"]} transistors