| <?xml version="1.0" encoding="utf-8"?> |
| <klayout-macro> |
| <description/> |
| <version/> |
| <category>drc</category> |
| <prolog/> |
| <epilog/> |
| <doc/> |
| <autorun>false</autorun> |
| <autorun-early>false</autorun-early> |
| <shortcut/> |
| <show-in-menu>true</show-in-menu> |
| <group-name>drc_scripts</group-name> |
| <menu-path>tools_menu.drc.end</menu-path> |
| <interpreter>dsl</interpreter> |
| <dsl-interpreter-name>drc-dsl-xml</dsl-interpreter-name> |
| <text> |
| |
| # optionnal for a batch launch : klayout -b -rd input=my_layout.gds -rd report=sky130_drc.txt -r drc_sky130.drc |
| |
| source($input, $top_cell) |
| |
| report("SKY130 DRC runset", $report) |
| |
| verbose(true) |
| |
| deep |
| |
| # all except purpose (datatype) 5 -- label and 44 -- via |
| li_wildcard = "67/0-4,6-43,45-*" |
| mcon_wildcard = "67/44" |
| |
| m1_wildcard = "68/0-4,6-43,45-*" |
| via_wildcard = "68/44" |
| |
| m2_wildcard = "69/0-4,6-43,45-*" |
| via2_wildcard = "69/44" |
| |
| m3_wildcard = "70/0-4,6-43,45-*" |
| via3_wildcard = "70/44" |
| |
| m4_wildcard = "71/0-4,6-43,45-*" |
| via4_wildcard = "71/44" |
| |
| m5_wildcard = "72/0-4,6-43,45-*" |
| |
| diff = input(65, 20) |
| tap = polygons(65, 44) |
| nwell = polygons(64, 20) |
| dnwell = polygons(64, 18) |
| pwbm = polygons(19, 44) |
| pwde = polygons(124, 20) |
| natfet = polygons(124, 21) |
| hvtr = polygons(18, 20) |
| hvtp = polygons(78, 44) |
| ldntm = polygons(11, 44) |
| hvi = polygons(75, 20) |
| tunm = polygons(80, 20) |
| lvtn = polygons(125, 44) |
| poly = polygons(66, 20) |
| hvntm = polygons(125, 20) |
| nsdm = polygons(93, 44) |
| psdm = polygons(94, 20) |
| rpm = polygons(86, 20) |
| urpm = polygons(79, 20) |
| npc = polygons(95, 20) |
| licon = polygons(66, 44) |
| |
| li = polygons(li_wildcard) |
| mcon = polygons(mcon_wildcard) |
| |
| m1 = polygons(m1_wildcard) |
| via = polygons(via_wildcard) |
| |
| m2 = polygons(m2_wildcard) |
| via2 = polygons(via2_wildcard) |
| |
| m3 = polygons(m3_wildcard) |
| via3 = polygons(via3_wildcard) |
| |
| m4 = polygons(m4_wildcard) |
| via4 = polygons(via4_wildcard) |
| |
| m5 = polygons(m5_wildcard) |
| |
| pad = polygons(76, 20) |
| nsm = polygons(61, 20) |
| capm = polygons(89, 44) |
| cap2m = polygons(97, 44) |
| vhvi = polygons(74, 21) |
| uhvi = polygons(74, 22) |
| npn = polygons(82, 20) |
| inductor = polygons(82, 24) |
| vpp = polygons(82, 64) |
| pnp = polygons(82, 44) |
| lvs_prune = polygons(84, 44) |
| ncm = polygons(92, 44) |
| padcenter = polygons(81, 20) |
| mf = polygons(76, 44) |
| areaid_sl = polygons(81, 1) |
| areaid_ce = polygons(81, 2) |
| areaid_fe = polygons(81, 3) |
| areaid_sc = polygons(81, 4) |
| areaid_sf = polygons(81, 6) |
| areaid_sw = polygons(81, 7) |
| areaid_sr = polygons(81, 8) |
| areaid_mt = polygons(81, 10) |
| areaid_dt = polygons(81, 11) |
| areaid_ft = polygons(81, 12) |
| areaid_ww = polygons(81, 13) |
| areaid_ld = polygons(81, 14) |
| areaid_ns = polygons(81, 15) |
| areaid_ij = polygons(81, 17) |
| areaid_zr = polygons(81, 18) |
| areaid_ed = polygons(81, 19) |
| areaid_de = polygons(81, 23) |
| areaid_rd = polygons(81, 24) |
| areaid_dn = polygons(81, 50) |
| areaid_cr = polygons(81, 51) |
| areaid_cd = polygons(81, 52) |
| areaid_st = polygons(81, 53) |
| areaid_op = polygons(81, 54) |
| areaid_en = polygons(81, 57) |
| areaid_en20 = polygons(81, 58) |
| areaid_le = polygons(81, 60) |
| areaid_hl = polygons(81, 63) |
| areaid_sd = polygons(81, 70) |
| areaid_po = polygons(81, 81) |
| areaid_it = polygons(81, 84) |
| areaid_et = polygons(81, 101) |
| areaid_lvt = polygons(81, 108) |
| areaid_re = polygons(81, 125) |
| areaid_ag = polygons(81, 79) |
| poly_rs = polygons(66, 13) |
| diff_rs = polygons(65, 13) |
| pwell_rs = polygons(64, 13) |
| li_rs = polygons(67, 13) |
| cfom = polygons(22, 20) |
| |
| |
| log("{{ OFFGRID-ANGLES section }}") |
| |
| dnwell.ongrid(0.005).output("dnwell_OFFGRID", "x.1b : OFFGRID vertex on dnwell") |
| dnwell.with_angle(0 .. 45).output("dnwell_angle", "x.3a : non 45 degree angle dnwell") |
| nwell.ongrid(0.005).output("nwell_OFFGRID", "x.1b : OFFGRID vertex on nwell") |
| nwell.with_angle(0 .. 45).output("nwell_angle", "x.3a : non 45 degree angle nwell") |
| pwbm.ongrid(0.005).output("pwbm_OFFGRID", "x.1b : OFFGRID vertex on pwbm") |
| pwbm.with_angle(0 .. 45).output("pwbm_angle", "x.3a : non 45 degree angle pwbm") |
| pwde.ongrid(0.005).output("pwde_OFFGRID", "x.1b : OFFGRID vertex on pwde") |
| pwde.with_angle(0 .. 45).output("pwde_angle", "x.3a : non 45 degree angle pwde") |
| hvtp.ongrid(0.005).output("hvtp_OFFGRID", "x.1b : OFFGRID vertex on hvtp") |
| hvtp.with_angle(0 .. 45).output("hvtp_angle", "x.3a : non 45 degree angle hvtp") |
| hvtr.ongrid(0.005).output("hvtr_OFFGRID", "x.1b : OFFGRID vertex on hvtr") |
| hvtr.with_angle(0 .. 45).output("hvtr_angle", "x.3a : non 45 degree angle hvtr") |
| lvtn.ongrid(0.005).output("lvtn_OFFGRID", "x.1b : OFFGRID vertex on lvtn") |
| lvtn.with_angle(0 .. 45).output("lvtn_angle", "x.3a : non 45 degree angle lvtn") |
| ncm.ongrid(0.005).output("ncm_OFFGRID", "x.1b : OFFGRID vertex on ncm") |
| ncm.with_angle(0 .. 45).output("ncm_angle", "x.3a : non 45 degree angle ncm") |
| diff.ongrid(0.005).output("diff_OFFGRID", "x.1b : OFFGRID vertex on diff") |
| tap.ongrid(0.005).output("tap_OFFGRID", "x.1b : OFFGRID vertex on tap") |
| diff.not(areaid_en.and(uhvi)).with_angle(0 .. 90).output("diff_angle", "x.2 : non 90 degree angle diff") |
| diff.and(areaid_en.and(uhvi)).with_angle(0 .. 45).output("diff_angle", "x.2c : non 45 degree angle diff") |
| tap.not(areaid_en.and(uhvi)).with_angle(0 .. 90).output("tap_angle", "x.2 : non 90 degree angle tap") |
| tap.and(areaid_en.and(uhvi)).with_angle(0 .. 45).output("tap_angle", "x.2c : non 45 degree angle tap") |
| tunm.ongrid(0.005).output("tunm_OFFGRID", "x.1b : OFFGRID vertex on tunm") |
| tunm.with_angle(0 .. 45).output("tunm_angle", "x.3a : non 45 degree angle tunm") |
| poly.ongrid(0.005).output("poly_OFFGRID", "x.1b : OFFGRID vertex on poly") |
| poly.with_angle(0 .. 90).output("poly_angle", "x.2 : non 90 degree angle poly") |
| rpm.ongrid(0.005).output("rpm_OFFGRID", "x.1b : OFFGRID vertex on rpm") |
| rpm.with_angle(0 .. 45).output("rpm_angle", "x.3a : non 45 degree angle rpm") |
| npc.ongrid(0.005).output("npc_OFFGRID", "x.1b : OFFGRID vertex on npc") |
| npc.with_angle(0 .. 45).output("npc_angle", "x.3a : non 45 degree angle npc") |
| nsdm.ongrid(0.005).output("nsdm_OFFGRID", "x.1b : OFFGRID vertex on nsdm") |
| nsdm.with_angle(0 .. 45).output("nsdm_angle", "x.3a : non 45 degree angle nsdm") |
| psdm.ongrid(0.005).output("psdm_OFFGRID", "x.1b : OFFGRID vertex on psdm") |
| psdm.with_angle(0 .. 45).output("psdm_angle", "x.3a : non 45 degree angle psdm") |
| licon.ongrid(0.005).output("licon_OFFGRID", "x.1b : OFFGRID vertex on licon") |
| licon.with_angle(0 .. 90).output("licon_angle", "x.2 : non 90 degree angle licon") |
| li.ongrid(0.005).output("li_OFFGRID", "x.1b : OFFGRID vertex on li") |
| li.with_angle(0 .. 45).output("li_angle", "x.3a : non 45 degree angle li") |
| mcon.ongrid(0.005).output("ct_OFFGRID", "x.1b : OFFGRID vertex on mcon") |
| mcon.with_angle(0 .. 90).output("ct_angle", "x.2 : non 90 degree angle mcon") |
| vpp.ongrid(0.005).output("vpp_OFFGRID", "x.1b : OFFGRID vertex on vpp") |
| vpp.with_angle(0 .. 45).output("vpp_angle", "x.3a : non 45 degree angle vpp") |
| m1.ongrid(0.005).output("m1_OFFGRID", "x.1b : OFFGRID vertex on m1") |
| m1.with_angle(0 .. 45).output("m1_angle", "x.3a : non 45 degree angle m1") |
| via.ongrid(0.005).output("via_OFFGRID", "x.1b : OFFGRID vertex on via") |
| via.with_angle(0 .. 90).output("via_angle", "x.2 : non 90 degree angle via") |
| m2.ongrid(0.005).output("m2_OFFGRID", "x.1b : OFFGRID vertex on m2") |
| m2.with_angle(0 .. 45).output("m2_angle", "x.3a : non 45 degree angle m2") |
| via2.ongrid(0.005).output("via2_OFFGRID", "x.1b : OFFGRID vertex on via2") |
| via2.with_angle(0 .. 90).output("via2_angle", "x.2 : non 90 degree angle via2") |
| m3.ongrid(0.005).output("m3_OFFGRID", "x.1b : OFFGRID vertex on m3") |
| m3.with_angle(0 .. 45).output("m3_angle", "x.3a : non 45 degree angle m3") |
| via3.ongrid(0.005).output("via3_OFFGRID", "x.1b : OFFGRID vertex on via3") |
| via3.with_angle(0 .. 90).output("via3_angle", "x.2 : non 90 degree angle via3") |
| nsm.ongrid(0.005).output("nsm_OFFGRID", "x.1b : OFFGRID vertex on nsm") |
| nsm.with_angle(0 .. 45).output("nsm_angle", "x.3a : non 45 degree angle nsm") |
| m4.ongrid(0.005).output("m4_OFFGRID", "x.1b : OFFGRID vertex on m4") |
| m4.with_angle(0 .. 45).output("m4_angle", "x.3a : non 45 degree angle m4") |
| via4.ongrid(0.005).output("via4_OFFGRID", "x.1b : OFFGRID vertex on via4") |
| via4.with_angle(0 .. 90).output("via4_angle", "x.2 : non 90 degree angle via4") |
| m5.ongrid(0.005).output("m5_OFFGRID", "x.1b : OFFGRID vertex on m5") |
| m5.with_angle(0 .. 45).output("m5_angle", "x.3a : non 45 degree angle m5") |
| pad.ongrid(0.005).output("pad_OFFGRID", "x.1b : OFFGRID vertex on pad") |
| pad.with_angle(0 .. 45).output("pad_angle", "x.3a : non 45 degree angle pad") |
| mf.ongrid(0.005).output("mf_OFFGRID", "x.1b : OFFGRID vertex on mf") |
| mf.with_angle(0 .. 90).output("mf_angle", "x.2 : non 90 degree angle mf") |
| hvi.ongrid(0.005).output("hvi_OFFGRID", "x.1b : OFFGRID vertex on hvi") |
| hvi.with_angle(0 .. 45).output("hvi_angle", "x.3a : non 45 degree angle hvi") |
| hvntm.ongrid(0.005).output("hvntm_OFFGRID", "x.1b : OFFGRID vertex on hvntm") |
| hvntm.with_angle(0 .. 45).output("hvntm_angle", "x.3a : non 45 degree angle hvntm") |
| vhvi.ongrid(0.005).output("vhvi_OFFGRID", "x.1b : OFFGRID vertex on vhvi") |
| vhvi.with_angle(0 .. 45).output("vhvi_angle", "x.3a : non 45 degree angle vhvi") |
| uhvi.ongrid(0.005).output("uhvi_OFFGRID", "x.1b : OFFGRID vertex on uhvi") |
| uhvi.with_angle(0 .. 45).output("uhvi_angle", "x.3a : non 45 degree angle uhvi") |
| pwell_rs.ongrid(0.005).output("pwell_rs_OFFGRID", "x.1b : OFFGRID vertex on pwell_rs") |
| pwell_rs.with_angle(0 .. 45).output("pwell_rs_angle", "x.3a : non 45 degree angle pwell_rs") |
| areaid_re.ongrid(0.005).output("areaid_re_OFFGRID", "x.1b : OFFGRID vertex on areaid.re") |
| |
| </text> |
| </klayout-macro> |