blob: 0bf1d1b4a5ba5b0fd7eb72e8b67029cfae630a0f [file] [log] [blame]
################################################################################################
# Copyright 2023 GlobalFoundries 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.
################################################################################################
#================================================
#------------- LAYERS DERIVATIONS ---------------
#================================================
polygons_count = 0
logger.info('Read in polygons from layers.')
def get_polygons(layer, data_type)
ps = polygons(layer, data_type)
$run_mode == 'deep' ? ps : ps.merged
end
comp = get_polygons(22, 0)
count = comp.count
logger.info("comp has #{count} polygons")
polygons_count += count
dnwell = get_polygons(12, 0)
count = dnwell.count
logger.info("dnwell has #{count} polygons")
polygons_count += count
nwell = get_polygons(21, 0)
count = nwell.count
logger.info("nwell has #{count} polygons")
polygons_count += count
lvpwell = get_polygons(204, 0)
count = lvpwell.count
logger.info("lvpwell has #{count} polygons")
polygons_count += count
hvnddd = get_polygons(202, 0)
count = hvnddd.count
logger.info("hvnddd has #{count} polygons")
polygons_count += count
hvpddd = get_polygons(197, 0)
count = hvpddd.count
logger.info("hvpddd has #{count} polygons")
polygons_count += count
dualgate2_d = get_polygons(144, 1)
count = dualgate2_d.count
logger.info("dualgate2_d has #{count} polygons")
polygons_count += count
poly2 = get_polygons(30, 0)
count = poly2.count
logger.info("poly2 has #{count} polygons")
polygons_count += count
nplus = get_polygons(32, 0)
count = nplus.count
logger.info("nplus has #{count} polygons")
polygons_count += count
pplus = get_polygons(31, 0)
count = pplus.count
logger.info("pplus has #{count} polygons")
polygons_count += count
sab = get_polygons(49, 0)
count = sab.count
logger.info("sab has #{count} polygons")
polygons_count += count
esd = get_polygons(24, 0)
count = esd.count
logger.info("esd has #{count} polygons")
polygons_count += count
resistor = get_polygons(62, 0)
count = resistor.count
logger.info("resistor has #{count} polygons")
polygons_count += count
fhres = get_polygons(227, 0)
count = fhres.count
logger.info("fhres has #{count} polygons")
polygons_count += count
fusetop = get_polygons(75, 0)
count = fusetop.count
logger.info("fusetop has #{count} polygons")
polygons_count += count
fusewindow_d = get_polygons(96, 1)
count = fusewindow_d.count
logger.info("fusewindow_d has #{count} polygons")
polygons_count += count
polyfuse = get_polygons(220, 0)
count = polyfuse.count
logger.info("polyfuse has #{count} polygons")
polygons_count += count
mvsd = get_polygons(210, 0)
count = mvsd.count
logger.info("mvsd has #{count} polygons")
polygons_count += count
mvpsd = get_polygons(11, 39)
count = mvpsd.count
logger.info("mvpsd has #{count} polygons")
polygons_count += count
nat = get_polygons(5, 0)
count = nat.count
logger.info("nat has #{count} polygons")
polygons_count += count
comp_dummy = get_polygons(22, 4)
count = comp_dummy.count
logger.info("comp_dummy has #{count} polygons")
polygons_count += count
poly2_dummy = get_polygons(30, 4)
count = poly2_dummy.count
logger.info("poly2_dummy has #{count} polygons")
polygons_count += count
schottky_diode = get_polygons(241, 0)
count = schottky_diode.count
logger.info("schottky_diode has #{count} polygons")
polygons_count += count
zener = get_polygons(178, 0)
count = zener.count
logger.info("zener has #{count} polygons")
polygons_count += count
res_mk = get_polygons(110, 5)
count = res_mk.count
logger.info("res_mk has #{count} polygons")
polygons_count += count
opc_drc = get_polygons(124, 5)
count = opc_drc.count
logger.info("opc_drc has #{count} polygons")
polygons_count += count
ndmy = get_polygons(111, 5)
count = ndmy.count
logger.info("ndmy has #{count} polygons")
polygons_count += count
pmndmy = get_polygons(152, 5)
count = pmndmy.count
logger.info("pmndmy has #{count} polygons")
polygons_count += count
v5_xtor = get_polygons(112, 1)
count = v5_xtor.count
logger.info("v5_xtor has #{count} polygons")
polygons_count += count
cap_mk = get_polygons(117, 5)
count = cap_mk.count
logger.info("cap_mk has #{count} polygons")
polygons_count += count
mos_cap_mk = get_polygons(166, 5)
count = mos_cap_mk.count
logger.info("mos_cap_mk has #{count} polygons")
polygons_count += count
ind_mk = get_polygons(151, 5)
count = ind_mk.count
logger.info("ind_mk has #{count} polygons")
polygons_count += count
diode_mk = get_polygons(115, 5)
count = diode_mk.count
logger.info("diode_mk has #{count} polygons")
polygons_count += count
drc_bjt = get_polygons(127, 5)
count = drc_bjt.count
logger.info("drc_bjt has #{count} polygons")
polygons_count += count
lvs_bjt = get_polygons(118, 5)
count = lvs_bjt.count
logger.info("lvs_bjt has #{count} polygons")
polygons_count += count
mim_l_mk = get_polygons(117, 10)
count = mim_l_mk.count
logger.info("mim_l_mk has #{count} polygons")
polygons_count += count
latchup_mk = get_polygons(137, 5)
count = latchup_mk.count
logger.info("latchup_mk has #{count} polygons")
polygons_count += count
guard_ring_mk = get_polygons(167, 5)
count = guard_ring_mk.count
logger.info("guard_ring_mk has #{count} polygons")
polygons_count += count
otp_mk = get_polygons(173, 5)
count = otp_mk.count
logger.info("otp_mk has #{count} polygons")
polygons_count += count
mtpmark = get_polygons(122, 5)
count = mtpmark.count
logger.info("mtpmark has #{count} polygons")
polygons_count += count
sramcore = get_polygons(108, 5)
count = sramcore.count
logger.info("sramcore has #{count} polygons")
polygons_count += count
lvs_rf = get_polygons(100, 5)
count = lvs_rf.count
logger.info("lvs_rf has #{count} polygons")
polygons_count += count
lvs_drain = get_polygons(100, 7)
count = lvs_drain.count
logger.info("lvs_drain has #{count} polygons")
polygons_count += count
hvpolyrs = get_polygons(123, 5)
count = hvpolyrs.count
logger.info("hvpolyrs has #{count} polygons")
polygons_count += count
lvs_io = get_polygons(119, 5)
count = lvs_io.count
logger.info("lvs_io has #{count} polygons")
polygons_count += count
probe_mk = get_polygons(13, 17)
count = probe_mk.count
logger.info("probe_mk has #{count} polygons")
polygons_count += count
esd_mk = get_polygons(24, 5)
count = esd_mk.count
logger.info("esd_mk has #{count} polygons")
polygons_count += count
lvs_source = get_polygons(100, 8)
count = lvs_source.count
logger.info("lvs_source has #{count} polygons")
polygons_count += count
well_diode_mk = get_polygons(153, 51)
count = well_diode_mk.count
logger.info("well_diode_mk has #{count} polygons")
polygons_count += count
ldmos_xtor = get_polygons(226, 0)
count = ldmos_xtor.count
logger.info("ldmos_xtor has #{count} polygons")
polygons_count += count
plfuse = get_polygons(125, 5)
count = plfuse.count
logger.info("plfuse has #{count} polygons")
polygons_count += count
efuse_mk = get_polygons(80, 5)
count = efuse_mk.count
logger.info("efuse_mk has #{count} polygons")
polygons_count += count
comp_label = get_polygons(22, 10)
count = comp_label.count
logger.info("comp_label has #{count} polygons")
polygons_count += count
poly2_label = get_polygons(30, 10)
count = poly2_label.count
logger.info("poly2_label has #{count} polygons")
polygons_count += count
mdiode = get_polygons(116, 5)
count = mdiode.count
logger.info("mdiode has #{count} polygons")
polygons_count += count
contact = get_polygons(33, 0)
count = contact.count
logger.info("contact has #{count} polygons")
polygons_count += count
metal1_drawn = get_polygons(34, 0)
count = metal1_drawn.count
logger.info("metal1_drawn has #{count} polygons")
polygons_count += count
metal1_dummy = get_polygons(34, 4)
count = metal1_dummy.count
logger.info("metal1_dummy has #{count} polygons")
polygons_count += count
metal1 = metal1_drawn + metal1_dummy
metal1_label = labels(34, 10)
count = metal1_label.count
logger.info("metal1_label has #{count} polygons")
polygons_count += count
metal1_slot = get_polygons(34, 3)
count = metal1_slot.count
logger.info("metal1_slot has #{count} polygons")
polygons_count += count
metal1_blk = get_polygons(34, 5)
count = metal1_blk.count
logger.info("metal1_blk has #{count} polygons")
polygons_count += count
via1 = get_polygons(35, 0)
count = via1.count
logger.info("via1 has #{count} polygons")
polygons_count += count
metal2_drawn = get_polygons(36, 0)
count = metal2_drawn.count
logger.info("metal2_drawn has #{count} polygons")
polygons_count += count
metal2_dummy = get_polygons(36, 4)
count = metal2_dummy.count
logger.info("metal2_dummy has #{count} polygons")
polygons_count += count
metal2 = metal2_drawn + metal2_dummy
metal2_label = labels(36, 10)
count = metal2_label.count
logger.info("metal2_label has #{count} polygons")
polygons_count += count
metal2_slot = get_polygons(36, 3)
count = metal2_slot.count
logger.info("metal2_slot has #{count} polygons")
polygons_count += count
metal2_blk = get_polygons(36, 5)
count = metal2_blk.count
logger.info("metal2_blk has #{count} polygons")
polygons_count += count
case METAL_LEVEL
when '3LM', '4LM', '5LM', '6LM'
via2 = get_polygons(38, 0)
count = via2.count
logger.info("via2 has #{count} polygons")
polygons_count += count
metal3_drawn = get_polygons(42, 0)
count = metal3_drawn.count
logger.info("metal3_drawn has #{count} polygons")
polygons_count += count
metal3_dummy = get_polygons(42, 4)
count = metal3_dummy.count
logger.info("metal3_dummy has #{count} polygons")
polygons_count += count
metal3 = metal3_drawn + metal3_dummy
metal3_label = labels(42, 10)
count = metal3_label.count
logger.info("metal3_label has #{count} polygons")
polygons_count += count
metal3_slot = get_polygons(42, 3)
count = metal3_slot.count
logger.info("metal3_slot has #{count} polygons")
polygons_count += count
metal3_blk = get_polygons(42, 5)
count = metal3_blk.count
logger.info("metal3_blk has #{count} polygons")
polygons_count += count
end
case METAL_LEVEL
when '4LM', '5LM', '6LM'
via3 = get_polygons(40, 0)
count = via3.count
logger.info("via3 has #{count} polygons")
polygons_count += count
metal4_drawn = get_polygons(46, 0)
count = metal4_drawn.count
logger.info("metal4_drawn has #{count} polygons")
polygons_count += count
metal4_dummy = get_polygons(46, 4)
count = metal4_dummy.count
logger.info("metal4_dummy has #{count} polygons")
polygons_count += count
metal4 = metal4_drawn + metal4_dummy
metal4_label = labels(46, 10)
count = metal4_label.count
logger.info("metal4_label has #{count} polygons")
polygons_count += count
metal4_slot = get_polygons(46, 3)
count = metal4_slot.count
logger.info("metal4_slot has #{count} polygons")
polygons_count += count
metal4_blk = get_polygons(46, 5)
count = metal4_blk.count
logger.info("metal4_blk has #{count} polygons")
polygons_count += count
end
case METAL_LEVEL
when '5LM', '6LM'
via4 = get_polygons(41, 0)
count = via4.count
logger.info("via4 has #{count} polygons")
polygons_count += count
metal5_drawn = get_polygons(81, 0)
count = metal5_drawn.count
logger.info("metal5_drawn has #{count} polygons")
polygons_count += count
metal5_dummy = get_polygons(81, 4)
count = metal5_dummy.count
logger.info("metal5_dummy has #{count} polygons")
polygons_count += count
metal5 = metal5_drawn + metal5_dummy
metal5_label = labels(81, 10)
count = metal5_label.count
logger.info("metal5_label has #{count} polygons")
polygons_count += count
metal5_slot = get_polygons(81, 3)
count = metal5_slot.count
logger.info("metal5_slot has #{count} polygons")
polygons_count += count
metal5_blk = get_polygons(81, 5)
count = metal5_blk.count
logger.info("metal5_blk has #{count} polygons")
polygons_count += count
end
case METAL_LEVEL
when '6LM'
via5 = get_polygons(82, 0)
count = via5.count
logger.info("via5 has #{count} polygons")
polygons_count += count
metaltop_drawn = get_polygons(53, 0)
count = metaltop_drawn.count
logger.info("metaltop_drawn has #{count} polygons")
polygons_count += count
metaltop_dummy = get_polygons(53, 4)
count = metaltop_dummy.count
logger.info("metaltop_dummy has #{count} polygons")
polygons_count += count
metaltop = metaltop_drawn + metaltop_dummy
metaltop_label = labels(53, 10)
count = metaltop_label.count
logger.info("metaltop_label has #{count} polygons")
polygons_count += count
metaltop_slot = get_polygons(53, 3)
count = metaltop_slot.count
logger.info("metaltop_slot has #{count} polygons")
polygons_count += count
metaltop_blk = get_polygons(53, 5)
count = metaltop_blk.count
logger.info("metaltop_blk has #{count} polygons")
polygons_count += count
end
case METAL_LEVEL
when '2LM'
top_via = via1
topmin1_via = contact
top_metal = metal2
topmin1_metal = metal1
top_metal_label = metal2_label
when '3LM'
top_via = via2
topmin1_via = via1
top_metal = metal3
topmin1_metal = metal2
top_metal_label = metal3_label
when '4LM'
top_via = via3
topmin1_via = via2
top_metal = metal4
topmin1_metal = metal3
top_metal_label = metal4_label
when '5LM'
top_via = via4
topmin1_via = via3
top_metal = metal5
topmin1_metal = metal4
top_metal_label = metal5_label
when '6LM'
top_via = via5
topmin1_via = via4
top_metal = metaltop
topmin1_metal = metal5
top_metal_label = metaltop_label
else
logger.error("Unknown metal stack #{METAL_LEVEL}")
raise
end
piscap = get_polygons(120, 0)
count = piscap.count
logger.info("piscap has #{count} polygons")
polygons_count += count
pad = get_polygons(37, 0)
count = pad.count
logger.info("pad has #{count} polygons")
polygons_count += count
ubmpperi = get_polygons(183, 0)
count = ubmpperi.count
logger.info("ubmpperi has #{count} polygons")
polygons_count += count
ubmpperi_label = get_polygons(29, 39)
count = ubmpperi_label.count
logger.info("ubmpperi_label has #{count} polygons")
polygons_count += count
ubmparray = get_polygons(184, 0)
count = ubmparray.count
logger.info("ubmparray has #{count} polygons")
polygons_count += count
ubmparray_label = get_polygons(33, 39)
count = ubmparray_label.count
logger.info("ubmparray_label has #{count} polygons")
polygons_count += count
ubmeplate = get_polygons(185, 0)
count = ubmeplate.count
logger.info("ubmeplate has #{count} polygons")
polygons_count += count
ubmeplate_label = get_polygons(28, 39)
count = ubmeplate_label.count
logger.info("ubmeplate_label has #{count} polygons")
polygons_count += count
cu_ppi = get_polygons(25, 39)
count = cu_ppi.count
logger.info("cu_ppi has #{count} polygons")
polygons_count += count
cu_ppi_blk = get_polygons(30, 39)
count = cu_ppi_blk.count
logger.info("cu_ppi_blk has #{count} polygons")
polygons_count += count
cu_ppi_dummy = get_polygons(31, 39)
count = cu_ppi_dummy.count
logger.info("cu_ppi_dummy has #{count} polygons")
polygons_count += count
cu_ppi_label = get_polygons(32, 39)
count = cu_ppi_label.count
logger.info("cu_ppi_label has #{count} polygons")
polygons_count += count
pm1_ppi = get_polygons(26, 39)
count = pm1_ppi.count
logger.info("pm1_ppi has #{count} polygons")
polygons_count += count
pm2_ppi = get_polygons(27, 39)
count = pm2_ppi.count
logger.info("pm2_ppi has #{count} polygons")
polygons_count += count
pm1_bop = get_polygons(35, 39)
count = pm1_bop.count
logger.info("pm1_bop has #{count} polygons")
polygons_count += count
dni = get_polygons(78, 0)
count = dni.count
logger.info("dni has #{count} polygons")
polygons_count += count
pwhv = get_polygons(44, 0)
count = pwhv.count
logger.info("pwhv has #{count} polygons")
polygons_count += count
metal_shield = get_polygons(35, 28)
count = metal_shield.count
logger.info("metal_shield has #{count} polygons")
polygons_count += count
metal_shield_slot = get_polygons(78, 39)
count = metal_shield_slot.count
logger.info("metal_shield_slot has #{count} polygons")
polygons_count += count
metal_shield_dummy = get_polygons(79, 39)
count = metal_shield_dummy.count
logger.info("metal_shield_dummy has #{count} polygons")
polygons_count += count
metal_shield_label = get_polygons(68, 39)
count = metal_shield_label.count
logger.info("metal_shield_label has #{count} polygons")
polygons_count += count
metal_shield_via = get_polygons(36, 28)
count = metal_shield_via.count
logger.info("metal_shield_via has #{count} polygons")
polygons_count += count
metal_shield_via_label = get_polygons(69, 39)
count = metal_shield_via_label.count
logger.info("metal_shield_via_label has #{count} polygons")
polygons_count += count
metal_shield_blk = get_polygons(69, 39)
count = metal_shield_blk.count
logger.info("metal_shield_blk has #{count} polygons")
polygons_count += count
tanres = get_polygons(222, 0)
count = tanres.count
logger.info("tanres has #{count} polygons")
polygons_count += count
tanres_mk = get_polygons(56, 17)
count = tanres_mk.count
logger.info("tanres_mk has #{count} polygons")
polygons_count += count
tanres_label = get_polygons(222, 10)
count = tanres_label.count
logger.info("tanres_label has #{count} polygons")
polygons_count += count
tanres_l_mk = get_polygons(72, 17)
count = tanres_l_mk.count
logger.info("tanres_l_mk has #{count} polygons")
polygons_count += count
pres_layer = get_polygons(12, 201)
count = pres_layer.count
logger.info("pres_layer has #{count} polygons")
polygons_count += count
cap_mk_type1 = get_polygons(62, 17)
count = cap_mk_type1.count
logger.info("cap_mk_type1 has #{count} polygons")
polygons_count += count
cap_mk_type2 = get_polygons(75, 17)
count = cap_mk_type2.count
logger.info("cap_mk_type2 has #{count} polygons")
polygons_count += count
mos_mk_type4 = get_polygons(73, 17)
count = mos_mk_type4.count
logger.info("mos_mk_type4 has #{count} polygons")
polygons_count += count
mos_source_type1 = get_polygons(154, 51)
count = mos_source_type1.count
logger.info("mos_source_type1 has #{count} polygons")
polygons_count += count
mk_35v = get_polygons(25, 17)
count = mk_35v.count
logger.info("mk_35v has #{count} polygons")
polygons_count += count
lvs_35v = get_polygons(27, 17)
count = lvs_35v.count
logger.info("lvs_35v has #{count} polygons")
polygons_count += count
elmd_mk = get_polygons(18, 17)
count = elmd_mk.count
logger.info("elmd_mk has #{count} polygons")
polygons_count += count
elmd2_mk = get_polygons(19, 17)
count = elmd2_mk.count
logger.info("elmd2_mk has #{count} polygons")
polygons_count += count
mos_mk_type1 = get_polygons(151, 51)
count = mos_mk_type1.count
logger.info("mos_mk_type1 has #{count} polygons")
polygons_count += count
esd_hbm_mk = get_polygons(37, 17)
count = esd_hbm_mk.count
logger.info("esd_hbm_mk has #{count} polygons")
polygons_count += count
lvs_psub2 = get_polygons(23, 5)
count = lvs_psub2.count
logger.info("lvs_psub2 has #{count} polygons")
mv_well_mk = get_polygons(57, 17)
count = mv_well_mk.count
logger.info("mv_well_mk has #{count} polygons")
polygons_count += count
mhv_well_mk = get_polygons(58, 17)
count = mhv_well_mk.count
logger.info("mhv_well_mk has #{count} polygons")
polygons_count += count
hv_well_mk = get_polygons(59, 17)
count = hv_well_mk.count
logger.info("hv_well_mk has #{count} polygons")
polygons_count += count
mhv_well_mk_type1 = get_polygons(96, 17)
count = mhv_well_mk_type1.count
logger.info("mhv_well_mk_type1 has #{count} polygons")
polygons_count += count
lvs_donut = get_polygons(55, 17)
count = lvs_donut.count
logger.info("lvs_donut has #{count} polygons")
polygons_count += count
res_mk_type1 = get_polygons(26, 17)
count = res_mk_type1.count
logger.info("res_mk_type1 has #{count} polygons")
polygons_count += count
swfet_mk = get_polygons(69, 17)
count = swfet_mk.count
logger.info("swfet_mk has #{count} polygons")
polygons_count += count
mom_mk = get_polygons(51, 17)
count = mom_mk.count
logger.info("mom_mk has #{count} polygons")
polygons_count += count
mom_m1_mk = get_polygons(40, 17)
count = mom_m1_mk.count
logger.info("mom_m1_mk has #{count} polygons")
polygons_count += count
mom_m2_mk = get_polygons(41, 17)
count = mom_m2_mk.count
logger.info("mom_m2_mk has #{count} polygons")
polygons_count += count
mom_m3_mk = get_polygons(42, 17)
count = mom_m3_mk.count
logger.info("mom_m3_mk has #{count} polygons")
polygons_count += count
mom_m4_mk = get_polygons(43, 17)
count = mom_m4_mk.count
logger.info("mom_m4_mk has #{count} polygons")
polygons_count += count
mom_m5_mk = get_polygons(44, 17)
count = mom_m5_mk.count
logger.info("mom_m5_mk has #{count} polygons")
polygons_count += count
pr_bndry = get_polygons(0, 0)
count = pr_bndry.count
logger.info("pr_bndry has #{count} polygons")
polygons_count += count
border = get_polygons(63, 0)
count = border.count
logger.info("border has #{count} polygons")
polygons_count += count
logger.info("Total no. of polygons in the design is #{polygons_count}")
#=== BULK LAYER ===
sub = polygon_layer