feat(precheck): initial IHP support

still missing the IHP Klayout DRC deck
This commit is contained in:
Uri Shaked
2025-06-27 20:08:02 +03:00
parent c5199c8f27
commit fcd0fd9cfd
5 changed files with 532 additions and 58 deletions
+401 -1
View File
@@ -59,6 +59,371 @@ valid_layers_sky130 = {
}
# fmt: on
valid_layers_ihp_sg13g2 = [
"Substrate.drawing",
"Substrate.text",
"Activ.drawing",
"Activ.label",
"Activ.pin",
"Activ.net",
"Activ.boundary",
"Activ.lvs",
"Activ.mask",
"Activ.nofill",
"Activ.OPC",
"Activ.iOPC",
"Activ.noqrc",
"GatPoly.drawing",
"GatPoly.label",
"GatPoly.pin",
"GatPoly.net",
"GatPoly.boundary",
"GatPoly.nofill",
"GatPoly.OPC",
"GatPoly.iOPC",
"GatPoly.noqrc",
"PolyRes.drawing",
"PolyRes.label",
"PolyRes.pin",
"PolyRes.net",
"PolyRes.boundary",
"NWell.drawing",
"NWell.label",
"NWell.pin",
"NWell.net",
"NWell.boundary",
"nBuLay.drawing",
"nBuLay.label",
"nBuLay.pin",
"nBuLay.net",
"nBuLay.boundary",
"nBuLay.block",
"PWell.block",
"pSD.drawing",
"nSD.drawing",
"nSD.block",
"SalBlock.drawing",
"ThickGateOx.drawing",
"Cont.drawing",
"Cont.net",
"Cont.boundary",
"Cont.OPC",
"Metal1.drawing",
"Metal1.label",
"Metal1.pin",
"Metal1.net",
"Metal1.boundary",
"Metal1.mask",
"Metal1.nofill",
"Metal1.slit",
"Metal1.text",
"Metal1.OPC",
"Metal1.noqrc",
"Metal1.res",
"Metal1.iprobe",
"Metal1.diffprb",
"Via1.drawing",
"Via1.net",
"Via1.boundary",
"Metal2.drawing",
"Metal2.label",
"Metal2.pin",
"Metal2.net",
"Metal2.boundary",
"Metal2.mask",
"Metal2.nofill",
"Metal2.slit",
"Metal2.text",
"Metal2.OPC",
"Metal2.noqrc",
"Metal2.res",
"Metal2.iprobe",
"Metal2.diffprb",
"Via2.drawing",
"Via2.net",
"Via2.boundary",
"Metal3.drawing",
"Metal3.label",
"Metal3.pin",
"Metal3.net",
"Metal3.boundary",
"Metal3.mask",
"Metal3.nofill",
"Metal3.slit",
"Metal3.text",
"Metal3.OPC",
"Metal3.noqrc",
"Metal3.res",
"Metal3.iprobe",
"Metal3.diffprb",
"MIM.drawing",
"MIM.net",
"MIM.boundary",
"Vmim.drawing",
"Via3.drawing",
"Via3.net",
"Via3.boundary",
"Metal4.drawing",
"Metal4.label",
"Metal4.pin",
"Metal4.net",
"Metal4.boundary",
"Metal4.mask",
"Metal4.nofill",
"Metal4.slit",
"Metal4.text",
"Metal4.OPC",
"Metal4.noqrc",
"Metal4.res",
"Metal4.iprobe",
"Metal4.diffprb",
"Via4.drawing",
"Via4.net",
"Via4.boundary",
"Metal5.drawing",
"Metal5.label",
"Metal5.pin",
"Metal5.net",
"Metal5.boundary",
"Metal5.mask",
"Metal5.nofill",
"Metal5.slit",
"Metal5.text",
"Metal5.OPC",
"Metal5.noqrc",
"Metal5.res",
"Metal5.iprobe",
"Metal5.diffprb",
"TopVia1.drawing",
"TopVia1.net",
"TopVia1.boundary",
"TopMetal1.drawing",
"TopMetal1.label",
"TopMetal1.pin",
"TopMetal1.net",
"TopMetal1.boundary",
"TopMetal1.mask",
"TopMetal1.nofill",
"TopMetal1.slit",
"TopMetal1.text",
"TopMetal1.noqrc",
"TopMetal1.res",
"TopMetal1.iprobe",
"TopMetal1.diffprb",
"TopVia2.drawing",
"TopVia2.net",
"TopVia2.boundary",
"TopMetal2.drawing",
"TopMetal2.label",
"TopMetal2.pin",
"TopMetal2.net",
"TopMetal2.boundary",
"TopMetal2.mask",
"TopMetal2.nofill",
"TopMetal2.slit",
"TopMetal2.text",
"TopMetal2.noqrc",
"TopMetal2.res",
"TopMetal2.iprobe",
"TopMetal2.diffprb",
"Passiv.drawing",
"Passiv.label",
"Passiv.pin",
"Passiv.net",
"Passiv.boundary",
"Passiv.pillar",
"Passiv.sbump",
"Passiv.pdl",
"NoMetFiller.drawing",
"ThinFilmRes.drawing",
"IND.drawing",
"IND.pin",
"IND.boundary",
"IND.text",
"EdgeSeal.drawing",
"EdgeSeal.boundary",
"dfpad.drawing",
"dfpad.pillar",
"dfpad.sbump",
"TEXT.drawing",
"Recog.drawing",
"Recog.pin",
"Recog.esd",
"Recog.diode",
"Recog.tsv",
"Recog.iprobe",
"Recog.diffprb",
"Recog.pillar",
"Recog.sbump",
"Recog.otp",
"Recog.pdiode",
"Recog.mom",
"Recog.pcm",
"DigiBnd.drawing",
"DigiBnd.drawing0",
"RES.drawing",
"RES.label",
"SRAM.drawing",
"SRAM.label",
"SRAM.boundary",
"TRANS.drawing",
"DigiSub.drawing",
"HeatTrans.drawing",
"HeatRes.drawing",
"NoRCX.drawing",
"NoRCX.m2m3",
"NoRCX.m2m4",
"NoRCX.m2m5",
"NoRCX.m2tm1",
"NoRCX.m2tm2",
"NoRCX.m3m4",
"NoRCX.m3m5",
"NoRCX.m3tm1",
"NoRCX.m3tm2",
"NoRCX.m4m5",
"NoRCX.m4tm1",
"NoRCX.m4tm2",
"NoRCX.m5tm1",
"NoRCX.m5tm2",
"NoRCX.tm1tm2",
"NoRCX.m1sub",
"NoRCX.m2sub",
"NoRCX.m3sub",
"NoRCX.m4sub",
"NoRCX.m5sub",
"NoRCX.tm1sub",
"NoRCX.tm2sub",
"BiWind.drawing",
"BiWind.OPC",
"BasPoly.drawing",
"BasPoly.label",
"BasPoly.pin",
"BasPoly.net",
"BasPoly.boundary",
"EmWind.drawing",
"EmWind.OPC",
"DeepCo.drawing",
"EmPoly.drawing",
"Varicap.drawing",
"EmWind3.drawing",
"EmWiHV3.drawing",
"ColOpen.drawing",
"ColWind.drawing",
"EmWiHV.drawing",
"DeepVia.drawing",
"LBE.drawing",
"BackMetal1.drawing",
"BackMetal1.label",
"BackMetal1.pin",
"BackMetal1.net",
"BackMetal1.boundary",
"BackMetal1.mask",
"BackMetal1.nofill",
"BackMetal1.slit",
"BackMetal1.text",
"BackMetal1.OPC",
"BackMetal1.noqrc",
"BackMetal1.res",
"BackMetal1.iprobe",
"BackMetal1.diffprb",
"BackPassiv.drawing",
"IntBondVia.drawing",
"IntBondMet.drawing",
"DevBondVia.drawing",
"DevBondMet.drawing",
"DevTrench.drawing",
"Redist.drawing",
"FBE.drawing",
"AntVia1.drawing",
"AntMetal2.drawing",
"AntMetal1.drawing",
"FLM.drawing",
"SNSRing.drawing",
"Sensor.drawing",
"SNSArms.drawing",
"SNSCMOSVia.drawing",
"SNSBotVia.drawing",
"SNSTopVia.drawing",
"NLDB.drawing",
"PLDB.drawing",
"RedBuLay.drawing",
"NLDD.drawing",
"PLDD.drawing",
"NExt.drawing",
"PExt.drawing",
"INLDPWL.drawing",
"nBuLayCut.drawing",
"GraphBot.drawing",
"GraphTop.drawing",
"GraphCont.drawing",
"SiWG.drawing",
"SiWG.nofill",
"SiGrating.drawing",
"SiNGrating.drawing",
"GraphPas.drawing",
"GraphPad.drawing",
"GraphMetal1.drawing",
"GraphMetal1.nofill",
"GraphMetal1.slit",
"GraphMetal1.OPC",
"GraphMet1L.drawing",
"GraphMet1L.nofill",
"GraphMet1L.slit",
"GraphMet1L.OPC",
"GraphGate.drawing",
"SiNWG.drawing",
"SiNWG.nofill",
"PWell.drawing",
"PWell.label",
"PWell.pin",
"PWell.net",
"PWell.boundary",
"IC.drawing",
"NoDRC.drawing",
"RadHard.drawing",
"MemCap.drawing",
"SMOS.drawing",
"Polimide.drawing",
"Polimide.label",
"Polimide.pin",
"Polimide.net",
"EXTBlock.drawing",
"NExtHV.drawing",
"PExtHV.drawing",
"MEMPAD.drawing",
"HafniumOx.drawing",
"MEMVia.drawing",
"RFMEM.drawing",
"FGEtch.drawing",
"CtrGat.drawing",
"FGImp.drawing",
"AlCuStop.drawing",
"prBoundary.drawing",
"prBoundary.label",
"prBoundary.boundary",
"Exchange0.drawing",
"Exchange0.label",
"Exchange0.pin",
"Exchange0.text",
"Exchange1.drawing",
"Exchange1.label",
"Exchange1.pin",
"Exchange1.text",
"Exchange2.drawing",
"Exchange2.label",
"Exchange2.pin",
"Exchange2.text",
"Exchange3.drawing",
"Exchange3.label",
"Exchange3.pin",
"Exchange3.text",
"Exchange4.drawing",
"Exchange4.label",
"Exchange4.pin",
"Exchange4.text",
"isoNWell.drawing",
]
# layers used for the analog pin check
layer_map_sky130 = {
"met4": (71, 20),
@@ -70,6 +435,41 @@ def analog_pin_pos_sky130(pin_number: int, uses_3v3: bool):
return 151.81 - 19.32 * pin_number - (15.64 if uses_3v3 else 0)
valid_layers = {"sky130": valid_layers_sky130}
valid_layers = {"sky130": valid_layers_sky130, "ihp-sg13g2": valid_layers_ihp_sg13g2}
layer_map = {"sky130": layer_map_sky130}
analog_pin_pos = {"sky130": analog_pin_pos_sky130}
lyp_filename = {"sky130": "sky130A.lyp", "ihp-sg13g2": "sg13g2.lyp"}
# TODO: read layer numbers from lyp file
valid_lef_port_layers = {
"sky130": {
"met1.pin": (68, 16),
"met2.pin": (69, 16),
"met3.pin": (70, 16),
"met4.pin": (71, 16),
},
"ihp-sg13g2": {
"Metal1.pin": (8, 2),
"Metal2.pin": (10, 2),
"Metal3.pin": (30, 2),
"Metal4.pin": (50, 2),
"Metal5.pin": (67, 2),
},
}
forbidden_layers = {
"sky130": ["met5.drawing", "met5.pin", "met5.label"],
"ihp-sg13g2": [
"TopMetal1.drawing",
"TopMetal1.pin",
"TopMetal1.label",
"TopMetal2.drawing",
"TopMetal2.pin",
"TopMetal2.label",
],
}
power_pins_layer = {
"sky130": "met4",
"ihp-sg13g2": "Metal5",
}
tech_names = ["sky130", "ihp-sg13g2"]