From 1b2d2efd78f29e6973916532a765dab7654663a3 Mon Sep 17 00:00:00 2001 From: FaragElsayed2 Date: Thu, 16 May 2024 12:08:29 +0300 Subject: [PATCH 1/5] Minor updates to lvs general derivations Signed-off-by: FaragElsayed2 --- .../klayout/tech/lvs/rule_decks/general_connections.lvs | 2 +- .../klayout/tech/lvs/rule_decks/general_derivations.lvs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_connections.lvs b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_connections.lvs index 5d2d5013..3a2c097b 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_connections.lvs +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_connections.lvs @@ -24,7 +24,7 @@ logger.info('Starting GF180 LVS connectivity setup (Inter-layer)') # Inter-layer -connect(pwell_deep, pwell) +connect(pwell_sub, pwell) connect(pwell, ptap) connect(nwell_drw, ntap) connect(ntap, cont_drw) diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_derivations.lvs b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_derivations.lvs index d3eef551..202a30f4 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_derivations.lvs +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_derivations.lvs @@ -32,7 +32,7 @@ nwell_iso = nwell_drw.and(nbulay_drw) nwell_n_iso = nwell_drw.not(nbulay_drw) # pwell -pwell_pre = pwell_drw.join(CHIP.not(nwell_drw.join(pwell_block).join(digisub_drw))) +pwell_pre = CHIP.not(nwell_drw).not(pwell_block).not(digisub_drw) digisub_pre = digisub_drw.sized(-1.nm).not(nwell_drw).not(pwell_block) pwell = pwell_pre.join(digisub_pre) @@ -75,4 +75,4 @@ ptap_holes = ptap.holes ntap_holes = ntap.holes # General pwell -pwell_deep = CHIP.not(digisub_drw).not(pwell_block).not(nbulay_drw.interacting(nwell_holes)) +pwell_sub = CHIP.not(digisub_drw).not(pwell_block).not(nbulay_drw.interacting(nwell_holes)) From 65ca29a881d9765cbedbd072d58af551dd5db849 Mon Sep 17 00:00:00 2001 From: FaragElsayed2 Date: Sun, 19 May 2024 13:15:10 +0300 Subject: [PATCH 2/5] Adding support for all metal res, Updating layers def, Updating resistor extractor, Updating actions version Signed-off-by: FaragElsayed2 --- .github/workflows/linting.yml | 2 +- .github/workflows/lvs_regression.yml | 6 +- .../tech/lvs/rule_decks/cap_connections.lvs | 4 +- .../tech/lvs/rule_decks/cap_derivations.lvs | 6 +- .../tech/lvs/rule_decks/custom_extractor.lvs | 1 + .../tech/lvs/rule_decks/diode_derivations.lvs | 2 +- .../lvs/rule_decks/general_connections.lvs | 26 +- .../lvs/rule_decks/general_derivations.lvs | 8 +- .../lvs/rule_decks/layers_definitions.lvs | 1255 ++++++++++------- .../tech/lvs/rule_decks/res_connections.lvs | 2 +- .../tech/lvs/rule_decks/res_derivations.lvs | 22 +- .../tech/lvs/rule_decks/res_extraction.lvs | 28 +- .../unit/res_devices/layout/lvsres.gds | Bin 1132 -> 0 bytes .../unit/res_devices/layout/res_metal1.gds | Bin 0 -> 1136 bytes .../unit/res_devices/layout/res_metal2.gds | Bin 0 -> 1136 bytes .../unit/res_devices/layout/res_metal3.gds | Bin 0 -> 1136 bytes .../unit/res_devices/layout/res_metal4.gds | Bin 0 -> 1136 bytes .../unit/res_devices/layout/res_metal5.gds | Bin 0 -> 1136 bytes .../unit/res_devices/layout/res_topmetal1.gds | Bin 0 -> 1140 bytes .../unit/res_devices/layout/res_topmetal2.gds | Bin 0 -> 1140 bytes .../unit/res_devices/layout/rhigh.gds | Bin 216568 -> 216568 bytes .../netlist/{lvsres.cdl => res_metal1.cdl} | 8 +- .../unit/res_devices/netlist/res_metal2.cdl | 22 + .../unit/res_devices/netlist/res_metal3.cdl | 22 + .../unit/res_devices/netlist/res_metal4.cdl | 22 + .../unit/res_devices/netlist/res_metal5.cdl | 22 + .../res_devices/netlist/res_topmetal1.cdl | 22 + .../res_devices/netlist/res_topmetal2.cdl | 22 + .../unit/res_devices/netlist/rhigh.cdl | 162 +-- .../unit/res_devices/netlist/rppd.cdl | 162 +-- .../unit/res_devices/netlist/rsil.cdl | 162 +-- 31 files changed, 1178 insertions(+), 810 deletions(-) delete mode 100644 ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/layout/lvsres.gds create mode 100644 ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/layout/res_metal1.gds create mode 100644 ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/layout/res_metal2.gds create mode 100644 ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/layout/res_metal3.gds create mode 100644 ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/layout/res_metal4.gds create mode 100644 ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/layout/res_metal5.gds create mode 100644 ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/layout/res_topmetal1.gds create mode 100644 ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/layout/res_topmetal2.gds rename ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/{lvsres.cdl => res_metal1.cdl} (83%) create mode 100644 ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_metal2.cdl create mode 100644 ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_metal3.cdl create mode 100644 ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_metal4.cdl create mode 100644 ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_metal5.cdl create mode 100644 ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_topmetal1.cdl create mode 100644 ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_topmetal2.cdl diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index ff8a5a54..64a278f2 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -25,7 +25,7 @@ jobs: lint_python: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: 'recursive' - name: Lint with flake8 diff --git a/.github/workflows/lvs_regression.yml b/.github/workflows/lvs_regression.yml index e5313079..5a8f9a17 100644 --- a/.github/workflows/lvs_regression.yml +++ b/.github/workflows/lvs_regression.yml @@ -34,7 +34,7 @@ jobs: outputs: lvs_table: ${{ steps.set-matrix.outputs.lvs_table }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - id: set-matrix run: | cd ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/ @@ -67,7 +67,7 @@ jobs: # Check that KLayout was successfully installed! klayout -v - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: 'recursive' - name: Testing ${{ matrix.part }} for ${{ matrix.test }} @@ -89,7 +89,7 @@ jobs: # Check that KLayout was successfully installed! klayout -v - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: 'recursive' - name: Testing LVS for SG13G2 cells diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/cap_connections.lvs b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/cap_connections.lvs index 52475f7a..645dde29 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/cap_connections.lvs +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/cap_connections.lvs @@ -24,12 +24,12 @@ logger.info('Starting LVS CAP CONNECTIONS') # === cap_mim === -connect(cmim_btm, metal5_drw) +connect(cmim_btm, metal5_con) connect(cmim_top, mim_via) connect(mim_via, topmetal1_con) # === rfcmim === -connect(rfmim_btm, metal5_drw) +connect(rfmim_btm, metal5_con) connect(rfmim_top, mim_via) connect(rfmim_sub, ptap) diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/cap_derivations.lvs b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/cap_derivations.lvs index cbbbd749..707d018f 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/cap_derivations.lvs +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/cap_derivations.lvs @@ -28,8 +28,8 @@ rfmimcap_exc = ind_drw.join(ind_pin) # === MIMCAP === mimcap_exclude = pwell_block.join(rfmimcap_exc) -mim_top = mim_drw.overlapping(topmetal1_drw).and(metal5_drw) -mim_btm = metal5_drw.and(mim_drw).sized(0.6.um) +mim_top = mim_drw.overlapping(topmetal1_con).and(metal5_con) +mim_btm = metal5_con.and(mim_drw).sized(0.6.um) mim_via = vmim_drw.join(topvia1_drw).and(mim_drw) topvia1_n_cap = topvia1_drw.not(mim_via) @@ -44,7 +44,7 @@ rfmim_top = mim_top.and(rfmim_area).not(rfmimcap_exc) rfmim_btm = mim_btm.and(rfmim_area).covering(rfmim_top) rfmim_dev = mim_drw.covering(rfmim_top).and(rfmim_btm) rfmim_sub = ptap.extents.interacting(rfmim_area) -rfmeas_mk = metal5_drw.overlapping(rfmim_btm).and(rfmim_area) +rfmeas_mk = metal5_con.overlapping(rfmim_btm).and(rfmim_area) # === svaricap === cap_exc = nsd_drw.join(trans_drw).join(emwind_drw) diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/custom_extractor.lvs b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/custom_extractor.lvs index 9aea0ffa..55a7a4e8 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/custom_extractor.lvs +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/custom_extractor.lvs @@ -171,6 +171,7 @@ class GeneralNTerminalExtractor < RBA::GenericDeviceExtractor if bends.positive? poly_sp_polygon = meas_mk.interacting(dev) poly_sp = get_notch_min(poly_sp_polygon, 10 * length) + length = length + width end # Default values diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/diode_derivations.lvs b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/diode_derivations.lvs index 2d79ab04..2b367f9e 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/diode_derivations.lvs +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/diode_derivations.lvs @@ -48,7 +48,7 @@ schottky_mk = recog_diode.and(thickgateox_drw).not(diode_exclude) .and(salblock_drw).and(nsd_block).and(nwell_holes) .not(psd_drw).not(pwell).not(diode_exclude) -schottcky_p_ = cont_drw.and(activ_drw).and(metal1_drw) +schottcky_p_ = cont_drw.and(activ_drw).and(metal1_con) .and(schottky_mk) # schottky_nbl1 is a fixed device (0.3um X 1.0 um) diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_connections.lvs b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_connections.lvs index 3a2c097b..a3062e1f 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_connections.lvs +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_connections.lvs @@ -34,26 +34,24 @@ connect(nsd_fet, cont_drw) connect(psd_fet, cont_drw) connect(cont_drw, metal1_con) connect(metal1_con, via1_drw) -connect(via1_drw, metal2_drw) -connect(metal2_drw, via2_drw) -connect(via2_drw, metal3_drw) -connect(metal3_drw, via3_drw) -connect(via3_drw, metal4_drw) -connect(metal4_drw, via4_drw) -connect(via4_drw, metal5_drw) -connect(metal5_drw, topvia1_n_cap) +connect(via1_drw, metal2_con) +connect(metal2_con, via2_drw) +connect(via2_drw, metal3_con) +connect(metal3_con, via3_drw) +connect(via3_drw, metal4_con) +connect(metal4_con, via4_drw) +connect(via4_drw, metal5_con) +connect(metal5_con, topvia1_n_cap) connect(topvia1_n_cap, topmetal1_con) connect(topmetal1_con, topvia2_drw) connect(topvia2_drw, topmetal2_con) # Attaching labels -connect(activ_drw, activ_label) -connect(poly_con, gatpoly_label) connect(metal1_con, metal1_text) -connect(metal2_drw, metal2_text) -connect(metal3_drw, metal3_text) -connect(metal4_drw, metal4_text) -connect(metal5_drw, metal5_text) +connect(metal2_con, metal2_text) +connect(metal3_con, metal3_text) +connect(metal4_con, metal4_text) +connect(metal5_con, metal5_text) connect(topmetal1_con, topmetal1_text) connect(topmetal2_con, topmetal2_text) diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_derivations.lvs b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_derivations.lvs index 202a30f4..80874f3b 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_derivations.lvs +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_derivations.lvs @@ -49,8 +49,12 @@ pactiv = activ_drw.and(psd) res_mk = polyres_drw.join(res_drw) poly_con = gatpoly_drw.not(res_mk) metal1_con = metal1_drw.not(metal1_res) -topmetal1_con = topmetal1_drw.not(ind_drw) -topmetal2_con = topmetal2_drw.not(ind_drw) +metal2_con = metal2_drw.not(metal2_res) +metal3_con = metal3_drw.not(metal3_res) +metal4_con = metal4_drw.not(metal4_res) +metal5_con = metal5_drw.not(metal5_res) +topmetal1_con = topmetal1_drw.not(topmetal1_res).not(ind_drw) +topmetal2_con = topmetal2_drw.not(topmetal2_res).not(ind_drw) # Gate FETs tgate = gatpoly_drw.and(activ_drw).not(res_mk) diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/layers_definitions.lvs b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/layers_definitions.lvs index 546cce2b..f827bb76 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/layers_definitions.lvs +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/layers_definitions.lvs @@ -22,1304 +22,1495 @@ #================================================ polygons_count = 0 -logger.info('Read in polygons from layers.') +logger.info("Read in polygons from layers.") -def get_polygons(lay_no, lay_dt) - if $run_mode == 'deep' - polygons(lay_no, lay_dt) +def get_polygons(l, d) + if $run_mode == "deep" + polygons(l, d) else - polygons(lay_no, lay_dt).merged + polygons(l, d).merged end end -l0_drw = get_polygons(0, 0) -count = l0_drw.count -logger.info("l0_drw has #{count} polygons") -polygons_count += count - activ_drw = get_polygons(1, 0) -count = activ_drw.count +count = activ_drw.count() logger.info("activ_drw has #{count} polygons") polygons_count += count -activ_label = labels(1, 1) -count = activ_label.count -logger.info("activ_label has #{count} polygons") -polygons_count += count - activ_pin = get_polygons(1, 2) -count = activ_pin.count +count = activ_pin.count() logger.info("activ_pin has #{count} polygons") polygons_count += count -activ_net = get_polygons(1, 3) -count = activ_net.count -logger.info("activ_net has #{count} polygons") -polygons_count += count - -activ_boundary = get_polygons(1, 4) -count = activ_boundary.count -logger.info("activ_boundary has #{count} polygons") -polygons_count += count - -activ_lvs = get_polygons(1, 19) -count = activ_lvs.count -logger.info("activ_lvs has #{count} polygons") -polygons_count += count - activ_mask = get_polygons(1, 20) -count = activ_mask.count +count = activ_mask.count() logger.info("activ_mask has #{count} polygons") polygons_count += count activ_filler = get_polygons(1, 22) -count = activ_filler.count +count = activ_filler.count() logger.info("activ_filler has #{count} polygons") polygons_count += count activ_nofill = get_polygons(1, 23) -count = activ_nofill.count +count = activ_nofill.count() logger.info("activ_nofill has #{count} polygons") polygons_count += count activ_opc = get_polygons(1, 26) -count = activ_opc.count +count = activ_opc.count() logger.info("activ_opc has #{count} polygons") polygons_count += count activ_iopc = get_polygons(1, 27) -count = activ_iopc.count +count = activ_iopc.count() logger.info("activ_iopc has #{count} polygons") polygons_count += count -l2_drw = get_polygons(2, 0) -count = l2_drw.count -logger.info("l2_drw has #{count} polygons") +activ_noqrc = get_polygons(1, 28) +count = activ_noqrc.count() +logger.info("activ_noqrc has #{count} polygons") polygons_count += count biwind_drw = get_polygons(3, 0) -count = biwind_drw.count +count = biwind_drw.count() logger.info("biwind_drw has #{count} polygons") polygons_count += count biwind_opc = get_polygons(3, 26) -count = biwind_opc.count +count = biwind_opc.count() logger.info("biwind_opc has #{count} polygons") polygons_count += count gatpoly_drw = get_polygons(5, 0) -count = gatpoly_drw.count +count = gatpoly_drw.count() logger.info("gatpoly_drw has #{count} polygons") polygons_count += count -gatpoly_label = labels(5, 1) -count = gatpoly_label.count -logger.info("gatpoly_label has #{count} polygons") -polygons_count += count - gatpoly_pin = get_polygons(5, 2) -count = gatpoly_pin.count +count = gatpoly_pin.count() logger.info("gatpoly_pin has #{count} polygons") polygons_count += count -gatpoly_net = get_polygons(5, 3) -count = gatpoly_net.count -logger.info("gatpoly_net has #{count} polygons") -polygons_count += count - -gatpoly_boundary = get_polygons(5, 4) -count = gatpoly_boundary.count -logger.info("gatpoly_boundary has #{count} polygons") -polygons_count += count - gatpoly_filler = get_polygons(5, 22) -count = gatpoly_filler.count +count = gatpoly_filler.count() logger.info("gatpoly_filler has #{count} polygons") polygons_count += count gatpoly_nofill = get_polygons(5, 23) -count = gatpoly_nofill.count +count = gatpoly_nofill.count() logger.info("gatpoly_nofill has #{count} polygons") polygons_count += count gatpoly_opc = get_polygons(5, 26) -count = gatpoly_opc.count +count = gatpoly_opc.count() logger.info("gatpoly_opc has #{count} polygons") polygons_count += count gatpoly_iopc = get_polygons(5, 27) -count = gatpoly_iopc.count +count = gatpoly_iopc.count() logger.info("gatpoly_iopc has #{count} polygons") polygons_count += count -cont_drw = get_polygons(6, 0) -count = cont_drw.count -logger.info("cont_drw has #{count} polygons") -polygons_count += count - -cont_net = get_polygons(6, 3) -count = cont_net.count -logger.info("cont_net has #{count} polygons") +gatpoly_noqrc = get_polygons(5, 28) +count = gatpoly_noqrc.count() +logger.info("gatpoly_noqrc has #{count} polygons") polygons_count += count -cont_boundary = get_polygons(6, 4) -count = cont_boundary.count -logger.info("cont_boundary has #{count} polygons") +cont_drw = get_polygons(6, 0) +count = cont_drw.count() +logger.info("cont_drw has #{count} polygons") polygons_count += count cont_opc = get_polygons(6, 26) -count = cont_opc.count +count = cont_opc.count() logger.info("cont_opc has #{count} polygons") polygons_count += count -nsd_drw = get_polygons(7, 0) -count = nsd_drw.count +nsd_drw = get_polygons(7, 0) +count = nsd_drw.count() logger.info("nsd_drw has #{count} polygons") polygons_count += count nsd_block = get_polygons(7, 21) -count = nsd_block.count +count = nsd_block.count() logger.info("nsd_block has #{count} polygons") polygons_count += count metal1_drw = get_polygons(8, 0) -count = metal1_drw.count +count = metal1_drw.count() logger.info("metal1_drw has #{count} polygons") polygons_count += count -metal1_label = labels(8, 1) -count = metal1_label.count -logger.info("metal1_label has #{count} polygons") -polygons_count += count - metal1_pin = get_polygons(8, 2) -count = metal1_pin.count +count = metal1_pin.count() logger.info("metal1_pin has #{count} polygons") polygons_count += count -metal1_net = get_polygons(8, 3) -count = metal1_net.count -logger.info("metal1_net has #{count} polygons") +metal1_mask = get_polygons(8, 20) +count = metal1_mask.count() +logger.info("metal1_mask has #{count} polygons") +polygons_count += count + +metal1_filler = get_polygons(8, 22) +count = metal1_filler.count() +logger.info("metal1_filler has #{count} polygons") +polygons_count += count + +metal1_nofill = get_polygons(8, 23) +count = metal1_nofill.count() +logger.info("metal1_nofill has #{count} polygons") polygons_count += count -metal1_boundary = get_polygons(8, 4) -count = metal1_boundary.count -logger.info("metal1_boundary has #{count} polygons") +metal1_slit = get_polygons(8, 24) +count = metal1_slit.count() +logger.info("metal1_slit has #{count} polygons") polygons_count += count metal1_text = labels(8, 25) -count = metal1_text.count +count = metal1_text.count() logger.info("metal1_text has #{count} polygons") polygons_count += count metal1_opc = get_polygons(8, 26) -count = metal1_opc.count +count = metal1_opc.count() logger.info("metal1_opc has #{count} polygons") polygons_count += count +metal1_noqrc = get_polygons(8, 28) +count = metal1_noqrc.count() +logger.info("metal1_noqrc has #{count} polygons") +polygons_count += count + metal1_res = get_polygons(8, 29) -count = metal1_res.count +count = metal1_res.count() logger.info("metal1_res has #{count} polygons") polygons_count += count metal1_iprobe = get_polygons(8, 33) -count = metal1_iprobe.count +count = metal1_iprobe.count() logger.info("metal1_iprobe has #{count} polygons") polygons_count += count metal1_diffprb = get_polygons(8, 34) -count = metal1_diffprb.count +count = metal1_diffprb.count() logger.info("metal1_diffprb has #{count} polygons") polygons_count += count passiv_drw = get_polygons(9, 0) -count = passiv_drw.count +count = passiv_drw.count() logger.info("passiv_drw has #{count} polygons") polygons_count += count -passiv_label = labels(9, 1) -count = passiv_label.count -logger.info("passiv_label has #{count} polygons") -polygons_count += count - passiv_pin = get_polygons(9, 2) -count = passiv_pin.count +count = passiv_pin.count() logger.info("passiv_pin has #{count} polygons") polygons_count += count -passiv_net = get_polygons(9, 3) -count = passiv_net.count -logger.info("passiv_net has #{count} polygons") -polygons_count += count - -passiv_boundary = get_polygons(9, 4) -count = passiv_boundary.count -logger.info("passiv_boundary has #{count} polygons") -polygons_count += count - -passiv_pdl = get_polygons(9, 40) -count = passiv_pdl.count -logger.info("passiv_pdl has #{count} polygons") -polygons_count += count - passiv_sbump = get_polygons(9, 36) -count = passiv_sbump.count +count = passiv_sbump.count() logger.info("passiv_sbump has #{count} polygons") polygons_count += count passiv_pillar = get_polygons(9, 35) -count = passiv_pillar.count +count = passiv_pillar.count() logger.info("passiv_pillar has #{count} polygons") polygons_count += count -metal2_drw = get_polygons(10, 0) -count = metal2_drw.count -logger.info("metal2_drw has #{count} polygons") +passiv_pdl = get_polygons(9, 40) +count = passiv_pdl.count() +logger.info("passiv_pdl has #{count} polygons") polygons_count += count -metal2_label = labels(10, 1) -count = metal2_label.count -logger.info("metal2_label has #{count} polygons") +metal2_drw = get_polygons(10, 0) +count = metal2_drw.count() +logger.info("metal2_drw has #{count} polygons") polygons_count += count metal2_pin = get_polygons(10, 2) -count = metal2_pin.count +count = metal2_pin.count() logger.info("metal2_pin has #{count} polygons") polygons_count += count -metal2_net = get_polygons(10, 3) -count = metal2_net.count -logger.info("metal2_net has #{count} polygons") +metal2_mask = get_polygons(10, 20) +count = metal2_mask.count() +logger.info("metal2_mask has #{count} polygons") +polygons_count += count + +metal2_filler = get_polygons(10, 22) +count = metal2_filler.count() +logger.info("metal2_filler has #{count} polygons") +polygons_count += count + +metal2_nofill = get_polygons(10, 23) +count = metal2_nofill.count() +logger.info("metal2_nofill has #{count} polygons") polygons_count += count -metal2_boundary = get_polygons(10, 4) -count = metal2_boundary.count -logger.info("metal2_boundary has #{count} polygons") +metal2_slit = get_polygons(10, 24) +count = metal2_slit.count() +logger.info("metal2_slit has #{count} polygons") polygons_count += count metal2_text = labels(10, 25) -count = metal2_text.count +count = metal2_text.count() logger.info("metal2_text has #{count} polygons") polygons_count += count metal2_opc = get_polygons(10, 26) -count = metal2_opc.count +count = metal2_opc.count() logger.info("metal2_opc has #{count} polygons") polygons_count += count +metal2_noqrc = get_polygons(10, 28) +count = metal2_noqrc.count() +logger.info("metal2_noqrc has #{count} polygons") +polygons_count += count + metal2_res = get_polygons(10, 29) -count = metal2_res.count +count = metal2_res.count() logger.info("metal2_res has #{count} polygons") polygons_count += count metal2_iprobe = get_polygons(10, 33) -count = metal2_iprobe.count +count = metal2_iprobe.count() logger.info("metal2_iprobe has #{count} polygons") polygons_count += count metal2_diffprb = get_polygons(10, 34) -count = metal2_diffprb.count +count = metal2_diffprb.count() logger.info("metal2_diffprb has #{count} polygons") polygons_count += count baspoly_drw = get_polygons(13, 0) -count = baspoly_drw.count +count = baspoly_drw.count() logger.info("baspoly_drw has #{count} polygons") polygons_count += count -baspoly_label = labels(13, 1) -count = baspoly_label.count -logger.info("baspoly_label has #{count} polygons") -polygons_count += count - baspoly_pin = get_polygons(13, 2) -count = baspoly_pin.count +count = baspoly_pin.count() logger.info("baspoly_pin has #{count} polygons") polygons_count += count -baspoly_net = get_polygons(13, 3) -count = baspoly_net.count -logger.info("baspoly_net has #{count} polygons") -polygons_count += count - -baspoly_boundary = get_polygons(13, 4) -count = baspoly_boundary.count -logger.info("baspoly_boundary has #{count} polygons") -polygons_count += count - -psd_drw = get_polygons(14, 0) -count = psd_drw.count +psd_drw = get_polygons(14, 0) +count = psd_drw.count() logger.info("psd_drw has #{count} polygons") polygons_count += count nldb_drw = get_polygons(15, 0) -count = nldb_drw.count +count = nldb_drw.count() logger.info("nldb_drw has #{count} polygons") polygons_count += count digibnd_drw = get_polygons(16, 0) -count = digibnd_drw.count +count = digibnd_drw.count() logger.info("digibnd_drw has #{count} polygons") polygons_count += count -digibnd_drawing0 = get_polygons(16, 10) -count = digibnd_drawing0.count -logger.info("digibnd_drawing0 has #{count} polygons") -polygons_count += count - via1_drw = get_polygons(19, 0) -count = via1_drw.count +count = via1_drw.count() logger.info("via1_drw has #{count} polygons") polygons_count += count -via1_net = get_polygons(19, 3) -count = via1_net.count -logger.info("via1_net has #{count} polygons") -polygons_count += count - -via1_boundary = get_polygons(19, 4) -count = via1_boundary.count -logger.info("via1_boundary has #{count} polygons") -polygons_count += count - backmetal1_drw = get_polygons(20, 0) -count = backmetal1_drw.count +count = backmetal1_drw.count() logger.info("backmetal1_drw has #{count} polygons") polygons_count += count -backmetal1_label = labels(20, 1) -count = backmetal1_label.count -logger.info("backmetal1_label has #{count} polygons") -polygons_count += count - backmetal1_pin = get_polygons(20, 2) -count = backmetal1_pin.count +count = backmetal1_pin.count() logger.info("backmetal1_pin has #{count} polygons") polygons_count += count -backmetal1_net = get_polygons(20, 3) -count = backmetal1_net.count -logger.info("backmetal1_net has #{count} polygons") +backmetal1_mask = get_polygons(20, 20) +count = backmetal1_mask.count() +logger.info("backmetal1_mask has #{count} polygons") polygons_count += count -backmetal1_boundary = get_polygons(20, 4) -count = backmetal1_boundary.count -logger.info("backmetal1_boundary has #{count} polygons") +backmetal1_filler = get_polygons(20, 22) +count = backmetal1_filler.count() +logger.info("backmetal1_filler has #{count} polygons") +polygons_count += count + +backmetal1_nofill = get_polygons(20, 23) +count = backmetal1_nofill.count() +logger.info("backmetal1_nofill has #{count} polygons") +polygons_count += count + +backmetal1_slit = get_polygons(20, 24) +count = backmetal1_slit.count() +logger.info("backmetal1_slit has #{count} polygons") polygons_count += count backmetal1_text = labels(20, 25) -count = backmetal1_text.count +count = backmetal1_text.count() logger.info("backmetal1_text has #{count} polygons") polygons_count += count backmetal1_opc = get_polygons(20, 26) -count = backmetal1_opc.count +count = backmetal1_opc.count() logger.info("backmetal1_opc has #{count} polygons") polygons_count += count +backmetal1_noqrc = get_polygons(20, 28) +count = backmetal1_noqrc.count() +logger.info("backmetal1_noqrc has #{count} polygons") +polygons_count += count + backmetal1_res = get_polygons(20, 29) -count = backmetal1_res.count +count = backmetal1_res.count() logger.info("backmetal1_res has #{count} polygons") polygons_count += count backmetal1_iprobe = get_polygons(20, 33) -count = backmetal1_iprobe.count +count = backmetal1_iprobe.count() logger.info("backmetal1_iprobe has #{count} polygons") polygons_count += count backmetal1_diffprb = get_polygons(20, 34) -count = backmetal1_diffprb.count +count = backmetal1_diffprb.count() logger.info("backmetal1_diffprb has #{count} polygons") polygons_count += count backpassiv_drw = get_polygons(23, 0) -count = backpassiv_drw.count +count = backpassiv_drw.count() logger.info("backpassiv_drw has #{count} polygons") polygons_count += count -res_drw = get_polygons(24, 0) -count = res_drw.count +res_drw = get_polygons(24, 0) +count = res_drw.count() logger.info("res_drw has #{count} polygons") polygons_count += count -res_label = labels(24, 1) -count = res_label.count -logger.info("res_label has #{count} polygons") -polygons_count += count - sram_drw = get_polygons(25, 0) -count = sram_drw.count +count = sram_drw.count() logger.info("sram_drw has #{count} polygons") polygons_count += count -sram_label = labels(25, 1) -count = sram_label.count -logger.info("sram_label has #{count} polygons") -polygons_count += count - -sram_boundary = get_polygons(25, 4) -count = sram_boundary.count -logger.info("sram_boundary has #{count} polygons") -polygons_count += count - trans_drw = get_polygons(26, 0) -count = trans_drw.count +count = trans_drw.count() logger.info("trans_drw has #{count} polygons") polygons_count += count -ind_drw = get_polygons(27, 0) -count = ind_drw.count +ind_drw = get_polygons(27, 0) +count = ind_drw.count() logger.info("ind_drw has #{count} polygons") polygons_count += count -ind_pin = get_polygons(27, 2) -count = ind_pin.count +ind_pin = get_polygons(27, 2) +count = ind_pin.count() logger.info("ind_pin has #{count} polygons") polygons_count += count -ind_boundary = get_polygons(27, 4) -count = ind_boundary.count -logger.info("ind_boundary has #{count} polygons") -polygons_count += count - ind_text = labels(27, 25) -count = ind_text.count +count = ind_text.count() logger.info("ind_text has #{count} polygons") polygons_count += count salblock_drw = get_polygons(28, 0) -count = salblock_drw.count +count = salblock_drw.count() logger.info("salblock_drw has #{count} polygons") polygons_count += count via2_drw = get_polygons(29, 0) -count = via2_drw.count +count = via2_drw.count() logger.info("via2_drw has #{count} polygons") polygons_count += count -via2_net = get_polygons(29, 3) -count = via2_net.count -logger.info("via2_net has #{count} polygons") -polygons_count += count - -via2_boundary = get_polygons(29, 4) -count = via2_boundary.count -logger.info("via2_boundary has #{count} polygons") -polygons_count += count - metal3_drw = get_polygons(30, 0) -count = metal3_drw.count +count = metal3_drw.count() logger.info("metal3_drw has #{count} polygons") polygons_count += count -metal3_label = labels(30, 1) -count = metal3_label.count -logger.info("metal3_label has #{count} polygons") -polygons_count += count - metal3_pin = get_polygons(30, 2) -count = metal3_pin.count +count = metal3_pin.count() logger.info("metal3_pin has #{count} polygons") polygons_count += count -metal3_net = get_polygons(30, 3) -count = metal3_net.count -logger.info("metal3_net has #{count} polygons") +metal3_mask = get_polygons(30, 20) +count = metal3_mask.count() +logger.info("metal3_mask has #{count} polygons") +polygons_count += count + +metal3_filler = get_polygons(30, 22) +count = metal3_filler.count() +logger.info("metal3_filler has #{count} polygons") polygons_count += count -metal3_boundary = get_polygons(30, 4) -count = metal3_boundary.count -logger.info("metal3_boundary has #{count} polygons") +metal3_nofill = get_polygons(30, 23) +count = metal3_nofill.count() +logger.info("metal3_nofill has #{count} polygons") +polygons_count += count + +metal3_slit = get_polygons(30, 24) +count = metal3_slit.count() +logger.info("metal3_slit has #{count} polygons") polygons_count += count metal3_text = labels(30, 25) -count = metal3_text.count +count = metal3_text.count() logger.info("metal3_text has #{count} polygons") polygons_count += count metal3_opc = get_polygons(30, 26) -count = metal3_opc.count +count = metal3_opc.count() logger.info("metal3_opc has #{count} polygons") polygons_count += count +metal3_noqrc = get_polygons(30, 28) +count = metal3_noqrc.count() +logger.info("metal3_noqrc has #{count} polygons") +polygons_count += count + metal3_res = get_polygons(30, 29) -count = metal3_res.count +count = metal3_res.count() logger.info("metal3_res has #{count} polygons") polygons_count += count metal3_iprobe = get_polygons(30, 33) -count = metal3_iprobe.count +count = metal3_iprobe.count() logger.info("metal3_iprobe has #{count} polygons") polygons_count += count metal3_diffprb = get_polygons(30, 34) -count = metal3_diffprb.count +count = metal3_diffprb.count() logger.info("metal3_diffprb has #{count} polygons") polygons_count += count nwell_drw = get_polygons(31, 0) -count = nwell_drw.count +count = nwell_drw.count() logger.info("nwell_drw has #{count} polygons") polygons_count += count -nwell_label = labels(31, 1) -count = nwell_label.count -logger.info("nwell_label has #{count} polygons") -polygons_count += count - nwell_pin = get_polygons(31, 2) -count = nwell_pin.count +count = nwell_pin.count() logger.info("nwell_pin has #{count} polygons") polygons_count += count -nwell_net = get_polygons(31, 3) -count = nwell_net.count -logger.info("nwell_net has #{count} polygons") -polygons_count += count - -nwell_boundary = get_polygons(31, 4) -count = nwell_boundary.count -logger.info("nwell_boundary has #{count} polygons") -polygons_count += count - nbulay_drw = get_polygons(32, 0) -count = nbulay_drw.count +count = nbulay_drw.count() logger.info("nbulay_drw has #{count} polygons") polygons_count += count -nbulay_label = labels(32, 1) -count = nbulay_label.count -logger.info("nbulay_label has #{count} polygons") -polygons_count += count - nbulay_pin = get_polygons(32, 2) -count = nbulay_pin.count +count = nbulay_pin.count() logger.info("nbulay_pin has #{count} polygons") polygons_count += count -nbulay_net = get_polygons(32, 3) -count = nbulay_net.count -logger.info("nbulay_net has #{count} polygons") -polygons_count += count - -nbulay_boundary = get_polygons(32, 4) -count = nbulay_boundary.count -logger.info("nbulay_boundary has #{count} polygons") -polygons_count += count - nbulay_block = get_polygons(32, 21) -count = nbulay_block.count +count = nbulay_block.count() logger.info("nbulay_block has #{count} polygons") polygons_count += count emwind_drw = get_polygons(33, 0) -count = emwind_drw.count +count = emwind_drw.count() logger.info("emwind_drw has #{count} polygons") polygons_count += count emwind_opc = get_polygons(33, 26) -count = emwind_opc.count +count = emwind_opc.count() logger.info("emwind_opc has #{count} polygons") polygons_count += count deepco_drw = get_polygons(35, 0) -count = deepco_drw.count +count = deepco_drw.count() logger.info("deepco_drw has #{count} polygons") polygons_count += count -mim_drw = get_polygons(36, 0) -count = mim_drw.count +mim_drw = get_polygons(36, 0) +count = mim_drw.count() logger.info("mim_drw has #{count} polygons") polygons_count += count -mim_net = get_polygons(36, 3) -count = mim_net.count -logger.info("mim_net has #{count} polygons") -polygons_count += count - -mim_boundary = get_polygons(36, 4) -count = mim_boundary.count -logger.info("mim_boundary has #{count} polygons") -polygons_count += count - edgeseal_drw = get_polygons(39, 0) -count = edgeseal_drw.count +count = edgeseal_drw.count() logger.info("edgeseal_drw has #{count} polygons") polygons_count += count -edgeseal_boundary = get_polygons(39, 4) -count = edgeseal_boundary.count -logger.info("edgeseal_boundary has #{count} polygons") -polygons_count += count - substrate_drw = get_polygons(40, 0) -count = substrate_drw.count +count = substrate_drw.count() logger.info("substrate_drw has #{count} polygons") polygons_count += count substrate_text = labels(40, 25) -count = substrate_text.count +count = substrate_text.count() logger.info("substrate_text has #{count} polygons") polygons_count += count dfpad_drw = get_polygons(41, 0) -count = dfpad_drw.count +count = dfpad_drw.count() logger.info("dfpad_drw has #{count} polygons") polygons_count += count dfpad_pillar = get_polygons(41, 35) -count = dfpad_pillar.count +count = dfpad_pillar.count() logger.info("dfpad_pillar has #{count} polygons") polygons_count += count dfpad_sbump = get_polygons(41, 36) -count = dfpad_sbump.count +count = dfpad_sbump.count() logger.info("dfpad_sbump has #{count} polygons") polygons_count += count thickgateox_drw = get_polygons(44, 0) -count = thickgateox_drw.count +count = thickgateox_drw.count() logger.info("thickgateox_drw has #{count} polygons") polygons_count += count pldb_drw = get_polygons(45, 0) -count = pldb_drw.count +count = pldb_drw.count() logger.info("pldb_drw has #{count} polygons") polygons_count += count pwell_drw = get_polygons(46, 0) -count = pwell_drw.count +count = pwell_drw.count() logger.info("pwell_drw has #{count} polygons") polygons_count += count -pwell_label = labels(46, 1) -count = pwell_label.count -logger.info("pwell_label has #{count} polygons") -polygons_count += count - pwell_pin = get_polygons(46, 2) -count = pwell_pin.count +count = pwell_pin.count() logger.info("pwell_pin has #{count} polygons") polygons_count += count -pwell_net = get_polygons(46, 3) -count = pwell_net.count -logger.info("pwell_net has #{count} polygons") -polygons_count += count - -pwell_boundary = get_polygons(46, 4) -count = pwell_boundary.count -logger.info("pwell_boundary has #{count} polygons") -polygons_count += count - pwell_block = get_polygons(46, 21) -count = pwell_block.count +count = pwell_block.count() logger.info("pwell_block has #{count} polygons") polygons_count += count -via3_drw = get_polygons(49, 0) -count = via3_drw.count -logger.info("via3_drw has #{count} polygons") -polygons_count += count - -via3_net = get_polygons(49, 3) -count = via3_net.count -logger.info("via3_net has #{count} polygons") +ic_drw = get_polygons(48, 0) +count = ic_drw.count() +logger.info("ic_drw has #{count} polygons") polygons_count += count -via3_boundary = get_polygons(49, 4) -count = via3_boundary.count -logger.info("via3_boundary has #{count} polygons") +via3_drw = get_polygons(49, 0) +count = via3_drw.count() +logger.info("via3_drw has #{count} polygons") polygons_count += count metal4_drw = get_polygons(50, 0) -count = metal4_drw.count +count = metal4_drw.count() logger.info("metal4_drw has #{count} polygons") polygons_count += count -metal4_label = labels(50, 1) -count = metal4_label.count -logger.info("metal4_label has #{count} polygons") -polygons_count += count - metal4_pin = get_polygons(50, 2) -count = metal4_pin.count +count = metal4_pin.count() logger.info("metal4_pin has #{count} polygons") polygons_count += count -metal4_net = get_polygons(50, 3) -count = metal4_net.count -logger.info("metal4_net has #{count} polygons") +metal4_mask = get_polygons(50, 20) +count = metal4_mask.count() +logger.info("metal4_mask has #{count} polygons") polygons_count += count -metal4_boundary = get_polygons(50, 4) -count = metal4_boundary.count -logger.info("metal4_boundary has #{count} polygons") +metal4_filler = get_polygons(50, 22) +count = metal4_filler.count() +logger.info("metal4_filler has #{count} polygons") +polygons_count += count + +metal4_nofill = get_polygons(50, 23) +count = metal4_nofill.count() +logger.info("metal4_nofill has #{count} polygons") +polygons_count += count + +metal4_slit = get_polygons(50, 24) +count = metal4_slit.count() +logger.info("metal4_slit has #{count} polygons") polygons_count += count metal4_text = labels(50, 25) -count = metal4_text.count +count = metal4_text.count() logger.info("metal4_text has #{count} polygons") polygons_count += count metal4_opc = get_polygons(50, 26) -count = metal4_opc.count +count = metal4_opc.count() logger.info("metal4_opc has #{count} polygons") polygons_count += count +metal4_noqrc = get_polygons(50, 28) +count = metal4_noqrc.count() +logger.info("metal4_noqrc has #{count} polygons") +polygons_count += count + metal4_res = get_polygons(50, 29) -count = metal4_res.count +count = metal4_res.count() logger.info("metal4_res has #{count} polygons") polygons_count += count metal4_iprobe = get_polygons(50, 33) -count = metal4_iprobe.count +count = metal4_iprobe.count() logger.info("metal4_iprobe has #{count} polygons") polygons_count += count metal4_diffprb = get_polygons(50, 34) -count = metal4_diffprb.count +count = metal4_diffprb.count() logger.info("metal4_diffprb has #{count} polygons") polygons_count += count heattrans_drw = get_polygons(51, 0) -count = heattrans_drw.count +count = heattrans_drw.count() logger.info("heattrans_drw has #{count} polygons") polygons_count += count heatres_drw = get_polygons(52, 0) -count = heatres_drw.count +count = heatres_drw.count() logger.info("heatres_drw has #{count} polygons") polygons_count += count -fbe_drw = get_polygons(54, 0) -count = fbe_drw.count +fbe_drw = get_polygons(54, 0) +count = fbe_drw.count() logger.info("fbe_drw has #{count} polygons") polygons_count += count empoly_drw = get_polygons(55, 0) -count = empoly_drw.count +count = empoly_drw.count() logger.info("empoly_drw has #{count} polygons") polygons_count += count digisub_drw = get_polygons(60, 0) -count = digisub_drw.count +count = digisub_drw.count() logger.info("digisub_drw has #{count} polygons") polygons_count += count nodrc_drw = get_polygons(62, 0) -count = nodrc_drw.count +count = nodrc_drw.count() logger.info("nodrc_drw has #{count} polygons") polygons_count += count text_drw = labels(63, 0) -count = text_drw.count +count = text_drw.count() logger.info("text_drw has #{count} polygons") polygons_count += count via4_drw = get_polygons(66, 0) -count = via4_drw.count +count = via4_drw.count() logger.info("via4_drw has #{count} polygons") polygons_count += count -via4_net = get_polygons(66, 3) -count = via4_net.count -logger.info("via4_net has #{count} polygons") -polygons_count += count - -via4_boundary = get_polygons(66, 4) -count = via4_boundary.count -logger.info("via4_boundary has #{count} polygons") -polygons_count += count - metal5_drw = get_polygons(67, 0) -count = metal5_drw.count +count = metal5_drw.count() logger.info("metal5_drw has #{count} polygons") polygons_count += count -metal5_label = labels(67, 1) -count = metal5_label.count -logger.info("metal5_label has #{count} polygons") -polygons_count += count - metal5_pin = get_polygons(67, 2) -count = metal5_pin.count +count = metal5_pin.count() logger.info("metal5_pin has #{count} polygons") polygons_count += count -metal5_net = get_polygons(67, 3) -count = metal5_net.count -logger.info("metal5_net has #{count} polygons") +metal5_mask = get_polygons(67, 20) +count = metal5_mask.count() +logger.info("metal5_mask has #{count} polygons") polygons_count += count -metal5_boundary = get_polygons(67, 4) -count = metal5_boundary.count -logger.info("metal5_boundary has #{count} polygons") +metal5_filler = get_polygons(67, 22) +count = metal5_filler.count() +logger.info("metal5_filler has #{count} polygons") +polygons_count += count + +metal5_nofill = get_polygons(67, 23) +count = metal5_nofill.count() +logger.info("metal5_nofill has #{count} polygons") +polygons_count += count + +metal5_slit = get_polygons(67, 24) +count = metal5_slit.count() +logger.info("metal5_slit has #{count} polygons") polygons_count += count metal5_text = labels(67, 25) -count = metal5_text.count +count = metal5_text.count() logger.info("metal5_text has #{count} polygons") polygons_count += count metal5_opc = get_polygons(67, 26) -count = metal5_opc.count +count = metal5_opc.count() logger.info("metal5_opc has #{count} polygons") polygons_count += count +metal5_noqrc = get_polygons(67, 28) +count = metal5_noqrc.count() +logger.info("metal5_noqrc has #{count} polygons") +polygons_count += count + metal5_res = get_polygons(67, 29) -count = metal5_res.count +count = metal5_res.count() logger.info("metal5_res has #{count} polygons") polygons_count += count metal5_iprobe = get_polygons(67, 33) -count = metal5_iprobe.count +count = metal5_iprobe.count() logger.info("metal5_iprobe has #{count} polygons") polygons_count += count metal5_diffprb = get_polygons(67, 34) -count = metal5_diffprb.count +count = metal5_diffprb.count() logger.info("metal5_diffprb has #{count} polygons") polygons_count += count radhard_drw = get_polygons(68, 0) -count = radhard_drw.count +count = radhard_drw.count() logger.info("radhard_drw has #{count} polygons") polygons_count += count memcap_drw = get_polygons(69, 0) -count = memcap_drw.count +count = memcap_drw.count() logger.info("memcap_drw has #{count} polygons") polygons_count += count varicap_drw = get_polygons(70, 0) -count = varicap_drw.count +count = varicap_drw.count() logger.info("varicap_drw has #{count} polygons") polygons_count += count intbondvia_drw = get_polygons(72, 0) -count = intbondvia_drw.count +count = intbondvia_drw.count() logger.info("intbondvia_drw has #{count} polygons") polygons_count += count intbondmet_drw = get_polygons(73, 0) -count = intbondmet_drw.count +count = intbondmet_drw.count() logger.info("intbondmet_drw has #{count} polygons") polygons_count += count devbondvia_drw = get_polygons(74, 0) -count = devbondvia_drw.count +count = devbondvia_drw.count() logger.info("devbondvia_drw has #{count} polygons") polygons_count += count devbondmet_drw = get_polygons(75, 0) -count = devbondmet_drw.count +count = devbondmet_drw.count() logger.info("devbondmet_drw has #{count} polygons") polygons_count += count devtrench_drw = get_polygons(76, 0) -count = devtrench_drw.count +count = devtrench_drw.count() logger.info("devtrench_drw has #{count} polygons") polygons_count += count redist_drw = get_polygons(77, 0) -count = redist_drw.count +count = redist_drw.count() logger.info("redist_drw has #{count} polygons") polygons_count += count graphbot_drw = get_polygons(78, 0) -count = graphbot_drw.count +count = graphbot_drw.count() logger.info("graphbot_drw has #{count} polygons") polygons_count += count graphtop_drw = get_polygons(79, 0) -count = graphtop_drw.count +count = graphtop_drw.count() logger.info("graphtop_drw has #{count} polygons") polygons_count += count antvia1_drw = get_polygons(83, 0) -count = antvia1_drw.count +count = antvia1_drw.count() logger.info("antvia1_drw has #{count} polygons") polygons_count += count antmetal2_drw = get_polygons(84, 0) -count = antmetal2_drw.count +count = antmetal2_drw.count() logger.info("antmetal2_drw has #{count} polygons") polygons_count += count graphcont_drw = get_polygons(85, 0) -count = graphcont_drw.count +count = graphcont_drw.count() logger.info("graphcont_drw has #{count} polygons") polygons_count += count siwg_drw = get_polygons(86, 0) -count = siwg_drw.count +count = siwg_drw.count() logger.info("siwg_drw has #{count} polygons") polygons_count += count siwg_filler = get_polygons(86, 22) -count = siwg_filler.count +count = siwg_filler.count() logger.info("siwg_filler has #{count} polygons") polygons_count += count siwg_nofill = get_polygons(86, 23) -count = siwg_nofill.count +count = siwg_nofill.count() logger.info("siwg_nofill has #{count} polygons") polygons_count += count sigrating_drw = get_polygons(87, 0) -count = sigrating_drw.count +count = sigrating_drw.count() logger.info("sigrating_drw has #{count} polygons") polygons_count += count singrating_drw = get_polygons(88, 0) -count = singrating_drw.count +count = singrating_drw.count() logger.info("singrating_drw has #{count} polygons") polygons_count += count graphpas_drw = get_polygons(89, 0) -count = graphpas_drw.count +count = graphpas_drw.count() logger.info("graphpas_drw has #{count} polygons") polygons_count += count emwind3_drw = get_polygons(90, 0) -count = emwind3_drw.count +count = emwind3_drw.count() logger.info("emwind3_drw has #{count} polygons") polygons_count += count emwihv3_drw = get_polygons(91, 0) -count = emwihv3_drw.count +count = emwihv3_drw.count() logger.info("emwihv3_drw has #{count} polygons") polygons_count += count redbulay_drw = get_polygons(92, 0) -count = redbulay_drw.count +count = redbulay_drw.count() logger.info("redbulay_drw has #{count} polygons") polygons_count += count smos_drw = get_polygons(93, 0) -count = smos_drw.count +count = smos_drw.count() logger.info("smos_drw has #{count} polygons") polygons_count += count graphpad_drw = get_polygons(97, 0) -count = graphpad_drw.count +count = graphpad_drw.count() logger.info("graphpad_drw has #{count} polygons") polygons_count += count polimide_drw = get_polygons(98, 0) -count = polimide_drw.count +count = polimide_drw.count() logger.info("polimide_drw has #{count} polygons") polygons_count += count -polimide_label = labels(98, 1) -count = polimide_label.count -logger.info("polimide_label has #{count} polygons") -polygons_count += count - polimide_pin = get_polygons(98, 2) -count = polimide_pin.count +count = polimide_pin.count() logger.info("polimide_pin has #{count} polygons") polygons_count += count -polimide_net = get_polygons(98, 3) -count = polimide_net.count -logger.info("polimide_net has #{count} polygons") -polygons_count += count - recog_drw = get_polygons(99, 0) -count = recog_drw.count +count = recog_drw.count() logger.info("recog_drw has #{count} polygons") polygons_count += count recog_pin = get_polygons(99, 2) -count = recog_pin.count +count = recog_pin.count() logger.info("recog_pin has #{count} polygons") polygons_count += count recog_esd = get_polygons(99, 30) -count = recog_esd.count +count = recog_esd.count() logger.info("recog_esd has #{count} polygons") polygons_count += count recog_diode = get_polygons(99, 31) -count = recog_diode.count +count = recog_diode.count() logger.info("recog_diode has #{count} polygons") polygons_count += count recog_tsv = get_polygons(99, 32) -count = recog_tsv.count +count = recog_tsv.count() logger.info("recog_tsv has #{count} polygons") polygons_count += count recog_iprobe = get_polygons(99, 33) -count = recog_iprobe.count +count = recog_iprobe.count() logger.info("recog_iprobe has #{count} polygons") polygons_count += count recog_diffprb = get_polygons(99, 34) -count = recog_diffprb.count +count = recog_diffprb.count() logger.info("recog_diffprb has #{count} polygons") polygons_count += count recog_pillar = get_polygons(99, 35) -count = recog_pillar.count +count = recog_pillar.count() logger.info("recog_pillar has #{count} polygons") polygons_count += count recog_sbump = get_polygons(99, 36) -count = recog_sbump.count +count = recog_sbump.count() logger.info("recog_sbump has #{count} polygons") polygons_count += count recog_otp = get_polygons(99, 37) -count = recog_otp.count +count = recog_otp.count() logger.info("recog_otp has #{count} polygons") polygons_count += count recog_pdiode = get_polygons(99, 38) -count = recog_pdiode.count +count = recog_pdiode.count() logger.info("recog_pdiode has #{count} polygons") polygons_count += count recog_mom = get_polygons(99, 39) -count = recog_mom.count +count = recog_mom.count() logger.info("recog_mom has #{count} polygons") polygons_count += count recog_pcm = get_polygons(99, 100) -count = recog_pcm.count +count = recog_pcm.count() logger.info("recog_pcm has #{count} polygons") polygons_count += count colopen_drw = get_polygons(101, 0) -count = colopen_drw.count +count = colopen_drw.count() logger.info("colopen_drw has #{count} polygons") polygons_count += count graphmetal1_drw = get_polygons(109, 0) -count = graphmetal1_drw.count +count = graphmetal1_drw.count() logger.info("graphmetal1_drw has #{count} polygons") polygons_count += count graphmetal1_filler = get_polygons(109, 22) -count = graphmetal1_filler.count +count = graphmetal1_filler.count() logger.info("graphmetal1_filler has #{count} polygons") polygons_count += count graphmetal1_nofill = get_polygons(109, 23) -count = graphmetal1_nofill.count +count = graphmetal1_nofill.count() logger.info("graphmetal1_nofill has #{count} polygons") polygons_count += count +graphmetal1_slit = get_polygons(109, 24) +count = graphmetal1_slit.count() +logger.info("graphmetal1_slit has #{count} polygons") +polygons_count += count + +graphmetal1_opc = get_polygons(109, 26) +count = graphmetal1_opc.count() +logger.info("graphmetal1_opc has #{count} polygons") +polygons_count += count + +graphmet1l_drw = get_polygons(110, 0) +count = graphmet1l_drw.count() +logger.info("graphmet1l_drw has #{count} polygons") +polygons_count += count + +graphmet1l_filler = get_polygons(110, 22) +count = graphmet1l_filler.count() +logger.info("graphmet1l_filler has #{count} polygons") +polygons_count += count + +graphmet1l_nofill = get_polygons(110, 23) +count = graphmet1l_nofill.count() +logger.info("graphmet1l_nofill has #{count} polygons") +polygons_count += count + +graphmet1l_slit = get_polygons(110, 24) +count = graphmet1l_slit.count() +logger.info("graphmet1l_slit has #{count} polygons") +polygons_count += count + +graphmet1l_opc = get_polygons(110, 26) +count = graphmet1l_opc.count() +logger.info("graphmet1l_opc has #{count} polygons") +polygons_count += count + extblock_drw = get_polygons(111, 0) -count = extblock_drw.count +count = extblock_drw.count() logger.info("extblock_drw has #{count} polygons") polygons_count += count nldd_drw = get_polygons(112, 0) -count = nldd_drw.count +count = nldd_drw.count() logger.info("nldd_drw has #{count} polygons") polygons_count += count pldd_drw = get_polygons(113, 0) -count = pldd_drw.count +count = pldd_drw.count() logger.info("pldd_drw has #{count} polygons") polygons_count += count next_drw = get_polygons(114, 0) -count = next_drw.count +count = next_drw.count() logger.info("next_drw has #{count} polygons") polygons_count += count pext_drw = get_polygons(115, 0) -count = pext_drw.count +count = pext_drw.count() logger.info("pext_drw has #{count} polygons") polygons_count += count nexthv_drw = get_polygons(116, 0) -count = nexthv_drw.count +count = nexthv_drw.count() logger.info("nexthv_drw has #{count} polygons") polygons_count += count pexthv_drw = get_polygons(117, 0) -count = pexthv_drw.count +count = pexthv_drw.count() logger.info("pexthv_drw has #{count} polygons") polygons_count += count graphgate_drw = get_polygons(118, 0) -count = graphgate_drw.count +count = graphgate_drw.count() logger.info("graphgate_drw has #{count} polygons") polygons_count += count sinwg_drw = get_polygons(119, 0) -count = sinwg_drw.count +count = sinwg_drw.count() logger.info("sinwg_drw has #{count} polygons") polygons_count += count sinwg_filler = get_polygons(119, 22) -count = sinwg_filler.count +count = sinwg_filler.count() logger.info("sinwg_filler has #{count} polygons") polygons_count += count sinwg_nofill = get_polygons(119, 23) -count = sinwg_nofill.count +count = sinwg_nofill.count() logger.info("sinwg_nofill has #{count} polygons") polygons_count += count mempad_drw = get_polygons(124, 0) -count = mempad_drw.count +count = mempad_drw.count() logger.info("mempad_drw has #{count} polygons") polygons_count += count topvia1_drw = get_polygons(125, 0) -count = topvia1_drw.count +count = topvia1_drw.count() logger.info("topvia1_drw has #{count} polygons") polygons_count += count -topvia1_net = get_polygons(125, 3) -count = topvia1_net.count -logger.info("topvia1_net has #{count} polygons") +topmetal1_drw = get_polygons(126, 0) +count = topmetal1_drw.count() +logger.info("topmetal1_drw has #{count} polygons") polygons_count += count -topvia1_boundary = get_polygons(125, 4) -count = topvia1_boundary.count -logger.info("topvia1_boundary has #{count} polygons") +topmetal1_pin = get_polygons(126, 2) +count = topmetal1_pin.count() +logger.info("topmetal1_pin has #{count} polygons") polygons_count += count -topmetal1_drw = get_polygons(126, 0) -count = topmetal1_drw.count -logger.info("topmetal1_drw has #{count} polygons") +topmetal1_mask = get_polygons(126, 20) +count = topmetal1_mask.count() +logger.info("topmetal1_mask has #{count} polygons") polygons_count += count -topmetal1_label = labels(126, 1) -count = topmetal1_label.count -logger.info("topmetal1_label has #{count} polygons") +topmetal1_filler = get_polygons(126, 22) +count = topmetal1_filler.count() +logger.info("topmetal1_filler has #{count} polygons") polygons_count += count -topmetal1_pin = get_polygons(126, 2) -count = topmetal1_pin.count -logger.info("topmetal1_pin has #{count} polygons") +topmetal1_nofill = get_polygons(126, 23) +count = topmetal1_nofill.count() +logger.info("topmetal1_nofill has #{count} polygons") polygons_count += count -topmetal1_net = get_polygons(126, 3) -count = topmetal1_net.count -logger.info("topmetal1_net has #{count} polygons") +topmetal1_slit = get_polygons(126, 24) +count = topmetal1_slit.count() +logger.info("topmetal1_slit has #{count} polygons") polygons_count += count topmetal1_text = labels(126, 25) -count = topmetal1_text.count +count = topmetal1_text.count() logger.info("topmetal1_text has #{count} polygons") polygons_count += count +topmetal1_noqrc = get_polygons(126, 28) +count = topmetal1_noqrc.count() +logger.info("topmetal1_noqrc has #{count} polygons") +polygons_count += count + topmetal1_res = get_polygons(126, 29) -count = topmetal1_res.count +count = topmetal1_res.count() logger.info("topmetal1_res has #{count} polygons") polygons_count += count topmetal1_iprobe = get_polygons(126, 33) -count = topmetal1_iprobe.count +count = topmetal1_iprobe.count() logger.info("topmetal1_iprobe has #{count} polygons") polygons_count += count topmetal1_diffprb = get_polygons(126, 34) -count = topmetal1_diffprb.count +count = topmetal1_diffprb.count() logger.info("topmetal1_diffprb has #{count} polygons") polygons_count += count inldpwl_drw = get_polygons(127, 0) -count = inldpwl_drw.count +count = inldpwl_drw.count() logger.info("inldpwl_drw has #{count} polygons") polygons_count += count polyres_drw = get_polygons(128, 0) -count = polyres_drw.count +count = polyres_drw.count() logger.info("polyres_drw has #{count} polygons") polygons_count += count -polyres_label = labels(128, 1) -count = polyres_label.count -logger.info("polyres_label has #{count} polygons") -polygons_count += count - polyres_pin = get_polygons(128, 2) -count = polyres_pin.count +count = polyres_pin.count() logger.info("polyres_pin has #{count} polygons") polygons_count += count -polyres_net = get_polygons(128, 3) -count = polyres_net.count -logger.info("polyres_net has #{count} polygons") -polygons_count += count - -polyres_boundary = get_polygons(128, 4) -count = polyres_boundary.count -logger.info("polyres_boundary has #{count} polygons") -polygons_count += count - vmim_drw = get_polygons(129, 0) -count = vmim_drw.count +count = vmim_drw.count() logger.info("vmim_drw has #{count} polygons") polygons_count += count nbulaycut_drw = get_polygons(131, 0) -count = nbulaycut_drw.count +count = nbulaycut_drw.count() logger.info("nbulaycut_drw has #{count} polygons") polygons_count += count antmetal1_drw = get_polygons(132, 0) -count = antmetal1_drw.count +count = antmetal1_drw.count() logger.info("antmetal1_drw has #{count} polygons") polygons_count += count topvia2_drw = get_polygons(133, 0) -count = topvia2_drw.count +count = topvia2_drw.count() logger.info("topvia2_drw has #{count} polygons") polygons_count += count -topvia2_net = get_polygons(133, 3) -count = topvia2_net.count -logger.info("topvia2_net has #{count} polygons") +topmetal2_drw = get_polygons(134, 0) +count = topmetal2_drw.count() +logger.info("topmetal2_drw has #{count} polygons") polygons_count += count -topvia2_boundary = get_polygons(133, 4) -count = topvia2_boundary.count -logger.info("topvia2_boundary has #{count} polygons") +topmetal2_pin = get_polygons(134, 2) +count = topmetal2_pin.count() +logger.info("topmetal2_pin has #{count} polygons") polygons_count += count -topmetal2_drw = get_polygons(134, 0) -count = topmetal2_drw.count -logger.info("topmetal2_drw has #{count} polygons") +topmetal2_mask = get_polygons(134, 20) +count = topmetal2_mask.count() +logger.info("topmetal2_mask has #{count} polygons") polygons_count += count -topmetal2_label = labels(134, 1) -count = topmetal2_label.count -logger.info("topmetal2_label has #{count} polygons") +topmetal2_filler = get_polygons(134, 22) +count = topmetal2_filler.count() +logger.info("topmetal2_filler has #{count} polygons") polygons_count += count -topmetal2_pin = get_polygons(134, 2) -count = topmetal2_pin.count -logger.info("topmetal2_pin has #{count} polygons") +topmetal2_nofill = get_polygons(134, 23) +count = topmetal2_nofill.count() +logger.info("topmetal2_nofill has #{count} polygons") polygons_count += count -topmetal2_net = get_polygons(134, 3) -count = topmetal2_net.count -logger.info("topmetal2_net has #{count} polygons") +topmetal2_slit = get_polygons(134, 24) +count = topmetal2_slit.count() +logger.info("topmetal2_slit has #{count} polygons") polygons_count += count topmetal2_text = labels(134, 25) -count = topmetal2_text.count +count = topmetal2_text.count() logger.info("topmetal2_text has #{count} polygons") polygons_count += count +topmetal2_noqrc = get_polygons(134, 28) +count = topmetal2_noqrc.count() +logger.info("topmetal2_noqrc has #{count} polygons") +polygons_count += count + topmetal2_res = get_polygons(134, 29) -count = topmetal2_res.count +count = topmetal2_res.count() logger.info("topmetal2_res has #{count} polygons") polygons_count += count +topmetal2_iprobe = get_polygons(134, 33) +count = topmetal2_iprobe.count() +logger.info("topmetal2_iprobe has #{count} polygons") +polygons_count += count + +topmetal2_diffprb = get_polygons(134, 34) +count = topmetal2_diffprb.count() +logger.info("topmetal2_diffprb has #{count} polygons") +polygons_count += count + +snsring_drw = get_polygons(135, 0) +count = snsring_drw.count() +logger.info("snsring_drw has #{count} polygons") +polygons_count += count + +sensor_drw = get_polygons(136, 0) +count = sensor_drw.count() +logger.info("sensor_drw has #{count} polygons") +polygons_count += count + +snsarms_drw = get_polygons(137, 0) +count = snsarms_drw.count() +logger.info("snsarms_drw has #{count} polygons") +polygons_count += count + +snscmosvia_drw = get_polygons(138, 0) +count = snscmosvia_drw.count() +logger.info("snscmosvia_drw has #{count} polygons") +polygons_count += count + +colwind_drw = get_polygons(139, 0) +count = colwind_drw.count() +logger.info("colwind_drw has #{count} polygons") +polygons_count += count + +flm_drw = get_polygons(142, 0) +count = flm_drw.count() +logger.info("flm_drw has #{count} polygons") +polygons_count += count + +hafniumox_drw = get_polygons(143, 0) +count = hafniumox_drw.count() +logger.info("hafniumox_drw has #{count} polygons") +polygons_count += count + +memvia_drw = get_polygons(145, 0) +count = memvia_drw.count() +logger.info("memvia_drw has #{count} polygons") +polygons_count += count + +thinfilmres_drw = get_polygons(146, 0) +count = thinfilmres_drw.count() +logger.info("thinfilmres_drw has #{count} polygons") +polygons_count += count + +rfmem_drw = get_polygons(147, 0) +count = rfmem_drw.count() +logger.info("rfmem_drw has #{count} polygons") +polygons_count += count + +norcx_drw = get_polygons(148, 0) +count = norcx_drw.count() +logger.info("norcx_drw has #{count} polygons") +polygons_count += count + +norcx_m2m3 = get_polygons(148, 41) +count = norcx_m2m3.count() +logger.info("norcx_m2m3 has #{count} polygons") +polygons_count += count + +norcx_m2m4 = get_polygons(148, 42) +count = norcx_m2m4.count() +logger.info("norcx_m2m4 has #{count} polygons") +polygons_count += count + +norcx_m2m5 = get_polygons(148, 43) +count = norcx_m2m5.count() +logger.info("norcx_m2m5 has #{count} polygons") +polygons_count += count + +norcx_m2tm1 = get_polygons(148, 44) +count = norcx_m2tm1.count() +logger.info("norcx_m2tm1 has #{count} polygons") +polygons_count += count + +norcx_m2tm2 = get_polygons(148, 45) +count = norcx_m2tm2.count() +logger.info("norcx_m2tm2 has #{count} polygons") +polygons_count += count + +norcx_m3m4 = get_polygons(148, 46) +count = norcx_m3m4.count() +logger.info("norcx_m3m4 has #{count} polygons") +polygons_count += count + +norcx_m3m5 = get_polygons(148, 47) +count = norcx_m3m5.count() +logger.info("norcx_m3m5 has #{count} polygons") +polygons_count += count + +norcx_m3tm1 = get_polygons(148, 48) +count = norcx_m3tm1.count() +logger.info("norcx_m3tm1 has #{count} polygons") +polygons_count += count + +norcx_m3tm2 = get_polygons(148, 49) +count = norcx_m3tm2.count() +logger.info("norcx_m3tm2 has #{count} polygons") +polygons_count += count + +norcx_m4m5 = get_polygons(148, 50) +count = norcx_m4m5.count() +logger.info("norcx_m4m5 has #{count} polygons") +polygons_count += count + +norcx_m4tm1 = get_polygons(148, 51) +count = norcx_m4tm1.count() +logger.info("norcx_m4tm1 has #{count} polygons") +polygons_count += count + +norcx_m4tm2 = get_polygons(148, 52) +count = norcx_m4tm2.count() +logger.info("norcx_m4tm2 has #{count} polygons") +polygons_count += count + +norcx_m5tm1 = get_polygons(148, 53) +count = norcx_m5tm1.count() +logger.info("norcx_m5tm1 has #{count} polygons") +polygons_count += count + +norcx_m5tm2 = get_polygons(148, 54) +count = norcx_m5tm2.count() +logger.info("norcx_m5tm2 has #{count} polygons") +polygons_count += count + +norcx_tm1tm2 = get_polygons(148, 55) +count = norcx_tm1tm2.count() +logger.info("norcx_tm1tm2 has #{count} polygons") +polygons_count += count + +norcx_m1sub = get_polygons(148, 123) +count = norcx_m1sub.count() +logger.info("norcx_m1sub has #{count} polygons") +polygons_count += count + +norcx_m2sub = get_polygons(148, 124) +count = norcx_m2sub.count() +logger.info("norcx_m2sub has #{count} polygons") +polygons_count += count + +norcx_m3sub = get_polygons(148, 125) +count = norcx_m3sub.count() +logger.info("norcx_m3sub has #{count} polygons") +polygons_count += count + +norcx_m4sub = get_polygons(148, 126) +count = norcx_m4sub.count() +logger.info("norcx_m4sub has #{count} polygons") +polygons_count += count + +norcx_m5sub = get_polygons(148, 127) +count = norcx_m5sub.count() +logger.info("norcx_m5sub has #{count} polygons") +polygons_count += count + +norcx_tm1sub = get_polygons(148, 300) +count = norcx_tm1sub.count() +logger.info("norcx_tm1sub has #{count} polygons") +polygons_count += count + +norcx_tm2sub = get_polygons(148, 301) +count = norcx_tm2sub.count() +logger.info("norcx_tm2sub has #{count} polygons") +polygons_count += count + +snsbotvia_drw = get_polygons(149, 0) +count = snsbotvia_drw.count() +logger.info("snsbotvia_drw has #{count} polygons") +polygons_count += count + +snstopvia_drw = get_polygons(151, 0) +count = snstopvia_drw.count() +logger.info("snstopvia_drw has #{count} polygons") +polygons_count += count + +deepvia_drw = get_polygons(152, 0) +count = deepvia_drw.count() +logger.info("deepvia_drw has #{count} polygons") +polygons_count += count + +fgetch_drw = get_polygons(153, 0) +count = fgetch_drw.count() +logger.info("fgetch_drw has #{count} polygons") +polygons_count += count + +ctrgat_drw = get_polygons(154, 0) +count = ctrgat_drw.count() +logger.info("ctrgat_drw has #{count} polygons") +polygons_count += count + +fgimp_drw = get_polygons(155, 0) +count = fgimp_drw.count() +logger.info("fgimp_drw has #{count} polygons") +polygons_count += count + emwihv_drw = get_polygons(156, 0) -count = emwihv_drw.count +count = emwihv_drw.count() logger.info("emwihv_drw has #{count} polygons") polygons_count += count +lbe_drw = get_polygons(157, 0) +count = lbe_drw.count() +logger.info("lbe_drw has #{count} polygons") +polygons_count += count + +alcustop_drw = get_polygons(159, 0) +count = alcustop_drw.count() +logger.info("alcustop_drw has #{count} polygons") +polygons_count += count + +nometfiller_drw = get_polygons(160, 0) +count = nometfiller_drw.count() +logger.info("nometfiller_drw has #{count} polygons") +polygons_count += count + +prboundary_drw = get_polygons(189, 0) +count = prboundary_drw.count() +logger.info("prboundary_drw has #{count} polygons") +polygons_count += count + +exchange0_drw = get_polygons(190, 0) +count = exchange0_drw.count() +logger.info("exchange0_drw has #{count} polygons") +polygons_count += count + +exchange0_pin = get_polygons(190, 2) +count = exchange0_pin.count() +logger.info("exchange0_pin has #{count} polygons") +polygons_count += count + +exchange0_text = labels(190, 25) +count = exchange0_text.count() +logger.info("exchange0_text has #{count} polygons") +polygons_count += count + +exchange1_drw = get_polygons(191, 0) +count = exchange1_drw.count() +logger.info("exchange1_drw has #{count} polygons") +polygons_count += count + +exchange1_pin = get_polygons(191, 2) +count = exchange1_pin.count() +logger.info("exchange1_pin has #{count} polygons") +polygons_count += count + +exchange1_text = labels(191, 25) +count = exchange1_text.count() +logger.info("exchange1_text has #{count} polygons") +polygons_count += count + +exchange2_drw = get_polygons(192, 0) +count = exchange2_drw.count() +logger.info("exchange2_drw has #{count} polygons") +polygons_count += count + +exchange2_pin = get_polygons(192, 2) +count = exchange2_pin.count() +logger.info("exchange2_pin has #{count} polygons") +polygons_count += count + +exchange2_text = labels(192, 25) +count = exchange2_text.count() +logger.info("exchange2_text has #{count} polygons") +polygons_count += count + +exchange3_drw = get_polygons(193, 0) +count = exchange3_drw.count() +logger.info("exchange3_drw has #{count} polygons") +polygons_count += count + +exchange3_pin = get_polygons(193, 2) +count = exchange3_pin.count() +logger.info("exchange3_pin has #{count} polygons") +polygons_count += count + +exchange3_text = labels(193, 25) +count = exchange3_text.count() +logger.info("exchange3_text has #{count} polygons") +polygons_count += count + +exchange4_drw = get_polygons(194, 0) +count = exchange4_drw.count() +logger.info("exchange4_drw has #{count} polygons") +polygons_count += count + +exchange4_pin = get_polygons(194, 2) +count = exchange4_pin.count() +logger.info("exchange4_pin has #{count} polygons") +polygons_count += count + +exchange4_text = labels(194, 25) +count = exchange4_text.count() +logger.info("exchange4_text has #{count} polygons") +polygons_count += count + +isonwell_drw = get_polygons(257, 0) +count = isonwell_drw.count() +logger.info("isonwell_drw has #{count} polygons") +polygons_count += count + + logger.info("Total no. of polygons in the design is #{polygons_count}") diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/res_connections.lvs b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/res_connections.lvs index a652884e..c3ec332e 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/res_connections.lvs +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/res_connections.lvs @@ -32,5 +32,5 @@ connect(rppd_ports, cont_drw) # === rhigh === connect(rhigh_ports, cont_drw) -# === lvsres === +# === Metal Res === # Added in general connections diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/res_derivations.lvs b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/res_derivations.lvs index f206065a..e5925731 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/res_derivations.lvs +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/res_derivations.lvs @@ -53,5 +53,23 @@ rsil_ports = gatpoly_drw.interacting(rsil_res).not(rsil_res) # ---- METAL ---- # =============== -# lvsres -lvsres = metal1_drw.and(metal1_res) +# res_metal1 +res_metal1 = metal1_drw.and(metal1_res) + +# res_metal2 +res_metal2 = metal2_drw.and(metal2_res) + +# res_metal3 +res_metal3 = metal3_drw.and(metal3_res) + +# res_metal4 +res_metal4 = metal4_drw.and(metal4_res) + +# res_metal5 +res_metal5 = metal5_drw.and(metal5_res) + +# res_topmetal1 +res_topmetal1 = topmetal1_drw.and(topmetal1_res) + +# res_topmetal2 +res_topmetal2 = topmetal2_drw.and(topmetal2_res) diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/res_extraction.lvs b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/res_extraction.lvs index 2d9bb322..d0483911 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/res_extraction.lvs +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/res_extraction.lvs @@ -61,5 +61,29 @@ extract_devices(GeneralNTerminalExtractor.new('rhigh', 2), { # =============== # RM1 -logger.info('Extracting lvsres resistor') -extract_devices(resistor('lvsres', 1.0, RES2), { 'R' => lvsres, 'C' => metal1_con }) +logger.info('Extracting res_metal1 resistor') +extract_devices(resistor('res_metal1', 1.0, RES2), { 'R' => res_metal1, 'C' => metal1_con }) + +# RM2 +logger.info('Extracting res_metal2 resistor') +extract_devices(resistor('res_metal2', 1.0, RES2), { 'R' => res_metal2, 'C' => metal2_con }) + +# RM3 +logger.info('Extracting res_metal3 resistor') +extract_devices(resistor('res_metal3', 1.0, RES2), { 'R' => res_metal3, 'C' => metal3_con }) + +# RM4 +logger.info('Extracting res_metal4 resistor') +extract_devices(resistor('res_metal4', 1.0, RES2), { 'R' => res_metal4, 'C' => metal4_con }) + +# RM5 +logger.info('Extracting res_metal5 resistor') +extract_devices(resistor('res_metal5', 1.0, RES2), { 'R' => res_metal5, 'C' => metal5_con }) + +# RTM1 +logger.info('Extracting res_topmetal1 resistor') +extract_devices(resistor('res_topmetal1', 1.0, RES2), { 'R' => res_topmetal1, 'C' => topmetal1_con }) + +# RTM2 +logger.info('Extracting res_topmetal2 resistor') +extract_devices(resistor('res_topmetal2', 1.0, RES2), { 'R' => res_topmetal2, 'C' => topmetal2_con }) diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/layout/lvsres.gds b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/layout/lvsres.gds deleted file mode 100644 index 1b9470d977a71e53a45f87a0bbbb02f75bb1b097..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1132 zcmbW0y-EW?6opSFyPL&m{K={aD_UqF2$o_aC}~6sixeWZ7J`Ksu<`-oGiZ^{SFo^7 z;Z+5C@iTm@|hvbLK807;}QOVrs7lVNgec)t__3COSIU2a;;I zyLY#J*nfQ6X+3TA?oZoDL%(k#iY{+D*XJDsF%V4|#E2ROz~)SKIQ(qc8HCL)V4eY` zuG8rfwq+fKOA7~8d7t)^`i=WhWOHX}Z?o9TP^e@=^D5*Hz>tAb& zpIp2GHePa4ak|&Po{FE${6S7CP9OIh<}Z11pXT;E|B>$T7vE3vZgw?y)l2eo^^5sW z_ar}(!|9&-HZOZ$4zesir+fXy{540-)tkRN|NO1gC-vQxRGdCue_8tf-~F5U0nJHs t({t##obIVV>W{2X{@6b&`Tq;l2lkCWNZb1tz|whmPf>^1IprjEkEK-OFVv#~n5ViCJ;x}lKF27)5 zZRH2#6D(8MSZJI#Z(de6J0K1$XP7&eH*@DLG?Y3*T2hragh()kO;mr*5h;DJw+qzE z;r7n`#{NsUztwnJ>pUDck%oR>to3#4=Jc|4dv>voAOdt%A%cz-fYqt;VDQ;6Gcc1j zpq>GtteXu%&3r}vuL<@O$ya*MNPgCRejx6VpGp4uA^VB4Zs@5GOrP*RBKc>{eT1Yq z-Roa!vY$A21+2VgB*p1o|8mNHqV)$ENpbq9Us3*?7wwbWe&;{bJ^uXrao$N=au>ZI zKUY7W|73^rBhqlXr@qO{+?NKiC_krr{rUVQN6FQjzdQfT9oHwyy9-Hi`e^+H?*D)H zuk{0xljJ7nkaIcRQ-9bWwom@pKa1J_3yk;78-EZ@@1Fznk3w0uwDl|IKML>-^eK$3 literal 0 HcmV?d00001 diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/layout/res_metal2.gds b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/layout/res_metal2.gds new file mode 100644 index 0000000000000000000000000000000000000000..dbb9b0ab54213413d14f716f52c9abcd696760c5 GIT binary patch literal 1136 zcmb7?ze)o^5Ql%++-*YC^Us|T;Y1591VOM78$n4UT3DnI5yT>epdf1L1H@<0B3)j= z!rICQ@DVI6Y%Da+-0oyGaSFHjj+y;#cYnLEFy;Vx$y8nuBSj4h$bNpKYV6+5HjtI$ z&8^$@-KXx`M&n_%b9dN89_wCW?Pcrg_`G#}a<+!33fM7&dDz4NSeYmTBQL$)=LZw0 zp8~V@La7&wCein6!KYq>{shOg4VXtjD0P~k`d_2YXR=p%4`koMu5V7Qmdj0G6KvrA}1+rJQF0%)*ZXrA{37jk`b2i-+X) zJAYTFw&D-opUXRKOYYLw{Nen^J1##a4}U+(`ji))mk0B&{Cr>a2lJO4C0E~9{plOG zK2z>p$Q|Dw_UAbNkkh~4Z{Y)yljJ7*kbU{Svc7vayiYlIKS!Ud&!O-u^bR6?1M01e Ai~s-t literal 0 HcmV?d00001 diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/layout/res_metal3.gds b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/layout/res_metal3.gds new file mode 100644 index 0000000000000000000000000000000000000000..063c30df949b31f9d462137fa027204a5be34169 GIT binary patch literal 1136 zcmb7?y)HyS6vzKNd++SV$Mtd7isYg|A(1E)qLGkoghH`}h(r`yNJs>w2UyQwi|xFE zLap)u9zm(lC|Kv*nX|)Qr!dX$=A8N6nfcGa!k7bOB~y7tj1)t#Soryks^nXZ8RQMyLX38WU=lg)?T)*j?Y`yCueJjs(>9en1@XafR*twF#OW%eSR>3 z`YABe5lTI0G=aW97kuh9=udD=+kkllgi@yos{b|Od?tIP_dxbtU-N;4_RWLIer-Qc z>O^IIVDgA(IkI1;^9ZF*RQ<&!&jOg!7r^p!pwx+~zm)MTfSLPIpwx*)-?;nZym&}% zzw>u>YAgQW{kgo;w&X5-%`fIZ)^+(YdHDNL)~CGaygZnH<>&jVKbXJdD7pH+>QCLc z^_g<-Lhkr}(Vyk~Lr(vGzqt=cPLiAKL-ytS%KGlz@IK|-{TzL+K8M_|&^w6m4T}to AjQ{`u literal 0 HcmV?d00001 diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/layout/res_metal4.gds b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/layout/res_metal4.gds new file mode 100644 index 0000000000000000000000000000000000000000..2c8e24c4b8e37ec251c93481a849f8ba44254db2 GIT binary patch literal 1136 zcmb7?y-EW?5Xb-7TsFav^CK}LoY-g~2mukqMo`j-78WT)1hGgVD2Q760QwACr1KRl ztgU9w|g@K3uE?>luY#%71S{#&*b+zYR2wtZ32yQ zWqspjb^Gc5ZLR&#>fP>lkW|86Z0&jX;_$S4d33UZs0P?kgE`pP09YC?1H&)<{^th? zG>?IqJEg``Micn)m%T5!wtNYW^=rU90!od`hM@m7;(U@`>D`mQ%ZGd*mV0xN^c%aL z8W#r62PO}=%aMLl{zs{CVbGuNa2G&Mp8<={o*EYh{e^_P05bI>PmK$U{w({a^>G}i zeyI~US{i!SW|D?u+f%DzHxo_b68#jOKH<$MP@BFy9q>JaLet!P64!$mKK0|(S xepnCILF!KF_DTDepWiH>`ca5Q`Lof~chrpwFO1I$y!U z+R6v;5iBiiEHuvl_Qusax5zfXFtfkR-ps(lm^~yVQ+-7Rbqpaw{QEa*#_nuw0F82G zZT)6t`|18|wf)fQ-R^ggRKi|t?Rod&@U(k*bh3=72G~)9IoQ|$SQ;+_!!P~*=LZQi zkAayxrN&c66Zr8ry)U`8{1Y7O*MNBhlp2={LH}#S`6Rv4yC;2@5BWeW@8%)tH+DTW zE)3KMCJ%Vak$zLYN2zgP(4X({7C=s)0gKO`8W#rrg@m^NGW8=*jSGwZEa#{FaU7_B zsSk|xSjCb4)Rp^wQscrvefMtO8~FXk?H}jOqjUeeKQ1omV*S+5@1OR;_r>jJ$S>{> w`@ueFU$XrQ)R%e7ym-j}=AY$*etv(nkGdCGKIrS5bZ+_m&GM;Vl|DxJ29=bLUH||9 literal 0 HcmV?d00001 diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/layout/res_topmetal1.gds b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/layout/res_topmetal1.gds new file mode 100644 index 0000000000000000000000000000000000000000..0b21e7f6953948d668ac2bbe7732f400706f45e8 GIT binary patch literal 1140 zcmb7?ze)o^5Ql%+yW0f+M9syBaAKo{Ac&RN2ud2!!Xkx;AQmYE#h@w0IzEFb()kJ& z)>b}%k6>wGW1(^8cE{DkDct5eX7;!6eEa`{QO4A*xl_dpc*9` zn>TAak9V)@_4}3H?Lh-sqI(r{b{&n!FSEoP0G3@~60T4=^CaC`BnDd$J72X2bcYVzV%Cv7DO!ljL zfl?jRZTp5@4Xjm{&KI#Kl(8axYN&a{A~r$DI_Rev$#SpYNl<3OnshkfJjkMrUo zx&6-H)v2xcgZJn1PCJsj^fiAt|B0T!T z%B|0odlz!Y_lNyC&OhYz@AsSgfaD~($v$LXzOStB-VN_l&i$RE&(-IU`$c*OF}?sn C`jh?u literal 0 HcmV?d00001 diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/layout/res_topmetal2.gds b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/layout/res_topmetal2.gds new file mode 100644 index 0000000000000000000000000000000000000000..dac53d145e68c89de08aac9226a818d031fa79dd GIT binary patch literal 1140 zcmb7?ze)o^5Ql%+++BiyPEBG&II+<}5Cj{s5tKBdg+&SxK`c@Tia}Fai#~%E>3jtX zYbzhXN3gW8vCufb+Z$Hz+#=h2VP?O~-pn9^G5bhLrt*dmb&S9u{{0(O6YXwq0gZCF zv3a|;^Zf9>-g;c=-yO7(gnq9UMHijRquzP`x<;gNI`Z^eV zeUd=)1em>7YCL5y<@{^sORgpV1k3sjV4eV_#^r+7{~ohGNw4(bNZ;mtJ`l^hc}V(= zJx7fTJ@tXwA#YjIZ_4*5H7@k}3vJ#4$eAv%^x~*-q1Rtbcncs?KXBBzu;|Zme%c?) zq57Blz(k)_Ea^{Q+3zPcF7(v5@8-Rs-*4>xao#*S_rLpNUjnYYY~hx~8;S>EgC_ecAvdy(b6zRpSKmfznjpZXQ)V}Kvs_7@DS48jaN4B8C3$n1$qs=`==8>3pI7+a&5wni~$ r`b^*L%WOVs_7@DS415ei4CV}M$n1$qs=`==8>3pI7+a&5wni~$ q`Y<7NgLesbTFuSm^Gcd5QFaQ8D^%%VX diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/lvsres.cdl b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_metal1.cdl similarity index 83% rename from ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/lvsres.cdl rename to ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_metal1.cdl index 93fdf65b..36922b51 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/lvsres.cdl +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_metal1.cdl @@ -15,8 +15,8 @@ * SPDX-License-Identifier: Apache-2.0 *========================================================================== -.SUBCKT lvsres -Rm1 net1 net2 $[lvsres] 20k l=1u w=5u -Rm2 net3 net4 lvsres \ l=1.5u w =5u -Rm3 net5 net6 lvsres / length =1u width=6u +.SUBCKT res_metal1 +Rm1 net1 net2 $[res_metal1] 20k l=1u w=5u +Rm2 net3 net4 res_metal1 \ l=1.5u w =5u +Rm3 net5 net6 res_metal1 / length =1u width=6u .ENDS diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_metal2.cdl b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_metal2.cdl new file mode 100644 index 00000000..2bff83de --- /dev/null +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_metal2.cdl @@ -0,0 +1,22 @@ +*========================================================================== +* Copyright 2024 IHP PDK Authors +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* https://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* SPDX-License-Identifier: Apache-2.0 +*========================================================================== + +.SUBCKT res_metal2 +Rm1 net1 net2 $[res_metal2] 20k l=1u w=5u +Rm2 net3 net4 res_metal2 \ l=1.5u w =5u +Rm3 net5 net6 res_metal2 / length =1u width=6u +.ENDS diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_metal3.cdl b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_metal3.cdl new file mode 100644 index 00000000..4747b168 --- /dev/null +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_metal3.cdl @@ -0,0 +1,22 @@ +*========================================================================== +* Copyright 2024 IHP PDK Authors +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* https://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* SPDX-License-Identifier: Apache-2.0 +*========================================================================== + +.SUBCKT res_metal3 +Rm1 net1 net2 $[res_metal3] 20k l=1u w=5u +Rm2 net3 net4 res_metal3 \ l=1.5u w =5u +Rm3 net5 net6 res_metal3 / length =1u width=6u +.ENDS diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_metal4.cdl b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_metal4.cdl new file mode 100644 index 00000000..f3711a4c --- /dev/null +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_metal4.cdl @@ -0,0 +1,22 @@ +*========================================================================== +* Copyright 2024 IHP PDK Authors +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* https://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* SPDX-License-Identifier: Apache-2.0 +*========================================================================== + +.SUBCKT res_metal4 +Rm1 net1 net2 $[res_metal4] 20k l=1u w=5u +Rm2 net3 net4 res_metal4 \ l=1.5u w =5u +Rm3 net5 net6 res_metal4 / length =1u width=6u +.ENDS diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_metal5.cdl b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_metal5.cdl new file mode 100644 index 00000000..96b24ceb --- /dev/null +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_metal5.cdl @@ -0,0 +1,22 @@ +*========================================================================== +* Copyright 2024 IHP PDK Authors +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* https://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* SPDX-License-Identifier: Apache-2.0 +*========================================================================== + +.SUBCKT res_metal5 +Rm1 net1 net2 $[res_metal5] 20k l=1u w=5u +Rm2 net3 net4 res_metal5 \ l=1.5u w =5u +Rm3 net5 net6 res_metal5 / length =1u width=6u +.ENDS diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_topmetal1.cdl b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_topmetal1.cdl new file mode 100644 index 00000000..2c4cb99d --- /dev/null +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_topmetal1.cdl @@ -0,0 +1,22 @@ +*========================================================================== +* Copyright 2024 IHP PDK Authors +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* https://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* SPDX-License-Identifier: Apache-2.0 +*========================================================================== + +.SUBCKT res_topmetal1 +Rm1 net1 net2 $[res_topmetal1] 20k l=1u w=5u +Rm2 net3 net4 res_topmetal1 \ l=1.5u w =5u +Rm3 net5 net6 res_topmetal1 / length =1u width=6u +.ENDS diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_topmetal2.cdl b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_topmetal2.cdl new file mode 100644 index 00000000..f1a91aa5 --- /dev/null +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/res_topmetal2.cdl @@ -0,0 +1,22 @@ +*========================================================================== +* Copyright 2024 IHP PDK Authors +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* https://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* SPDX-License-Identifier: Apache-2.0 +*========================================================================== + +.SUBCKT res_topmetal2 +Rm1 net1 net2 $[res_topmetal2] 20k l=1u w=5u +Rm2 net3 net4 res_topmetal2 \ l=1.5u w =5u +Rm3 net5 net6 res_topmetal2 / length =1u width=6u +.ENDS diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/rhigh.cdl b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/rhigh.cdl index 089192de..15672863 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/rhigh.cdl +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/rhigh.cdl @@ -19,8 +19,8 @@ Rh1 net1 net2 rhigh m=1 l=0.96u w=0.5u Rh2 net3 net4 rhigh m=1 l=1u w=0.5u Rh3 net5 net6 rhigh m=1 l=1.2u w=0.7u -Rh4 net7 net8 rhigh m=1 l=1u w=0.5u ps=0.2u b=1 -Rh5 net9 net10 rhigh m=1 l=1.2u w=0.5u ps=0.2u b=2 +Rh4 net7 net8 rhigh m=1 l=1.5u w=0.5u ps=0.2u b=1 +Rh5 net9 net10 rhigh m=1 l=1.7u w=0.5u ps=0.2u b=2 ** Testing combiner * res-A R1 p_split p1 rhigh w=0.5e-6 l=30e-6 m=1 b=0 @@ -33,83 +33,83 @@ R2 p_intern p6 rhigh w=0.5e-6 l=10e-6 m=1 b=0 M1 p_intern G S B sg13_lv_nmos w=0.15e-6 l=0.2e-6 m=1 ng=1 * Extra patterns -R_pattern_1 a_1 b_1 rhigh w=5.85u l=5.4u b=3 ps=0.2u -R_pattern_2 a_2 b_2 rhigh w=1.67u l=9.14u b=6 ps=0.19u -R_pattern_3 a_3 b_3 rhigh w=4.69u l=7.11u b=4 ps=0.19u -R_pattern_4 a_4 b_4 rhigh w=5.02u l=0.82u b=4 ps=0.2u -R_pattern_5 a_5 b_5 rhigh w=0.64u l=6.3u b=2 ps=0.2u -R_pattern_6 a_6 b_6 rhigh w=4.64u l=1.98u b=4 ps=0.19u -R_pattern_7 a_7 b_7 rhigh w=3.93u l=9.34u b=8 ps=0.19u -R_pattern_8 a_8 b_8 rhigh w=5.1u l=3.03u b=9 ps=0.2u -R_pattern_9 a_9 b_9 rhigh w=5.1u l=9.34u b=4 ps=0.2u -R_pattern_10 a_10 b_10 rhigh w=3.93u l=1.98u b=2 ps=0.2u -R_pattern_11 a_11 b_11 rhigh w=4.64u l=6.3u b=4 ps=0.19u -R_pattern_12 a_12 b_12 rhigh w=0.64u l=0.82u b=4 ps=0.19u -R_pattern_13 a_13 b_13 rhigh w=5.02u l=7.11u b=6 ps=0.2u -R_pattern_14 a_14 b_14 rhigh w=4.69u l=9.14u b=3 ps=0.2u -R_pattern_15 a_15 b_15 rhigh w=1.67u l=5.4u b=9 ps=0.19u -R_pattern_16 a_16 b_16 rhigh w=5.85u l=3.03u b=8 ps=0.19u -R_pattern_17 a_17 b_17 rhigh w=1.67u l=3.03u b=2 ps=0.19u -R_pattern_18 a_18 b_18 rhigh w=5.02u l=9.34u b=4 ps=0.19u -R_pattern_19 a_19 b_19 rhigh w=4.64u l=9.14u b=8 ps=0.2u -R_pattern_20 a_20 b_20 rhigh w=5.1u l=5.4u b=4 ps=0.19u -R_pattern_21 a_21 b_21 rhigh w=5.85u l=0.82u b=6 ps=0.19u -R_pattern_22 a_22 b_22 rhigh w=4.69u l=1.98u b=9 ps=0.19u -R_pattern_23 a_23 b_23 rhigh w=0.64u l=7.11u b=3 ps=0.19u -R_pattern_24 a_24 b_24 rhigh w=3.93u l=6.3u b=4 ps=0.19u -R_pattern_25 a_25 b_25 rhigh w=1.67u l=6.3u b=4 ps=0.2u -R_pattern_26 a_26 b_26 rhigh w=3.93u l=7.11u b=4 ps=0.19u -R_pattern_27 a_27 b_27 rhigh w=0.64u l=5.4u b=4 ps=0.19u -R_pattern_28 a_28 b_28 rhigh w=4.69u l=3.03u b=4 ps=0.19u -R_pattern_29 a_29 b_29 rhigh w=5.85u l=9.34u b=2 ps=0.19u -R_pattern_30 a_30 b_30 rhigh w=5.1u l=9.14u b=2 ps=0.19u -R_pattern_31 a_31 b_31 rhigh w=4.64u l=0.82u b=9 ps=0.19u -R_pattern_32 a_32 b_32 rhigh w=5.02u l=1.98u b=3 ps=0.19u -R_pattern_33 a_33 b_33 rhigh w=5.02u l=3.03u b=8 ps=0.19u -R_pattern_34 a_34 b_34 rhigh w=4.64u l=5.4u b=6 ps=0.19u -R_pattern_35 a_35 b_35 rhigh w=5.1u l=7.11u b=8 ps=0.19u -R_pattern_36 a_36 b_36 rhigh w=5.85u l=6.3u b=9 ps=0.19u -R_pattern_37 a_37 b_37 rhigh w=4.69u l=0.82u b=2 ps=0.19u -R_pattern_38 a_38 b_38 rhigh w=0.64u l=9.34u b=9 ps=0.19u -R_pattern_39 a_39 b_39 rhigh w=3.93u l=9.14u b=9 ps=0.19u -R_pattern_40 a_40 b_40 rhigh w=1.67u l=1.98u b=4 ps=0.19u -R_pattern_41 a_41 b_41 rhigh w=1.67u l=0.82u b=3 ps=0.19u -R_pattern_42 a_42 b_42 rhigh w=3.93u l=3.03u b=6 ps=0.19u -R_pattern_43 a_43 b_43 rhigh w=0.64u l=1.98u b=6 ps=0.19u -R_pattern_44 a_44 b_44 rhigh w=4.69u l=5.4u b=8 ps=0.19u -R_pattern_45 a_45 b_45 rhigh w=5.85u l=9.14u b=4 ps=0.19u -R_pattern_46 a_46 b_46 rhigh w=5.1u l=6.3u b=3 ps=0.19u -R_pattern_47 a_47 b_47 rhigh w=4.64u l=7.11u b=2 ps=0.19u -R_pattern_48 a_48 b_48 rhigh w=5.02u l=6.3u b=4 ps=0.19u -R_pattern_49 a_49 b_49 rhigh w=5.02u l=9.14u b=4 ps=0.19u -R_pattern_50 a_50 b_50 rhigh w=4.64u l=9.34u b=3 ps=0.19u -R_pattern_51 a_51 b_51 rhigh w=5.1u l=1.98u b=4 ps=0.19u -R_pattern_52 a_52 b_52 rhigh w=5.85u l=7.11u b=4 ps=0.19u -R_pattern_53 a_53 b_53 rhigh w=4.69u l=9.34u b=4 ps=0.19u -R_pattern_54 a_54 b_54 rhigh w=0.64u l=3.03u b=4 ps=0.19u -R_pattern_55 a_55 b_55 rhigh w=3.93u l=0.82u b=4 ps=0.19u -R_pattern_56 a_56 b_56 rhigh w=1.67u l=9.34u b=6 ps=0.19u -R_pattern_57 a_57 b_57 rhigh w=5.02u l=5.4u b=2 ps=0.19u -R_pattern_58 a_58 b_58 rhigh w=1.67u l=7.11u b=9 ps=0.19u -R_pattern_59 a_59 b_59 rhigh w=4.64u l=3.03u b=4 ps=0.19u -R_pattern_60 a_60 b_60 rhigh w=1.67u l=0.82u b=8 ps=0.19u -R_pattern_61 a_61 b_61 rhigh w=3.93u l=5.4u b=3 ps=0.19u -R_pattern_62 a_62 b_62 rhigh w=0.64u l=9.14u b=8 ps=0.19u -R_pattern_63 a_63 b_63 rhigh w=4.69u l=6.3u b=6 ps=0.19u -R_pattern_64 a_64 b_64 rhigh w=5.85u l=1.98u b=4 ps=0.19u -R_pattern_65 a_65 b_65 rhigh w=5.1u l=0.82u b=6 ps=0.19u -R_pattern_66 a_66 b_66 rhigh w=5.02u l=0.82u b=9 ps=0.19u -R_pattern_67 a_67 b_67 rhigh w=1.67u l=0.82u b=4 ps=0.19u -R_pattern_68 a_68 b_68 rhigh w=5.1u l=1.98u b=8 ps=0.19u -R_pattern_69 a_69 b_69 rhigh w=5.1u l=9.14u b=4 ps=0.19u -R_pattern_70 a_70 b_70 rhigh w=5.1u l=5.4u b=4 ps=0.19u -R_pattern_71 a_71 b_71 rhigh w=5.1u l=3.03u b=4 ps=0.19u -R_pattern_72 a_72 b_72 rhigh w=5.85u l=3.03u b=3 ps=0.19u -R_pattern_73 a_73 b_73 rhigh w=4.69u l=1.98u b=4 ps=0.19u -R_pattern_74 a_74 b_74 rhigh w=0.64u l=6.3u b=8 ps=0.19u -R_pattern_75 a_75 b_75 rhigh w=3.93u l=7.11u b=4 ps=0.19u -R_pattern_76 a_76 b_76 rhigh w=3.93u l=7.11u b=2 ps=0.19u -R_pattern_77 a_77 b_77 rhigh w=3.93u l=7.11u b=4 ps=0.19u -R_pattern_78 a_78 b_78 rhigh w=4.64u l=7.11u b=4 ps=0.19u -R_pattern_79 a_79 b_79 rhigh w=5.1u l=9.34u b=4 ps=0.19u +R_pattern_1 a_1 b_1 rhigh w=5.85u l=11.25u b=3 ps=0.2u +R_pattern_2 a_2 b_2 rhigh w=1.67u l=10.81u b=6 ps=0.19u +R_pattern_3 a_3 b_3 rhigh w=4.69u l=11.80u b=4 ps=0.19u +R_pattern_4 a_4 b_4 rhigh w=5.02u l=5.84u b=4 ps=0.2u +R_pattern_5 a_5 b_5 rhigh w=0.64u l=6.94u b=2 ps=0.2u +R_pattern_6 a_6 b_6 rhigh w=4.64u l=6.62u b=4 ps=0.19u +R_pattern_7 a_7 b_7 rhigh w=3.93u l=13.27u b=8 ps=0.19u +R_pattern_8 a_8 b_8 rhigh w=5.1u l=8.13u b=9 ps=0.2u +R_pattern_9 a_9 b_9 rhigh w=5.1u l=14.44u b=4 ps=0.2u +R_pattern_10 a_10 b_10 rhigh w=3.93u l=5.91u b=2 ps=0.2u +R_pattern_11 a_11 b_11 rhigh w=4.64u l=10.94u b=4 ps=0.19u +R_pattern_12 a_12 b_12 rhigh w=0.64u l=1.46u b=4 ps=0.19u +R_pattern_13 a_13 b_13 rhigh w=5.02u l=12.13u b=6 ps=0.2u +R_pattern_14 a_14 b_14 rhigh w=4.69u l=13.83u b=3 ps=0.2u +R_pattern_15 a_15 b_15 rhigh w=1.67u l=7.07u b=9 ps=0.19u +R_pattern_16 a_16 b_16 rhigh w=5.85u l=8.88u b=8 ps=0.19u +R_pattern_17 a_17 b_17 rhigh w=1.67u l=4.70u b=2 ps=0.19u +R_pattern_18 a_18 b_18 rhigh w=5.02u l=14.36u b=4 ps=0.19u +R_pattern_19 a_19 b_19 rhigh w=4.64u l=13.78u b=8 ps=0.2u +R_pattern_20 a_20 b_20 rhigh w=5.1u l=10.50u b=4 ps=0.19u +R_pattern_21 a_21 b_21 rhigh w=5.85u l=6.67u b=6 ps=0.19u +R_pattern_22 a_22 b_22 rhigh w=4.69u l=6.67u b=9 ps=0.19u +R_pattern_23 a_23 b_23 rhigh w=0.64u l=7.75u b=3 ps=0.19u +R_pattern_24 a_24 b_24 rhigh w=3.93u l=10.23u b=4 ps=0.19u +R_pattern_25 a_25 b_25 rhigh w=1.67u l=7.97u b=4 ps=0.2u +R_pattern_26 a_26 b_26 rhigh w=3.93u l=11.04u b=4 ps=0.19u +R_pattern_27 a_27 b_27 rhigh w=0.64u l=6.04u b=4 ps=0.19u +R_pattern_28 a_28 b_28 rhigh w=4.69u l=7.72u b=4 ps=0.19u +R_pattern_29 a_29 b_29 rhigh w=5.85u l=15.19u b=2 ps=0.19u +R_pattern_30 a_30 b_30 rhigh w=5.1u l=14.24u b=2 ps=0.19u +R_pattern_31 a_31 b_31 rhigh w=4.64u l=5.46u b=9 ps=0.19u +R_pattern_32 a_32 b_32 rhigh w=5.02u l=7.00u b=3 ps=0.19u +R_pattern_33 a_33 b_33 rhigh w=5.02u l=8.05u b=8 ps=0.19u +R_pattern_34 a_34 b_34 rhigh w=4.64u l=10.04u b=6 ps=0.19u +R_pattern_35 a_35 b_35 rhigh w=5.1u l=12.21u b=8 ps=0.19u +R_pattern_36 a_36 b_36 rhigh w=5.85u l=12.15u b=9 ps=0.19u +R_pattern_37 a_37 b_37 rhigh w=4.69u l=5.51u b=2 ps=0.19u +R_pattern_38 a_38 b_38 rhigh w=0.64u l=9.98u b=9 ps=0.19u +R_pattern_39 a_39 b_39 rhigh w=3.93u l=13.07u b=9 ps=0.19u +R_pattern_40 a_40 b_40 rhigh w=1.67u l=3.65u b=4 ps=0.19u +R_pattern_41 a_41 b_41 rhigh w=1.67u l=2.49u b=3 ps=0.19u +R_pattern_42 a_42 b_42 rhigh w=3.93u l=6.96u b=6 ps=0.19u +R_pattern_43 a_43 b_43 rhigh w=0.64u l=2.62u b=6 ps=0.19u +R_pattern_44 a_44 b_44 rhigh w=4.69u l=10.09u b=8 ps=0.19u +R_pattern_45 a_45 b_45 rhigh w=5.85u l=14.99u b=4 ps=0.19u +R_pattern_46 a_46 b_46 rhigh w=5.1u l=11.40u b=3 ps=0.19u +R_pattern_47 a_47 b_47 rhigh w=4.64u l=11.75u b=2 ps=0.19u +R_pattern_48 a_48 b_48 rhigh w=5.02u l=11.32u b=4 ps=0.19u +R_pattern_49 a_49 b_49 rhigh w=5.02u l=14.16u b=4 ps=0.19u +R_pattern_50 a_50 b_50 rhigh w=4.64u l=13.98u b=3 ps=0.19u +R_pattern_51 a_51 b_51 rhigh w=5.1u l=7.08u b=4 ps=0.19u +R_pattern_52 a_52 b_52 rhigh w=5.85u l=12.96u b=4 ps=0.19u +R_pattern_53 a_53 b_53 rhigh w=4.69u l=14.03u b=4 ps=0.19u +R_pattern_54 a_54 b_54 rhigh w=0.64u l=3.67u b=4 ps=0.19u +R_pattern_55 a_55 b_55 rhigh w=3.93u l=4.75u b=4 ps=0.19u +R_pattern_56 a_56 b_56 rhigh w=1.67u l=11.01u b=6 ps=0.19u +R_pattern_57 a_57 b_57 rhigh w=5.02u l=10.42u b=2 ps=0.19u +R_pattern_58 a_58 b_58 rhigh w=1.67u l=8.78u b=9 ps=0.19u +R_pattern_59 a_59 b_59 rhigh w=4.64u l=7.67u b=4 ps=0.19u +R_pattern_60 a_60 b_60 rhigh w=1.67u l=2.49u b=8 ps=0.19u +R_pattern_61 a_61 b_61 rhigh w=3.93u l=9.33u b=3 ps=0.19u +R_pattern_62 a_62 b_62 rhigh w=0.64u l=9.78u b=8 ps=0.19u +R_pattern_63 a_63 b_63 rhigh w=4.69u l=10.99u b=6 ps=0.19u +R_pattern_64 a_64 b_64 rhigh w=5.85u l=7.83u b=4 ps=0.19u +R_pattern_65 a_65 b_65 rhigh w=5.1u l=5.92u b=6 ps=0.19u +R_pattern_66 a_66 b_66 rhigh w=5.02u l=5.84u b=9 ps=0.19u +R_pattern_67 a_67 b_67 rhigh w=1.67u l=2.49u b=4 ps=0.19u +R_pattern_68 a_68 b_68 rhigh w=5.1u l=7.08u b=8 ps=0.19u +R_pattern_69 a_69 b_69 rhigh w=5.1u l=14.24u b=4 ps=0.19u +R_pattern_70 a_70 b_70 rhigh w=5.1u l=10.50u b=4 ps=0.19u +R_pattern_71 a_71 b_71 rhigh w=5.1u l=8.13u b=4 ps=0.19u +R_pattern_72 a_72 b_72 rhigh w=5.85u l=8.88u b=3 ps=0.19u +R_pattern_73 a_73 b_73 rhigh w=4.69u l=6.67u b=4 ps=0.19u +R_pattern_74 a_74 b_74 rhigh w=0.64u l=6.94u b=8 ps=0.19u +R_pattern_75 a_75 b_75 rhigh w=3.93u l=11.04u b=4 ps=0.19u +R_pattern_76 a_76 b_76 rhigh w=3.93u l=11.04u b=2 ps=0.19u +R_pattern_77 a_77 b_77 rhigh w=3.93u l=11.04u b=4 ps=0.19u +R_pattern_78 a_78 b_78 rhigh w=4.64u l=11.75u b=4 ps=0.19u +R_pattern_79 a_79 b_79 rhigh w=5.1u l=14.44u b=4 ps=0.19u .ENDS diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/rppd.cdl b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/rppd.cdl index ed71a67c..c90f4274 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/rppd.cdl +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/rppd.cdl @@ -19,87 +19,87 @@ Rp1 net1 net2 rppd m=1 l=0.5u w=0.5u Rp2 net3 net4 rppd m=1 l=1u w=0.5u Rp3 net5 net6 rppd m=1 l=1.2u w=0.7u -Rp4 net7 net8 rppd m=1 l=1u w=0.5u ps=0.2u b=1 -Rp5 net9 net10 rppd m=1 l=1.2u w=0.5u ps=0.2u b=2 +Rp4 net7 net8 rppd m=1 l=1.5u w=0.5u ps=0.2u b=1 +Rp5 net9 net10 rppd m=1 l=1.7u w=0.5u ps=0.2u b=2 * Extra patterns -R_pattern_1 a_1 b_1 rppd w=5.85u l=5.4u b=3 ps=0.2u -R_pattern_2 a_2 b_2 rppd w=1.67u l=9.14u b=6 ps=0.19u -R_pattern_3 a_3 b_3 rppd w=4.69u l=7.11u b=4 ps=0.19u -R_pattern_4 a_4 b_4 rppd w=5.02u l=0.82u b=4 ps=0.2u -R_pattern_5 a_5 b_5 rppd w=0.64u l=6.3u b=2 ps=0.2u -R_pattern_6 a_6 b_6 rppd w=4.64u l=1.98u b=4 ps=0.19u -R_pattern_7 a_7 b_7 rppd w=3.93u l=9.34u b=8 ps=0.19u -R_pattern_8 a_8 b_8 rppd w=5.1u l=3.03u b=9 ps=0.2u -R_pattern_9 a_9 b_9 rppd w=5.1u l=9.34u b=4 ps=0.2u -R_pattern_10 a_10 b_10 rppd w=3.93u l=1.98u b=2 ps=0.2u -R_pattern_11 a_11 b_11 rppd w=4.64u l=6.3u b=4 ps=0.19u -R_pattern_12 a_12 b_12 rppd w=0.64u l=0.82u b=4 ps=0.19u -R_pattern_13 a_13 b_13 rppd w=5.02u l=7.11u b=6 ps=0.2u -R_pattern_14 a_14 b_14 rppd w=4.69u l=9.14u b=3 ps=0.2u -R_pattern_15 a_15 b_15 rppd w=1.67u l=5.4u b=9 ps=0.19u -R_pattern_16 a_16 b_16 rppd w=5.85u l=3.03u b=8 ps=0.19u -R_pattern_17 a_17 b_17 rppd w=1.67u l=3.03u b=2 ps=0.19u -R_pattern_18 a_18 b_18 rppd w=5.02u l=9.34u b=4 ps=0.19u -R_pattern_19 a_19 b_19 rppd w=4.64u l=9.14u b=8 ps=0.2u -R_pattern_20 a_20 b_20 rppd w=5.1u l=5.4u b=4 ps=0.19u -R_pattern_21 a_21 b_21 rppd w=5.85u l=0.82u b=6 ps=0.19u -R_pattern_22 a_22 b_22 rppd w=4.69u l=1.98u b=9 ps=0.19u -R_pattern_23 a_23 b_23 rppd w=0.64u l=7.11u b=3 ps=0.19u -R_pattern_24 a_24 b_24 rppd w=3.93u l=6.3u b=4 ps=0.19u -R_pattern_25 a_25 b_25 rppd w=1.67u l=6.3u b=4 ps=0.2u -R_pattern_26 a_26 b_26 rppd w=3.93u l=7.11u b=4 ps=0.19u -R_pattern_27 a_27 b_27 rppd w=0.64u l=5.4u b=4 ps=0.19u -R_pattern_28 a_28 b_28 rppd w=4.69u l=3.03u b=4 ps=0.19u -R_pattern_29 a_29 b_29 rppd w=5.85u l=9.34u b=2 ps=0.19u -R_pattern_30 a_30 b_30 rppd w=5.1u l=9.14u b=2 ps=0.19u -R_pattern_31 a_31 b_31 rppd w=4.64u l=0.82u b=9 ps=0.19u -R_pattern_32 a_32 b_32 rppd w=5.02u l=1.98u b=3 ps=0.19u -R_pattern_33 a_33 b_33 rppd w=5.02u l=3.03u b=8 ps=0.19u -R_pattern_34 a_34 b_34 rppd w=4.64u l=5.4u b=6 ps=0.19u -R_pattern_35 a_35 b_35 rppd w=5.1u l=7.11u b=8 ps=0.19u -R_pattern_36 a_36 b_36 rppd w=5.85u l=6.3u b=9 ps=0.19u -R_pattern_37 a_37 b_37 rppd w=4.69u l=0.82u b=2 ps=0.19u -R_pattern_38 a_38 b_38 rppd w=0.64u l=9.34u b=9 ps=0.19u -R_pattern_39 a_39 b_39 rppd w=3.93u l=9.14u b=9 ps=0.19u -R_pattern_40 a_40 b_40 rppd w=1.67u l=1.98u b=4 ps=0.19u -R_pattern_41 a_41 b_41 rppd w=1.67u l=0.82u b=3 ps=0.19u -R_pattern_42 a_42 b_42 rppd w=3.93u l=3.03u b=6 ps=0.19u -R_pattern_43 a_43 b_43 rppd w=0.64u l=1.98u b=6 ps=0.19u -R_pattern_44 a_44 b_44 rppd w=4.69u l=5.4u b=8 ps=0.19u -R_pattern_45 a_45 b_45 rppd w=5.85u l=9.14u b=4 ps=0.19u -R_pattern_46 a_46 b_46 rppd w=5.1u l=6.3u b=3 ps=0.19u -R_pattern_47 a_47 b_47 rppd w=4.64u l=7.11u b=2 ps=0.19u -R_pattern_48 a_48 b_48 rppd w=5.02u l=6.3u b=4 ps=0.19u -R_pattern_49 a_49 b_49 rppd w=5.02u l=9.14u b=4 ps=0.19u -R_pattern_50 a_50 b_50 rppd w=4.64u l=9.34u b=3 ps=0.19u -R_pattern_51 a_51 b_51 rppd w=5.1u l=1.98u b=4 ps=0.19u -R_pattern_52 a_52 b_52 rppd w=5.85u l=7.11u b=4 ps=0.19u -R_pattern_53 a_53 b_53 rppd w=4.69u l=9.34u b=4 ps=0.19u -R_pattern_54 a_54 b_54 rppd w=0.64u l=3.03u b=4 ps=0.19u -R_pattern_55 a_55 b_55 rppd w=3.93u l=0.82u b=4 ps=0.19u -R_pattern_56 a_56 b_56 rppd w=1.67u l=9.34u b=6 ps=0.19u -R_pattern_57 a_57 b_57 rppd w=5.02u l=5.4u b=2 ps=0.19u -R_pattern_58 a_58 b_58 rppd w=1.67u l=7.11u b=9 ps=0.19u -R_pattern_59 a_59 b_59 rppd w=4.64u l=3.03u b=4 ps=0.19u -R_pattern_60 a_60 b_60 rppd w=1.67u l=0.82u b=8 ps=0.19u -R_pattern_61 a_61 b_61 rppd w=3.93u l=5.4u b=3 ps=0.19u -R_pattern_62 a_62 b_62 rppd w=0.64u l=9.14u b=8 ps=0.19u -R_pattern_63 a_63 b_63 rppd w=4.69u l=6.3u b=6 ps=0.19u -R_pattern_64 a_64 b_64 rppd w=5.85u l=1.98u b=4 ps=0.19u -R_pattern_65 a_65 b_65 rppd w=5.1u l=0.82u b=6 ps=0.19u -R_pattern_66 a_66 b_66 rppd w=5.02u l=0.82u b=9 ps=0.19u -R_pattern_67 a_67 b_67 rppd w=1.67u l=0.82u b=4 ps=0.19u -R_pattern_68 a_68 b_68 rppd w=5.1u l=1.98u b=8 ps=0.19u -R_pattern_69 a_69 b_69 rppd w=5.1u l=9.14u b=4 ps=0.19u -R_pattern_70 a_70 b_70 rppd w=5.1u l=5.4u b=4 ps=0.19u -R_pattern_71 a_71 b_71 rppd w=5.1u l=3.03u b=4 ps=0.19u -R_pattern_72 a_72 b_72 rppd w=5.85u l=3.03u b=3 ps=0.19u -R_pattern_73 a_73 b_73 rppd w=4.69u l=1.98u b=4 ps=0.19u -R_pattern_74 a_74 b_74 rppd w=0.64u l=6.3u b=8 ps=0.19u -R_pattern_75 a_75 b_75 rppd w=3.93u l=7.11u b=4 ps=0.19u -R_pattern_76 a_76 b_76 rppd w=3.93u l=7.11u b=2 ps=0.19u -R_pattern_77 a_77 b_77 rppd w=3.93u l=7.11u b=4 ps=0.19u -R_pattern_78 a_78 b_78 rppd w=4.64u l=7.11u b=4 ps=0.19u -R_pattern_79 a_79 b_79 rppd w=5.1u l=9.34u b=4 ps=0.19u +R_pattern_1 a_1 b_1 rppd w=5.85u l=11.25u b=3 ps=0.2u +R_pattern_2 a_2 b_2 rppd w=1.67u l=10.81u b=6 ps=0.19u +R_pattern_3 a_3 b_3 rppd w=4.69u l=11.80u b=4 ps=0.19u +R_pattern_4 a_4 b_4 rppd w=5.02u l=5.84u b=4 ps=0.2u +R_pattern_5 a_5 b_5 rppd w=0.64u l=6.94u b=2 ps=0.2u +R_pattern_6 a_6 b_6 rppd w=4.64u l=6.62u b=4 ps=0.19u +R_pattern_7 a_7 b_7 rppd w=3.93u l=13.27u b=8 ps=0.19u +R_pattern_8 a_8 b_8 rppd w=5.1u l=8.13u b=9 ps=0.2u +R_pattern_9 a_9 b_9 rppd w=5.1u l=14.44u b=4 ps=0.2u +R_pattern_10 a_10 b_10 rppd w=3.93u l=5.91u b=2 ps=0.2u +R_pattern_11 a_11 b_11 rppd w=4.64u l=10.94u b=4 ps=0.19u +R_pattern_12 a_12 b_12 rppd w=0.64u l=1.46u b=4 ps=0.19u +R_pattern_13 a_13 b_13 rppd w=5.02u l=12.13u b=6 ps=0.2u +R_pattern_14 a_14 b_14 rppd w=4.69u l=13.83u b=3 ps=0.2u +R_pattern_15 a_15 b_15 rppd w=1.67u l=7.07u b=9 ps=0.19u +R_pattern_16 a_16 b_16 rppd w=5.85u l=8.88u b=8 ps=0.19u +R_pattern_17 a_17 b_17 rppd w=1.67u l=4.70u b=2 ps=0.19u +R_pattern_18 a_18 b_18 rppd w=5.02u l=14.36u b=4 ps=0.19u +R_pattern_19 a_19 b_19 rppd w=4.64u l=13.78u b=8 ps=0.2u +R_pattern_20 a_20 b_20 rppd w=5.1u l=10.50u b=4 ps=0.19u +R_pattern_21 a_21 b_21 rppd w=5.85u l=6.67u b=6 ps=0.19u +R_pattern_22 a_22 b_22 rppd w=4.69u l=6.67u b=9 ps=0.19u +R_pattern_23 a_23 b_23 rppd w=0.64u l=7.75u b=3 ps=0.19u +R_pattern_24 a_24 b_24 rppd w=3.93u l=10.23u b=4 ps=0.19u +R_pattern_25 a_25 b_25 rppd w=1.67u l=7.97u b=4 ps=0.2u +R_pattern_26 a_26 b_26 rppd w=3.93u l=11.04u b=4 ps=0.19u +R_pattern_27 a_27 b_27 rppd w=0.64u l=6.04u b=4 ps=0.19u +R_pattern_28 a_28 b_28 rppd w=4.69u l=7.72u b=4 ps=0.19u +R_pattern_29 a_29 b_29 rppd w=5.85u l=15.19u b=2 ps=0.19u +R_pattern_30 a_30 b_30 rppd w=5.1u l=14.24u b=2 ps=0.19u +R_pattern_31 a_31 b_31 rppd w=4.64u l=5.46u b=9 ps=0.19u +R_pattern_32 a_32 b_32 rppd w=5.02u l=7.00u b=3 ps=0.19u +R_pattern_33 a_33 b_33 rppd w=5.02u l=8.05u b=8 ps=0.19u +R_pattern_34 a_34 b_34 rppd w=4.64u l=10.04u b=6 ps=0.19u +R_pattern_35 a_35 b_35 rppd w=5.1u l=12.21u b=8 ps=0.19u +R_pattern_36 a_36 b_36 rppd w=5.85u l=12.15u b=9 ps=0.19u +R_pattern_37 a_37 b_37 rppd w=4.69u l=5.51u b=2 ps=0.19u +R_pattern_38 a_38 b_38 rppd w=0.64u l=9.98u b=9 ps=0.19u +R_pattern_39 a_39 b_39 rppd w=3.93u l=13.07u b=9 ps=0.19u +R_pattern_40 a_40 b_40 rppd w=1.67u l=3.65u b=4 ps=0.19u +R_pattern_41 a_41 b_41 rppd w=1.67u l=2.49u b=3 ps=0.19u +R_pattern_42 a_42 b_42 rppd w=3.93u l=6.96u b=6 ps=0.19u +R_pattern_43 a_43 b_43 rppd w=0.64u l=2.62u b=6 ps=0.19u +R_pattern_44 a_44 b_44 rppd w=4.69u l=10.09u b=8 ps=0.19u +R_pattern_45 a_45 b_45 rppd w=5.85u l=14.99u b=4 ps=0.19u +R_pattern_46 a_46 b_46 rppd w=5.1u l=11.40u b=3 ps=0.19u +R_pattern_47 a_47 b_47 rppd w=4.64u l=11.75u b=2 ps=0.19u +R_pattern_48 a_48 b_48 rppd w=5.02u l=11.32u b=4 ps=0.19u +R_pattern_49 a_49 b_49 rppd w=5.02u l=14.16u b=4 ps=0.19u +R_pattern_50 a_50 b_50 rppd w=4.64u l=13.98u b=3 ps=0.19u +R_pattern_51 a_51 b_51 rppd w=5.1u l=7.08u b=4 ps=0.19u +R_pattern_52 a_52 b_52 rppd w=5.85u l=12.96u b=4 ps=0.19u +R_pattern_53 a_53 b_53 rppd w=4.69u l=14.03u b=4 ps=0.19u +R_pattern_54 a_54 b_54 rppd w=0.64u l=3.67u b=4 ps=0.19u +R_pattern_55 a_55 b_55 rppd w=3.93u l=4.75u b=4 ps=0.19u +R_pattern_56 a_56 b_56 rppd w=1.67u l=11.01u b=6 ps=0.19u +R_pattern_57 a_57 b_57 rppd w=5.02u l=10.42u b=2 ps=0.19u +R_pattern_58 a_58 b_58 rppd w=1.67u l=8.78u b=9 ps=0.19u +R_pattern_59 a_59 b_59 rppd w=4.64u l=7.67u b=4 ps=0.19u +R_pattern_60 a_60 b_60 rppd w=1.67u l=2.49u b=8 ps=0.19u +R_pattern_61 a_61 b_61 rppd w=3.93u l=9.33u b=3 ps=0.19u +R_pattern_62 a_62 b_62 rppd w=0.64u l=9.78u b=8 ps=0.19u +R_pattern_63 a_63 b_63 rppd w=4.69u l=10.99u b=6 ps=0.19u +R_pattern_64 a_64 b_64 rppd w=5.85u l=7.83u b=4 ps=0.19u +R_pattern_65 a_65 b_65 rppd w=5.1u l=5.92u b=6 ps=0.19u +R_pattern_66 a_66 b_66 rppd w=5.02u l=5.84u b=9 ps=0.19u +R_pattern_67 a_67 b_67 rppd w=1.67u l=2.49u b=4 ps=0.19u +R_pattern_68 a_68 b_68 rppd w=5.1u l=7.08u b=8 ps=0.19u +R_pattern_69 a_69 b_69 rppd w=5.1u l=14.24u b=4 ps=0.19u +R_pattern_70 a_70 b_70 rppd w=5.1u l=10.50u b=4 ps=0.19u +R_pattern_71 a_71 b_71 rppd w=5.1u l=8.13u b=4 ps=0.19u +R_pattern_72 a_72 b_72 rppd w=5.85u l=8.88u b=3 ps=0.19u +R_pattern_73 a_73 b_73 rppd w=4.69u l=6.67u b=4 ps=0.19u +R_pattern_74 a_74 b_74 rppd w=0.64u l=6.94u b=8 ps=0.19u +R_pattern_75 a_75 b_75 rppd w=3.93u l=11.04u b=4 ps=0.19u +R_pattern_76 a_76 b_76 rppd w=3.93u l=11.04u b=2 ps=0.19u +R_pattern_77 a_77 b_77 rppd w=3.93u l=11.04u b=4 ps=0.19u +R_pattern_78 a_78 b_78 rppd w=4.64u l=11.75u b=4 ps=0.19u +R_pattern_79 a_79 b_79 rppd w=5.1u l=14.44u b=4 ps=0.19u .ENDS diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/rsil.cdl b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/rsil.cdl index eabf0236..053b9624 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/rsil.cdl +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/res_devices/netlist/rsil.cdl @@ -19,89 +19,89 @@ Rs1 net1 net2 rsil m=1 l=0.5u w=0.5u Rs2 net3 net4 rsil m=1 l=1u w=0.5u Rs3 net5 net6 rsil m=1 l=1.2u w=0.7u -Rs4 net7 net8 rsil m=1 l=1u w=0.5u ps=0.2u b=1 -Rs5 net9 net10 rsil m=1 l=1.2u w=0.5u ps=0.2u b=2 +Rs4 net7 net8 rsil m=1 l=1.5u w=0.5u ps=0.2u b=1 +Rs5 net9 net10 rsil m=1 l=1.7u w=0.5u ps=0.2u b=2 Rs6 net11 net12 rsil m=2 l=0.5u w=0.5u Rs7 net13 net14 rsil m=1 l=1u w=0.5u * Extra patterns -R_pattern_1 a_1 b_1 rsil w=5.85u l=5.4u b=3 ps=0.2u -R_pattern_2 a_2 b_2 rsil w=1.67u l=9.14u b=6 ps=0.19u -R_pattern_3 a_3 b_3 rsil w=4.69u l=7.11u b=4 ps=0.19u -R_pattern_4 a_4 b_4 rsil w=5.02u l=0.82u b=4 ps=0.2u -R_pattern_5 a_5 b_5 rsil w=0.64u l=6.3u b=2 ps=0.2u -R_pattern_6 a_6 b_6 rsil w=4.64u l=1.98u b=4 ps=0.19u -R_pattern_7 a_7 b_7 rsil w=3.93u l=9.34u b=8 ps=0.19u -R_pattern_8 a_8 b_8 rsil w=5.1u l=3.03u b=9 ps=0.2u -R_pattern_9 a_9 b_9 rsil w=5.1u l=9.34u b=4 ps=0.2u -R_pattern_10 a_10 b_10 rsil w=3.93u l=1.98u b=2 ps=0.2u -R_pattern_11 a_11 b_11 rsil w=4.64u l=6.3u b=4 ps=0.19u -R_pattern_12 a_12 b_12 rsil w=0.64u l=0.82u b=4 ps=0.19u -R_pattern_13 a_13 b_13 rsil w=5.02u l=7.11u b=6 ps=0.2u -R_pattern_14 a_14 b_14 rsil w=4.69u l=9.14u b=3 ps=0.2u -R_pattern_15 a_15 b_15 rsil w=1.67u l=5.4u b=9 ps=0.19u -R_pattern_16 a_16 b_16 rsil w=5.85u l=3.03u b=8 ps=0.19u -R_pattern_17 a_17 b_17 rsil w=1.67u l=3.03u b=2 ps=0.19u -R_pattern_18 a_18 b_18 rsil w=5.02u l=9.34u b=4 ps=0.19u -R_pattern_19 a_19 b_19 rsil w=4.64u l=9.14u b=8 ps=0.2u -R_pattern_20 a_20 b_20 rsil w=5.1u l=5.4u b=4 ps=0.19u -R_pattern_21 a_21 b_21 rsil w=5.85u l=0.82u b=6 ps=0.19u -R_pattern_22 a_22 b_22 rsil w=4.69u l=1.98u b=9 ps=0.19u -R_pattern_23 a_23 b_23 rsil w=0.64u l=7.11u b=3 ps=0.19u -R_pattern_24 a_24 b_24 rsil w=3.93u l=6.3u b=4 ps=0.19u -R_pattern_25 a_25 b_25 rsil w=1.67u l=6.3u b=4 ps=0.2u -R_pattern_26 a_26 b_26 rsil w=3.93u l=7.11u b=4 ps=0.19u -R_pattern_27 a_27 b_27 rsil w=0.64u l=5.4u b=4 ps=0.19u -R_pattern_28 a_28 b_28 rsil w=4.69u l=3.03u b=4 ps=0.19u -R_pattern_29 a_29 b_29 rsil w=5.85u l=9.34u b=2 ps=0.19u -R_pattern_30 a_30 b_30 rsil w=5.1u l=9.14u b=2 ps=0.19u -R_pattern_31 a_31 b_31 rsil w=4.64u l=0.82u b=9 ps=0.19u -R_pattern_32 a_32 b_32 rsil w=5.02u l=1.98u b=3 ps=0.19u -R_pattern_33 a_33 b_33 rsil w=5.02u l=3.03u b=8 ps=0.19u -R_pattern_34 a_34 b_34 rsil w=4.64u l=5.4u b=6 ps=0.19u -R_pattern_35 a_35 b_35 rsil w=5.1u l=7.11u b=8 ps=0.19u -R_pattern_36 a_36 b_36 rsil w=5.85u l=6.3u b=9 ps=0.19u -R_pattern_37 a_37 b_37 rsil w=4.69u l=0.82u b=2 ps=0.19u -R_pattern_38 a_38 b_38 rsil w=0.64u l=9.34u b=9 ps=0.19u -R_pattern_39 a_39 b_39 rsil w=3.93u l=9.14u b=9 ps=0.19u -R_pattern_40 a_40 b_40 rsil w=1.67u l=1.98u b=4 ps=0.19u -R_pattern_41 a_41 b_41 rsil w=1.67u l=0.82u b=3 ps=0.19u -R_pattern_42 a_42 b_42 rsil w=3.93u l=3.03u b=6 ps=0.19u -R_pattern_43 a_43 b_43 rsil w=0.64u l=1.98u b=6 ps=0.19u -R_pattern_44 a_44 b_44 rsil w=4.69u l=5.4u b=8 ps=0.19u -R_pattern_45 a_45 b_45 rsil w=5.85u l=9.14u b=4 ps=0.19u -R_pattern_46 a_46 b_46 rsil w=5.1u l=6.3u b=3 ps=0.19u -R_pattern_47 a_47 b_47 rsil w=4.64u l=7.11u b=2 ps=0.19u -R_pattern_48 a_48 b_48 rsil w=5.02u l=6.3u b=4 ps=0.19u -R_pattern_49 a_49 b_49 rsil w=5.02u l=9.14u b=4 ps=0.19u -R_pattern_50 a_50 b_50 rsil w=4.64u l=9.34u b=3 ps=0.19u -R_pattern_51 a_51 b_51 rsil w=5.1u l=1.98u b=4 ps=0.19u -R_pattern_52 a_52 b_52 rsil w=5.85u l=7.11u b=4 ps=0.19u -R_pattern_53 a_53 b_53 rsil w=4.69u l=9.34u b=4 ps=0.19u -R_pattern_54 a_54 b_54 rsil w=0.64u l=3.03u b=4 ps=0.19u -R_pattern_55 a_55 b_55 rsil w=3.93u l=0.82u b=4 ps=0.19u -R_pattern_56 a_56 b_56 rsil w=1.67u l=9.34u b=6 ps=0.19u -R_pattern_57 a_57 b_57 rsil w=5.02u l=5.4u b=2 ps=0.19u -R_pattern_58 a_58 b_58 rsil w=1.67u l=7.11u b=9 ps=0.19u -R_pattern_59 a_59 b_59 rsil w=4.64u l=3.03u b=4 ps=0.19u -R_pattern_60 a_60 b_60 rsil w=1.67u l=0.82u b=8 ps=0.19u -R_pattern_61 a_61 b_61 rsil w=3.93u l=5.4u b=3 ps=0.19u -R_pattern_62 a_62 b_62 rsil w=0.64u l=9.14u b=8 ps=0.19u -R_pattern_63 a_63 b_63 rsil w=4.69u l=6.3u b=6 ps=0.19u -R_pattern_64 a_64 b_64 rsil w=5.85u l=1.98u b=4 ps=0.19u -R_pattern_65 a_65 b_65 rsil w=5.1u l=0.82u b=6 ps=0.19u -R_pattern_66 a_66 b_66 rsil w=5.02u l=0.82u b=9 ps=0.19u -R_pattern_67 a_67 b_67 rsil w=1.67u l=0.82u b=4 ps=0.19u -R_pattern_68 a_68 b_68 rsil w=5.1u l=1.98u b=8 ps=0.19u -R_pattern_69 a_69 b_69 rsil w=5.1u l=9.14u b=4 ps=0.19u -R_pattern_70 a_70 b_70 rsil w=5.1u l=5.4u b=4 ps=0.19u -R_pattern_71 a_71 b_71 rsil w=5.1u l=3.03u b=4 ps=0.19u -R_pattern_72 a_72 b_72 rsil w=5.85u l=3.03u b=3 ps=0.19u -R_pattern_73 a_73 b_73 rsil w=4.69u l=1.98u b=4 ps=0.19u -R_pattern_74 a_74 b_74 rsil w=0.64u l=6.3u b=8 ps=0.19u -R_pattern_75 a_75 b_75 rsil w=3.93u l=7.11u b=4 ps=0.19u -R_pattern_76 a_76 b_76 rsil w=3.93u l=7.11u b=2 ps=0.19u -R_pattern_77 a_77 b_77 rsil w=3.93u l=7.11u b=4 ps=0.19u -R_pattern_78 a_78 b_78 rsil w=4.64u l=7.11u b=4 ps=0.19u -R_pattern_79 a_79 b_79 rsil w=5.1u l=9.34u b=4 ps=0.19u +R_pattern_1 a_1 b_1 rsil w=5.85u l=11.25u b=3 ps=0.2u +R_pattern_2 a_2 b_2 rsil w=1.67u l=10.81u b=6 ps=0.19u +R_pattern_3 a_3 b_3 rsil w=4.69u l=11.80u b=4 ps=0.19u +R_pattern_4 a_4 b_4 rsil w=5.02u l=5.84u b=4 ps=0.2u +R_pattern_5 a_5 b_5 rsil w=0.64u l=6.94u b=2 ps=0.2u +R_pattern_6 a_6 b_6 rsil w=4.64u l=6.62u b=4 ps=0.19u +R_pattern_7 a_7 b_7 rsil w=3.93u l=13.27u b=8 ps=0.19u +R_pattern_8 a_8 b_8 rsil w=5.1u l=8.13u b=9 ps=0.2u +R_pattern_9 a_9 b_9 rsil w=5.1u l=14.44u b=4 ps=0.2u +R_pattern_10 a_10 b_10 rsil w=3.93u l=5.91u b=2 ps=0.2u +R_pattern_11 a_11 b_11 rsil w=4.64u l=10.94u b=4 ps=0.19u +R_pattern_12 a_12 b_12 rsil w=0.64u l=1.46u b=4 ps=0.19u +R_pattern_13 a_13 b_13 rsil w=5.02u l=12.13u b=6 ps=0.2u +R_pattern_14 a_14 b_14 rsil w=4.69u l=13.83u b=3 ps=0.2u +R_pattern_15 a_15 b_15 rsil w=1.67u l=7.07u b=9 ps=0.19u +R_pattern_16 a_16 b_16 rsil w=5.85u l=8.88u b=8 ps=0.19u +R_pattern_17 a_17 b_17 rsil w=1.67u l=4.70u b=2 ps=0.19u +R_pattern_18 a_18 b_18 rsil w=5.02u l=14.36u b=4 ps=0.19u +R_pattern_19 a_19 b_19 rsil w=4.64u l=13.78u b=8 ps=0.2u +R_pattern_20 a_20 b_20 rsil w=5.1u l=10.50u b=4 ps=0.19u +R_pattern_21 a_21 b_21 rsil w=5.85u l=6.67u b=6 ps=0.19u +R_pattern_22 a_22 b_22 rsil w=4.69u l=6.67u b=9 ps=0.19u +R_pattern_23 a_23 b_23 rsil w=0.64u l=7.75u b=3 ps=0.19u +R_pattern_24 a_24 b_24 rsil w=3.93u l=10.23u b=4 ps=0.19u +R_pattern_25 a_25 b_25 rsil w=1.67u l=7.97u b=4 ps=0.2u +R_pattern_26 a_26 b_26 rsil w=3.93u l=11.04u b=4 ps=0.19u +R_pattern_27 a_27 b_27 rsil w=0.64u l=6.04u b=4 ps=0.19u +R_pattern_28 a_28 b_28 rsil w=4.69u l=7.72u b=4 ps=0.19u +R_pattern_29 a_29 b_29 rsil w=5.85u l=15.19u b=2 ps=0.19u +R_pattern_30 a_30 b_30 rsil w=5.1u l=14.24u b=2 ps=0.19u +R_pattern_31 a_31 b_31 rsil w=4.64u l=5.46u b=9 ps=0.19u +R_pattern_32 a_32 b_32 rsil w=5.02u l=7.00u b=3 ps=0.19u +R_pattern_33 a_33 b_33 rsil w=5.02u l=8.05u b=8 ps=0.19u +R_pattern_34 a_34 b_34 rsil w=4.64u l=10.04u b=6 ps=0.19u +R_pattern_35 a_35 b_35 rsil w=5.1u l=12.21u b=8 ps=0.19u +R_pattern_36 a_36 b_36 rsil w=5.85u l=12.15u b=9 ps=0.19u +R_pattern_37 a_37 b_37 rsil w=4.69u l=5.51u b=2 ps=0.19u +R_pattern_38 a_38 b_38 rsil w=0.64u l=9.98u b=9 ps=0.19u +R_pattern_39 a_39 b_39 rsil w=3.93u l=13.07u b=9 ps=0.19u +R_pattern_40 a_40 b_40 rsil w=1.67u l=3.65u b=4 ps=0.19u +R_pattern_41 a_41 b_41 rsil w=1.67u l=2.49u b=3 ps=0.19u +R_pattern_42 a_42 b_42 rsil w=3.93u l=6.96u b=6 ps=0.19u +R_pattern_43 a_43 b_43 rsil w=0.64u l=2.62u b=6 ps=0.19u +R_pattern_44 a_44 b_44 rsil w=4.69u l=10.09u b=8 ps=0.19u +R_pattern_45 a_45 b_45 rsil w=5.85u l=14.99u b=4 ps=0.19u +R_pattern_46 a_46 b_46 rsil w=5.1u l=11.40u b=3 ps=0.19u +R_pattern_47 a_47 b_47 rsil w=4.64u l=11.75u b=2 ps=0.19u +R_pattern_48 a_48 b_48 rsil w=5.02u l=11.32u b=4 ps=0.19u +R_pattern_49 a_49 b_49 rsil w=5.02u l=14.16u b=4 ps=0.19u +R_pattern_50 a_50 b_50 rsil w=4.64u l=13.98u b=3 ps=0.19u +R_pattern_51 a_51 b_51 rsil w=5.1u l=7.08u b=4 ps=0.19u +R_pattern_52 a_52 b_52 rsil w=5.85u l=12.96u b=4 ps=0.19u +R_pattern_53 a_53 b_53 rsil w=4.69u l=14.03u b=4 ps=0.19u +R_pattern_54 a_54 b_54 rsil w=0.64u l=3.67u b=4 ps=0.19u +R_pattern_55 a_55 b_55 rsil w=3.93u l=4.75u b=4 ps=0.19u +R_pattern_56 a_56 b_56 rsil w=1.67u l=11.01u b=6 ps=0.19u +R_pattern_57 a_57 b_57 rsil w=5.02u l=10.42u b=2 ps=0.19u +R_pattern_58 a_58 b_58 rsil w=1.67u l=8.78u b=9 ps=0.19u +R_pattern_59 a_59 b_59 rsil w=4.64u l=7.67u b=4 ps=0.19u +R_pattern_60 a_60 b_60 rsil w=1.67u l=2.49u b=8 ps=0.19u +R_pattern_61 a_61 b_61 rsil w=3.93u l=9.33u b=3 ps=0.19u +R_pattern_62 a_62 b_62 rsil w=0.64u l=9.78u b=8 ps=0.19u +R_pattern_63 a_63 b_63 rsil w=4.69u l=10.99u b=6 ps=0.19u +R_pattern_64 a_64 b_64 rsil w=5.85u l=7.83u b=4 ps=0.19u +R_pattern_65 a_65 b_65 rsil w=5.1u l=5.92u b=6 ps=0.19u +R_pattern_66 a_66 b_66 rsil w=5.02u l=5.84u b=9 ps=0.19u +R_pattern_67 a_67 b_67 rsil w=1.67u l=2.49u b=4 ps=0.19u +R_pattern_68 a_68 b_68 rsil w=5.1u l=7.08u b=8 ps=0.19u +R_pattern_69 a_69 b_69 rsil w=5.1u l=14.24u b=4 ps=0.19u +R_pattern_70 a_70 b_70 rsil w=5.1u l=10.50u b=4 ps=0.19u +R_pattern_71 a_71 b_71 rsil w=5.1u l=8.13u b=4 ps=0.19u +R_pattern_72 a_72 b_72 rsil w=5.85u l=8.88u b=3 ps=0.19u +R_pattern_73 a_73 b_73 rsil w=4.69u l=6.67u b=4 ps=0.19u +R_pattern_74 a_74 b_74 rsil w=0.64u l=6.94u b=8 ps=0.19u +R_pattern_75 a_75 b_75 rsil w=3.93u l=11.04u b=4 ps=0.19u +R_pattern_76 a_76 b_76 rsil w=3.93u l=11.04u b=2 ps=0.19u +R_pattern_77 a_77 b_77 rsil w=3.93u l=11.04u b=4 ps=0.19u +R_pattern_78 a_78 b_78 rsil w=4.64u l=11.75u b=4 ps=0.19u +R_pattern_79 a_79 b_79 rsil w=5.1u l=14.44u b=4 ps=0.19u .ENDS From 9de6a7342ad42349dc876b15c20792a770bde355 Mon Sep 17 00:00:00 2001 From: FaragElsayed2 Date: Sun, 19 May 2024 14:20:35 +0300 Subject: [PATCH 3/5] Updating LVS for taps, Adding salicide lvs connections Signed-off-by: FaragElsayed2 --- .../tech/lvs/rule_decks/esd_derivations.lvs | 2 +- .../lvs/rule_decks/general_connections.lvs | 6 ++++ .../lvs/rule_decks/general_derivations.lvs | 33 +++++++++++++----- .../tech/lvs/rule_decks/tap_connections.lvs | 8 ++--- .../tech/lvs/rule_decks/tap_derivations.lvs | 14 ++++---- .../tech/lvs/rule_decks/tap_extraction.lvs | 4 +-- .../tech/lvs/testing/run_regression_cells.py | 13 ++----- .../unit/tap_devices/layout/ntap1.gds | Bin 988140 -> 974892 bytes 8 files changed, 48 insertions(+), 32 deletions(-) diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/esd_derivations.lvs b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/esd_derivations.lvs index a2b07c59..224f1655 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/esd_derivations.lvs +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/esd_derivations.lvs @@ -39,7 +39,7 @@ idiodevss_exc = esd_exc_d.join(nwell_drw.not_interacting(nwell_holes)) .join(pwell_block) diodevss_exc = idiodevss_exc.join(nbulay_drw) -nw_diode = nwell_n_iso.not_interacting(pwell_block) +nw_diode = nwell_drw.not_interacting(pwell_block) nw_idiode = nwell_iso.interacting(pwell_block) #====================== diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_connections.lvs b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_connections.lvs index a3062e1f..c279ed68 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_connections.lvs +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_connections.lvs @@ -46,6 +46,12 @@ connect(topvia1_n_cap, topmetal1_con) connect(topmetal1_con, topvia2_drw) connect(topvia2_drw, topmetal2_con) +# salicide connection +connect(nsd_fet, nsd_ptap_abutt) +connect(nsd_ptap_abutt, ptap) +connect(psd_fet, psd_ntap_abutt) +connect(psd_ntap_abutt, ntap) + # Attaching labels connect(metal1_con, metal1_text) connect(metal2_con, metal2_text) diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_derivations.lvs b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_derivations.lvs index 80874f3b..71973a79 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_derivations.lvs +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/general_derivations.lvs @@ -29,13 +29,16 @@ CHIP = extent.sized(0.0) # === General Derivations === # nwell nwell_iso = nwell_drw.and(nbulay_drw) -nwell_n_iso = nwell_drw.not(nbulay_drw) +nwell_holes = nwell_drw.holes.not(nwell_drw) # pwell pwell_pre = CHIP.not(nwell_drw).not(pwell_block).not(digisub_drw) digisub_pre = digisub_drw.sized(-1.nm).not(nwell_drw).not(pwell_block) pwell = pwell_pre.join(digisub_pre) +# General pwell +pwell_sub = CHIP.not(digisub_drw).not(pwell_block).not(nbulay_drw.interacting(nwell_holes)) + # psd, nsd active & res psd = psd_drw nsd_res = nsd_drw.and(psd).interacting(polyres_drw) @@ -69,14 +72,28 @@ pgate_hv_base = pgate.and(thickgateox_drw) nsd_fet = nactiv.not(nwell_drw).interacting(ngate).not(ngate).not_interacting(res_mk) psd_fet = pactiv.and(nwell_drw).interacting(pgate).not(pgate).not_interacting(res_mk) -# n & p taps (short connections) -ntap = nactiv.and(nwell_n_iso).not(res_mk).not(recog_diode).not(gatpoly_drw) -ptap = pactiv.and(pwell).not(substrate_drw).not(res_mk).not(recog_diode).not(gatpoly_drw) -# Derived - Layers (Special) -nwell_holes = nwell_drw.holes.not(nwell_drw) +# n1/p1 taps labels +ntap1_lbl = text_drw.texts("well") +ntap1_mk = nwell_drw.interacting(ntap1_lbl) + +ptap1_lbl = text_drw.texts("sub!") +ptap1_mk = substrate_drw.and(pwell).interacting(ptap1_lbl) + +# n & p taps (short connections) +ntap = nactiv.and(nwell_drw).not(recog_diode).not(gatpoly_drw).not(ntap1_mk) +ptap = pactiv.and(pwell).not(ptap1_mk).not(recog_diode).not(gatpoly_drw) ptap_holes = ptap.holes ntap_holes = ntap.holes -# General pwell -pwell_sub = CHIP.not(digisub_drw).not(pwell_block).not(nbulay_drw.interacting(nwell_holes)) +# S/D (salicide) +nsd_sal = nsd_fet.not(salblock_drw) +psd_sal = psd_fet.not(salblock_drw) + +# n & p taps (salicide) +ntap_sal = ntap.not(salblock_drw) +ptap_sal = ptap.not(salblock_drw) + +# n/p SD abutted with n/p taps (salicide) +nsd_ptap_abutt = nsd_sal.edges.and(ptap_sal.edges).extended(:in => 1.nm, :out => 1.nm) +psd_ntap_abutt = psd_sal.edges.and(ntap_sal.edges).extended(:in => 1.nm, :out => 1.nm) diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/tap_connections.lvs b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/tap_connections.lvs index 4d1c5139..f922e2a6 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/tap_connections.lvs +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/tap_connections.lvs @@ -24,9 +24,9 @@ logger.info('Starting LVS Taps CONNECTIONS') # ntap1 -connect(ntap1_n, cont_drw) -connect(ntap1_p, nwell_drw) +connect(ntap1_tie, cont_drw) +connect(ntap1_well, nwell_drw) # ptap1 -connect(ptap1_n, cont_drw) -connect(ptap1_p, pwell) +connect(ptap1_tie, cont_drw) +connect(ptap1_sub, pwell) diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/tap_derivations.lvs b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/tap_derivations.lvs index a888b25d..1f70f0b4 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/tap_derivations.lvs +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/tap_derivations.lvs @@ -31,12 +31,12 @@ taps_exclude = gatpoly_drw.join(nsd_drw).join(trans_drw) # === ntap1 === ntap1_exc = pwell.join(psd_drw).join(taps_exclude) -# ntap1_n = nactiv.and(nwell_iso).not(ntap1_exc) -# Modified to catch similar structure in pnpMPA-Base node -ntap1_n = nactiv.and(nwell_iso).extents.not_interacting(ntap1_exc) -ntap1_p = nwell_iso.covering(ntap1_n) + +ntap1_tie = nactiv.and(ntap1_mk).extents.not(ntap1_exc) +ntap1_well = ntap1_mk.covering(ntap1_tie) # === ptap1 === -ptap1_exc = nwell_drw.join(nbulay_drw).join(taps_exclude) -ptap1_n = pactiv.and(pwell).interacting(substrate_drw).not(ptap1_exc) -ptap1_p = pwell.covering(ptap1_n) +ptap1_exc = nwell_drw.join(taps_exclude) + +ptap1_tie = pactiv.and(ptap1_mk).extents.not(ptap1_exc) +ptap1_sub = pwell.covering(ptap1_tie) diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/tap_extraction.lvs b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/tap_extraction.lvs index 8e08e659..d6cc82db 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/tap_extraction.lvs +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/tap_extraction.lvs @@ -25,8 +25,8 @@ logger.info('Starting Taps EXTRACTION') # ntap1 logger.info('Extracting ntap1 device') -extract_devices(diode('ntap1', CustomTap), { 'N' => ntap1_n, 'P' => ntap1_p }) +extract_devices(diode('ntap1', CustomTap), { 'N' => ntap1_tie, 'P' => ntap1_well }) # ptap1 logger.info('Extracting ptap1 device') -extract_devices(diode('ptap1', CustomTap), { 'N' => ptap1_n, 'P' => ptap1_p }) +extract_devices(diode('ptap1', CustomTap), { 'N' => ptap1_tie, 'P' => ptap1_sub }) diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/run_regression_cells.py b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/run_regression_cells.py index aaa84499..58529667 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/run_regression_cells.py +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/run_regression_cells.py @@ -70,12 +70,6 @@ def build_tests_dataframe(cells_dir, target_cell, cells): # Construct df that holds all info tc_df = pd.DataFrame({"cell_name": cells}) - # Drop specific cell that has issues - values_to_drop = ["sg13g2_tiehi"] - - # Drop rows where cell_name is in the list of values to drop - tc_df = tc_df[~tc_df['cell_name'].isin(values_to_drop)] - all_cells_layout = sorted(Path(cells_dir).rglob("*.{}".format(SUPPORTED_TC_EXT))) all_cells_netlist = sorted( Path(cells_dir).rglob("*.{}".format(SUPPORTED_SPICE_EXT)) @@ -128,16 +122,15 @@ def build_tests_dataframe(cells_dir, target_cell, cells): tc_df["run_id"] = range(len(tc_df)) # Duplicate the original cells for iso/digisub - # iso_df = tc_df.copy() + iso_df = tc_df.copy() sub_df = tc_df.copy() # Add the suffix to each cell in the column - # iso_df["cell_name"] = iso_df["cell_name"] + "_iso" + iso_df["cell_name"] = iso_df["cell_name"] + "_iso" sub_df["cell_name"] = sub_df["cell_name"] + "_digisub" # Concatenate the original DataFrame with the modified DataFrame - # final_df = pd.concat([tc_df, iso_df, sub_df]) - final_df = pd.concat([tc_df, sub_df]) + final_df = pd.concat([tc_df, iso_df, sub_df]) final_df.reset_index(drop=True, inplace=True) final_df["run_id"] = range(len(final_df)) diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/tap_devices/layout/ntap1.gds b/ihp-sg13g2/libs.tech/klayout/tech/lvs/testing/testcases/unit/tap_devices/layout/ntap1.gds index f9081c80d9b89fe6858cf4287f1e05c42e16ab87..b4072b4e5e2c340bf40e5bded8f3109882c343e1 100644 GIT binary patch delta 123 zcmaE}+-A)IYb6FY1}3Hm1{p>s_7@DS48jb&3{ni@$n1$qs=`==8>3pI7+a&5TBDd- zqgYy_SX-mmTBF!oqc~clI9sE*TBEpIqj*}Qc(+FJO+LSU?E^kb0XB991{M|u0Mb4h A-2eap delta 5944 zcmb`L&x;gC6vwN3e(V}&H-<<;jH0Y~3v~etm= zUCr0kp1OLYuJ+c|psp6ytHtXZ#gU=^e(_^Spx7U{qSyzzTBCSMpx7T-qj*Z7*q>OV zcuJtypIM`LN}$+ZSfhAKpx9qoqj*Z7*xy*AcuJty-&v!0N}$+3SfhAKpxB43Q9LD3 z?4PVrJS9-LY66BWhw9Y83SmHLlc0)WkXTQPfBDiDjr!)JODjr9Pr2&Y_Q@ zKB7-7Lye+7qK_-}5jAlReH8T(ePS7E6!j5(T&a(!iF4?qsE_Cq%TS}JkLcq{eMC*1 zLmx$bM4woO8by6XA6M!lYT_LFDC#5n#4^+<>LdENQXf$h=g>z{AJHcUqDFy_$K7CT zqv^j>n!@zoEf59$1BEeW@P2Rk8dN@meH~+-{k^%_`OoZsuYY>^v$ac?&#s+Y{p9S0 z)icI)-@?ypu!=7~SC*RvtbFs|+zWF%{>$>-N-k^%tFv-0!gA^3?>zSrSURhF^#)mP z2440KuV!DE+p)=>-rU^0et9;V>>|d$JIgV|5_W$%2r*bX>(0?J%eDV1bxwVqe_?Lw zJKlM*o)4R1b-#(ToZdqc#@}1|Ze|yTAT#E}gR;lmERyVhSO&{YMl6!71#F6SZzaxh zatluwKawmCOJzOxTP)Z1MuH^Uf@QGW#2pSv)&@4gGEZ+B^Z1KMkh!$+7Z)-9C@hVI zAlqiSmiO`U&e3gH2FqR3;{^{GNU~P23D%4C6qZZc{YbJDSP~0C)?m4I$0$j%;{0-C zlkKuEaQ@JbobPZZYX@tvB*;=O%%y}6j$}!&6qW>8W4ZYF zaU@HG#aR+$6Bp)MJi|$nO~5i(I{)#*r73TJl%HhHO@<&#WVz_>mn2Js#aRflNtVlh zgq9?mgk`W~{xW_^vevLMOM)zwh4atuFC8SwQeiQc9LYMT4mJ0f%YTD`B%6X|urPlO xA0%0O*qDVNOJ=#q_$A4bVKEkhY?|eAUm!`6O~W!+AL#fc$##X!;q6w}yac~&OaK4? From 8a29c419f344049aaae661cde9fddb5acaea4f1d Mon Sep 17 00:00:00 2001 From: FaragElsayed2 Date: Sun, 19 May 2024 18:19:15 +0300 Subject: [PATCH 4/5] Linting fixes for layers def runset Signed-off-by: FaragElsayed2 --- .../lvs/rule_decks/layers_definitions.lvs | 623 +++++++++--------- 1 file changed, 311 insertions(+), 312 deletions(-) diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/layers_definitions.lvs b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/layers_definitions.lvs index f827bb76..693c3ab9 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/layers_definitions.lvs +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/rule_decks/layers_definitions.lvs @@ -22,1495 +22,1494 @@ #================================================ polygons_count = 0 -logger.info("Read in polygons from layers.") +logger.info('Read in polygons from layers.') -def get_polygons(l, d) - if $run_mode == "deep" - polygons(l, d) +def get_polygons(lay_no, lay_dt) + if $run_mode == 'deep' + polygons(lay_no, lay_dt) else - polygons(l, d).merged + polygons(lay_no, lay_dt).merged end end activ_drw = get_polygons(1, 0) -count = activ_drw.count() +count = activ_drw.count logger.info("activ_drw has #{count} polygons") polygons_count += count activ_pin = get_polygons(1, 2) -count = activ_pin.count() +count = activ_pin.count logger.info("activ_pin has #{count} polygons") polygons_count += count activ_mask = get_polygons(1, 20) -count = activ_mask.count() +count = activ_mask.count logger.info("activ_mask has #{count} polygons") polygons_count += count activ_filler = get_polygons(1, 22) -count = activ_filler.count() +count = activ_filler.count logger.info("activ_filler has #{count} polygons") polygons_count += count activ_nofill = get_polygons(1, 23) -count = activ_nofill.count() +count = activ_nofill.count logger.info("activ_nofill has #{count} polygons") polygons_count += count activ_opc = get_polygons(1, 26) -count = activ_opc.count() +count = activ_opc.count logger.info("activ_opc has #{count} polygons") polygons_count += count activ_iopc = get_polygons(1, 27) -count = activ_iopc.count() +count = activ_iopc.count logger.info("activ_iopc has #{count} polygons") polygons_count += count activ_noqrc = get_polygons(1, 28) -count = activ_noqrc.count() +count = activ_noqrc.count logger.info("activ_noqrc has #{count} polygons") polygons_count += count biwind_drw = get_polygons(3, 0) -count = biwind_drw.count() +count = biwind_drw.count logger.info("biwind_drw has #{count} polygons") polygons_count += count biwind_opc = get_polygons(3, 26) -count = biwind_opc.count() +count = biwind_opc.count logger.info("biwind_opc has #{count} polygons") polygons_count += count gatpoly_drw = get_polygons(5, 0) -count = gatpoly_drw.count() +count = gatpoly_drw.count logger.info("gatpoly_drw has #{count} polygons") polygons_count += count gatpoly_pin = get_polygons(5, 2) -count = gatpoly_pin.count() +count = gatpoly_pin.count logger.info("gatpoly_pin has #{count} polygons") polygons_count += count gatpoly_filler = get_polygons(5, 22) -count = gatpoly_filler.count() +count = gatpoly_filler.count logger.info("gatpoly_filler has #{count} polygons") polygons_count += count gatpoly_nofill = get_polygons(5, 23) -count = gatpoly_nofill.count() +count = gatpoly_nofill.count logger.info("gatpoly_nofill has #{count} polygons") polygons_count += count gatpoly_opc = get_polygons(5, 26) -count = gatpoly_opc.count() +count = gatpoly_opc.count logger.info("gatpoly_opc has #{count} polygons") polygons_count += count gatpoly_iopc = get_polygons(5, 27) -count = gatpoly_iopc.count() +count = gatpoly_iopc.count logger.info("gatpoly_iopc has #{count} polygons") polygons_count += count gatpoly_noqrc = get_polygons(5, 28) -count = gatpoly_noqrc.count() +count = gatpoly_noqrc.count logger.info("gatpoly_noqrc has #{count} polygons") polygons_count += count cont_drw = get_polygons(6, 0) -count = cont_drw.count() +count = cont_drw.count logger.info("cont_drw has #{count} polygons") polygons_count += count cont_opc = get_polygons(6, 26) -count = cont_opc.count() +count = cont_opc.count logger.info("cont_opc has #{count} polygons") polygons_count += count -nsd_drw = get_polygons(7, 0) -count = nsd_drw.count() +nsd_drw = get_polygons(7, 0) +count = nsd_drw.count logger.info("nsd_drw has #{count} polygons") polygons_count += count nsd_block = get_polygons(7, 21) -count = nsd_block.count() +count = nsd_block.count logger.info("nsd_block has #{count} polygons") polygons_count += count metal1_drw = get_polygons(8, 0) -count = metal1_drw.count() +count = metal1_drw.count logger.info("metal1_drw has #{count} polygons") polygons_count += count metal1_pin = get_polygons(8, 2) -count = metal1_pin.count() +count = metal1_pin.count logger.info("metal1_pin has #{count} polygons") polygons_count += count metal1_mask = get_polygons(8, 20) -count = metal1_mask.count() +count = metal1_mask.count logger.info("metal1_mask has #{count} polygons") polygons_count += count metal1_filler = get_polygons(8, 22) -count = metal1_filler.count() +count = metal1_filler.count logger.info("metal1_filler has #{count} polygons") polygons_count += count metal1_nofill = get_polygons(8, 23) -count = metal1_nofill.count() +count = metal1_nofill.count logger.info("metal1_nofill has #{count} polygons") polygons_count += count metal1_slit = get_polygons(8, 24) -count = metal1_slit.count() +count = metal1_slit.count logger.info("metal1_slit has #{count} polygons") polygons_count += count metal1_text = labels(8, 25) -count = metal1_text.count() +count = metal1_text.count logger.info("metal1_text has #{count} polygons") polygons_count += count metal1_opc = get_polygons(8, 26) -count = metal1_opc.count() +count = metal1_opc.count logger.info("metal1_opc has #{count} polygons") polygons_count += count metal1_noqrc = get_polygons(8, 28) -count = metal1_noqrc.count() +count = metal1_noqrc.count logger.info("metal1_noqrc has #{count} polygons") polygons_count += count metal1_res = get_polygons(8, 29) -count = metal1_res.count() +count = metal1_res.count logger.info("metal1_res has #{count} polygons") polygons_count += count metal1_iprobe = get_polygons(8, 33) -count = metal1_iprobe.count() +count = metal1_iprobe.count logger.info("metal1_iprobe has #{count} polygons") polygons_count += count metal1_diffprb = get_polygons(8, 34) -count = metal1_diffprb.count() +count = metal1_diffprb.count logger.info("metal1_diffprb has #{count} polygons") polygons_count += count passiv_drw = get_polygons(9, 0) -count = passiv_drw.count() +count = passiv_drw.count logger.info("passiv_drw has #{count} polygons") polygons_count += count passiv_pin = get_polygons(9, 2) -count = passiv_pin.count() +count = passiv_pin.count logger.info("passiv_pin has #{count} polygons") polygons_count += count passiv_sbump = get_polygons(9, 36) -count = passiv_sbump.count() +count = passiv_sbump.count logger.info("passiv_sbump has #{count} polygons") polygons_count += count passiv_pillar = get_polygons(9, 35) -count = passiv_pillar.count() +count = passiv_pillar.count logger.info("passiv_pillar has #{count} polygons") polygons_count += count passiv_pdl = get_polygons(9, 40) -count = passiv_pdl.count() +count = passiv_pdl.count logger.info("passiv_pdl has #{count} polygons") polygons_count += count metal2_drw = get_polygons(10, 0) -count = metal2_drw.count() +count = metal2_drw.count logger.info("metal2_drw has #{count} polygons") polygons_count += count metal2_pin = get_polygons(10, 2) -count = metal2_pin.count() +count = metal2_pin.count logger.info("metal2_pin has #{count} polygons") polygons_count += count metal2_mask = get_polygons(10, 20) -count = metal2_mask.count() +count = metal2_mask.count logger.info("metal2_mask has #{count} polygons") polygons_count += count metal2_filler = get_polygons(10, 22) -count = metal2_filler.count() +count = metal2_filler.count logger.info("metal2_filler has #{count} polygons") polygons_count += count metal2_nofill = get_polygons(10, 23) -count = metal2_nofill.count() +count = metal2_nofill.count logger.info("metal2_nofill has #{count} polygons") polygons_count += count metal2_slit = get_polygons(10, 24) -count = metal2_slit.count() +count = metal2_slit.count logger.info("metal2_slit has #{count} polygons") polygons_count += count metal2_text = labels(10, 25) -count = metal2_text.count() +count = metal2_text.count logger.info("metal2_text has #{count} polygons") polygons_count += count metal2_opc = get_polygons(10, 26) -count = metal2_opc.count() +count = metal2_opc.count logger.info("metal2_opc has #{count} polygons") polygons_count += count metal2_noqrc = get_polygons(10, 28) -count = metal2_noqrc.count() +count = metal2_noqrc.count logger.info("metal2_noqrc has #{count} polygons") polygons_count += count metal2_res = get_polygons(10, 29) -count = metal2_res.count() +count = metal2_res.count logger.info("metal2_res has #{count} polygons") polygons_count += count metal2_iprobe = get_polygons(10, 33) -count = metal2_iprobe.count() +count = metal2_iprobe.count logger.info("metal2_iprobe has #{count} polygons") polygons_count += count metal2_diffprb = get_polygons(10, 34) -count = metal2_diffprb.count() +count = metal2_diffprb.count logger.info("metal2_diffprb has #{count} polygons") polygons_count += count baspoly_drw = get_polygons(13, 0) -count = baspoly_drw.count() +count = baspoly_drw.count logger.info("baspoly_drw has #{count} polygons") polygons_count += count baspoly_pin = get_polygons(13, 2) -count = baspoly_pin.count() +count = baspoly_pin.count logger.info("baspoly_pin has #{count} polygons") polygons_count += count -psd_drw = get_polygons(14, 0) -count = psd_drw.count() +psd_drw = get_polygons(14, 0) +count = psd_drw.count logger.info("psd_drw has #{count} polygons") polygons_count += count nldb_drw = get_polygons(15, 0) -count = nldb_drw.count() +count = nldb_drw.count logger.info("nldb_drw has #{count} polygons") polygons_count += count digibnd_drw = get_polygons(16, 0) -count = digibnd_drw.count() +count = digibnd_drw.count logger.info("digibnd_drw has #{count} polygons") polygons_count += count via1_drw = get_polygons(19, 0) -count = via1_drw.count() +count = via1_drw.count logger.info("via1_drw has #{count} polygons") polygons_count += count backmetal1_drw = get_polygons(20, 0) -count = backmetal1_drw.count() +count = backmetal1_drw.count logger.info("backmetal1_drw has #{count} polygons") polygons_count += count backmetal1_pin = get_polygons(20, 2) -count = backmetal1_pin.count() +count = backmetal1_pin.count logger.info("backmetal1_pin has #{count} polygons") polygons_count += count backmetal1_mask = get_polygons(20, 20) -count = backmetal1_mask.count() +count = backmetal1_mask.count logger.info("backmetal1_mask has #{count} polygons") polygons_count += count backmetal1_filler = get_polygons(20, 22) -count = backmetal1_filler.count() +count = backmetal1_filler.count logger.info("backmetal1_filler has #{count} polygons") polygons_count += count backmetal1_nofill = get_polygons(20, 23) -count = backmetal1_nofill.count() +count = backmetal1_nofill.count logger.info("backmetal1_nofill has #{count} polygons") polygons_count += count backmetal1_slit = get_polygons(20, 24) -count = backmetal1_slit.count() +count = backmetal1_slit.count logger.info("backmetal1_slit has #{count} polygons") polygons_count += count backmetal1_text = labels(20, 25) -count = backmetal1_text.count() +count = backmetal1_text.count logger.info("backmetal1_text has #{count} polygons") polygons_count += count backmetal1_opc = get_polygons(20, 26) -count = backmetal1_opc.count() +count = backmetal1_opc.count logger.info("backmetal1_opc has #{count} polygons") polygons_count += count backmetal1_noqrc = get_polygons(20, 28) -count = backmetal1_noqrc.count() +count = backmetal1_noqrc.count logger.info("backmetal1_noqrc has #{count} polygons") polygons_count += count backmetal1_res = get_polygons(20, 29) -count = backmetal1_res.count() +count = backmetal1_res.count logger.info("backmetal1_res has #{count} polygons") polygons_count += count backmetal1_iprobe = get_polygons(20, 33) -count = backmetal1_iprobe.count() +count = backmetal1_iprobe.count logger.info("backmetal1_iprobe has #{count} polygons") polygons_count += count backmetal1_diffprb = get_polygons(20, 34) -count = backmetal1_diffprb.count() +count = backmetal1_diffprb.count logger.info("backmetal1_diffprb has #{count} polygons") polygons_count += count backpassiv_drw = get_polygons(23, 0) -count = backpassiv_drw.count() +count = backpassiv_drw.count logger.info("backpassiv_drw has #{count} polygons") polygons_count += count -res_drw = get_polygons(24, 0) -count = res_drw.count() +res_drw = get_polygons(24, 0) +count = res_drw.count logger.info("res_drw has #{count} polygons") polygons_count += count sram_drw = get_polygons(25, 0) -count = sram_drw.count() +count = sram_drw.count logger.info("sram_drw has #{count} polygons") polygons_count += count trans_drw = get_polygons(26, 0) -count = trans_drw.count() +count = trans_drw.count logger.info("trans_drw has #{count} polygons") polygons_count += count -ind_drw = get_polygons(27, 0) -count = ind_drw.count() +ind_drw = get_polygons(27, 0) +count = ind_drw.count logger.info("ind_drw has #{count} polygons") polygons_count += count -ind_pin = get_polygons(27, 2) -count = ind_pin.count() +ind_pin = get_polygons(27, 2) +count = ind_pin.count logger.info("ind_pin has #{count} polygons") polygons_count += count ind_text = labels(27, 25) -count = ind_text.count() +count = ind_text.count logger.info("ind_text has #{count} polygons") polygons_count += count salblock_drw = get_polygons(28, 0) -count = salblock_drw.count() +count = salblock_drw.count logger.info("salblock_drw has #{count} polygons") polygons_count += count via2_drw = get_polygons(29, 0) -count = via2_drw.count() +count = via2_drw.count logger.info("via2_drw has #{count} polygons") polygons_count += count metal3_drw = get_polygons(30, 0) -count = metal3_drw.count() +count = metal3_drw.count logger.info("metal3_drw has #{count} polygons") polygons_count += count metal3_pin = get_polygons(30, 2) -count = metal3_pin.count() +count = metal3_pin.count logger.info("metal3_pin has #{count} polygons") polygons_count += count metal3_mask = get_polygons(30, 20) -count = metal3_mask.count() +count = metal3_mask.count logger.info("metal3_mask has #{count} polygons") polygons_count += count metal3_filler = get_polygons(30, 22) -count = metal3_filler.count() +count = metal3_filler.count logger.info("metal3_filler has #{count} polygons") polygons_count += count metal3_nofill = get_polygons(30, 23) -count = metal3_nofill.count() +count = metal3_nofill.count logger.info("metal3_nofill has #{count} polygons") polygons_count += count metal3_slit = get_polygons(30, 24) -count = metal3_slit.count() +count = metal3_slit.count logger.info("metal3_slit has #{count} polygons") polygons_count += count metal3_text = labels(30, 25) -count = metal3_text.count() +count = metal3_text.count logger.info("metal3_text has #{count} polygons") polygons_count += count metal3_opc = get_polygons(30, 26) -count = metal3_opc.count() +count = metal3_opc.count logger.info("metal3_opc has #{count} polygons") polygons_count += count metal3_noqrc = get_polygons(30, 28) -count = metal3_noqrc.count() +count = metal3_noqrc.count logger.info("metal3_noqrc has #{count} polygons") polygons_count += count metal3_res = get_polygons(30, 29) -count = metal3_res.count() +count = metal3_res.count logger.info("metal3_res has #{count} polygons") polygons_count += count metal3_iprobe = get_polygons(30, 33) -count = metal3_iprobe.count() +count = metal3_iprobe.count logger.info("metal3_iprobe has #{count} polygons") polygons_count += count metal3_diffprb = get_polygons(30, 34) -count = metal3_diffprb.count() +count = metal3_diffprb.count logger.info("metal3_diffprb has #{count} polygons") polygons_count += count nwell_drw = get_polygons(31, 0) -count = nwell_drw.count() +count = nwell_drw.count logger.info("nwell_drw has #{count} polygons") polygons_count += count nwell_pin = get_polygons(31, 2) -count = nwell_pin.count() +count = nwell_pin.count logger.info("nwell_pin has #{count} polygons") polygons_count += count nbulay_drw = get_polygons(32, 0) -count = nbulay_drw.count() +count = nbulay_drw.count logger.info("nbulay_drw has #{count} polygons") polygons_count += count nbulay_pin = get_polygons(32, 2) -count = nbulay_pin.count() +count = nbulay_pin.count logger.info("nbulay_pin has #{count} polygons") polygons_count += count nbulay_block = get_polygons(32, 21) -count = nbulay_block.count() +count = nbulay_block.count logger.info("nbulay_block has #{count} polygons") polygons_count += count emwind_drw = get_polygons(33, 0) -count = emwind_drw.count() +count = emwind_drw.count logger.info("emwind_drw has #{count} polygons") polygons_count += count emwind_opc = get_polygons(33, 26) -count = emwind_opc.count() +count = emwind_opc.count logger.info("emwind_opc has #{count} polygons") polygons_count += count deepco_drw = get_polygons(35, 0) -count = deepco_drw.count() +count = deepco_drw.count logger.info("deepco_drw has #{count} polygons") polygons_count += count -mim_drw = get_polygons(36, 0) -count = mim_drw.count() +mim_drw = get_polygons(36, 0) +count = mim_drw.count logger.info("mim_drw has #{count} polygons") polygons_count += count edgeseal_drw = get_polygons(39, 0) -count = edgeseal_drw.count() +count = edgeseal_drw.count logger.info("edgeseal_drw has #{count} polygons") polygons_count += count substrate_drw = get_polygons(40, 0) -count = substrate_drw.count() +count = substrate_drw.count logger.info("substrate_drw has #{count} polygons") polygons_count += count substrate_text = labels(40, 25) -count = substrate_text.count() +count = substrate_text.count logger.info("substrate_text has #{count} polygons") polygons_count += count dfpad_drw = get_polygons(41, 0) -count = dfpad_drw.count() +count = dfpad_drw.count logger.info("dfpad_drw has #{count} polygons") polygons_count += count dfpad_pillar = get_polygons(41, 35) -count = dfpad_pillar.count() +count = dfpad_pillar.count logger.info("dfpad_pillar has #{count} polygons") polygons_count += count dfpad_sbump = get_polygons(41, 36) -count = dfpad_sbump.count() +count = dfpad_sbump.count logger.info("dfpad_sbump has #{count} polygons") polygons_count += count thickgateox_drw = get_polygons(44, 0) -count = thickgateox_drw.count() +count = thickgateox_drw.count logger.info("thickgateox_drw has #{count} polygons") polygons_count += count pldb_drw = get_polygons(45, 0) -count = pldb_drw.count() +count = pldb_drw.count logger.info("pldb_drw has #{count} polygons") polygons_count += count pwell_drw = get_polygons(46, 0) -count = pwell_drw.count() +count = pwell_drw.count logger.info("pwell_drw has #{count} polygons") polygons_count += count pwell_pin = get_polygons(46, 2) -count = pwell_pin.count() +count = pwell_pin.count logger.info("pwell_pin has #{count} polygons") polygons_count += count pwell_block = get_polygons(46, 21) -count = pwell_block.count() +count = pwell_block.count logger.info("pwell_block has #{count} polygons") polygons_count += count -ic_drw = get_polygons(48, 0) -count = ic_drw.count() +ic_drw = get_polygons(48, 0) +count = ic_drw.count logger.info("ic_drw has #{count} polygons") polygons_count += count via3_drw = get_polygons(49, 0) -count = via3_drw.count() +count = via3_drw.count logger.info("via3_drw has #{count} polygons") polygons_count += count metal4_drw = get_polygons(50, 0) -count = metal4_drw.count() +count = metal4_drw.count logger.info("metal4_drw has #{count} polygons") polygons_count += count metal4_pin = get_polygons(50, 2) -count = metal4_pin.count() +count = metal4_pin.count logger.info("metal4_pin has #{count} polygons") polygons_count += count metal4_mask = get_polygons(50, 20) -count = metal4_mask.count() +count = metal4_mask.count logger.info("metal4_mask has #{count} polygons") polygons_count += count metal4_filler = get_polygons(50, 22) -count = metal4_filler.count() +count = metal4_filler.count logger.info("metal4_filler has #{count} polygons") polygons_count += count metal4_nofill = get_polygons(50, 23) -count = metal4_nofill.count() +count = metal4_nofill.count logger.info("metal4_nofill has #{count} polygons") polygons_count += count metal4_slit = get_polygons(50, 24) -count = metal4_slit.count() +count = metal4_slit.count logger.info("metal4_slit has #{count} polygons") polygons_count += count metal4_text = labels(50, 25) -count = metal4_text.count() +count = metal4_text.count logger.info("metal4_text has #{count} polygons") polygons_count += count metal4_opc = get_polygons(50, 26) -count = metal4_opc.count() +count = metal4_opc.count logger.info("metal4_opc has #{count} polygons") polygons_count += count metal4_noqrc = get_polygons(50, 28) -count = metal4_noqrc.count() +count = metal4_noqrc.count logger.info("metal4_noqrc has #{count} polygons") polygons_count += count metal4_res = get_polygons(50, 29) -count = metal4_res.count() +count = metal4_res.count logger.info("metal4_res has #{count} polygons") polygons_count += count metal4_iprobe = get_polygons(50, 33) -count = metal4_iprobe.count() +count = metal4_iprobe.count logger.info("metal4_iprobe has #{count} polygons") polygons_count += count metal4_diffprb = get_polygons(50, 34) -count = metal4_diffprb.count() +count = metal4_diffprb.count logger.info("metal4_diffprb has #{count} polygons") polygons_count += count heattrans_drw = get_polygons(51, 0) -count = heattrans_drw.count() +count = heattrans_drw.count logger.info("heattrans_drw has #{count} polygons") polygons_count += count heatres_drw = get_polygons(52, 0) -count = heatres_drw.count() +count = heatres_drw.count logger.info("heatres_drw has #{count} polygons") polygons_count += count -fbe_drw = get_polygons(54, 0) -count = fbe_drw.count() +fbe_drw = get_polygons(54, 0) +count = fbe_drw.count logger.info("fbe_drw has #{count} polygons") polygons_count += count empoly_drw = get_polygons(55, 0) -count = empoly_drw.count() +count = empoly_drw.count logger.info("empoly_drw has #{count} polygons") polygons_count += count digisub_drw = get_polygons(60, 0) -count = digisub_drw.count() +count = digisub_drw.count logger.info("digisub_drw has #{count} polygons") polygons_count += count nodrc_drw = get_polygons(62, 0) -count = nodrc_drw.count() +count = nodrc_drw.count logger.info("nodrc_drw has #{count} polygons") polygons_count += count text_drw = labels(63, 0) -count = text_drw.count() +count = text_drw.count logger.info("text_drw has #{count} polygons") polygons_count += count via4_drw = get_polygons(66, 0) -count = via4_drw.count() +count = via4_drw.count logger.info("via4_drw has #{count} polygons") polygons_count += count metal5_drw = get_polygons(67, 0) -count = metal5_drw.count() +count = metal5_drw.count logger.info("metal5_drw has #{count} polygons") polygons_count += count metal5_pin = get_polygons(67, 2) -count = metal5_pin.count() +count = metal5_pin.count logger.info("metal5_pin has #{count} polygons") polygons_count += count metal5_mask = get_polygons(67, 20) -count = metal5_mask.count() +count = metal5_mask.count logger.info("metal5_mask has #{count} polygons") polygons_count += count metal5_filler = get_polygons(67, 22) -count = metal5_filler.count() +count = metal5_filler.count logger.info("metal5_filler has #{count} polygons") polygons_count += count metal5_nofill = get_polygons(67, 23) -count = metal5_nofill.count() +count = metal5_nofill.count logger.info("metal5_nofill has #{count} polygons") polygons_count += count metal5_slit = get_polygons(67, 24) -count = metal5_slit.count() +count = metal5_slit.count logger.info("metal5_slit has #{count} polygons") polygons_count += count metal5_text = labels(67, 25) -count = metal5_text.count() +count = metal5_text.count logger.info("metal5_text has #{count} polygons") polygons_count += count metal5_opc = get_polygons(67, 26) -count = metal5_opc.count() +count = metal5_opc.count logger.info("metal5_opc has #{count} polygons") polygons_count += count metal5_noqrc = get_polygons(67, 28) -count = metal5_noqrc.count() +count = metal5_noqrc.count logger.info("metal5_noqrc has #{count} polygons") polygons_count += count metal5_res = get_polygons(67, 29) -count = metal5_res.count() +count = metal5_res.count logger.info("metal5_res has #{count} polygons") polygons_count += count metal5_iprobe = get_polygons(67, 33) -count = metal5_iprobe.count() +count = metal5_iprobe.count logger.info("metal5_iprobe has #{count} polygons") polygons_count += count metal5_diffprb = get_polygons(67, 34) -count = metal5_diffprb.count() +count = metal5_diffprb.count logger.info("metal5_diffprb has #{count} polygons") polygons_count += count radhard_drw = get_polygons(68, 0) -count = radhard_drw.count() +count = radhard_drw.count logger.info("radhard_drw has #{count} polygons") polygons_count += count memcap_drw = get_polygons(69, 0) -count = memcap_drw.count() +count = memcap_drw.count logger.info("memcap_drw has #{count} polygons") polygons_count += count varicap_drw = get_polygons(70, 0) -count = varicap_drw.count() +count = varicap_drw.count logger.info("varicap_drw has #{count} polygons") polygons_count += count intbondvia_drw = get_polygons(72, 0) -count = intbondvia_drw.count() +count = intbondvia_drw.count logger.info("intbondvia_drw has #{count} polygons") polygons_count += count intbondmet_drw = get_polygons(73, 0) -count = intbondmet_drw.count() +count = intbondmet_drw.count logger.info("intbondmet_drw has #{count} polygons") polygons_count += count devbondvia_drw = get_polygons(74, 0) -count = devbondvia_drw.count() +count = devbondvia_drw.count logger.info("devbondvia_drw has #{count} polygons") polygons_count += count devbondmet_drw = get_polygons(75, 0) -count = devbondmet_drw.count() +count = devbondmet_drw.count logger.info("devbondmet_drw has #{count} polygons") polygons_count += count devtrench_drw = get_polygons(76, 0) -count = devtrench_drw.count() +count = devtrench_drw.count logger.info("devtrench_drw has #{count} polygons") polygons_count += count redist_drw = get_polygons(77, 0) -count = redist_drw.count() +count = redist_drw.count logger.info("redist_drw has #{count} polygons") polygons_count += count graphbot_drw = get_polygons(78, 0) -count = graphbot_drw.count() +count = graphbot_drw.count logger.info("graphbot_drw has #{count} polygons") polygons_count += count graphtop_drw = get_polygons(79, 0) -count = graphtop_drw.count() +count = graphtop_drw.count logger.info("graphtop_drw has #{count} polygons") polygons_count += count antvia1_drw = get_polygons(83, 0) -count = antvia1_drw.count() +count = antvia1_drw.count logger.info("antvia1_drw has #{count} polygons") polygons_count += count antmetal2_drw = get_polygons(84, 0) -count = antmetal2_drw.count() +count = antmetal2_drw.count logger.info("antmetal2_drw has #{count} polygons") polygons_count += count graphcont_drw = get_polygons(85, 0) -count = graphcont_drw.count() +count = graphcont_drw.count logger.info("graphcont_drw has #{count} polygons") polygons_count += count siwg_drw = get_polygons(86, 0) -count = siwg_drw.count() +count = siwg_drw.count logger.info("siwg_drw has #{count} polygons") polygons_count += count siwg_filler = get_polygons(86, 22) -count = siwg_filler.count() +count = siwg_filler.count logger.info("siwg_filler has #{count} polygons") polygons_count += count siwg_nofill = get_polygons(86, 23) -count = siwg_nofill.count() +count = siwg_nofill.count logger.info("siwg_nofill has #{count} polygons") polygons_count += count sigrating_drw = get_polygons(87, 0) -count = sigrating_drw.count() +count = sigrating_drw.count logger.info("sigrating_drw has #{count} polygons") polygons_count += count singrating_drw = get_polygons(88, 0) -count = singrating_drw.count() +count = singrating_drw.count logger.info("singrating_drw has #{count} polygons") polygons_count += count graphpas_drw = get_polygons(89, 0) -count = graphpas_drw.count() +count = graphpas_drw.count logger.info("graphpas_drw has #{count} polygons") polygons_count += count emwind3_drw = get_polygons(90, 0) -count = emwind3_drw.count() +count = emwind3_drw.count logger.info("emwind3_drw has #{count} polygons") polygons_count += count emwihv3_drw = get_polygons(91, 0) -count = emwihv3_drw.count() +count = emwihv3_drw.count logger.info("emwihv3_drw has #{count} polygons") polygons_count += count redbulay_drw = get_polygons(92, 0) -count = redbulay_drw.count() +count = redbulay_drw.count logger.info("redbulay_drw has #{count} polygons") polygons_count += count smos_drw = get_polygons(93, 0) -count = smos_drw.count() +count = smos_drw.count logger.info("smos_drw has #{count} polygons") polygons_count += count graphpad_drw = get_polygons(97, 0) -count = graphpad_drw.count() +count = graphpad_drw.count logger.info("graphpad_drw has #{count} polygons") polygons_count += count polimide_drw = get_polygons(98, 0) -count = polimide_drw.count() +count = polimide_drw.count logger.info("polimide_drw has #{count} polygons") polygons_count += count polimide_pin = get_polygons(98, 2) -count = polimide_pin.count() +count = polimide_pin.count logger.info("polimide_pin has #{count} polygons") polygons_count += count recog_drw = get_polygons(99, 0) -count = recog_drw.count() +count = recog_drw.count logger.info("recog_drw has #{count} polygons") polygons_count += count recog_pin = get_polygons(99, 2) -count = recog_pin.count() +count = recog_pin.count logger.info("recog_pin has #{count} polygons") polygons_count += count recog_esd = get_polygons(99, 30) -count = recog_esd.count() +count = recog_esd.count logger.info("recog_esd has #{count} polygons") polygons_count += count recog_diode = get_polygons(99, 31) -count = recog_diode.count() +count = recog_diode.count logger.info("recog_diode has #{count} polygons") polygons_count += count recog_tsv = get_polygons(99, 32) -count = recog_tsv.count() +count = recog_tsv.count logger.info("recog_tsv has #{count} polygons") polygons_count += count recog_iprobe = get_polygons(99, 33) -count = recog_iprobe.count() +count = recog_iprobe.count logger.info("recog_iprobe has #{count} polygons") polygons_count += count recog_diffprb = get_polygons(99, 34) -count = recog_diffprb.count() +count = recog_diffprb.count logger.info("recog_diffprb has #{count} polygons") polygons_count += count recog_pillar = get_polygons(99, 35) -count = recog_pillar.count() +count = recog_pillar.count logger.info("recog_pillar has #{count} polygons") polygons_count += count recog_sbump = get_polygons(99, 36) -count = recog_sbump.count() +count = recog_sbump.count logger.info("recog_sbump has #{count} polygons") polygons_count += count recog_otp = get_polygons(99, 37) -count = recog_otp.count() +count = recog_otp.count logger.info("recog_otp has #{count} polygons") polygons_count += count recog_pdiode = get_polygons(99, 38) -count = recog_pdiode.count() +count = recog_pdiode.count logger.info("recog_pdiode has #{count} polygons") polygons_count += count recog_mom = get_polygons(99, 39) -count = recog_mom.count() +count = recog_mom.count logger.info("recog_mom has #{count} polygons") polygons_count += count recog_pcm = get_polygons(99, 100) -count = recog_pcm.count() +count = recog_pcm.count logger.info("recog_pcm has #{count} polygons") polygons_count += count colopen_drw = get_polygons(101, 0) -count = colopen_drw.count() +count = colopen_drw.count logger.info("colopen_drw has #{count} polygons") polygons_count += count graphmetal1_drw = get_polygons(109, 0) -count = graphmetal1_drw.count() +count = graphmetal1_drw.count logger.info("graphmetal1_drw has #{count} polygons") polygons_count += count graphmetal1_filler = get_polygons(109, 22) -count = graphmetal1_filler.count() +count = graphmetal1_filler.count logger.info("graphmetal1_filler has #{count} polygons") polygons_count += count graphmetal1_nofill = get_polygons(109, 23) -count = graphmetal1_nofill.count() +count = graphmetal1_nofill.count logger.info("graphmetal1_nofill has #{count} polygons") polygons_count += count graphmetal1_slit = get_polygons(109, 24) -count = graphmetal1_slit.count() +count = graphmetal1_slit.count logger.info("graphmetal1_slit has #{count} polygons") polygons_count += count graphmetal1_opc = get_polygons(109, 26) -count = graphmetal1_opc.count() +count = graphmetal1_opc.count logger.info("graphmetal1_opc has #{count} polygons") polygons_count += count graphmet1l_drw = get_polygons(110, 0) -count = graphmet1l_drw.count() +count = graphmet1l_drw.count logger.info("graphmet1l_drw has #{count} polygons") polygons_count += count graphmet1l_filler = get_polygons(110, 22) -count = graphmet1l_filler.count() +count = graphmet1l_filler.count logger.info("graphmet1l_filler has #{count} polygons") polygons_count += count graphmet1l_nofill = get_polygons(110, 23) -count = graphmet1l_nofill.count() +count = graphmet1l_nofill.count logger.info("graphmet1l_nofill has #{count} polygons") polygons_count += count graphmet1l_slit = get_polygons(110, 24) -count = graphmet1l_slit.count() +count = graphmet1l_slit.count logger.info("graphmet1l_slit has #{count} polygons") polygons_count += count graphmet1l_opc = get_polygons(110, 26) -count = graphmet1l_opc.count() +count = graphmet1l_opc.count logger.info("graphmet1l_opc has #{count} polygons") polygons_count += count extblock_drw = get_polygons(111, 0) -count = extblock_drw.count() +count = extblock_drw.count logger.info("extblock_drw has #{count} polygons") polygons_count += count nldd_drw = get_polygons(112, 0) -count = nldd_drw.count() +count = nldd_drw.count logger.info("nldd_drw has #{count} polygons") polygons_count += count pldd_drw = get_polygons(113, 0) -count = pldd_drw.count() +count = pldd_drw.count logger.info("pldd_drw has #{count} polygons") polygons_count += count next_drw = get_polygons(114, 0) -count = next_drw.count() +count = next_drw.count logger.info("next_drw has #{count} polygons") polygons_count += count pext_drw = get_polygons(115, 0) -count = pext_drw.count() +count = pext_drw.count logger.info("pext_drw has #{count} polygons") polygons_count += count nexthv_drw = get_polygons(116, 0) -count = nexthv_drw.count() +count = nexthv_drw.count logger.info("nexthv_drw has #{count} polygons") polygons_count += count pexthv_drw = get_polygons(117, 0) -count = pexthv_drw.count() +count = pexthv_drw.count logger.info("pexthv_drw has #{count} polygons") polygons_count += count graphgate_drw = get_polygons(118, 0) -count = graphgate_drw.count() +count = graphgate_drw.count logger.info("graphgate_drw has #{count} polygons") polygons_count += count sinwg_drw = get_polygons(119, 0) -count = sinwg_drw.count() +count = sinwg_drw.count logger.info("sinwg_drw has #{count} polygons") polygons_count += count sinwg_filler = get_polygons(119, 22) -count = sinwg_filler.count() +count = sinwg_filler.count logger.info("sinwg_filler has #{count} polygons") polygons_count += count sinwg_nofill = get_polygons(119, 23) -count = sinwg_nofill.count() +count = sinwg_nofill.count logger.info("sinwg_nofill has #{count} polygons") polygons_count += count mempad_drw = get_polygons(124, 0) -count = mempad_drw.count() +count = mempad_drw.count logger.info("mempad_drw has #{count} polygons") polygons_count += count topvia1_drw = get_polygons(125, 0) -count = topvia1_drw.count() +count = topvia1_drw.count logger.info("topvia1_drw has #{count} polygons") polygons_count += count topmetal1_drw = get_polygons(126, 0) -count = topmetal1_drw.count() +count = topmetal1_drw.count logger.info("topmetal1_drw has #{count} polygons") polygons_count += count topmetal1_pin = get_polygons(126, 2) -count = topmetal1_pin.count() +count = topmetal1_pin.count logger.info("topmetal1_pin has #{count} polygons") polygons_count += count topmetal1_mask = get_polygons(126, 20) -count = topmetal1_mask.count() +count = topmetal1_mask.count logger.info("topmetal1_mask has #{count} polygons") polygons_count += count topmetal1_filler = get_polygons(126, 22) -count = topmetal1_filler.count() +count = topmetal1_filler.count logger.info("topmetal1_filler has #{count} polygons") polygons_count += count topmetal1_nofill = get_polygons(126, 23) -count = topmetal1_nofill.count() +count = topmetal1_nofill.count logger.info("topmetal1_nofill has #{count} polygons") polygons_count += count topmetal1_slit = get_polygons(126, 24) -count = topmetal1_slit.count() +count = topmetal1_slit.count logger.info("topmetal1_slit has #{count} polygons") polygons_count += count topmetal1_text = labels(126, 25) -count = topmetal1_text.count() +count = topmetal1_text.count logger.info("topmetal1_text has #{count} polygons") polygons_count += count topmetal1_noqrc = get_polygons(126, 28) -count = topmetal1_noqrc.count() +count = topmetal1_noqrc.count logger.info("topmetal1_noqrc has #{count} polygons") polygons_count += count topmetal1_res = get_polygons(126, 29) -count = topmetal1_res.count() +count = topmetal1_res.count logger.info("topmetal1_res has #{count} polygons") polygons_count += count topmetal1_iprobe = get_polygons(126, 33) -count = topmetal1_iprobe.count() +count = topmetal1_iprobe.count logger.info("topmetal1_iprobe has #{count} polygons") polygons_count += count topmetal1_diffprb = get_polygons(126, 34) -count = topmetal1_diffprb.count() +count = topmetal1_diffprb.count logger.info("topmetal1_diffprb has #{count} polygons") polygons_count += count inldpwl_drw = get_polygons(127, 0) -count = inldpwl_drw.count() +count = inldpwl_drw.count logger.info("inldpwl_drw has #{count} polygons") polygons_count += count polyres_drw = get_polygons(128, 0) -count = polyres_drw.count() +count = polyres_drw.count logger.info("polyres_drw has #{count} polygons") polygons_count += count polyres_pin = get_polygons(128, 2) -count = polyres_pin.count() +count = polyres_pin.count logger.info("polyres_pin has #{count} polygons") polygons_count += count vmim_drw = get_polygons(129, 0) -count = vmim_drw.count() +count = vmim_drw.count logger.info("vmim_drw has #{count} polygons") polygons_count += count nbulaycut_drw = get_polygons(131, 0) -count = nbulaycut_drw.count() +count = nbulaycut_drw.count logger.info("nbulaycut_drw has #{count} polygons") polygons_count += count antmetal1_drw = get_polygons(132, 0) -count = antmetal1_drw.count() +count = antmetal1_drw.count logger.info("antmetal1_drw has #{count} polygons") polygons_count += count topvia2_drw = get_polygons(133, 0) -count = topvia2_drw.count() +count = topvia2_drw.count logger.info("topvia2_drw has #{count} polygons") polygons_count += count topmetal2_drw = get_polygons(134, 0) -count = topmetal2_drw.count() +count = topmetal2_drw.count logger.info("topmetal2_drw has #{count} polygons") polygons_count += count topmetal2_pin = get_polygons(134, 2) -count = topmetal2_pin.count() +count = topmetal2_pin.count logger.info("topmetal2_pin has #{count} polygons") polygons_count += count topmetal2_mask = get_polygons(134, 20) -count = topmetal2_mask.count() +count = topmetal2_mask.count logger.info("topmetal2_mask has #{count} polygons") polygons_count += count topmetal2_filler = get_polygons(134, 22) -count = topmetal2_filler.count() +count = topmetal2_filler.count logger.info("topmetal2_filler has #{count} polygons") polygons_count += count topmetal2_nofill = get_polygons(134, 23) -count = topmetal2_nofill.count() +count = topmetal2_nofill.count logger.info("topmetal2_nofill has #{count} polygons") polygons_count += count topmetal2_slit = get_polygons(134, 24) -count = topmetal2_slit.count() +count = topmetal2_slit.count logger.info("topmetal2_slit has #{count} polygons") polygons_count += count topmetal2_text = labels(134, 25) -count = topmetal2_text.count() +count = topmetal2_text.count logger.info("topmetal2_text has #{count} polygons") polygons_count += count topmetal2_noqrc = get_polygons(134, 28) -count = topmetal2_noqrc.count() +count = topmetal2_noqrc.count logger.info("topmetal2_noqrc has #{count} polygons") polygons_count += count topmetal2_res = get_polygons(134, 29) -count = topmetal2_res.count() +count = topmetal2_res.count logger.info("topmetal2_res has #{count} polygons") polygons_count += count topmetal2_iprobe = get_polygons(134, 33) -count = topmetal2_iprobe.count() +count = topmetal2_iprobe.count logger.info("topmetal2_iprobe has #{count} polygons") polygons_count += count topmetal2_diffprb = get_polygons(134, 34) -count = topmetal2_diffprb.count() +count = topmetal2_diffprb.count logger.info("topmetal2_diffprb has #{count} polygons") polygons_count += count snsring_drw = get_polygons(135, 0) -count = snsring_drw.count() +count = snsring_drw.count logger.info("snsring_drw has #{count} polygons") polygons_count += count sensor_drw = get_polygons(136, 0) -count = sensor_drw.count() +count = sensor_drw.count logger.info("sensor_drw has #{count} polygons") polygons_count += count snsarms_drw = get_polygons(137, 0) -count = snsarms_drw.count() +count = snsarms_drw.count logger.info("snsarms_drw has #{count} polygons") polygons_count += count snscmosvia_drw = get_polygons(138, 0) -count = snscmosvia_drw.count() +count = snscmosvia_drw.count logger.info("snscmosvia_drw has #{count} polygons") polygons_count += count colwind_drw = get_polygons(139, 0) -count = colwind_drw.count() +count = colwind_drw.count logger.info("colwind_drw has #{count} polygons") polygons_count += count -flm_drw = get_polygons(142, 0) -count = flm_drw.count() +flm_drw = get_polygons(142, 0) +count = flm_drw.count logger.info("flm_drw has #{count} polygons") polygons_count += count hafniumox_drw = get_polygons(143, 0) -count = hafniumox_drw.count() +count = hafniumox_drw.count logger.info("hafniumox_drw has #{count} polygons") polygons_count += count memvia_drw = get_polygons(145, 0) -count = memvia_drw.count() +count = memvia_drw.count logger.info("memvia_drw has #{count} polygons") polygons_count += count thinfilmres_drw = get_polygons(146, 0) -count = thinfilmres_drw.count() +count = thinfilmres_drw.count logger.info("thinfilmres_drw has #{count} polygons") polygons_count += count rfmem_drw = get_polygons(147, 0) -count = rfmem_drw.count() +count = rfmem_drw.count logger.info("rfmem_drw has #{count} polygons") polygons_count += count norcx_drw = get_polygons(148, 0) -count = norcx_drw.count() +count = norcx_drw.count logger.info("norcx_drw has #{count} polygons") polygons_count += count norcx_m2m3 = get_polygons(148, 41) -count = norcx_m2m3.count() +count = norcx_m2m3.count logger.info("norcx_m2m3 has #{count} polygons") polygons_count += count norcx_m2m4 = get_polygons(148, 42) -count = norcx_m2m4.count() +count = norcx_m2m4.count logger.info("norcx_m2m4 has #{count} polygons") polygons_count += count norcx_m2m5 = get_polygons(148, 43) -count = norcx_m2m5.count() +count = norcx_m2m5.count logger.info("norcx_m2m5 has #{count} polygons") polygons_count += count norcx_m2tm1 = get_polygons(148, 44) -count = norcx_m2tm1.count() +count = norcx_m2tm1.count logger.info("norcx_m2tm1 has #{count} polygons") polygons_count += count norcx_m2tm2 = get_polygons(148, 45) -count = norcx_m2tm2.count() +count = norcx_m2tm2.count logger.info("norcx_m2tm2 has #{count} polygons") polygons_count += count norcx_m3m4 = get_polygons(148, 46) -count = norcx_m3m4.count() +count = norcx_m3m4.count logger.info("norcx_m3m4 has #{count} polygons") polygons_count += count norcx_m3m5 = get_polygons(148, 47) -count = norcx_m3m5.count() +count = norcx_m3m5.count logger.info("norcx_m3m5 has #{count} polygons") polygons_count += count norcx_m3tm1 = get_polygons(148, 48) -count = norcx_m3tm1.count() +count = norcx_m3tm1.count logger.info("norcx_m3tm1 has #{count} polygons") polygons_count += count norcx_m3tm2 = get_polygons(148, 49) -count = norcx_m3tm2.count() +count = norcx_m3tm2.count logger.info("norcx_m3tm2 has #{count} polygons") polygons_count += count norcx_m4m5 = get_polygons(148, 50) -count = norcx_m4m5.count() +count = norcx_m4m5.count logger.info("norcx_m4m5 has #{count} polygons") polygons_count += count norcx_m4tm1 = get_polygons(148, 51) -count = norcx_m4tm1.count() +count = norcx_m4tm1.count logger.info("norcx_m4tm1 has #{count} polygons") polygons_count += count norcx_m4tm2 = get_polygons(148, 52) -count = norcx_m4tm2.count() +count = norcx_m4tm2.count logger.info("norcx_m4tm2 has #{count} polygons") polygons_count += count norcx_m5tm1 = get_polygons(148, 53) -count = norcx_m5tm1.count() +count = norcx_m5tm1.count logger.info("norcx_m5tm1 has #{count} polygons") polygons_count += count norcx_m5tm2 = get_polygons(148, 54) -count = norcx_m5tm2.count() +count = norcx_m5tm2.count logger.info("norcx_m5tm2 has #{count} polygons") polygons_count += count norcx_tm1tm2 = get_polygons(148, 55) -count = norcx_tm1tm2.count() +count = norcx_tm1tm2.count logger.info("norcx_tm1tm2 has #{count} polygons") polygons_count += count norcx_m1sub = get_polygons(148, 123) -count = norcx_m1sub.count() +count = norcx_m1sub.count logger.info("norcx_m1sub has #{count} polygons") polygons_count += count norcx_m2sub = get_polygons(148, 124) -count = norcx_m2sub.count() +count = norcx_m2sub.count logger.info("norcx_m2sub has #{count} polygons") polygons_count += count norcx_m3sub = get_polygons(148, 125) -count = norcx_m3sub.count() +count = norcx_m3sub.count logger.info("norcx_m3sub has #{count} polygons") polygons_count += count norcx_m4sub = get_polygons(148, 126) -count = norcx_m4sub.count() +count = norcx_m4sub.count logger.info("norcx_m4sub has #{count} polygons") polygons_count += count norcx_m5sub = get_polygons(148, 127) -count = norcx_m5sub.count() +count = norcx_m5sub.count logger.info("norcx_m5sub has #{count} polygons") polygons_count += count norcx_tm1sub = get_polygons(148, 300) -count = norcx_tm1sub.count() +count = norcx_tm1sub.count logger.info("norcx_tm1sub has #{count} polygons") polygons_count += count norcx_tm2sub = get_polygons(148, 301) -count = norcx_tm2sub.count() +count = norcx_tm2sub.count logger.info("norcx_tm2sub has #{count} polygons") polygons_count += count snsbotvia_drw = get_polygons(149, 0) -count = snsbotvia_drw.count() +count = snsbotvia_drw.count logger.info("snsbotvia_drw has #{count} polygons") polygons_count += count snstopvia_drw = get_polygons(151, 0) -count = snstopvia_drw.count() +count = snstopvia_drw.count logger.info("snstopvia_drw has #{count} polygons") polygons_count += count deepvia_drw = get_polygons(152, 0) -count = deepvia_drw.count() +count = deepvia_drw.count logger.info("deepvia_drw has #{count} polygons") polygons_count += count fgetch_drw = get_polygons(153, 0) -count = fgetch_drw.count() +count = fgetch_drw.count logger.info("fgetch_drw has #{count} polygons") polygons_count += count ctrgat_drw = get_polygons(154, 0) -count = ctrgat_drw.count() +count = ctrgat_drw.count logger.info("ctrgat_drw has #{count} polygons") polygons_count += count fgimp_drw = get_polygons(155, 0) -count = fgimp_drw.count() +count = fgimp_drw.count logger.info("fgimp_drw has #{count} polygons") polygons_count += count emwihv_drw = get_polygons(156, 0) -count = emwihv_drw.count() +count = emwihv_drw.count logger.info("emwihv_drw has #{count} polygons") polygons_count += count -lbe_drw = get_polygons(157, 0) -count = lbe_drw.count() +lbe_drw = get_polygons(157, 0) +count = lbe_drw.count logger.info("lbe_drw has #{count} polygons") polygons_count += count alcustop_drw = get_polygons(159, 0) -count = alcustop_drw.count() +count = alcustop_drw.count logger.info("alcustop_drw has #{count} polygons") polygons_count += count nometfiller_drw = get_polygons(160, 0) -count = nometfiller_drw.count() +count = nometfiller_drw.count logger.info("nometfiller_drw has #{count} polygons") polygons_count += count prboundary_drw = get_polygons(189, 0) -count = prboundary_drw.count() +count = prboundary_drw.count logger.info("prboundary_drw has #{count} polygons") polygons_count += count exchange0_drw = get_polygons(190, 0) -count = exchange0_drw.count() +count = exchange0_drw.count logger.info("exchange0_drw has #{count} polygons") polygons_count += count exchange0_pin = get_polygons(190, 2) -count = exchange0_pin.count() +count = exchange0_pin.count logger.info("exchange0_pin has #{count} polygons") polygons_count += count exchange0_text = labels(190, 25) -count = exchange0_text.count() +count = exchange0_text.count logger.info("exchange0_text has #{count} polygons") polygons_count += count exchange1_drw = get_polygons(191, 0) -count = exchange1_drw.count() +count = exchange1_drw.count logger.info("exchange1_drw has #{count} polygons") polygons_count += count exchange1_pin = get_polygons(191, 2) -count = exchange1_pin.count() +count = exchange1_pin.count logger.info("exchange1_pin has #{count} polygons") polygons_count += count exchange1_text = labels(191, 25) -count = exchange1_text.count() +count = exchange1_text.count logger.info("exchange1_text has #{count} polygons") polygons_count += count exchange2_drw = get_polygons(192, 0) -count = exchange2_drw.count() +count = exchange2_drw.count logger.info("exchange2_drw has #{count} polygons") polygons_count += count exchange2_pin = get_polygons(192, 2) -count = exchange2_pin.count() +count = exchange2_pin.count logger.info("exchange2_pin has #{count} polygons") polygons_count += count exchange2_text = labels(192, 25) -count = exchange2_text.count() +count = exchange2_text.count logger.info("exchange2_text has #{count} polygons") polygons_count += count exchange3_drw = get_polygons(193, 0) -count = exchange3_drw.count() +count = exchange3_drw.count logger.info("exchange3_drw has #{count} polygons") polygons_count += count exchange3_pin = get_polygons(193, 2) -count = exchange3_pin.count() +count = exchange3_pin.count logger.info("exchange3_pin has #{count} polygons") polygons_count += count exchange3_text = labels(193, 25) -count = exchange3_text.count() +count = exchange3_text.count logger.info("exchange3_text has #{count} polygons") polygons_count += count exchange4_drw = get_polygons(194, 0) -count = exchange4_drw.count() +count = exchange4_drw.count logger.info("exchange4_drw has #{count} polygons") polygons_count += count exchange4_pin = get_polygons(194, 2) -count = exchange4_pin.count() +count = exchange4_pin.count logger.info("exchange4_pin has #{count} polygons") polygons_count += count exchange4_text = labels(194, 25) -count = exchange4_text.count() +count = exchange4_text.count logger.info("exchange4_text has #{count} polygons") polygons_count += count isonwell_drw = get_polygons(257, 0) -count = isonwell_drw.count() +count = isonwell_drw.count logger.info("isonwell_drw has #{count} polygons") polygons_count += count - logger.info("Total no. of polygons in the design is #{polygons_count}") From 07618d620faac1dc87c35e206e5a2b51a3149e5b Mon Sep 17 00:00:00 2001 From: FaragElsayed2 Date: Mon, 20 May 2024 13:20:09 +0300 Subject: [PATCH 5/5] Updating GUI menus to automatically detect active cell Signed-off-by: FaragElsayed2 --- .../libs.tech/klayout/tech/lvs/README.md | 2 +- .../klayout/tech/lvs/images/lvs_menus_2.png | Bin 42734 -> 38280 bytes .../klayout/tech/macros/sg13g2_options.lym | 12 ++++++++++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/README.md b/ihp-sg13g2/libs.tech/klayout/tech/lvs/README.md index b23de49b..43c439aa 100644 --- a/ihp-sg13g2/libs.tech/klayout/tech/lvs/README.md +++ b/ihp-sg13g2/libs.tech/klayout/tech/lvs/README.md @@ -222,4 +222,4 @@ Finally, after setting your option, you could execute the LVS using `Run Klayout Upon executing the LVS, the result database will appear on your layout interface, allowing you to verify the outcome of the run similarly as shown above in Fig. 4. -Additionally, you can find the extracted netlist generated from your design at (`_extracted.cir`) in the same directory as the layout file. \ No newline at end of file +Additionally, you can find the extracted netlist generated from your design at (`_extracted.cir`) in the same directory as the layout file. diff --git a/ihp-sg13g2/libs.tech/klayout/tech/lvs/images/lvs_menus_2.png b/ihp-sg13g2/libs.tech/klayout/tech/lvs/images/lvs_menus_2.png index bedcee15ff0bcb3c4ee1f8ca460c761f9f3f36bf..1a634a241414a31b1b5947b9a3da20aa17084191 100644 GIT binary patch literal 38280 zcmce;WpHCbwf#Ma5&&iNXohY!$+?q4TiM-u~Q z3p-l^6$={^AX&f*CI$jo0}sG~iG_fHk&BU&i`CQ-aMvWO6wpb(OmvXFJTn4hykgDYi`m}*&985XNleF+eT^3L=4*|Vx3{X2|k5Vy(mEYVk+9m<{V4oFBy z3K6K(#WtJmsDZsV<>O>Q2t<(*Qd0RkZH^~q6RC`U*Vo@wQ^X+%MbPq>&u?#T1SBOS zW>7>u77r1HAmRoA*O&Vd1o-3!iim(KRdm2?MV3ef0f!(>Boe@h)c>n7LPC4Xrif0D znDw#}@`6l*|Ao2vCbQErUaYRfcI!INa@p3*8$EcBCKd*xNMC1pqM)YtbK3LsM01n% za7rZ7Xu9!hV#N=h)Qy(!8d)$q)K+tWy5iMz1d6VdlVaV0U=mu(FoLh|?a*q~K(|=*mD=H)>5ul-cXj*5T}q zRNaO(I*2bAFgXH~R#semaGPmMKHMZ*EK|DoIRlsejqpt?st5rKYx4E+YQ0*2`1OX% z?aJWyt(gCi{gvZCqt)ga^u|G;X?on<$xPmJbT@1SN8 zTBGxv37vh?#N#hI3$;1y8ENxZZR+K>4j~m;jQb*z7rR}AdbR9iEsqBO$Fm97@EkC% z29(B2=Xh>)l0D03f3p74t#|;kRPQgWqvb%X{&3lGjkZICymMoSQ^#9Im8VyTBbRT`bTKxB1WqxweD&^nIjHMacP ztRSLWfz!Dn;8b=yJRmeQw22J%STfmkg>LWH<1uBxsw|Ek$&VUx&gMD#T=fwBs

