diff --git a/testdata/lvs/invchain_cheat.cir.1 b/testdata/lvs/invchain_cheat.cir.1 index ebb1e0e31..f4bef3947 100644 --- a/testdata/lvs/invchain_cheat.cir.1 +++ b/testdata/lvs/invchain_cheat.cir.1 @@ -1,30 +1,25 @@ * Extracted by KLayout -.SUBCKT INVCHAIN -X$1 \$7 \$1 \$9 \$8 \$6 \$9 \$5 \$5 \$3 \$2 \$I2 \$I1 INV3 -X$2 \$8 \$11 \$9 \$10 \$8 \$11 \$2 \$I3 \$2 \$I3 \$5 \$4 \$I2 \$I1 INV2 -X$3 \$I1 \$I2 \$11 \$I3 \$4 \$4 \$10 \$10 INV +.SUBCKT INVCHAIN IN OUT VSS VDD +X$1 IN \$2 \$3 \$2 \$3 \$4 VDD VSS INV3 +X$2 \$5 \$6 \$4 \$5 VDD VSS INV2 +X$3 VSS VDD \$6 OUT INV .ENDS INVCHAIN -.SUBCKT INV3 \$I18 \$I17 \$I15 \$I14 \$I13 \$I11 \$I10 \$I8 \$I7 \$I5 \$I4 \$I2 -X$1 \$I2 \$I4 \$I13 \$I17 \$I7 \$I7 \$I18 \$I18 INV -X$2 \$I2 \$I4 \$I18 \$I7 \$I17 \$I17 \$I13 \$I13 INV -X$3 \$I2 \$I4 \$I14 \$I5 \$I8 \$I10 \$I15 \$I11 INV +.SUBCKT INV3 3 5 7 4 6 8 \$I4 \$I2 +X$1 \$I2 \$I4 3 4 INV +X$2 \$I2 \$I4 5 6 INV +X$3 \$I2 \$I4 7 8 INV .ENDS INV3 -.SUBCKT INV2 \$I16 \$I15 \$I14 \$I13 \$I12 \$I11 \$I10 \$I9 \$I8 \$I7 \$I6 \$I5 -+ \$I4 \$I2 -X$1 \$I2 \$I4 \$I14 \$I6 \$I8 \$I10 \$I16 \$I12 INV -X$2 \$I2 \$I4 \$I13 \$I5 \$I7 \$I9 \$I15 \$I11 INV +.SUBCKT INV2 \$I8 \$I7 \$I6 \$I5 \$I4 \$I2 +X$1 \$I2 \$I4 \$I6 \$I8 INV +X$2 \$I2 \$I4 \$I5 \$I7 INV .ENDS INV2 -.SUBCKT INV \$1 \$2 \$3 \$4 \$5 \$9 \$I8 \$I7 -M$1 \$4 \$3 \$2 \$4 PMOS L=0.25U W=0.95U AS=0.79325P AD=0.26125P PS=3.57U -+ PD=1.5U -M$2 \$2 \$I8 \$5 \$2 PMOS L=0.25U W=0.95U AS=0.26125P AD=0.03325P PS=1.5U -+ PD=1.97U -M$3 \$4 \$3 \$1 \$4 NMOS L=0.25U W=0.95U AS=0.79325P AD=0.26125P PS=3.57U -+ PD=1.5U -M$4 \$1 \$I7 \$9 \$1 NMOS L=0.25U W=0.95U AS=0.26125P AD=0.03325P PS=1.5U -+ PD=1.97U +.SUBCKT INV \$1 \$2 \$3 \$4 +M$1 \$4 \$3 \$2 \$4 PMOS L=0.25U W=0.95U AS=0.73625P AD=0.73625P PS=3.45U ++ PD=3.45U +M$2 \$4 \$3 \$1 \$4 NMOS L=0.25U W=0.95U AS=0.73625P AD=0.73625P PS=3.45U ++ PD=3.45U .ENDS INV diff --git a/testdata/lvs/invchain_cheat.cir.2 b/testdata/lvs/invchain_cheat.cir.2 deleted file mode 100644 index 559a90f2a..000000000 --- a/testdata/lvs/invchain_cheat.cir.2 +++ /dev/null @@ -1,30 +0,0 @@ -* Extracted by KLayout - -.SUBCKT INVCHAIN -X$1 \$7 \$1 \$9 \$8 \$6 \$9 \$5 \$5 \$3 \$2 \$I2 \$I1 INV3 -X$2 \$8 \$11 \$9 \$10 \$8 \$11 \$2 \$I3 \$2 \$I3 \$5 \$4 \$I2 \$I1 INV2 -X$3 \$I1 \$I2 \$11 \$I3 \$4 \$4 \$10 \$10 INV -.ENDS INVCHAIN - -.SUBCKT INV3 \$I18 \$I17 \$I15 \$I14 \$I13 \$I11 \$I10 \$I8 \$I7 \$I5 \$I4 \$I2 -X$1 \$I2 \$I4 \$I13 \$I17 \$I7 \$I7 \$I18 \$I18 INV -X$2 \$I2 \$I4 \$I18 \$I7 \$I17 \$I17 \$I13 \$I13 INV -X$3 \$I2 \$I4 \$I14 \$I5 \$I8 \$I10 \$I15 \$I11 INV -.ENDS INV3 - -.SUBCKT INV2 \$I16 \$I15 \$I14 \$I13 \$I12 \$I11 \$I10 \$I9 \$I8 \$I7 \$I6 \$I5 -+ \$I4 \$I2 -X$1 \$I2 \$I4 \$I14 \$I6 \$I8 \$I10 \$I16 \$I12 INV -X$2 \$I2 \$I4 \$I13 \$I5 \$I7 \$I9 \$I15 \$I11 INV -.ENDS INV2 - -.SUBCKT INV \$1 \$2 \$3 \$4 \$5 \$8 \$I8 \$I7 -M$1 \$4 \$3 \$2 \$4 PMOS L=0.25U W=0.95U AS=0.79325P AD=0.26125P PS=3.57U -+ PD=1.5U -M$2 \$2 \$I8 \$5 \$2 PMOS L=0.25U W=0.95U AS=0.26125P AD=0.03325P PS=1.5U -+ PD=1.97U -M$3 \$4 \$3 \$1 \$4 NMOS L=0.25U W=0.95U AS=0.79325P AD=0.26125P PS=3.57U -+ PD=1.5U -M$4 \$1 \$I7 \$8 \$1 NMOS L=0.25U W=0.95U AS=0.26125P AD=0.03325P PS=1.5U -+ PD=1.97U -.ENDS INV diff --git a/testdata/lvs/invchain_cheat.cir.3 b/testdata/lvs/invchain_cheat.cir.3 deleted file mode 100644 index be921871d..000000000 --- a/testdata/lvs/invchain_cheat.cir.3 +++ /dev/null @@ -1,30 +0,0 @@ -* Extracted by KLayout - -.SUBCKT INVCHAIN -X$1 \$7 \$1 \$9 \$8 \$6 \$9 \$5 \$5 \$3 \$2 \$I2 \$I1 INV3 -X$2 \$8 \$11 \$9 \$10 \$8 \$11 \$2 \$I3 \$2 \$I3 \$5 \$4 \$I2 \$I1 INV2 -X$3 \$I1 \$I2 \$11 \$I3 \$4 \$4 \$10 \$10 INV -.ENDS INVCHAIN - -.SUBCKT INV3 \$I18 \$I17 \$I15 \$I14 \$I13 \$I11 \$I10 \$I8 \$I7 \$I5 \$I4 \$I2 -X$1 \$I2 \$I4 \$I13 \$I17 \$I7 \$I7 \$I18 \$I18 INV -X$2 \$I2 \$I4 \$I18 \$I7 \$I17 \$I17 \$I13 \$I13 INV -X$3 \$I2 \$I4 \$I14 \$I5 \$I8 \$I10 \$I15 \$I11 INV -.ENDS INV3 - -.SUBCKT INV2 \$I16 \$I15 \$I14 \$I13 \$I12 \$I11 \$I10 \$I9 \$I8 \$I7 \$I6 \$I5 -+ \$I4 \$I2 -X$1 \$I2 \$I4 \$I14 \$I6 \$I8 \$I10 \$I16 \$I12 INV -X$2 \$I2 \$I4 \$I13 \$I5 \$I7 \$I9 \$I15 \$I11 INV -.ENDS INV2 - -.SUBCKT INV \$1 \$2 \$3 \$4 \$7 \$10 \$I8 \$I7 -M$1 \$4 \$3 \$2 \$4 PMOS L=0.25U W=0.95U AS=0.79325P AD=0.26125P PS=3.57U -+ PD=1.5U -M$2 \$2 \$I8 \$7 \$2 PMOS L=0.25U W=0.95U AS=0.26125P AD=0.03325P PS=1.5U -+ PD=1.97U -M$3 \$4 \$3 \$1 \$4 NMOS L=0.25U W=0.95U AS=0.79325P AD=0.26125P PS=3.57U -+ PD=1.5U -M$4 \$1 \$I7 \$10 \$1 NMOS L=0.25U W=0.95U AS=0.26125P AD=0.03325P PS=1.5U -+ PD=1.97U -.ENDS INV diff --git a/testdata/lvs/invchain_cheat.cir.4 b/testdata/lvs/invchain_cheat.cir.4 deleted file mode 100644 index f6fcce0cb..000000000 --- a/testdata/lvs/invchain_cheat.cir.4 +++ /dev/null @@ -1,30 +0,0 @@ -* Extracted by KLayout - -.SUBCKT INVCHAIN -X$1 \$7 \$1 \$9 \$8 \$6 \$9 \$5 \$5 \$3 \$2 \$I2 \$I1 INV3 -X$2 \$8 \$11 \$9 \$10 \$8 \$11 \$2 \$I3 \$2 \$I3 \$5 \$4 \$I2 \$I1 INV2 -X$3 \$I1 \$I2 \$11 \$I3 \$4 \$4 \$10 \$10 INV -.ENDS INVCHAIN - -.SUBCKT INV3 \$I18 \$I17 \$I15 \$I14 \$I13 \$I11 \$I10 \$I8 \$I7 \$I5 \$I4 \$I2 -X$1 \$I2 \$I4 \$I13 \$I17 \$I7 \$I7 \$I18 \$I18 INV -X$2 \$I2 \$I4 \$I18 \$I7 \$I17 \$I17 \$I13 \$I13 INV -X$3 \$I2 \$I4 \$I14 \$I5 \$I8 \$I10 \$I15 \$I11 INV -.ENDS INV3 - -.SUBCKT INV2 \$I16 \$I15 \$I14 \$I13 \$I12 \$I11 \$I10 \$I9 \$I8 \$I7 \$I6 \$I5 -+ \$I4 \$I2 -X$1 \$I2 \$I4 \$I14 \$I6 \$I8 \$I10 \$I16 \$I12 INV -X$2 \$I2 \$I4 \$I13 \$I5 \$I7 \$I9 \$I15 \$I11 INV -.ENDS INV2 - -.SUBCKT INV \$1 \$2 \$3 \$4 \$6 \$9 \$I8 \$I7 -M$1 \$4 \$3 \$2 \$4 PMOS L=0.25U W=0.95U AS=0.79325P AD=0.26125P PS=3.57U -+ PD=1.5U -M$2 \$2 \$I8 \$6 \$2 PMOS L=0.25U W=0.95U AS=0.26125P AD=0.03325P PS=1.5U -+ PD=1.97U -M$3 \$4 \$3 \$1 \$4 NMOS L=0.25U W=0.95U AS=0.79325P AD=0.26125P PS=3.57U -+ PD=1.5U -M$4 \$1 \$I7 \$9 \$1 NMOS L=0.25U W=0.95U AS=0.26125P AD=0.03325P PS=1.5U -+ PD=1.97U -.ENDS INV diff --git a/testdata/lvs/invchain_cheat.lvs b/testdata/lvs/invchain_cheat.lvs index 34ff10e5c..d0fd20237 100644 --- a/testdata/lvs/invchain_cheat.lvs +++ b/testdata/lvs/invchain_cheat.lvs @@ -6,7 +6,52 @@ report_lvs($lvs_test_target_lvsdb) writer = write_spice(true, false) target_netlist($lvs_test_target_cir, writer, "Extracted by KLayout") -schematic("invchain_for_cheat.cir") +# needs this delegate because we use MOS3 which is not available in Spice +class SpiceReaderDelegate < RBA::NetlistSpiceReaderDelegate + + # says we want to catch these subcircuits as devices + def wants_subcircuit(name) + name == "HVNMOS" || name == "HVPMOS" + end + + # translate the element + def element(circuit, el, name, model, value, nets, params) + + if el != "M" + # all other elements are left to the standard implementation + return super + end + + if nets.size != 4 + error("Device #{model} needs four nodes") + end + + # provide a device class + cls = circuit.netlist.device_class_by_name(model) + if ! cls + cls = RBA::DeviceClassMOS3Transistor::new + cls.name = model + circuit.netlist.add(cls) + end + + # create a device + device = circuit.create_device(cls, name) + + # and configure the device + [ "S", "G", "D" ].each_with_index do |t,index| + device.connect_terminal(t, nets[index]) + end + device.set_parameter("W", params["W"] * 1e6) + device.set_parameter("L", params["L"] * 1e6) + + device + + end + +end + +reader = RBA::NetlistSpiceReader::new(SpiceReaderDelegate::new) +schematic("invchain_for_cheat.cir", reader) deep @@ -15,32 +60,38 @@ deep nwell = input(1, 0) active = input(2, 0) poly = input(3, 0) +poly_lbl = input(3, 1) diff_cont = input(4, 0) poly_cont = input(5, 0) metal1 = input(6, 0) +metal1_lbl = input(6, 1) via1 = input(7, 0) metal2 = input(8, 0) +metal2_lbl = input(8, 1) # Bulk layer for terminal provisioning bulk = polygon_layer -# Computed layers - -active_in_nwell = active & nwell -pactive = active_in_nwell -pgate = pactive & poly -psd = pactive - pgate - -active_outside_nwell = active - nwell -nactive = active_outside_nwell -ngate = nactive & poly -nsd = nactive - ngate - -# Device extraction +psd = nil +nsd = nil cheat("INV") do + # Computed layers + + active_in_nwell = active & nwell + pactive = active_in_nwell + pgate = pactive & poly + psd = pactive - pgate + + active_outside_nwell = active - nwell + nactive = active_outside_nwell + ngate = nactive & poly + nsd = nactive - ngate + + # Device extraction + # PMOS transistor device extraction extract_devices(mos3("PMOS"), { "SD" => psd, "G" => pgate, "tS" => psd, "tD" => psd, "tG" => poly }) @@ -62,12 +113,18 @@ connect(poly_cont, metal1) connect(metal1, via1) connect(via1, metal2) +# attach labels +connect(poly, poly_lbl) +connect(metal1, metal1_lbl) +connect(metal2, metal2_lbl) + # Global connect_global(bulk, "SUBSTRATE") # Compare section netlist.simplify +align compare diff --git a/testdata/lvs/invchain_cheat.lvsdb b/testdata/lvs/invchain_cheat.lvsdb index 7f128c691..5b854ca93 100644 --- a/testdata/lvs/invchain_cheat.lvsdb +++ b/testdata/lvs/invchain_cheat.lvsdb @@ -3,66 +3,50 @@ J( W(INVCHAIN) U(0.001) L(l3 '3/0') + L(l11 '3/1') L(l6 '4/0') - L(l7 '2/0') + L(l7 '5/0') L(l8 '6/0') + L(l12 '6/1') L(l9 '7/0') L(l10 '8/0') - L(l11) + L(l13 '8/1') + L(l14) L(l2) L(l5) - C(l3 l3 l7) + C(l3 l3 l11 l7) + C(l11 l3 l11) C(l6 l6 l8 l2 l5) C(l7 l3 l7 l8) - C(l8 l6 l7 l8 l9) + C(l8 l6 l7 l8 l12 l9) + C(l12 l8 l12) C(l9 l8 l9 l10) - C(l10 l9 l10) - C(l11 l11) + C(l10 l9 l10 l13) + C(l13 l10 l13) + C(l14 l14) C(l2 l6 l2) C(l5 l6 l5) - G(l11 SUBSTRATE) + G(l14 SUBSTRATE) D(D$PMOS PMOS T(S - R(l2 (-960 -475) (835 950)) + R(l2 (-900 -475) (775 950)) ) T(G R(l3 (-125 -475) (250 950)) ) T(D - R(l2 (125 -475) (550 950)) - ) - ) - D(D$PMOS$1 PMOS - T(S - R(l2 (-675 -475) (550 950)) - ) - T(G - R(l3 (-125 -475) (250 950)) - ) - T(D - R(l2 (125 -475) (35 950)) + R(l2 (125 -475) (775 950)) ) ) D(D$NMOS NMOS T(S - R(l5 (-960 -475) (835 950)) + R(l5 (-900 -475) (775 950)) ) T(G R(l3 (-125 -475) (250 950)) ) T(D - R(l5 (125 -475) (550 950)) - ) - ) - D(D$NMOS$1 NMOS - T(S - R(l5 (-675 -475) (550 950)) - ) - T(G - R(l3 (-125 -475) (250 950)) - ) - T(D - R(l5 (125 -475) (35 950)) + R(l5 (125 -475) (775 950)) ) ) X(INV @@ -74,7 +58,7 @@ J( R(l9 (-305 -705) (250 250)) R(l9 (-250 150) (250 250)) R(l10 (-2025 -775) (3000 900)) - R(l5 (-1375 -925) (550 950)) + R(l5 (-1375 -925) (775 950)) ) N(2 R(l6 (290 2490) (220 220)) @@ -83,7 +67,7 @@ J( R(l9 (-305 -705) (250 250)) R(l9 (-250 150) (250 250)) R(l10 (-2025 -775) (3000 900)) - R(l2 (-1375 -925) (550 950)) + R(l2 (-1375 -925) (775 950)) ) N(3 R(l3 (-125 -250) (250 2500)) @@ -98,99 +82,55 @@ J( R(l8 (-290 -3530) (360 2840)) R(l8 (-360 -2800) (360 760)) R(l8 (-360 2040) (360 760)) - R(l2 (-740 -855) (835 950)) - R(l5 (-835 -3750) (835 950)) + R(l2 (-680 -855) (775 950)) + R(l5 (-775 -3750) (775 950)) ) - N(5 - R(l2 (925 2325) (35 950)) - ) - N(6 - R(l5 (925 -475) (35 950)) - ) - N(7) - N(8) P(1) P(2) P(3) P(4) - P(5) - P(6) - P(7) - P(8) D(1 D$PMOS Y(0 2800) E(L 0.25) E(W 0.95) - E(AS 0.79325) - E(AD 0.26125) - E(PS 3.57) - E(PD 1.5) + E(AS 0.73625) + E(AD 0.73625) + E(PS 3.45) + E(PD 3.45) T(S 4) T(G 3) T(D 2) ) - D(2 D$PMOS$1 - Y(800 2800) - E(L 0.25) - E(W 0.95) - E(AS 0.26125) - E(AD 0.03325) - E(PS 1.5) - E(PD 1.97) - T(S 2) - T(G 7) - T(D 5) - ) - D(3 D$NMOS + D(2 D$NMOS Y(0 0) E(L 0.25) E(W 0.95) - E(AS 0.79325) - E(AD 0.26125) - E(PS 3.57) - E(PD 1.5) + E(AS 0.73625) + E(AD 0.73625) + E(PS 3.45) + E(PD 3.45) T(S 4) T(G 3) T(D 1) ) - D(4 D$NMOS$1 - Y(800 0) - E(L 0.25) - E(W 0.95) - E(AS 0.26125) - E(AD 0.03325) - E(PS 1.5) - E(PD 1.97) - T(S 1) - T(G 8) - T(D 6) - ) ) X(INV2 R((0 0) (5500 4600)) - N(1) - N(2) - N(3) - N(4) - N(5) - N(6) - N(7) - N(8) - N(9) - N(10) - N(11 + N(1 R(l6 (1790 490) (220 220)) R(l6 (-220 180) (220 220)) R(l6 (-220 2180) (220 220)) R(l6 (-220 180) (220 220)) ) - N(12 + N(2 R(l6 (3490 490) (220 220)) R(l6 (-220 180) (220 220)) R(l6 (-220 2180) (220 220)) R(l6 (-220 180) (220 220)) ) - N(13 + N(3) + N(4) + N(5 R(l6 (990 3290) (220 220)) R(l6 (-220 180) (220 220)) R(l6 (3080 -620) (220 220)) @@ -198,7 +138,7 @@ J( R(l8 (-3590 -690) (360 760)) R(l8 (2940 -760) (360 760)) ) - N(14 + N(6 R(l6 (990 490) (220 220)) R(l6 (-220 180) (220 220)) R(l6 (3080 -620) (220 220)) @@ -212,63 +152,52 @@ J( P(4) P(5) P(6) - P(7) - P(8) - P(9) - P(10) - P(11) - P(12) - P(13) - P(14) X(1 INV M O(180) Y(1500 800) - P(0 14) - P(1 13) + P(0 6) + P(1 5) P(2 3) - P(3 11) - P(4 9) - P(5 7) - P(6 1) - P(7 5) + P(3 1) ) X(2 INV Y(4000 800) - P(0 14) - P(1 13) + P(0 6) + P(1 5) P(2 4) - P(3 12) - P(4 10) - P(5 8) - P(6 2) - P(7 6) + P(3 2) ) ) X(INV3 R((0 0) (6300 4600)) - N(1) - N(2 + N(1 I('3') + R(l11 (1509 1929) (2 2)) + ) + N(2 I('5') + R(l11 (2319 1909) (2 2)) + ) + N(3 I('7') + R(l11 (4829 1889) (2 2)) + ) + N(4 I('4') R(l6 (990 490) (220 220)) R(l6 (-220 180) (220 220)) R(l6 (-220 2180) (220 220)) R(l6 (-220 180) (220 220)) + R(l12 (-121 -1941) (2 2)) ) - N(3) - N(4) - N(5) - N(6) - N(7) - N(8) - N(9 + N(5 I('6') R(l6 (2590 490) (220 220)) R(l6 (-220 180) (220 220)) R(l6 (-220 2180) (220 220)) R(l6 (-220 180) (220 220)) + R(l12 (-131 -1971) (2 2)) ) - N(10 + N(6 I('8') R(l6 (4290 490) (220 220)) R(l6 (-220 180) (220 220)) R(l6 (-220 2180) (220 220)) R(l6 (-220 180) (220 220)) + R(l12 (-101 -1991) (2 2)) ) - N(11 + N(7 R(l6 (1790 3290) (220 220)) R(l6 (-220 180) (220 220)) R(l6 (-220 -620) (220 220)) @@ -279,7 +208,7 @@ J( R(l8 (-360 -760) (360 760)) R(l8 (2940 -760) (360 760)) ) - N(12 + N(8 R(l6 (1790 490) (220 220)) R(l6 (-220 180) (220 220)) R(l6 (-220 -620) (220 220)) @@ -290,136 +219,92 @@ J( R(l8 (-360 -760) (360 760)) R(l8 (2940 -760) (360 760)) ) - P(1) - P(2) - P(3) - P(4) - P(5) - P(6) + P(1 I('3')) + P(2 I('5')) + P(3 I('7')) + P(4 I('4')) + P(5 I('6')) + P(6 I('8')) P(7) P(8) - P(9) - P(10) - P(11) - P(12) X(1 INV Y(1500 800) - P(0 12) - P(1 11) - P(2 5) - P(3 2) - P(4 9) - P(5 9) - P(6 1) - P(7 1) + P(0 8) + P(1 7) + P(2 1) + P(3 4) ) X(2 INV M O(180) Y(2300 800) - P(0 12) - P(1 11) - P(2 1) - P(3 9) - P(4 2) - P(5 2) - P(6 5) - P(7 5) + P(0 8) + P(1 7) + P(2 2) + P(3 5) ) X(3 INV Y(4800 800) - P(0 12) - P(1 11) - P(2 4) - P(3 10) - P(4 8) - P(5 7) - P(6 3) - P(7 6) + P(0 8) + P(1 7) + P(2 3) + P(3 6) ) ) X(INVCHAIN R((-1500 -800) (10400 4600)) - N(1 - R(l6 (490 990) (220 220)) - R(l6 (-1220 -1520) (220 220)) - R(l6 (-220 180) (220 220)) - R(l6 (-220 2180) (220 220)) - R(l6 (-220 180) (220 220)) - R(l8 (-65 -2185) (1105 350)) + N(1 I(IN) + R(l3 (-1295 925) (1235 350)) + R(l11 (-911 -151) (2 2)) ) N(2 - R(l6 (3790 990) (220 220)) - R(l6 (-1220 -1520) (220 220)) + R(l3 (445 805) (480 550)) + R(l6 (-1435 -1665) (220 220)) R(l6 (-220 180) (220 220)) R(l6 (-220 2180) (220 220)) R(l6 (-220 180) (220 220)) - R(l8 (-65 -2185) (1105 350)) + R(l7 (780 -2120) (220 220)) + R(l8 (-1065 -285) (1105 350)) ) N(3 - R(l6 (1405 990) (220 220)) - R(l6 (-535 -1520) (220 220)) + R(l3 (1345 925) (1945 350)) + R(l6 (-2200 -1585) (220 220)) R(l6 (-220 180) (220 220)) R(l6 (-220 2180) (220 220)) R(l6 (-220 180) (220 220)) - R(l8 (20 -2270) (440 520)) + R(l7 (95 -2120) (220 220)) + R(l8 (-295 -370) (440 520)) ) N(4 - R(l6 (7090 990) (220 220)) - R(l6 (-1220 -1520) (220 220)) + R(l3 (3745 805) (480 550)) + R(l6 (-1435 -1665) (220 220)) R(l6 (-220 180) (220 220)) R(l6 (-220 2180) (220 220)) R(l6 (-220 180) (220 220)) - R(l8 (-65 -2185) (1105 350)) + R(l7 (780 -2120) (220 220)) + R(l8 (-1065 -285) (1105 350)) ) N(5 - R(l6 (4705 990) (220 220)) - R(l6 (-535 -1520) (220 220)) + R(l3 (4645 925) (1945 350)) + R(l6 (-2200 -1585) (220 220)) R(l6 (-220 180) (220 220)) R(l6 (-220 2180) (220 220)) R(l6 (-220 180) (220 220)) - R(l8 (20 -2270) (440 520)) + R(l7 (95 -2120) (220 220)) + R(l8 (-295 -370) (440 520)) ) N(6 - R(l3 (-1295 925) (1235 350)) - ) - N(7 - R(l3 (445 805) (480 550)) - ) - N(8 - R(l3 (1345 925) (1945 350)) - ) - N(9 - R(l3 (3745 805) (480 550)) - ) - N(10 - R(l3 (4645 925) (1945 350)) - ) - N(11 R(l3 (7045 805) (480 550)) + R(l6 (-1435 -1665) (220 220)) + R(l6 (-220 180) (220 220)) + R(l6 (-220 2180) (220 220)) + R(l6 (-220 180) (220 220)) + R(l7 (780 -2120) (220 220)) + R(l8 (-1065 -285) (1105 350)) ) - N(12 + N(7 I(OUT) R(l6 (7690 -310) (220 220)) R(l6 (-220 180) (220 220)) R(l6 (-220 2180) (220 220)) R(l6 (-220 180) (220 220)) + R(l12 (-121 -2011) (2 2)) ) - N(13 - R(l6 (6890 2490) (220 220)) - R(l6 (-220 180) (220 220)) - R(l6 (-3520 -620) (220 220)) - R(l6 (-220 180) (220 220)) - R(l6 (3080 -620) (220 220)) - R(l6 (-220 180) (220 220)) - R(l6 (-6820 -620) (220 220)) - R(l6 (-220 180) (220 220)) - R(l6 (-220 -620) (220 220)) - R(l6 (-220 180) (220 220)) - R(l6 (3080 -620) (220 220)) - R(l6 (-220 180) (220 220)) - R(l8 (3010 -690) (360 760)) - R(l8 (-3660 -760) (360 760)) - R(l8 (2940 -760) (360 760)) - R(l8 (-6960 -760) (360 760)) - R(l8 (-360 -760) (360 760)) - R(l8 (2940 -760) (360 760)) - ) - N(14 + N(8 I(VSS) R(l6 (6890 -310) (220 220)) R(l6 (-220 180) (220 220)) R(l6 (-3520 -620) (220 220)) @@ -438,136 +323,96 @@ J( R(l8 (-6960 -760) (360 760)) R(l8 (-360 -760) (360 760)) R(l8 (2940 -760) (360 760)) + R(l13 (2719 -381) (2 2)) + R(l13 (-3302 -2) (2 2)) + R(l13 (-3302 -2) (2 2)) ) + N(9 I(VDD) + R(l6 (6890 2490) (220 220)) + R(l6 (-220 180) (220 220)) + R(l6 (-3520 -620) (220 220)) + R(l6 (-220 180) (220 220)) + R(l6 (3080 -620) (220 220)) + R(l6 (-220 180) (220 220)) + R(l6 (-6820 -620) (220 220)) + R(l6 (-220 180) (220 220)) + R(l6 (-220 -620) (220 220)) + R(l6 (-220 180) (220 220)) + R(l6 (3080 -620) (220 220)) + R(l6 (-220 180) (220 220)) + R(l8 (3010 -690) (360 760)) + R(l8 (-3660 -760) (360 760)) + R(l8 (2940 -760) (360 760)) + R(l8 (-6960 -760) (360 760)) + R(l8 (-360 -760) (360 760)) + R(l8 (2940 -760) (360 760)) + R(l13 (-581 -381) (2 2)) + R(l13 (3298 -2) (2 2)) + R(l13 (-6602 -2) (2 2)) + ) + P(1 I(IN)) + P(7 I(OUT)) + P(8 I(VSS)) + P(9 I(VDD)) X(1 INV3 Y(-1500 -800) - P(0 7) - P(1 1) - P(2 9) - P(3 8) - P(4 6) - P(5 9) - P(6 5) - P(7 5) - P(8 3) - P(9 2) - P(10 13) - P(11 14) + P(0 1) + P(1 2) + P(2 3) + P(3 2) + P(4 3) + P(5 4) + P(6 9) + P(7 8) ) X(2 INV2 Y(2600 -800) - P(0 8) - P(1 11) - P(2 9) - P(3 10) - P(4 8) - P(5 11) - P(6 2) - P(7 12) - P(8 2) - P(9 12) - P(10 5) - P(11 4) - P(12 13) - P(13 14) + P(0 5) + P(1 6) + P(2 4) + P(3 5) + P(4 9) + P(5 8) ) X(3 INV M O(180) Y(7400 0) - P(0 14) - P(1 13) - P(2 11) - P(3 12) - P(4 4) - P(5 4) - P(6 10) - P(7 10) + P(0 8) + P(1 9) + P(2 6) + P(3 7) ) ) ) H( - X(TRANS - N(1 I('1')) - N(2 I('2')) - N(3 I('3')) - P(1 I('1')) - P(2 I('2')) - P(3 I('3')) - ) X(INV N(1 I('1')) N(2 I('2')) N(3 I('3')) N(4 I('4')) - N(5 I('5')) - N(6 I('6')) - N(7 I('7')) - N(8 I('8')) P(1 I('1')) P(2 I('2')) P(3 I('3')) P(4 I('4')) - P(5 I('5')) - P(6 I('6')) - P(7 I('7')) - P(8 I('8')) D(1 PMOS I($1) E(L 0.25) E(W 0.95) - E(AS 0.79325) - E(AD 0.26125) - E(PS 3.57) - E(PD 1.5) - T(S 4) + E(AS 0) + E(AD 0) + E(PS 0) + E(PD 0) + T(S 1) T(G 3) - T(D 2) - T(B 4) + T(D 4) ) - D(2 PMOS - I($2) - E(L 0.25) - E(W 0.95) - E(AS 0.26125) - E(AD 0.03325) - E(PS 1.5) - E(PD 1.97) - T(S 2) - T(G 7) - T(D 5) - T(B 2) - ) - D(3 NMOS + D(2 NMOS I($3) E(L 0.25) E(W 0.95) - E(AS 0.79325) - E(AD 0.26125) - E(PS 3.57) - E(PD 1.5) - T(S 4) + E(AS 0) + E(AD 0) + E(PS 0) + E(PD 0) + T(S 2) T(G 3) - T(D 1) - T(B 4) - ) - D(4 NMOS - I($4) - E(L 0.25) - E(W 0.95) - E(AS 0.26125) - E(AD 0.03325) - E(PS 1.5) - E(PD 1.97) - T(S 1) - T(G 8) - T(D 6) - T(B 1) - ) - X(1 TRANS I($1) - P(0 4) - P(1 1) - P(2 3) - ) - X(2 TRANS I($2) - P(0 4) - P(1 2) - P(2 3) + T(D 4) ) ) X(INV3 @@ -579,10 +424,6 @@ H( N(6 I('6')) N(7 I('7')) N(8 I('8')) - N(9 I('9')) - N(10 I('10')) - N(11 I('11')) - N(12 I('12')) P(1 I('1')) P(2 I('2')) P(3 I('3')) @@ -591,39 +432,23 @@ H( P(6 I('6')) P(7 I('7')) P(8 I('8')) - P(9 I('9')) - P(10 I('10')) - P(11 I('11')) - P(12 I('12')) X(1 INV I($1) - P(0 12) - P(1 11) + P(0 1) + P(1 2) P(2 3) - P(3 10) - P(4 8) - P(5 6) - P(6 1) - P(7 5) + P(3 4) ) X(2 INV I($2) - P(0 12) - P(1 11) - P(2 4) - P(3 7) - P(4 9) - P(5 9) - P(6 2) - P(7 2) + P(0 1) + P(1 2) + P(2 5) + P(3 6) ) X(3 INV I($3) - P(0 12) - P(1 11) - P(2 2) - P(3 9) - P(4 7) - P(5 7) - P(6 4) - P(7 4) + P(0 1) + P(1 2) + P(2 7) + P(3 8) ) ) X(INV2 @@ -633,125 +458,135 @@ H( N(4 I('4')) N(5 I('5')) N(6 I('6')) - N(7 I('7')) - N(8 I('8')) - N(9 I('9')) - N(10 I('10')) - N(11 I('11')) - N(12 I('12')) - N(13 I('13')) - N(14 I('14')) P(1 I('1')) P(2 I('2')) P(3 I('3')) P(4 I('4')) P(5 I('5')) P(6 I('6')) - P(7 I('7')) - P(8 I('8')) - P(9 I('9')) - P(10 I('10')) - P(11 I('11')) - P(12 I('12')) - P(13 I('13')) - P(14 I('14')) X(1 INV I($1) - P(0 14) - P(1 13) + P(0 1) + P(1 2) P(2 3) - P(3 11) - P(4 9) - P(5 7) - P(6 1) - P(7 5) + P(3 4) ) X(2 INV I($2) - P(0 14) - P(1 13) - P(2 4) - P(3 12) - P(4 10) - P(5 8) - P(6 2) - P(7 6) + P(0 1) + P(1 2) + P(2 5) + P(3 6) ) ) X(INVCHAIN - N(1 I('9')) - N(2 I('7')) - N(3 I('8')) - N(4 I('6')) + N(1 I('1')) + N(2 I('2')) + N(3 I('3')) + N(4 I('4')) N(5 I('5')) - N(6 I('1')) - N(7 I('3')) - N(8 I('2')) - N(9 I('13')) - N(10 I('14')) - N(11 I('11')) - N(12 I('10')) - N(13 I('12')) - N(14 I('4')) + N(6 I('6')) + N(7 I('7')) + N(8 I('8')) + N(9 I('9')) X(1 INV3 I($1) P(0 1) P(1 2) P(2 3) P(3 4) - P(4 1) + P(4 4) P(5 5) - P(6 6) - P(7 5) - P(8 7) - P(9 8) - P(10 9) - P(11 10) + P(6 5) + P(7 6) ) X(2 INV2 I($2) - P(0 3) - P(1 11) - P(2 1) - P(3 12) - P(4 3) - P(5 11) - P(6 8) - P(7 13) - P(8 8) - P(9 13) - P(10 5) - P(11 14) - P(12 9) - P(13 10) + P(0 1) + P(1 2) + P(2 6) + P(3 7) + P(4 7) + P(5 8) ) X(3 INV I($3) - P(0 10) - P(1 9) - P(2 11) - P(3 13) - P(4 14) - P(5 14) - P(6 12) - P(7 12) + P(0 1) + P(1 2) + P(2 8) + P(3 9) ) ) ) Z( - X(() TRANS 0 + X(INV INV 1 Z( + N(2 1 1) + N(1 2 1) + N(3 3 1) + N(4 4 1) + P(1 0 1) + P(0 1 1) + P(2 2 1) + P(3 3 1) + D(2 2 1) + D(1 1 1) ) ) - X(INV INV S + X(INV2 INV2 1 Z( + N(5 1 1) + N(6 2 1) + N(3 3 1) + N(1 4 W) + N(4 5 1) + N(2 6 W) + P(4 0 1) + P(5 1 1) + P(2 2 1) + P(0 3 1) + P(3 4 1) + P(1 5 1) + X(1 1 1) + X(2 2 1) ) ) - X(INV2 INV2 S + X(INV3 INV3 1 Z( + N(7 1 1) + N(8 2 1) + N(1 3 1) + N(4 4 W) + N(2 5 1) + N(5 6 W) + N(3 7 1) + N(6 8 W) + P(6 0 1) + P(7 1 1) + P(0 2 1) + P(3 3 1) + P(1 4 1) + P(4 5 1) + P(2 6 1) + P(5 7 1) + X(1 1 1) + X(2 2 1) + X(3 3 1) ) ) - X(INV3 INV3 S - Z( - ) - ) - X(INVCHAIN INVCHAIN S + X(INVCHAIN INVCHAIN 1 Z( + N(2 4 1) + N(3 5 1) + N(4 6 1) + N(5 7 1) + N(6 8 1) + N(1 3 1) + N(7 9 1) + N(9 1 1) + N(8 2 1) + P(0 () 1) + P(1 () 1) + P(3 () 1) + P(2 () 1) + X(3 3 1) + X(2 2 1) + X(1 1 1) ) ) ) diff --git a/testdata/lvs/invchain_for_cheat.cir b/testdata/lvs/invchain_for_cheat.cir index 50e75dba1..d37bd4cee 100644 --- a/testdata/lvs/invchain_for_cheat.cir +++ b/testdata/lvs/invchain_for_cheat.cir @@ -1,29 +1,27 @@ * cell INVCHAIN .SUBCKT INVCHAIN -X$1 9 7 8 6 9 5 1 5 3 2 13 14 INV3 -X$2 8 11 9 10 8 11 2 12 2 12 5 4 13 14 INV2 -X$3 14 13 11 12 4 4 10 10 INV +X$1 1 2 3 4 4 5 5 6 INV3 +X$2 1 2 6 7 7 8 INV2 +X$3 1 2 8 9 INV .ENDS INVCHAIN * cell INV3 -.SUBCKT INV3 1 2 3 4 5 6 7 8 9 10 11 12 -X$1 12 11 3 10 8 6 1 5 INV -X$2 12 11 4 7 9 9 2 2 INV -X$3 12 11 2 9 7 7 4 4 INV +.SUBCKT INV3 1 2 3 4 5 6 7 8 +X$1 1 2 3 4 INV +X$2 1 2 5 6 INV +X$3 1 2 7 8 INV .ENDS INV3 * cell INV2 -.SUBCKT INV2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 -X$1 14 13 3 11 9 7 1 5 INV -X$2 14 13 4 12 10 8 2 6 INV +.SUBCKT INV2 1 2 3 4 5 6 +X$1 1 2 3 4 INV +X$2 1 2 5 6 INV .ENDS INV2 * cell INV -.SUBCKT INV 1 2 3 4 5 6 7 8 -M$1 4 3 2 4 PMOS L=0.25U W=0.95U AS=0.79325P AD=0.26125P PS=3.57U PD=1.5U -M$2 2 7 5 2 PMOS L=0.25U W=0.95U AS=0.26125P AD=0.03325P PS=1.5U PD=1.97U -M$3 4 3 1 4 NMOS L=0.25U W=0.95U AS=0.79325P AD=0.26125P PS=3.57U PD=1.5U -M$4 1 8 6 1 NMOS L=0.25U W=0.95U AS=0.26125P AD=0.03325P PS=1.5U PD=1.97U +.SUBCKT INV 1 2 3 4 +M$1 1 3 4 1 PMOS L=0.25U W=0.95U +M$3 2 3 4 2 NMOS L=0.25U W=0.95U .ENDS INV diff --git a/testdata/lvs/invchain_for_cheat.gds b/testdata/lvs/invchain_for_cheat.gds index 43446a79f..5856c8f19 100644 Binary files a/testdata/lvs/invchain_for_cheat.gds and b/testdata/lvs/invchain_for_cheat.gds differ