diff --git a/samples/lvs/RINGO.cir b/samples/lvs/RINGO.cir new file mode 100644 index 000000000..e97b148a1 --- /dev/null +++ b/samples/lvs/RINGO.cir @@ -0,0 +1,27 @@ + +.SUBCKT RINGO VSS VDD FB ENABLE OUT +X$1 VDD VSS 1 FB ENABLE ND2X1 +X$2 VDD VSS 2 1 INVX1 +X$3 VDD VSS 3 2 INVX1 +X$4 VDD VSS 4 3 INVX1 +X$5 VDD VSS 5 4 INVX1 +X$6 VDD VSS 6 5 INVX1 +X$7 VDD VSS 7 6 INVX1 +X$8 VDD VSS 8 7 INVX1 +X$9 VDD VSS 9 8 INVX1 +X$10 VDD VSS 10 9 INVX1 +X$11 VDD VSS FB 10 INVX1 +X$12 VDD VSS OUT FB INVX1 +.ENDS RINGO + +.SUBCKT ND2X1 VDD VSS OUT B A +M$1 OUT A VDD VDD LVPMOS L=0.25U W=1.5U +M$2 VDD B OUT VDD LVPMOS L=0.25U W=1.5U +M$3 VSS A 1 VSS LVNMOS L=0.25U W=0.95U +M$4 1 B OUT VSS LVNMOS L=0.25U W=0.95U +.ENDS ND2X1 + +.SUBCKT INVX1 VDD VSS OUT IN +M$1 VDD IN OUT VDD LVPMOS L=0.25U W=1.5U +M$2 VSS IN OUT VSS LVNMOS L=0.25U W=0.95U +.ENDS INVX1 diff --git a/samples/lvs/ringo.gds b/samples/lvs/ringo.gds index fa116f14d..3d79ce740 100644 Binary files a/samples/lvs/ringo.gds and b/samples/lvs/ringo.gds differ diff --git a/samples/lvs/schematic.cir b/samples/lvs/schematic.cir deleted file mode 100644 index 13d6d09f5..000000000 --- a/samples/lvs/schematic.cir +++ /dev/null @@ -1,27 +0,0 @@ - -.SUBCKT RINGO VSS VDD FB ENABLE OUT -X$1 VDD 1 VSS VDD FB ENABLE VSS ND2X1 -X$2 VDD 2 VSS VDD 1 VSS INVX1 -X$3 VDD 3 VSS VDD 2 VSS INVX1 -X$4 VDD 4 VSS VDD 3 VSS INVX1 -X$5 VDD 5 VSS VDD 4 VSS INVX1 -X$6 VDD 6 VSS VDD 5 VSS INVX1 -X$7 VDD 7 VSS VDD 6 VSS INVX1 -X$8 VDD 8 VSS VDD 7 VSS INVX1 -X$9 VDD 9 VSS VDD 8 VSS INVX1 -X$10 VDD 10 VSS VDD 9 VSS INVX1 -X$11 VDD FB VSS VDD 10 VSS INVX1 -X$12 VDD OUT VSS VDD FB VSS INVX1 -.ENDS RINGO - -.SUBCKT ND2X1 VDD OUT VSS NWELL B A BULK -M$1 OUT A VDD NWELL PMOS L=0.25U W=1.5U -M$2 VDD B OUT NWELL PMOS L=0.25U W=1.5U -M$3 VSS A 1 BULK NMOS L=0.25U W=0.95U -M$4 1 B OUT BULK NMOS L=0.25U W=0.95U -.ENDS ND2X1 - -.SUBCKT INVX1 VDD OUT VSS NWELL IN BULK -M$1 VDD IN OUT NWELL PMOS L=0.25U W=1.5U -M$2 VSS IN OUT BULK NMOS L=0.25U W=0.95U -.ENDS INVX1 diff --git a/samples/lvs/si4all.lvs b/samples/lvs/si4all.lvs new file mode 100644 index 000000000..2a6d82174 --- /dev/null +++ b/samples/lvs/si4all.lvs @@ -0,0 +1,128 @@ + +# Hierarchical mode +deep +# Print details +verbose + +# Output generation (dialog only) +report_lvs + +# Enable this to produce a L2N database +# report_netlist("extracted.l2n") + +# True to write the extracted netlist +if false + + # true: use net names instead of numbers + # false: use numbers for nets + spice_with_net_names = true + # true: put in comments with details + # false: no comments + spice_with_comments = false + + # Extracted netlist + target_netlist(File.join(File.dirname(File.absolute_path(source.path || ".")), source.cell_name + "_extracted.cir"), write_spice(spice_with_net_names, spice_with_comments), "Extracted by KLayout on : #{Time.now.strftime("%d/%m/%Y %H:%M")}") + +end + +# Specify the schematic netlist +# (looks for a file called .cir where +# is the current cell name). The file is looked up relative to +# the layout file name. +schematic(File.join(File.dirname(File.absolute_path(source.path || ".")), source.cell_name + ".cir")) + +# layers definitions +######################## +nwell = input(1, 0) +diff = input(2, 0) +pplus = input(3, 0) +nplus = input(4, 0) +poly = input(5, 0) +thickox = input(6, 0) +polyres = input(7, 0) +contact = input(8, 0) +metal1 = input(9, 0) +via = input(10, 0) +metal2 = input(11, 0) +pad = input(12, 0) +border = input(13, 0) + +# Special layer for bulk terminals + +bulk = make_layer + +# Computed layers + +diff_in_nwell = diff & nwell +pdiff = diff_in_nwell - nplus +ntie = diff_in_nwell & nplus +pgate = pdiff & poly +psd = pdiff - pgate +hv_pgate = pgate & thickox +lv_pgate = pgate - hv_pgate +hv_psd = psd & thickox +lv_psd = psd - thickox + +diff_outside_nwell = diff - nwell +ndiff = diff_outside_nwell - pplus +ptie = diff_outside_nwell & pplus +ngate = ndiff & poly +nsd = ndiff - ngate +hv_ngate = ngate & thickox +lv_ngate = ngate - hv_ngate +hv_nsd = nsd & thickox +lv_nsd = nsd - thickox + +# PMOS transistor device extraction + +hvpmos_ex = RBA::DeviceExtractorMOS4Transistor::new("HVPMOS") +extract_devices(hvpmos_ex, { "SD" => psd, "G" => hv_pgate, "P" => poly, "W" => nwell }) + +lvpmos_ex = RBA::DeviceExtractorMOS4Transistor::new("LVPMOS") +extract_devices(lvpmos_ex, { "SD" => psd, "G" => lv_pgate, "P" => poly, "W" => nwell }) + +# NMOS transistor device extraction + +lvnmos_ex = RBA::DeviceExtractorMOS4Transistor::new("LVNMOS") +extract_devices(lvnmos_ex, { "SD" => nsd, "G" => lv_ngate, "P" => poly, "W" => bulk }) + +hvnmos_ex = RBA::DeviceExtractorMOS4Transistor::new("HVNMOS") +extract_devices(hvnmos_ex, { "SD" => nsd, "G" => hv_ngate, "P" => poly, "W" => bulk }) + +# Define connectivity for netlist extraction + +# Inter-layer +connect(contact, ntie) +connect(contact, ptie) +connect(nwell, ntie) +connect(psd, contact) +connect(nsd, contact) +connect(poly, contact) +connect(contact, metal1) +connect(metal1, via) +connect(via, metal2) + +# Make "must-connect" connections between NWELL and VDD and BULK and VSS +connect_explicit("*", ["NWELL", "VDD"]) +connect_explicit("*", ["BULK", "VSS"]) + +# Global connections +connect_global(ptie, "BULK") +connect_global(bulk, "BULK") + +# Actually performs the extraction +netlist + +# Flatten cells which are present in one netlist only +align + +# Simplication of the netlist +netlist.simplify + +# LVS compare +if compare + puts "Congratulations! Netlists match." +else + puts "LVS ERROR: netlists do not match!" +end +