yt;m?o13~aar4;j|Or+dbi?k&x;!@g@EB&XUe+R_Gx_+NT|9m+# zehfY*(d+1wMRhE(QO=~;_636NLgMJMrZHO1IzDKJ#i4!X3!a-h*(jYmon;IkwrFu} zFg;g|M-><1JCUqF(6+VC9=iz+)>%YxX(FIl@OnOtOhS^q z6WhhEh)Vr29uh}gWvYHbvCxXH?`kJmrS!#tZR_NFT{D5n7*xicFY!$Jj8zzo$Ft1a zVkrCtRdh2K=z7d^T)^~9U=6KEHG;?srqd@x`71AXlY4r#;`E@zX<(ii z916?La8Cg^OPdg?LqniX5e?=g0I@;scDYFe^B&<;3Omqzt`KrEgWbCS4&CECnHsa55r;L1%3qt?TBJ72_mSJ67?63Q6Boi<)pB%*qkknq{aiH9=%Hc-;Ruktx)-89LA9VN}*JQRIp_y-M+56*_+wI+?!l=(%H{G`99%Y~V+S z8xy&GkCqw34pPzM$)A>c2A#sSBy}d1e?$6!Ka=%I$0pl{2Zq*^YzH9Ok;=}mG?+~z z8zER2q4<41E<5p36SffU@#j0*t`cz3`k5!mV%UT>7uvJ=Q6-J{S0^1yN&t~+10_+p z^W2S>>8%U}r1dzeswx1YZ=sCnA_{Iy@Q+)G8b3V;f`iRx4o3&Hj)E_P{b%9Tml0R# zD3f$W`kA9yv`DPU>wT}fX|>_5RBn>|;UZ%XC`}M8z7Hsky5sBhi>%q$1Xr;5N~xJT zJD*NGe(xBC@|4wqvhA8WGco?JuUUb+F8BDlfdVB~sCA&x>2Am3dn-&%OK3<=$GCp7 z@Qf5yg-Qp<<^(!&hn##0=d%UMO^a$kWXf|sottI_RRe5s{P}qnRON5KW@RkgSh+UF z)bjo`{h;7LsgWt&FX)*lcj1c&eo0uL1p}cN_b4uox#^_k9e92 zwoWt~$*|6D-=OxN{>VRT`1g7a9%#ZmXBL7x9{kXGBxGdWh1sfvdd#DtsgJA1UlR8D zme0VH)0_ZslaLGm9S{v95kAl;tv9|%GVNf?A+D)|R+#vu9U|GmcGY=OAG3npN^ zv7(f-b0d!fEdU(p&TRrvO&<*;5&+^%#1jCn`~O2@%uujzV72J;^`#+)qoVt)-dJgm zF&XBx|6%jCrkw-;>iRS~)B7z4vR4OVpyd)PcBG%)&sD3h^oGWCo1N!@uIgX!BfM|4 zVUND}!sgWEN11N1LYpti^M0`kMbR@prE$xB2%<&j`0uTU#`f!N?c%ffes1G*c}I4c z)qJyqqwIlFT%F3~ZNxa2YMqpwl38<1)KxHkc)YFosnjoPn**yuwQA!jv6YuE zdyXB~FQ4%lh)Eb?mSfzr#f<1HAg^+>BU4+o7t zYUap9=dGCN^228_&N-hMt1QDc0}KtiE-I?FzD!2H3Y5GVJT9Rpndcw#dV78d9(V5s zZdtW`CFbOy-J>_Ovld$a;@jBpp`0zHmzLvO)6Z!wU=Pm1ad37XSaGLg&mN&q^8x8+ zNX8h@9|gL_(O*eu&)aHkYmHx~Pvk0i`jeQf6K$*pqK<=$>oB1jMej<^n{5C^itbC= z2SKYCGS-wn?{tRa2`1WL@Z>mEL51#TDZVPC*UH(kbA&6ki3iQ$dY$(=jx-`LEmK2ScLJPmBlW46p^!C?>0 zan1aIAU0otWDB7;IrZlYDulbBTB?3|0snLC>oqiyp6ZmY74kqmukNVJWwC??7fH#mQv)RILG39 zSbtzQvZ`&Liv#!B5rn0r zSrxP;>i0@GW%B`Q_>F~vWgF8t*1kf0QfmiJ#jrq7$uZq3XD__l&hUK#Na*ZQCOf5r z9}ag=j4K8SnGl0lak+6=Buqnd^BFv2WYyc=n@9Ihw`UgRKf`6bAQkssOa4+#1;OLW zkC)4yZ1e!Z;+KQ7%7O?>^67J?LxhUE_D%6(Pg^pknw$!cb9R(A8bLM`%NE;ZK}K0H zW+f3@#Yf8MlT9f?02eM0|C@{lW`gb4q7zbtkH?$5`FL}C;Oi6-W+#wyD+*Om zWP4(NO6CbtJoBd1;@BD#EnCP6xi2`1g6f2;CKa1|qJ`i$ldL&o8D0^%tdZ)qy_VMc zuSs1)!vudb7xu%y4dw`OTINp-EC7{Bv!L_=BDYe^j^PMZ9=Qw{|ZKKc=7k-_Go?7?u8Od}!ibQcb z_KY>stfs?}qR-WsIXQ|o7l;XxC!Y9m#AAqLfcaxE?5H;)gsk3Uur)E@gP*nHSjZQF z85~R;hPghuC0kntiL*|N#}w(U{JoHcd;vQeRO^`P28kPv$)+ z|HL|q>J;+xyEy3G%>IV!GT;TJPhGP=fbssuN)6@M8Zxu}>la%*T}s-1D?havGI=oz z$=*7*cfB#}W@LB%F-EYvZ0YoBJj0;w(S&H}!y^_K`m)pYlB(S0OB`f@w!-m;P_sOg z-w_Gs?O$l~EDhv2qn|e3_~lWw-Y>>iOkxX@Q_YIF=2|s;*KYX3>B7sc1;7-oY)CdG8~rA#v2G1|jdY&DX+CBS4|Qqzqj8~{tZmq`ebkDid%|Mb5V_}# zf|R;iAq?$Nr;?}Z{PVAyV2u~dfw1HS%($A5zBXwr&6qLkV6#M>NJ$l}zZMXQgFiQv z@sK{$hdt^VGJ@O_%FLfZM2pdY29cJ3D?|h*7RoGoHeT=tez8`Ce;9$6#IveQ4g{n6 zc+?modT%=JT^vZ|iOnlDm$9$#HW4EVdN_<92Kbc?J?J}Ua;J;k4O%Qr9g6g8E;AJ2 z(c2!1AGpQryi;3RV(w`?`C|{AA#++OwKcg>U6!NuQLDp6wfRsiesIT-mL#*jVrdUI zkr5RFd1UEAQrzR|*K`T&-DkEG=XD3YiH66-Bx{|ssu=FjSH5-vzv|*-XK94d9LX5N z>Cv@)=m!Q-#Fq47a5m_z9HqTh1e3 z&a$tSRR*UA-6(@q<`ge^&P#zV=psevguxOl^z1R;TNGZ5W_`kc;4J7=uEEC)#r27* zqZyB6H;ci!guUT2BCa0wV}{gjM=McmsvVUQTkEG40Rj;0Qi;XpV5m$e}R~(_2DmTxV|y;K_(mCn8a#@pNA8Ca9eYT8ck4i>b_><;l?t{ z&Gm=Q5H{S&M?=ZmoJrPuV@KN@S1L)Cf@tQ+hp(m5l0?Iy%GI{yLo{3B#)fNkaP}N* z*;zh;w+vhf!zVI$)6W_RNfV3X>WsX@9`{J5fs)by;*XT~`mf8FwKpJ2dEY+Dr^)TB za|9v1+SWg3jnb^}BwE5&N@O(UFfFpV=(D;k+{77Km6o}kq!;JWr=!uG zbDZcW8Nkx6a+xA#Of~=Y{nY1BxsqX&hE;7SJ}DVrQFB6$G?O#(Jf@OKok`Q|c_3Dq zpF#23dNpPB8ROyU73(Du*L$$or%uc53?d)|;Czwf!m>3ddLW)=I?5-uTa7=Hx$-^= z@H?|Cp40g#^<9HkRp1g5+IH=uQ?%eSJkZKBa4f=*M15JDorZV~Dc5A*+>0aUYT;vF zehsEq&y^qj*_JM2hA#a2pdBBo=B)07=YFR$SN-#;kMFz>uTZ-wpK#)_qWgM(Lw`J@ z+ud=Ryt^HL{rIm%a+4MUX(Xw}+Zv>U=9P4_b$nex^G$yOQNQb!FJMY8O+WQbneV5C ztXJPna22&+sHerneVfg9cdfR@m|m`MR>8an27SaTPmZ2>bFt6h4ZlqeKAqi$7A;XA z&PV9)0c8AZ5gtYLMTwiv0j$hVzbJ5i&vJ!RYsVr)gK*+Hmo{I|yafVb$y<+ys`0++ z4}PqWZ|+R+gGseO4O8FmFVPo~5(3!TIMO0n|4Ew3wO}4G zCj=+%=KMrn_~Nmx9KQ7C7U1ug`&1j&-*&}rMThK=D;`PtS1Uyi)+gEVcr)l$V*S6b zG3=Cc()GAhU>%ojC2sAW910wiBeaVT$~LZJWNewz?|VxAagQEdV7YA{8@ax^htuhq z)Ejz?C%8?g0%SC7($Ka;gX82fgI1(ePjqUlFeuN?Y#C%6`gHNCs9E`cD#uzy#57Kv zNh+v%Umd$vy!Fj(_xP15T8NRCu1bs^38q8`$4UUh1;I5;m>I5?eNd+M&DnJGHaIaq z&js66=mYd>Iun;=I~7r26UrGqFM%TtCSMI3l2>JGY9O)UoDP&8l=&&>Mbwlx=F|E- za4gh|W|Zfnb)VVA>BJkpbr$}UVJUR$piE{YJWT^A;{T%5nVu;BKg&L2;Y<`u%Eyf{%f`f+CQcNMU;?(Ci))@|lMMqECd!E{k1=w!1`WH)r$V1#Z8W&@02Z*5kyQ4T%i9aKK zBnl9OdMu)fOi5pp_z5#at1p-2&Y8Yp#y~Qex@$SH{O{onXVi4-*d(trGHdMT!{yjW zD}eCZ`AQ4ersiA3SYjeJ#R-n#+Utt;tdx6(BcsvyILOg>D1#A-m`USsR!_&~Wtb z0odPBHj&e8;&c(#FZz_?}5zxF0|4gH-HVlq5C0~ zBCDxRmiPk>3i7*hui}|nfuRPmKM(f#P*fI`wq*&)nS;skj!TI zW9ZPB8C-Rmsp9*Uq4g*bo9h8h4{W5L5~EU^Agv7R6Pi*-!&n%op<-bvfEM-jo%3F;v&ob zo=&W&7DOWS6=H)McxG;E3 zLSkM=!aL}&v+EC4Ck{nBH4@7;*Lh7cl}Z1)K|{mrIQ6+ai^fW<06#r+$CcIH6EuOM zrGypSs^UV$nuepuwM5Ezd?Pt8>r34m%I$PT=HZz-IgG7p&XL_S;n$^kPK0NLtuxrK z)Vb`lV5bCTak@?+?78D(qYcURZ1-f;&oku>X7nexwh`r8o}8LkpF=mF`jPl8BvjPF zyTkEGIz>fA)91-3bT+a)(W*S{P576^CQ^MFY>Dm{kO^$AAhBp8jk;#|!73HokFF%$ zWsp;D8y3+jowVsAzdAW>Y|OwAY09J;pzXflXqARhsFHk{L7xs;J&`5a#w+FLO3WO=jI*Np`{ zg{X;UL>G^8g{oirVs>jom&uQH;Eg9XAFh7|PLmJoyoSEcl6vZpOGxa3C^)@Z` zH3MvXe$)}f^%r0(A6HnZT(Cw28@TG|aHrGrLmg*YVDqy$5L+6!@nt&)yA9JAY8hx> z>2O4k4wEIA(GU3bkB&nAMx|EcsjG6mTzhW$)}}9oVs)^*qCgu~F+F(OWpPve9g+Ch zCZ05wfZ5Z|%Z$D9BX{LpsalIPfcAHUDr8fcWSfDJ#zq?t{*iB^L4xxgMu{rB7Fb)F z%^k^A_Ec-umGcTi@{&KA0ES?{TrHzFr8N8lVc|<8XaD!wKH@ftOVT+RI8|bWP}zSn z{GS5SM+=#|G+|Wzwff{UTs3erH=LYkoB5#~ekdr1vpo3L(g_nepZ%qLZ$BZmTm!hj z2X?SHm4`5yl(rg|!mEK;`+Q#CI#{hEE5zMhqf=$AR;rVXB@WGwODwQX92HB2P^sL{ za=kSjv(_XYbCzq_cX6pS3NP$V5v30AOlk{ZdT%pc+YUL$x|S1fKDbIX61C5Li$9le zMaqNiI~uYXjh=p4cO<9fB>jcT6{1+B2fM#*nde-|g=bqP3U3(`FDo~JbX^pTGlU-_ z7C}QnMD#DVi2WI{)?~G<|4r1HOIZtv^LEal)eDvA;yZ&=`#>#^X~YBmoJH`7M+)6p zt}?{^itrv&m>@JiqrkvlrGEI9C#)mOGgMmc!GINw5iNEXB)_Awr&_JU`uVQxC5mT< zr}eWX-^wNW^*UJLu)lX=)z{xEJ*0SZ|8I_80cyDzs@q|n4+DQ#relzE^Eu?j3v!Q* z#uU8pS;3^WOmw$)xGMA9hfnK<=Z~{xaspEj>XvQ6dBazm!Ryp9*1}>dF|b2?`kd?! zzU-5H;&3TkYjRfEHNIq94|}qR5enrqE-RPsDwzNF0%Yo5%oy4t*vv_Ab)|gPaZ>0q zhFL$?1QH)op^3VA;=kKb9@uRJKWDPf(N)q+zIhLa%sarhj~mC4M$#c7B8rHJ0Bw9f zH$06-p|4;jIPN^0-It(B&YsRtVx1Ha zF8f}d!#AEvrsfZJIxMj_=Zq*7hs5RzXU$2bn2tv0S@lu`-P$=X4*fzjeI%c`sJQS|DdWcK1>rV96SCAHpmA|iE`2He(`>dfK<+a?!^!v>zJmk=KjV!j{ zC?W|+YxXS3qMq`7>pD-SY78HCs#X@$#rnNZ2dER%;el1nlh>6!ji}W z0(U%e6ybj7mS$t^D@bR5(sahV?05Tl7W_D|k@{PIw{xXT@nY2vHo-*^r;3K+!`Eue zcR5mzwwoYNoVHV@vt_icj8Eg9iyZ4XUw$pf@#IBoX zy}doTP!+zESyFUHPi(>ch|@;XeW7u|EzN5^AD!u#4fY$SG&`EO=6crY@^!u@ z_bwuWShUdd49$PYr^=qUh_V7M25u@~VLADLbl4(~PXR}YsfEj>z@#klc`s|!zLJH3 z4o!M3yNkhz?uJsmQ);QsOmUvCq+#m*LMy)p%Q=y54qVaBDKsMi&~_j8R0uEFtj|yx zeFXXK-Uf^rZ>pBdPRi`{-}&=-g~%j$m(%i-{8wD!OFq+$h-P6@3_GbM1VvhM213(f zt?8$5-l?MI*xlxD;2>hYqtm-qr)L%5p>8iPy6nkv)1u?agS88dC9b@D9M8iwy@62Q zyL83x$A5(l4)T2FrdUbwLHu>mYDdcXK}uYYHVGkDj_G9!B*#ymZEaB|2OgC(UUoBF z9@;#?C)Yr?=kOU%GtdsE{=P!rwvSl5E%?36<{3Z1(#TFOB37<$@te3NNGylIVwdW5 zah1PyPA6n=aCH))`c?jo*wjZ%1`W(b*jt=Ab*|LyNG?~cFs0~HS=3Z9H6=7>?07vr zcH($B>K~NbKgu(S%JlpZdqhlOP3YDu6b7!hdqH+vUb-xQvmP+};d{o!eoeK~hF)l0 zaVm3xn0&|cx5tEQa0ROfvzDB4b8^*E=IAB%diT%OlDNg}y#>;Y|0Cq7O%sXp4V~}h z$s<~4wno@;p!Yr(^jfU}$YQzbJNl+9y%v#TiM;)x?OP8O*L&y7@pxRFMSih%Cbz5q zinF|I@6cq*k2acbQO#fk`GWaVjUL}FXZEfsfYPFko(?cf0X$#gv3P^M zgv43>l!YCXkz5{kBz1LlBI4pbXZZj(7(z@;3r@ zH`Nb^)rX75`VpdW>^5UDvi6Ltx@Kt%{K=k)O=H-sUM%qC4-`uE*w~Kdg5(xivWng) z>5YZpzi#S^mSe7_td6_4LvvYGT@>5D*!cEi8+N*)ddPXHz3xIS_O55~XMF2Gvcx}y zWNWM`IDgbK*c|trR&2;ADL;9Lbr;{?pRW9Z2~No*S)kDWjV#2YOBN6`c3FB(^44T} z)B?+xZj0<<%THY#RbUd$kJ01+{5}56ghhtsR;@?4gfdu8xLwcsp*?2iXYO=|SPYjs z$v;ZPNnF6N`=@T&+|)t-CnRlrmUgV6t`A=hd$mAw<0GWj8XP7R(sP4%3^!m=*U9Ib z+6}KoZ)+8#63b+&OgB?mO3?FK{LH52m{TQw>4tt_Sjiq5uBo#(VNcjt53HP_?*TVb zEWuif9L@moZ0g#(P6q0qlEG+rBo8>pmO6e~k{sL(Q9p@yzwS;5>k48iQj0MiYS?z( zQ*E^R2EOCJFWAxBKM ze+|p({Nli-g^yIsoN}3nbdz@Jfg;e)mi*$l=d;NxY#rLni!|Hxp`=< z8KKLSto!b$h6a#jwUJU$MI4T&Wa#GS=TBT^V19eLCQS7rf{X6&b-hIS>}y2sA57U~ zI$lp4?3&aui{2eq_QKfRL$o8-%L>CH8?@qwh9nQTucrP}y9WQRbbjM+HUEK|$)P<@uS_}xA8E{QTslj5}^Jab#`;o1@!AN(%Wjj|TaDow&hKX;d-#TAOxtFnh$8)hd}?nrT#V@Yj| z=Ocy5)z~|*c$uCOfVef};4JcX@g0mnmA9_Y?RfgU{9bYbhh$}pDRlyWartm>-jOfC z>eevMZ=X2A6l;=l5J-r*@_}r2{z@%&S=ob7nM`F*8y;>0Vl%uJ}E)2#iWmJKfWm( zY@&&pL!^)g0{R9zM4cPc_;rmpM&207J+IMZAH|W>U0@ngE_zBD1J9JY-!#flD zr?xz5!|BR{epi_n@wO@PSK;)ozn=imvp6!6QlQG3?hh`WarOab7bl57LovaytDnQ5 zGNgA2@kOBj5ltn=MTryG(S^cj2#AP&$j;+IqBL18clUgWjyV63*qF`elj~CcF6mz? zA=5pAE3*1S`sYR`SOEu0;V&qg_?Ez79YNkE;hP$grx&=jlS;w-FrP{`QAhtTKjTm; z&gDE@7pPX_a}6vG7)6z*hcd!f$xAg7+>}F3T)Yw$qLbjAs(HHmjIAX;TB2~1`;9I; zu{#~~$;Mk>DCDc&ZAl9(UOmf>rUoI{g*E=Jbv%?JA|lc=|NZ+I0x2YS>Vu;hvHFY? z&Gj?rdhcF|ip9;+r7U;(lz=n5PzJ647jSv{)POQ=vUc6C3~p{Nnj5=E%3bAl#{6Yf zIea>)_0hvx!Tu#a?tv{LwkAB8ZzRgt4{bqFpRuL|7FZb4SMNh}BD^$~qF=|^lN+}5 z0||lw!&)%#OWWJkWjddAAkpu*MRO_rsp_N9>t5U#Tlwf_N`YbVXexj>a61$h7WQ{} z8C_q08~w{I>($>1oBiVl2qaATV9GqW^3|L3+OwW)VRC#{f;3%Y13AaNcXR}KS>3=u zKvOg{%&!%^=IHUs0aiJq?DG+dQYRrh&lr|2%wOD= zhi+5;@+-%it*Ek13C>2do)uS$u26sa=pf2kJUT#*V)omfgfWZ__D5aVra-H~yF+bzvWF5yl;W=pVOeS)h6>j6u3KTiZ|)y76i z3%7-}ww|Q+KK8@Em5qoXN%8g{F%p-dmZ z_U*~~>sY<()m;i9qdmrSEiD@cb1@=4?v_IBi31a)G;x@W6h4xnJ?1@1nYZNDqW^lP z1Ep}Z_H5zC&1a8LlyD$}ykS%EZZ?m`ygvk1rA7}|RW&C|1A>rAuw=f@^-`-`ttvh5 z;SOzuMhYxB7=d2c^c>ZrH|L)Nt&lWM^q&fJ%k*(vbBI8nT~I(=UY<`85hV>^xG}Qi zLd(lJxVTK+@c}UD4*-Sz1AW`u{PXjR09GGIRh858fdUQ=^Sdx$!gefQE}KWv+L~r| zcJ?213S$ofTn-Kn&fUukz{UTU8*Nqg|FJ2}4S?c?WAVx9=;)N+SJu|{j*p+?r2smL zw&b6YfW5sv2uR4$1wOB*3lGU6M4`?}5(#6)G!NJqSV| z%mjDn4Fg4J_KoqU-4^WFu5m@)@d2!AcklX;AoXmw|LOg@*$(qvBWFQkpBgCmZbEGhVdIIZAbwZZWkt_d|(yPQxcx!Wy4=AGQ2XWo}29li126>*S5Z z`9b_1(H@W#+W~p!^l={w@dLPBlotnKfE67Ya`Nc(j~9~ft|x7M*0tiI<(b}xjQ}S{ z?r)!_R&M;wO*bXh8KG9P>E;zKIm!Hb1H)IX8A7z>!NA46f214W20r!cXeYK5Z!fT; z0(;9K8nbhEjCi=!%@Fc4U5$vMhuao30&&)a4cxB8G~GFS5hO!ljh>yZy6qOOTI@SI zEhC6PM2$#rk2cS#rvF4!cl1?Sd~K3LQpq!X;eO)1lrAedz4Z3b8f^+w$YR>kyI}NW{-P@e>4DV|$6x&ZXlhG&Ki

-$pXs+ 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