| #!/usr/bin/env splrun | |
| // | |
| // Test procedure for matching Gates with shorted inputs, as suggested in | |
| // "SubCircuit Extraction with SubGraph Isomorphism. Zong Ling, Ph. D. IBM | |
| // Almaden Research Center -- EDA Shape Processing zling@us.ibm.com.": | |
| // | |
| // Four NAND gates and a NOR gate. One NAND gate (G1) has no shorted inputs, | |
| // one (G2) has an input shorted to VSS, one (G3) has an input shorted to VDD, | |
| // and one (G4) has both inputs shorted together. Th last gate (G5) is a NOR | |
| // gate. | |
| var net; | |
| function makeNAND(id) | |
| { | |
| net["${id}_VDD"] = "${id}_pa S"; | |
| net["${id}_VSS"] = "${id}_nb S"; | |
| net["${id}_A"] = "${id}_pa G"; | |
| net["${id}_B"] = "${id}_pb G"; | |
| net["${id}_Y"] = "${id}_pb D"; | |
| return <:> | |
| : node ${id}_pa pmos S 1 D 1 G 1 | |
| : node ${id}_pb pmos S 1 D 1 G 1 | |
| : node ${id}_na nmos S 1 D 1 G 1 | |
| : node ${id}_nb nmos S 1 D 1 G 1 | |
| : connect ${id}_pa S ${id}_pb S | |
| : connect ${id}_pa D ${id}_pb D | |
| : connect ${id}_pa D ${id}_na D | |
| : connect ${id}_na S ${id}_nb D | |
| : connect ${id}_pa G ${id}_na G | |
| : connect ${id}_pb G ${id}_nb G | |
| </>; | |
| } | |
| function makeNOR(id) | |
| { | |
| net["${id}_VDD"] = "${id}_pa S"; | |
| net["${id}_VSS"] = "${id}_nb S"; | |
| net["${id}_A"] = "${id}_pa G"; | |
| net["${id}_B"] = "${id}_pb G"; | |
| net["${id}_Y"] = "${id}_pb D"; | |
| return <:> | |
| : node ${id}_pa pmos S 1 D 1 G 1 | |
| : node ${id}_pb pmos S 1 D 1 G 1 | |
| : node ${id}_na nmos S 1 D 1 G 1 | |
| : node ${id}_nb nmos S 1 D 1 G 1 | |
| : connect ${id}_pa D ${id}_pb S | |
| : connect ${id}_pb D ${id}_na D | |
| : connect ${id}_pb D ${id}_nb D | |
| : connect ${id}_na S ${id}_nb S | |
| : connect ${id}_pa G ${id}_na G | |
| : connect ${id}_pb G ${id}_nb G | |
| </>; | |
| } | |
| write(<:> | |
| : graph nand | |
| : ${ makeNAND("G0") } | |
| : extern ${net["G0_VDD"]} | |
| : extern ${net["G0_VSS"]} | |
| : extern ${net["G0_A"]} | |
| : extern ${net["G0_B"]} | |
| : extern ${net["G0_Y"]} | |
| : endgraph | |
| : | |
| : graph nor | |
| : ${ makeNOR("G0") } | |
| : extern ${net["G0_VDD"]} | |
| : extern ${net["G0_VSS"]} | |
| : extern ${net["G0_A"]} | |
| : extern ${net["G0_B"]} | |
| : extern ${net["G0_Y"]} | |
| : endgraph | |
| : | |
| : graph haystack | |
| : ${ makeNAND("G1") } | |
| : ${ makeNAND("G2") } | |
| : ${ makeNAND("G3") } | |
| : ${ makeNAND("G4") } | |
| ${ makeNOR("G5") } | |
| : | |
| : node vdd vsupply V 1 | |
| : connect vdd V ${net["G1_VDD"]} | |
| : connect vdd V ${net["G2_VDD"]} | |
| : connect vdd V ${net["G3_VDD"]} | |
| : connect vdd V ${net["G4_VDD"]} | |
| : connect vdd V ${net["G5_VDD"]} | |
| : | |
| : node vss vsupply V 1 | |
| : connect vss V ${net["G1_VSS"]} | |
| : connect vss V ${net["G2_VSS"]} | |
| : connect vss V ${net["G3_VSS"]} | |
| : connect vss V ${net["G4_VSS"]} | |
| : connect vss V ${net["G5_VSS"]} | |
| : | |
| : connect ${net["G2_A"]} ${net["G1_A"]} | |
| : connect ${net["G2_B"]} ${net["G2_VSS"]} | |
| : | |
| : connect ${net["G3_A"]} ${net["G1_VDD"]} | |
| : connect ${net["G3_B"]} ${net["G2_Y"]} | |
| : | |
| : connect ${net["G4_A"]} ${net["G1_Y"]} | |
| : connect ${net["G4_B"]} ${net["G1_Y"]} | |
| : | |
| : connect ${net["G5_A"]} ${net["G3_Y"]} | |
| : connect ${net["G5_B"]} ${net["G4_Y"]} | |
| : endgraph | |
| : | |
| : solve nand haystack false | |
| : clearoverlap | |
| : expect 4 | |
| : | |
| : solve nor haystack false | |
| : clearoverlap | |
| : expect 1 | |
| </>); | |