#!/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
</>);

