From 779d6ad2b2d1502fa46da1db5debab1c55c2a566 Mon Sep 17 00:00:00 2001 From: mrg Date: Wed, 22 Sep 2021 16:54:52 -0700 Subject: [PATCH] Debugging klayout for SCMOS and FreePDK45. --- technology/freepdk45/tech/freepdk45.lylvs | 10 +- technology/scn4m_subm/tech/scn4m_subm.lylvs | 416 ++++++++++---------- technology/scn4m_subm/tech/tech.py | 3 + 3 files changed, 216 insertions(+), 213 deletions(-) diff --git a/technology/freepdk45/tech/freepdk45.lylvs b/technology/freepdk45/tech/freepdk45.lylvs index 934a981c..97fbf85e 100644 --- a/technology/freepdk45/tech/freepdk45.lylvs +++ b/technology/freepdk45/tech/freepdk45.lylvs @@ -206,13 +206,13 @@ connect(metal10, metal10_pin) schematic.simplify if $connect_supplies -connect_implicit("*", "vdd") -connect_implicit("*", "gnd") + connect_implicit("vdd") + connect_implicit("gnd") end -connect_global(pwell, "PWELL") -connect_global(nwell, "NWELL") -connect_global(bulk, "BULK") +#connect_global(pwell, "PWELL") +#connect_global(nwell, "NWELL") +#connect_global(bulk, "BULK") for pat in %w(pinv* pnor* pnand* and?_dec* write_driver* port_address* replica_bitcell_array*) connect_explicit(pat, [ "NWELL", "vdd" ]) diff --git a/technology/scn4m_subm/tech/scn4m_subm.lylvs b/technology/scn4m_subm/tech/scn4m_subm.lylvs index 7a7c1371..80185ede 100644 --- a/technology/scn4m_subm/tech/scn4m_subm.lylvs +++ b/technology/scn4m_subm/tech/scn4m_subm.lylvs @@ -1,208 +1,208 @@ - - - - - lvs - - - - false - false - - true - lvs_scripts - tools_menu.lvs.end - dsl - lvs-dsl-xml - # -# Extraction for freePDK45 -# -############################ -tstart = Time.now - -# optionnal for a batch launch : klayout -b -rd input=my_layout.gds -rd report=my_report.lyrdb -rd schematic=reference_netlist.cir -rd target_netlist=extracted_netlist.cir -r lvs_freepdk45.lvs -if $input - source($input) -end - -if $report - report_lvs($report) -else - report_lvs("lvs_report.lvsdb") -end - -if $schematic -#reference netlist - schematic($schematic) -else - schematic(RBA::CellView::active.filename.sub(/\.(oas|gds|oas.gz|gds.gz)$/, ".sp")) -end - -# 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 = true - -if $target_netlist - target_netlist($target_netlist) -else - # target_netlist("netlist.cir", write_spice(spice_with_net_names, spice_with_comments), "The netlist comment goes here.") - target_netlist(File.join(File.dirname(RBA::CellView::active.filename), 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 - -# Hierarchical mode -deep -# Use 4 CPU cores -threads(4) -# Print details -verbose(true) - - -# layers definitions -######################## -info("Layers definitions") - - DNW = input(38,0) - nwell = input(42,0) - pwell = input(41,0) - CW = input(59,0) - active = input(43,0) - TA = input(60,0) - PBase = input(58,0) - poly = input(46,0) - SB = input(29,0) - nplus = input(45,0) - pplus = input(44,0) - PO2 = input(56,0) - HR = input(34,0) - Contact = input(25,0) - ContactPoly = input(47,0) - ContactActive = input(48,0) - ContactPoly2 = input(55, 0) - CT = Contact + ContactPoly + ContactActive + ContactPoly2 - M1 = input(49,0) - V1 = input(50,0) - M2 = input(51,0) - V2 = input(61,0) - M3 = input(62,0) - V3 = input(30,0) - M4 = input(31,0) - CTM = input(35,0) - V4 = input(32,0) - M5 = input(33,0) - V5 = input(36,0) - M6 = input(37,0) - Glass = input(52,0) - Pads = input(26,0) - -# layers processing -######################## -info("Layers processing") - -# Bulk layer for terminal provisioning -bulk = polygon_layer - -active_in_nwell = active & nwell -pactive = active_in_nwell & pplus -ntie = active_in_nwell & nplus -pgate = pactive & poly -psd = pactive - pgate - -active_in_pwell = active & pwell -nactive = active_in_pwell & nplus -ptie = active_in_pwell & pplus -ngate = nactive & poly -nsd = nactive - ngate - - -cheat("cell_1rw", "dummy_cell_1rw", "replica_cell_1rw", "cell_2rw", "dummy_cell_2rw", "replica_cell_2rw", "pbitcell", "dummy_pbitcell", "replica_pbitcell", "dff", "wordline_driver*") { - -# PMOS transistor device extraction -extract_devices(mos4("p"), { "SD" => psd, "G" => pgate, "tS" => psd, "tD" => psd, "tG" => poly, "W" => nwell }) - -# NMOS transistor device extraction -extract_devices(mos4("n"), { "SD" => nsd, "G" => ngate, "tS" => nsd, "tD" => nsd, "tG" => poly, "W" => pwell }) - -} - -# Define connectivity for netlist extraction - -# Inter-layer -connect(nwell, ntie) -connect(pwell, ptie) -connect(CT, ntie) -connect(CT, ptie) -connect(psd, CT) -connect(nsd, CT) -connect(poly, CT) -connect(CT, M1) -connect(CT, M1) -connect(M1, V1) -connect(V1, M2) -connect(M2, V2) -connect(V2, M3) -connect(M3, V3) -connect(V3, M4) -connect(M4, V4) -connect(V4, M5) -connect(M5, V5) -connect(V5, M6) - - -# Global -schematic.simplify - -if $connect_supplies - connect_implicit("vdd") - connect_implicit("gnd") -end - -connect_global(pwell, "PWELL") -connect_global(nwell, "NWELL") -#connect_global(bulk, "BULK") - -for pat in %w(pinv* pnor* pnand* and?_dec* write_driver* port_address* replica_bitcell_array*) - connect_explicit(pat, [ "NWELL", "vdd" ]) - connect_explicit(pat, [ "BULK", "PWELL", "gnd" ]) -end - -# Actually performs the extraction -netlist # ... not really required - -# Flatten cells which are present in one netlist only -align -# SIMPLIFICATION of the netlist -#netlist.make_top_level_pins -#netlist.combine_devices -#netlist.purge -#netlist.purge_nets -netlist.simplify - -# Tolerances for the devices extracted parameters -# tolerance(device_class_name, parameter_name [, :absolute => absolute_tolerance] [, :relative => relative_tolerance]) -tolerance("P", "W", :absolute => 1.nm, :relative => 0.001) -tolerance("N", "W", :absolute => 1.nm, :relative => 0.001) - -#max_res(1000000) -#min_caps(1e-15) - -max_branch_complexity(65536) -max_depth(16) - -if ! compare - #raise "ERROR : Netlists don't match" - puts "ERROR : Netlists don't match" -else - puts "CONGRATULATIONS! Netlists match." -end - -# time spent for the LVS -time = Time.now -hours = ((time - tstart)/3600).to_i -minutes = ((time - tstart)/60 - hours * 60).to_i -seconds = ((time - tstart) - (minutes * 60 + hours * 3600)).to_i -$stdout.write "LVS finished at : #{time.hour}:#{time.min}:#{time.sec} - LVS duration = #{hours} hrs. #{minutes} min. #{seconds} sec.\n" - + + + + + lvs + + + + false + false + + true + lvs_scripts + tools_menu.lvs.end + dsl + lvs-dsl-xml + # +# Extraction for freePDK45 +# +############################ +tstart = Time.now + +# optionnal for a batch launch : klayout -b -rd input=my_layout.gds -rd report=my_report.lyrdb -rd schematic=reference_netlist.cir -rd target_netlist=extracted_netlist.cir -r lvs_freepdk45.lvs +if $input + source($input) +end + +if $report + report_lvs($report) +else + report_lvs("lvs_report.lvsdb") +end + +if $schematic +#reference netlist + schematic($schematic) +else + schematic(RBA::CellView::active.filename.sub(/\.(oas|gds|oas.gz|gds.gz)$/, ".sp")) +end + +# 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 = true + +if $target_netlist + target_netlist($target_netlist) +else + # target_netlist("netlist.cir", write_spice(spice_with_net_names, spice_with_comments), "The netlist comment goes here.") + target_netlist(File.join(File.dirname(RBA::CellView::active.filename), 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 + +# Hierarchical mode +deep +# Use 4 CPU cores +threads(4) +# Print details +verbose(true) + + +# layers definitions +######################## +info("Layers definitions") + + DNW = input(38,0) + nwell = input(42,0) + pwell = input(41,0) + CW = input(59,0) + active = input(43,0) + TA = input(60,0) + PBase = input(58,0) + poly = input(46,0) + SB = input(29,0) + nplus = input(45,0) + pplus = input(44,0) + PO2 = input(56,0) + HR = input(34,0) + Contact = input(25,0) + ContactPoly = input(47,0) + ContactActive = input(48,0) + ContactPoly2 = input(55, 0) + CT = Contact + ContactPoly + ContactActive + ContactPoly2 + M1 = input(49,0) + V1 = input(50,0) + M2 = input(51,0) + V2 = input(61,0) + M3 = input(62,0) + V3 = input(30,0) + M4 = input(31,0) + CTM = input(35,0) + V4 = input(32,0) + M5 = input(33,0) + V5 = input(36,0) + M6 = input(37,0) + Glass = input(52,0) + Pads = input(26,0) + +# layers processing +######################## +info("Layers processing") + +# Bulk layer for terminal provisioning +bulk = polygon_layer + +active_in_nwell = active & nwell +pactive = active_in_nwell & pplus +ntie = active_in_nwell & nplus +pgate = pactive & poly +psd = pactive - pgate + +active_in_pwell = active & pwell +nactive = active_in_pwell & nplus +ptie = active_in_pwell & pplus +ngate = nactive & poly +nsd = nactive - ngate + + +cheat("cell_1rw", "dummy_cell_1rw", "replica_cell_1rw", "cell_2rw", "dummy_cell_2rw", "replica_cell_2rw", "pbitcell", "dummy_pbitcell", "replica_pbitcell", "dff", "wordline_driver*") { + +# PMOS transistor device extraction +extract_devices(mos4("p"), { "SD" => psd, "G" => pgate, "tS" => psd, "tD" => psd, "tG" => poly, "W" => nwell }) + +# NMOS transistor device extraction +extract_devices(mos4("n"), { "SD" => nsd, "G" => ngate, "tS" => nsd, "tD" => nsd, "tG" => poly, "W" => pwell }) + +} + +# Define connectivity for netlist extraction + +# Inter-layer +connect(nwell, ntie) +connect(pwell, ptie) +connect(CT, ntie) +connect(CT, ptie) +connect(psd, CT) +connect(nsd, CT) +connect(poly, CT) +connect(CT, M1) +connect(CT, M1) +connect(M1, V1) +connect(V1, M2) +connect(M2, V2) +connect(V2, M3) +connect(M3, V3) +connect(V3, M4) +connect(M4, V4) +connect(V4, M5) +connect(M5, V5) +connect(V5, M6) + + +# Global +schematic.simplify + +if $connect_supplies + connect_implicit("vdd") + connect_implicit("gnd") +end + +connect_global(pwell, "PWELL") +connect_global(nwell, "NWELL") +#connect_global(bulk, "BULK") + +for pat in %w(pinv* pnor* pnand* and?_dec* write_driver* port_address* replica_bitcell_array*) + connect_explicit(pat, [ "NWELL", "vdd" ]) + connect_explicit(pat, [ "BULK", "PWELL", "gnd" ]) +end + +# Actually performs the extraction +netlist # ... not really required + +# Flatten cells which are present in one netlist only +align +# SIMPLIFICATION of the netlist +#netlist.make_top_level_pins +#netlist.combine_devices +#netlist.purge +#netlist.purge_nets +netlist.simplify + +# Tolerances for the devices extracted parameters +# tolerance(device_class_name, parameter_name [, :absolute => absolute_tolerance] [, :relative => relative_tolerance]) +tolerance("P", "W", :absolute => 1.nm, :relative => 0.001) +tolerance("N", "W", :absolute => 1.nm, :relative => 0.001) + +#max_res(1000000) +#min_caps(1e-15) + +max_branch_complexity(65536) +max_depth(16) + +if ! compare + #raise "ERROR : Netlists don't match" + puts "ERROR : Netlists don't match" +else + puts "CONGRATULATIONS! Netlists match." +end + +# time spent for the LVS +time = Time.now +hours = ((time - tstart)/3600).to_i +minutes = ((time - tstart)/60 - hours * 60).to_i +seconds = ((time - tstart) - (minutes * 60 + hours * 3600)).to_i +$stdout.write "LVS finished at : #{time.hour}:#{time.min}:#{time.sec} - LVS duration = #{hours} hrs. #{minutes} min. #{seconds} sec.\n" + diff --git a/technology/scn4m_subm/tech/tech.py b/technology/scn4m_subm/tech/tech.py index a8c44996..374ba4c8 100644 --- a/technology/scn4m_subm/tech/tech.py +++ b/technology/scn4m_subm/tech/tech.py @@ -428,5 +428,8 @@ spice["sa_transconductance"] = (spice["mobility_n"])*spice["cox"]*(parameter["sa drc_name = "magic" lvs_name = "netgen" pex_name = "magic" +drc_name = "klayout" +lvs_name = "klayout" +pex_name = "klayout" blackbox_bitcell = False