feat!: replace ihp-sg13g2 with ihp-sg13cmos5l

This commit is contained in:
htfab
2026-03-15 17:22:51 +01:00
parent 24ea6a232a
commit db5da7076e
35 changed files with 74 additions and 129 deletions
+8 -8
View File
@@ -10,7 +10,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
pdk: [sky130A, ihp-sg13g2, gf180mcuD] pdk: [sky130A, ihp-sg13cmos5l, gf180mcuD]
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
@@ -35,24 +35,24 @@ jobs:
run: pip install -r requirements.txt run: pip install -r requirements.txt
- name: Install librelane - name: Install librelane
if: "${{ matrix.pdk != 'ihp-sg13g2' }}" if: "${{ matrix.pdk != 'ihp-sg13cmos5l' }}"
run: pip install librelane==${LIBRELANE_VERSION} run: pip install librelane==${LIBRELANE_VERSION}
# LibreLane 2.4.2 does not support ihp-sg13g2. Remove once 3.0.0 is released. # LibreLane 2.4.2 does not support ihp-sg13cmos5l. Remove once 3.0.0 is released.
- name: Install librelane 3 dev (IHP only) - name: Install librelane 3 dev (IHP only)
if: "${{ matrix.pdk == 'ihp-sg13g2' }}" if: "${{ matrix.pdk == 'ihp-sg13cmos5l' }}"
run: pip install librelane==${LIBRELANE_VERSION_DEV} run: pip install librelane==${LIBRELANE_VERSION_DEV}
- name: Clone the factory test - name: Clone the factory test
if: "${{ matrix.pdk != 'ihp-sg13g2' }}" if: "${{ matrix.pdk != 'ihp-sg13cmos5l' }}"
run: git clone https://github.com/tinytapeout/ttsky25a-factory-test ${PROJECT_DIR} run: git clone https://github.com/tinytapeout/ttsky25a-factory-test ${PROJECT_DIR}
- name: Clone the factory test (ihp-sg13g2) - name: Clone the factory test (ihp-sg13cmos5l)
if: "${{ matrix.pdk == 'ihp-sg13g2' }}" if: "${{ matrix.pdk == 'ihp-sg13cmos5l' }}"
run: git clone https://github.com/TinyTapeout/ttihp25b-factory-test ${PROJECT_DIR} run: git clone https://github.com/TinyTapeout/ttihp25b-factory-test ${PROJECT_DIR}
- name: Configure tt_tool.py args (IHP) - name: Configure tt_tool.py args (IHP)
if: "${{ matrix.pdk == 'ihp-sg13g2' }}" if: "${{ matrix.pdk == 'ihp-sg13cmos5l' }}"
run: echo "TT_TOOL_ARGS=--ihp" >> $GITHUB_ENV run: echo "TT_TOOL_ARGS=--ihp" >> $GITHUB_ENV
- name: Configure tt_tool.py args (gf180mcuD) - name: Configure tt_tool.py args (gf180mcuD)
+1 -1
View File
@@ -17,7 +17,7 @@ class DatasheetConfig(TypedDict):
"caravel", "caravel",
"openframe", "openframe",
"openframe_sky130", "openframe_sky130",
"customframe_ihp_sg13g2", "customframe_ihp_sg13cmos5l",
"customframe_gf180mcud", "customframe_gf180mcud",
] ]
theme_override_colour: str theme_override_colour: str
+3 -3
View File
@@ -434,8 +434,8 @@ class DocsHelper:
case "sky130A": case "sky130A":
content["pinout"] = "openframe_sky130" content["pinout"] = "openframe_sky130"
case "ihp-sg13g2": case "ihp-sg13cmos5l":
content["pinout"] = "customframe_ihp_sg13g2" content["pinout"] = "customframe_ihp_sg13cmos5l"
case "gf180mcuD": case "gf180mcuD":
content["pinout"] = "customframe_gf180mcud" content["pinout"] = "customframe_gf180mcud"
case _: case _:
@@ -451,7 +451,7 @@ class DocsHelper:
content["pinout"] = "openframe_sky130" content["pinout"] = "openframe_sky130"
elif shuttle_config["id"].startswith("ttihp"): elif shuttle_config["id"].startswith("ttihp"):
content["pinout"] = "customframe_ihp_sg13g2" content["pinout"] = "customframe_ihp_sg13cmos5l"
elif shuttle_config["id"].startswith("ttgf"): elif shuttle_config["id"].startswith("ttgf"):
content["pinout"] = "customframe_gf180mcud" content["pinout"] = "customframe_gf180mcud"
+1 -1
View File
@@ -227,7 +227,7 @@
] ]
} }
#let customframe_ihp_sg13g2 = { #let customframe_ihp_sg13cmos5l = {
align(center, align(center,
table( table(
columns: 4, columns: 4,
+1 -1
View File
@@ -483,7 +483,7 @@
caravel: (diagram: "chip_pinout_qfn64", table: pins.caravel), caravel: (diagram: "chip_pinout_qfn64", table: pins.caravel),
openframe: (diagram: "chip_pinout_qfn64", table: pins.openframe), openframe: (diagram: "chip_pinout_qfn64", table: pins.openframe),
openframe_sky130: (diagram: "chip_pinout_qfn64_sky130_openframe", table: pins.openframe_sky130), openframe_sky130: (diagram: "chip_pinout_qfn64_sky130_openframe", table: pins.openframe_sky130),
customframe_ihp_sg13g2: (diagram: "chip_pinout_qfn64_ihp_sg13g2", table: pins.customframe_ihp_sg13g2), customframe_ihp_sg13cmos5l: (diagram: "chip_pinout_qfn64_ihp_sg13cmos5l", table: pins.customframe_ihp_sg13cmos5l),
customframe_gf180mcud: (diagram: "chip_pinout_qfn64_gf180mcud", table: pins.customframe_gf180mcud) customframe_gf180mcud: (diagram: "chip_pinout_qfn64_gf180mcud", table: pins.customframe_gf180mcud)
) )
+1 -1
View File
@@ -119,7 +119,7 @@ if __name__ == "__main__":
"--pdk", "--pdk",
type=str, type=str,
default="sky130A", default="sky130A",
choices=["sky130A", "ihp-sg13g2", "gf180mcuD"], choices=["sky130A", "ihp-sg13cmos5l", "gf180mcuD"],
) )
parser.add_argument("--top", action="store_true") parser.add_argument("--top", action="store_true")
parser.add_argument("--bottom", action="store_true") parser.add_argument("--bottom", action="store_true")
+1 -1
View File
@@ -54,7 +54,7 @@ def parse_lyp_layers(lyp_file: str, only_valid: bool = True):
if " " in source: if " " in source:
assert source.count(" ") == 1 assert source.count(" ") == 1
# sky130A and sg13g2 has the name in the "name" field # sky130A and sg13cmos5l has the name in the "name" field
# gf180mcuD has the name as part of the "source" field # gf180mcuD has the name as part of the "source" field
# if a future PDK has it in both places, we'll trigger the # if a future PDK has it in both places, we'll trigger the
# assertion below to decide which one has priority # assertion below to decide which one has priority
+7 -7
View File
@@ -112,11 +112,11 @@ def klayout_zero_area(gds: str):
return klayout_drc(gds, "zero_area", "zeroarea.rb.drc") return klayout_drc(gds, "zero_area", "zeroarea.rb.drc")
def klayout_sg13g2(gds: str): def klayout_sg13cmos5l(gds: str):
return klayout_drc( return klayout_drc(
gds, gds,
"sg13g2", "sg13cmos5l",
f"{PDK_ROOT}/{PDK_NAME}/libs.tech/klayout/tech/drc/ihp-sg13g2.drc", f"{PDK_ROOT}/{PDK_NAME}/libs.tech/klayout/tech/drc/ihp-sg13cmos5l.drc",
) )
@@ -367,7 +367,7 @@ def main():
template_def = f"{def_root}/analog/tt_analog_{tiles}_3v3.def" template_def = f"{def_root}/analog/tt_analog_{tiles}_3v3.def"
else: else:
template_def = f"{def_root}/analog/tt_analog_{tiles}.def" template_def = f"{def_root}/analog/tt_analog_{tiles}.def"
elif tech == "ihp-sg13g2" or tech == "gf180mcuD": elif tech == "ihp-sg13cmos5l" or tech == "gf180mcuD":
template_def = f"{def_root}/tt_block_{tiles}_pgvdd.def" template_def = f"{def_root}/tt_block_{tiles}_pgvdd.def"
else: else:
template_def = f"{def_root}/tt_block_{tiles}_pg.def" template_def = f"{def_root}/tt_block_{tiles}_pg.def"
@@ -413,8 +413,8 @@ def main():
}, },
{ {
"name": "KLayout SG13G2 DRC", "name": "KLayout SG13G2 DRC",
"check": lambda: klayout_sg13g2(gds_file), "check": lambda: klayout_sg13cmos5l(gds_file),
"techs": ["ihp-sg13g2"], "techs": ["ihp-sg13cmos5l"],
}, },
{"name": "KLayout zero area", "check": lambda: klayout_zero_area(gds_file)}, {"name": "KLayout zero area", "check": lambda: klayout_zero_area(gds_file)},
{ {
@@ -445,7 +445,7 @@ def main():
"check": lambda: analog_pin_check( "check": lambda: analog_pin_check(
gds_file, tech, is_analog, uses_3v3, analog_pins, pinout gds_file, tech, is_analog, uses_3v3, analog_pins, pinout
), ),
"techs": ["sky130A", "ihp-sg13g2"], "techs": ["sky130A", "ihp-sg13cmos5l"],
}, },
] ]
+1 -1
View File
@@ -4,7 +4,7 @@ drc_offgrid.xml
drc_pin_label_purposes_overlapping_drawing.xml drc_pin_label_purposes_overlapping_drawing.xml
drc_zero_area.xml drc_zero_area.xml
drc_nwell_urpm.xml drc_nwell_urpm.xml
drc_sg13g2.xml drc_sg13cmos5l.xml
magic_drc.mag magic_drc.mag
magic_drc.txt magic_drc.txt
results.md results.md
+1 -1
View File
@@ -3,7 +3,7 @@ pin_label_purposes_overlapping_drawing.rb.drc from https://github.com/chipfoundr
zeroarea.rb.drc from https://github.com/chipfoundry/mpw_precheck revision 4fd5283b124e931c9e71219f47270075176f84e2 zeroarea.rb.drc from https://github.com/chipfoundry/mpw_precheck revision 4fd5283b124e931c9e71219f47270075176f84e2
nwell_urpm.drc from https://open-source-silicon.slack.com/archives/C05FW1VMY5A/p1729112262642699?thread_ts=1728921677.220509&cid=C05FW1VMY5A nwell_urpm.drc from https://open-source-silicon.slack.com/archives/C05FW1VMY5A/p1729112262642699?thread_ts=1728921677.220509&cid=C05FW1VMY5A
sg13g2_mr.lydrc: sg13cmos5l_mr.lydrc:
from https://github.com/IHP-GmbH/TO_Apr2025 revision 772a369f3ceabc2c6e1eba57d91ae755682c8323 from https://github.com/IHP-GmbH/TO_Apr2025 revision 772a369f3ceabc2c6e1eba57d91ae755682c8323
with the following minimum density rules disabled: with the following minimum density rules disabled:
- M1.j, M2.j, M3.j, M4.j, M5.j - M1.j, M2.j, M3.j, M4.j, M5.j
+21 -26
View File
@@ -1,4 +1,4 @@
tech_names = ["sky130A", "ihp-sg13g2", "gf180mcuD"] tech_names = ["sky130A", "ihp-sg13cmos5l", "gf180mcuD"]
# fmt: off # fmt: off
valid_layers_sky130A = [ valid_layers_sky130A = [
@@ -56,7 +56,7 @@ valid_layers_sky130A = [
(235, 0), (235, 250), (235, 252), (236, 0), (235, 0), (235, 250), (235, 252), (236, 0),
] ]
valid_layers_ihp_sg13g2 = [ valid_layers_ihp_sg13cmos5l = [
"Substrate.drawing", "Substrate.text", "Activ.drawing", "Activ.label", "Activ.nofill", "Activ.pin", "GatPoly.drawing", "Substrate.drawing", "Substrate.text", "Activ.drawing", "Activ.label", "Activ.nofill", "Activ.pin", "GatPoly.drawing",
"GatPoly.label", "GatPoly.nofill", "GatPoly.pin", "PolyRes.drawing", "PolyRes.label", "PolyRes.pin", "NWell.drawing", "GatPoly.label", "GatPoly.nofill", "GatPoly.pin", "PolyRes.drawing", "PolyRes.label", "PolyRes.pin", "NWell.drawing",
"NWell.label", "NWell.pin", "nBuLay.drawing", "nBuLay.label", "nBuLay.pin", "nBuLay.block", "PWell.block", "NWell.label", "NWell.pin", "nBuLay.drawing", "nBuLay.label", "nBuLay.pin", "nBuLay.block", "PWell.block",
@@ -65,17 +65,14 @@ valid_layers_ihp_sg13g2 = [
"Metal2.drawing", "Metal2.label", "Metal2.nofill", "Metal2.pin", "Metal2.slit", "Metal2.text", "Metal2.res", "Metal2.drawing", "Metal2.label", "Metal2.nofill", "Metal2.pin", "Metal2.slit", "Metal2.text", "Metal2.res",
"Via2.drawing", "Via2.net", "Via2.boundary", "Metal3.drawing", "Metal3.label", "Metal3.nofill", "Metal3.pin", "Via2.drawing", "Via2.net", "Via2.boundary", "Metal3.drawing", "Metal3.label", "Metal3.nofill", "Metal3.pin",
"Metal3.slit", "Metal3.text", "Metal3.res", "MIM.drawing", "Vmim.drawing", "Via3.drawing", "Metal4.drawing", "Metal3.slit", "Metal3.text", "Metal3.res", "MIM.drawing", "Vmim.drawing", "Via3.drawing", "Metal4.drawing",
"Metal4.label", "Metal4.nofill", "Metal4.pin", "Metal4.slit", "Metal4.text", "Metal4.res", "Via4.drawing", "Metal4.label", "Metal4.nofill", "Metal4.pin", "Metal4.slit", "Metal4.text", "Metal4.res", "TopMetal1.nofill",
"Metal5.drawing", "Metal5.label", "Metal5.nofill", "Metal5.pin", "Metal5.slit", "Metal5.text", "Metal5.res", "IND.drawing", "IND.pin", "IND.boundary", "IND.text", "TEXT.drawing", "Recog.drawing", "Recog.pin", "Recog.esd",
"TopVia1.drawing", "TopMetal1.drawing", "TopMetal1.label", "TopMetal1.nofill", "TopMetal1.pin", "TopMetal1.slit", "Recog.diode", "Recog.tsv", "Recog.pdiode", "Recog.mom", "DigiBnd.drawing", "DigiBnd.drawing0", "RES.drawing",
"TopMetal1.text", "TopMetal1.res", "TopMetal2.nofill", "IND.drawing", "IND.pin", "IND.boundary", "IND.text", "RES.label", "SRAM.drawing", "SRAM.label", "SRAM.boundary", "DigiSub.drawing", "HeatRes.drawing", "NoRCX.drawing",
"TEXT.drawing", "Recog.drawing", "Recog.pin", "Recog.esd", "Recog.diode", "Recog.tsv", "Recog.pdiode", "Recog.mom", "NoRCX.m2m3", "NoRCX.m2m4", "NoRCX.m2m5", "NoRCX.m2tm1", "NoRCX.m2tm2", "NoRCX.m3m4", "NoRCX.m3m5", "NoRCX.m3tm1",
"DigiBnd.drawing", "DigiBnd.drawing0", "RES.drawing", "RES.label", "SRAM.drawing", "SRAM.label", "SRAM.boundary", "NoRCX.m3tm2", "NoRCX.m4m5", "NoRCX.m4tm1", "NoRCX.m4tm2", "NoRCX.m5tm1", "NoRCX.m5tm2", "NoRCX.tm1tm2", "NoRCX.m1sub",
"DigiSub.drawing", "HeatRes.drawing", "NoRCX.drawing", "NoRCX.m2m3", "NoRCX.m2m4", "NoRCX.m2m5", "NoRCX.m2tm1", "NoRCX.m2sub", "NoRCX.m3sub", "NoRCX.m4sub", "NoRCX.m5sub", "NoRCX.tm1sub", "Varicap.drawing", "EXTBlock.drawing",
"NoRCX.m2tm2", "NoRCX.m3m4", "NoRCX.m3m5", "NoRCX.m3tm1", "NoRCX.m3tm2", "NoRCX.m4m5", "NoRCX.m4tm1", "NoRCX.m4tm2", "prBoundary.drawing", "prBoundary.label", "prBoundary.boundary", "isoNWell.drawing",
"NoRCX.m5tm1", "NoRCX.m5tm2", "NoRCX.tm1tm2", "NoRCX.m1sub", "NoRCX.m2sub", "NoRCX.m3sub", "NoRCX.m4sub", "NoRCX.m5sub",
"NoRCX.tm1sub", "Varicap.drawing", "EXTBlock.drawing", "prBoundary.drawing", "prBoundary.label", "prBoundary.boundary",
"isoNWell.drawing",
] ]
valid_layers_gf180mcuD = [ valid_layers_gf180mcuD = [
@@ -108,7 +105,7 @@ def analog_pin_rects(tech: str, uses_3v3: bool):
x2, y2 = x1 + 0.9, y1 + 1.0 x2, y2 = x1 + 0.9, y1 + 1.0
rect = ((x1, y1), (x2, y2)) rect = ((x1, y1), (x2, y2))
yield (rect, pin_layer, via_layers) yield (rect, pin_layer, via_layers)
elif tech == "ihp-sg13g2": elif tech == "ihp-sg13cmos5l":
pin_layer = (126, 0) # TopMetal1 pin_layer = (126, 0) # TopMetal1
via_layers = [(125, 0)] # TopVia1 via_layers = [(125, 0)] # TopVia1
for pin_number in range(8): for pin_number in range(8):
@@ -127,12 +124,12 @@ def analog_pin_rects(tech: str, uses_3v3: bool):
valid_layers = { valid_layers = {
"sky130A": valid_layers_sky130A, "sky130A": valid_layers_sky130A,
"ihp-sg13g2": valid_layers_ihp_sg13g2, "ihp-sg13cmos5l": valid_layers_ihp_sg13cmos5l,
"gf180mcuD": valid_layers_gf180mcuD, "gf180mcuD": valid_layers_gf180mcuD,
} }
lyp_filename = { lyp_filename = {
"sky130A": "sky130A.lyp", "sky130A": "sky130A.lyp",
"ihp-sg13g2": "sg13g2.lyp", "ihp-sg13cmos5l": "sg13cmos5l.lyp",
"gf180mcuD": "gf180mcu.lyp", "gf180mcuD": "gf180mcu.lyp",
} }
@@ -144,13 +141,11 @@ valid_lef_port_layers = {
"met3.pin": (70, 16), "met3.pin": (70, 16),
"met4.pin": (71, 16), "met4.pin": (71, 16),
}, },
"ihp-sg13g2": { "ihp-sg13cmos5l": {
"Metal1.pin": (8, 2), "Metal1.pin": (8, 2),
"Metal2.pin": (10, 2), "Metal2.pin": (10, 2),
"Metal3.pin": (30, 2), "Metal3.pin": (30, 2),
"Metal4.pin": (50, 2), "Metal4.pin": (50, 2),
"Metal5.pin": (67, 2),
"TopMetal1.pin": (126, 2),
}, },
} }
forbidden_layers = { forbidden_layers = {
@@ -159,10 +154,10 @@ forbidden_layers = {
"met5.pin", "met5.pin",
"met5.label", "met5.label",
], ],
"ihp-sg13g2": [ "ihp-sg13cmos5l": [
"TopMetal2.drawing", "TopMetal1.drawing",
"TopMetal2.pin", "TopMetal1.pin",
"TopMetal2.label", "TopMetal1.label",
], ],
"gf180mcuD": [ "gf180mcuD": [
"Metal5", "Metal5",
@@ -171,16 +166,16 @@ forbidden_layers = {
} }
power_pins_layer = { power_pins_layer = {
"sky130A": "met4", "sky130A": "met4",
"ihp-sg13g2": "TopMetal1", "ihp-sg13cmos5l": "Metal4",
"gf180mcuD": "Metal4", "gf180mcuD": "Metal4",
} }
power_pins_min_width = { power_pins_min_width = {
"sky130A": 1200, # 1.2 um "sky130A": 1200, # 1.2 um
"ihp-sg13g2": 2100, # 2.1 um "ihp-sg13cmos5l": 2100, # 2.1 um
"gf180mcuD": 1200, # 1.2 um "gf180mcuD": 1200, # 1.2 um
} }
boundary_layer = { boundary_layer = {
"sky130A": "prBoundary.boundary", "sky130A": "prBoundary.boundary",
"ihp-sg13g2": "prBoundary.boundary", "ihp-sg13cmos5l": "prBoundary.boundary",
"gf180mcuD": "PR_bndry", "gf180mcuD": "PR_bndry",
} }
+3 -3
View File
@@ -36,9 +36,9 @@
"RUN_KLAYOUT_DRC": false "RUN_KLAYOUT_DRC": false
}, },
"pdk::ihp-sg13g2": { "pdk::ihp-sg13cmos5l": {
"DIE_AREA": [0, 0, 202.08, 154.98], "DIE_AREA": [0, 0, 202.08, 154.98],
"FP_DEF_TEMPLATE": "ref::$DESIGN_DIR/../tech/ihp-sg13g2/def/tt_block_1x1_pgvdd.def", "FP_DEF_TEMPLATE": "ref::$DESIGN_DIR/../tech/ihp-sg13cmos5l/def/tt_block_1x1_pgvdd.def",
"RT_MAX_LAYER": "Metal5" "RT_MAX_LAYER": "Metal4"
} }
} }
+20 -20
View File
@@ -2,7 +2,7 @@ import json
import os import os
from typing import Dict, List, Literal, Pattern, Protocol, Tuple, TypedDict, Union from typing import Dict, List, Literal, Pattern, Protocol, Tuple, TypedDict, Union
TechName = Literal["sky130A", "ihp-sg13g2", "gf180mcuD", "fpgaUp5k"] TechName = Literal["sky130A", "ihp-sg13cmos5l", "gf180mcuD", "fpgaUp5k"]
class CellDefinition(TypedDict): class CellDefinition(TypedDict):
@@ -128,16 +128,16 @@ class Sky130Tech(Tech):
class IHPTech(Tech): class IHPTech(Tech):
is_fpga = False is_fpga = False
def_suffix = "pgvdd" def_suffix = "pgvdd"
librelane_pdk_args = "--pdk ihp-sg13g2" librelane_pdk_args = "--pdk ihp-sg13cmos5l --manual-pdk"
tt_corner = "nom_typ_1p20V_25C" tt_corner = "nom_typ_1p20V_25C"
cell_regexp = r"^\s*sg13g2_(?P<cell_name>\S+)_(?P<cell_drive>\d+)" cell_regexp = r"^\s*sg13cmos5l_(?P<cell_name>\S+)_(?P<cell_drive>\d+)"
netlist_type = "nl" netlist_type = "nl"
project_top_metal_layer = "TopMetal1" project_top_metal_layer = "Metal4"
librelane_config = {} librelane_config = {}
label_layers = [ label_layers = [
(8, 1), # Metal1.label (8, 1), # Metal1.label
(8, 25), # Metal1.text (8, 25), # Metal1.text
(67, 25), # Metal5.text (50, 25), # Metal4.text
(126, 25), # TopMetal1.text (126, 25), # TopMetal1.text
] ]
buried_layers = [ buried_layers = [
@@ -147,32 +147,32 @@ class IHPTech(Tech):
(51, 0), # HeatTrans.drawing (51, 0), # HeatTrans.drawing
(189, 4), # prBoundary.boundary (189, 4), # prBoundary.boundary
] ]
scramble_cells = "sg13g2_" scramble_cells = "sg13cmos5l_"
mux_config_yaml_name = "ihp-sg13g2.yaml" mux_config_yaml_name = "ihp-sg13cmos5l.yaml"
mux_macros = [ mux_macros = [
"pg/ihp-sg13g2/tt_pg_1v5_hp_1", "pg/ihp-sg13cmos5l/tt_pg_1v5_hp_1",
"pg/ihp-sg13g2/tt_pg_1v5_hp_2", "pg/ihp-sg13cmos5l/tt_pg_1v5_hp_2",
"pg/ihp-sg13g2/tt_pg_1v5_hp_4", "pg/ihp-sg13cmos5l/tt_pg_1v5_hp_4",
"pg/ihp-sg13g2/tt_pg_1v5_ll_1", "pg/ihp-sg13cmos5l/tt_pg_1v5_ll_1",
"pg/ihp-sg13g2/tt_pg_1v5_ll_2", "pg/ihp-sg13cmos5l/tt_pg_1v5_ll_2",
"pg/ihp-sg13g2/tt_pg_1v5_ll_4", "pg/ihp-sg13cmos5l/tt_pg_1v5_ll_4",
] ]
extra_logo_macros = [ extra_logo_macros = [
"tech/ihp-sg13g2/tt_logo_corner", "tech/ihp-sg13cmos5l/tt_logo_corner",
] ]
prboundary_layer = (189, 4) # prBoundary.boundary prboundary_layer = (189, 4) # prBoundary.boundary
logo_layer = (67, 0) # Metal5.drawing logo_layer = (50, 0) # Metal4.drawing
logo_layer_name = "Metal5" logo_layer_name = "Metal4"
logo_pixel_size = 0.25 # um logo_pixel_size = 0.25 # um
def read_pdk_version(self, pdk_root: str) -> PDKVersionInfo: def read_pdk_version(self, pdk_root: str) -> PDKVersionInfo:
pdk_sources_file = os.path.join(pdk_root, "ihp-sg13g2", "SOURCES") pdk_sources_file = os.path.join(pdk_root, "ihp-sg13cmos5l", "SOURCES")
return parse_openpdks_pdk_version(pdk_sources_file, "IHP-Open-PDK") return parse_openpdks_pdk_version(pdk_sources_file, "IHP-Open-PDK")
def load_cell_definitions(self) -> Dict[str, CellDefinition]: def load_cell_definitions(self) -> Dict[str, CellDefinition]:
URL_FORMAT = "https://raw.githubusercontent.com/IHP-GmbH/IHP-Open-PDK/refs/heads/main/ihp-sg13g2/libs.ref/sg13g2_stdcell/doc/sg13g2_stdcell_typ_1p20V_25C.pdf#{ref}" URL_FORMAT = "https://raw.githubusercontent.com/IHP-GmbH/IHP-Open-PDK/refs/heads/main/ihp-sg13cmos5l/libs.ref/sg13cmos5l_stdcell/doc/sg13cmos5l_stdcell_typ_1p20V_25C.pdf#{ref}"
script_dir = os.path.dirname(os.path.realpath(__file__)) script_dir = os.path.dirname(os.path.realpath(__file__))
with open(os.path.join(script_dir, "tech/ihp-sg13g2/cells.json")) as fh: with open(os.path.join(script_dir, "tech/ihp-sg13cmos5l/cells.json")) as fh:
cells = json.load(fh) cells = json.load(fh)
for cell in cells.values(): for cell in cells.values():
cell["url"] = URL_FORMAT.format(ref=cell["doc_ref"]) cell["url"] = URL_FORMAT.format(ref=cell["doc_ref"])
@@ -277,7 +277,7 @@ class FpgaTech(Tech):
tech_map: dict[TechName, Tech] = { tech_map: dict[TechName, Tech] = {
"ihp-sg13g2": IHPTech(), "ihp-sg13cmos5l": IHPTech(),
"gf180mcuD": GF180MCUDTech(), "gf180mcuD": GF180MCUDTech(),
"sky130A": Sky130Tech(), "sky130A": Sky130Tech(),
"fpgaUp5k": FpgaTech(), "fpgaUp5k": FpgaTech(),
@@ -4,7 +4,7 @@
# Description: This script initializes a new Magic project for an analog design on Tiny Tapeout. # Description: This script initializes a new Magic project for an analog design on Tiny Tapeout.
# Important: before running this script, download the the .def file from # Important: before running this script, download the the .def file from
# https://raw.githubusercontent.com/TinyTapeout/tt-support-tools/main/tech/ihp-sg13g2/def/analog/tt_analog_1x2.def # https://raw.githubusercontent.com/TinyTapeout/tt-support-tools/main/tech/ihp-sg13cmos5l/def/analog/tt_analog_1x2.def
# Change the settings below to match your design: # Change the settings below to match your design:
# ------------------------------------------------ # ------------------------------------------------
@@ -93,12 +93,8 @@ TRACKS X 480 DO 420 STEP 480 LAYER Metal3 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ; TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ;
TRACKS X 480 DO 420 STEP 480 LAYER Metal4 ; TRACKS X 480 DO 420 STEP 480 LAYER Metal4 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal4 ; TRACKS Y 420 DO 746 STEP 420 LAYER Metal4 ;
TRACKS X 480 DO 420 STEP 480 LAYER Metal5 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal5 ;
TRACKS X 1640 DO 88 STEP 2280 LAYER TopMetal1 ; TRACKS X 1640 DO 88 STEP 2280 LAYER TopMetal1 ;
TRACKS Y 1640 DO 137 STEP 2280 LAYER TopMetal1 ; TRACKS Y 1640 DO 137 STEP 2280 LAYER TopMetal1 ;
TRACKS X 2000 DO 50 STEP 4000 LAYER TopMetal2 ;
TRACKS Y 2000 DO 78 STEP 4000 LAYER TopMetal2 ;
COMPONENTS 0 ; COMPONENTS 0 ;
END COMPONENTS END COMPONENTS
PINS 51 ; PINS 51 ;
@@ -93,12 +93,8 @@ TRACKS X 480 DO 873 STEP 480 LAYER Metal3 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ; TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ;
TRACKS X 480 DO 873 STEP 480 LAYER Metal4 ; TRACKS X 480 DO 873 STEP 480 LAYER Metal4 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal4 ; TRACKS Y 420 DO 746 STEP 420 LAYER Metal4 ;
TRACKS X 480 DO 873 STEP 480 LAYER Metal5 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal5 ;
TRACKS X 1640 DO 183 STEP 2280 LAYER TopMetal1 ; TRACKS X 1640 DO 183 STEP 2280 LAYER TopMetal1 ;
TRACKS Y 1640 DO 137 STEP 2280 LAYER TopMetal1 ; TRACKS Y 1640 DO 137 STEP 2280 LAYER TopMetal1 ;
TRACKS X 2000 DO 105 STEP 4000 LAYER TopMetal2 ;
TRACKS Y 2000 DO 78 STEP 4000 LAYER TopMetal2 ;
COMPONENTS 0 ; COMPONENTS 0 ;
END COMPONENTS END COMPONENTS
PINS 51 ; PINS 51 ;
@@ -51,12 +51,8 @@ TRACKS X 480 DO 420 STEP 480 LAYER Metal3 ;
TRACKS Y 420 DO 368 STEP 420 LAYER Metal3 ; TRACKS Y 420 DO 368 STEP 420 LAYER Metal3 ;
TRACKS X 480 DO 420 STEP 480 LAYER Metal4 ; TRACKS X 480 DO 420 STEP 480 LAYER Metal4 ;
TRACKS Y 420 DO 368 STEP 420 LAYER Metal4 ; TRACKS Y 420 DO 368 STEP 420 LAYER Metal4 ;
TRACKS X 480 DO 420 STEP 480 LAYER Metal5 ;
TRACKS Y 420 DO 368 STEP 420 LAYER Metal5 ;
TRACKS X 1640 DO 88 STEP 2280 LAYER TopMetal1 ; TRACKS X 1640 DO 88 STEP 2280 LAYER TopMetal1 ;
TRACKS Y 1640 DO 67 STEP 2280 LAYER TopMetal1 ; TRACKS Y 1640 DO 67 STEP 2280 LAYER TopMetal1 ;
TRACKS X 2000 DO 50 STEP 4000 LAYER TopMetal2 ;
TRACKS Y 2000 DO 38 STEP 4000 LAYER TopMetal2 ;
COMPONENTS 0 ; COMPONENTS 0 ;
END COMPONENTS END COMPONENTS
PINS 43 ; PINS 43 ;
@@ -93,12 +93,8 @@ TRACKS X 480 DO 420 STEP 480 LAYER Metal3 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ; TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ;
TRACKS X 480 DO 420 STEP 480 LAYER Metal4 ; TRACKS X 480 DO 420 STEP 480 LAYER Metal4 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal4 ; TRACKS Y 420 DO 746 STEP 420 LAYER Metal4 ;
TRACKS X 480 DO 420 STEP 480 LAYER Metal5 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal5 ;
TRACKS X 1640 DO 88 STEP 2280 LAYER TopMetal1 ; TRACKS X 1640 DO 88 STEP 2280 LAYER TopMetal1 ;
TRACKS Y 1640 DO 137 STEP 2280 LAYER TopMetal1 ; TRACKS Y 1640 DO 137 STEP 2280 LAYER TopMetal1 ;
TRACKS X 2000 DO 50 STEP 4000 LAYER TopMetal2 ;
TRACKS Y 2000 DO 78 STEP 4000 LAYER TopMetal2 ;
COMPONENTS 0 ; COMPONENTS 0 ;
END COMPONENTS END COMPONENTS
PINS 43 ; PINS 43 ;
@@ -93,12 +93,8 @@ TRACKS X 480 DO 873 STEP 480 LAYER Metal3 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ; TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ;
TRACKS X 480 DO 873 STEP 480 LAYER Metal4 ; TRACKS X 480 DO 873 STEP 480 LAYER Metal4 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal4 ; TRACKS Y 420 DO 746 STEP 420 LAYER Metal4 ;
TRACKS X 480 DO 873 STEP 480 LAYER Metal5 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal5 ;
TRACKS X 1640 DO 183 STEP 2280 LAYER TopMetal1 ; TRACKS X 1640 DO 183 STEP 2280 LAYER TopMetal1 ;
TRACKS Y 1640 DO 137 STEP 2280 LAYER TopMetal1 ; TRACKS Y 1640 DO 137 STEP 2280 LAYER TopMetal1 ;
TRACKS X 2000 DO 105 STEP 4000 LAYER TopMetal2 ;
TRACKS Y 2000 DO 78 STEP 4000 LAYER TopMetal2 ;
COMPONENTS 0 ; COMPONENTS 0 ;
END COMPONENTS END COMPONENTS
PINS 43 ; PINS 43 ;
@@ -93,12 +93,8 @@ TRACKS X 480 DO 1326 STEP 480 LAYER Metal3 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ; TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ;
TRACKS X 480 DO 1326 STEP 480 LAYER Metal4 ; TRACKS X 480 DO 1326 STEP 480 LAYER Metal4 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal4 ; TRACKS Y 420 DO 746 STEP 420 LAYER Metal4 ;
TRACKS X 480 DO 1326 STEP 480 LAYER Metal5 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal5 ;
TRACKS X 1640 DO 279 STEP 2280 LAYER TopMetal1 ; TRACKS X 1640 DO 279 STEP 2280 LAYER TopMetal1 ;
TRACKS Y 1640 DO 137 STEP 2280 LAYER TopMetal1 ; TRACKS Y 1640 DO 137 STEP 2280 LAYER TopMetal1 ;
TRACKS X 2000 DO 159 STEP 4000 LAYER TopMetal2 ;
TRACKS Y 2000 DO 78 STEP 4000 LAYER TopMetal2 ;
COMPONENTS 0 ; COMPONENTS 0 ;
END COMPONENTS END COMPONENTS
PINS 43 ; PINS 43 ;
@@ -198,12 +198,8 @@ TRACKS X 480 DO 1326 STEP 480 LAYER Metal3 ;
TRACKS Y 420 DO 1691 STEP 420 LAYER Metal3 ; TRACKS Y 420 DO 1691 STEP 420 LAYER Metal3 ;
TRACKS X 480 DO 1326 STEP 480 LAYER Metal4 ; TRACKS X 480 DO 1326 STEP 480 LAYER Metal4 ;
TRACKS Y 420 DO 1691 STEP 420 LAYER Metal4 ; TRACKS Y 420 DO 1691 STEP 420 LAYER Metal4 ;
TRACKS X 480 DO 1326 STEP 480 LAYER Metal5 ;
TRACKS Y 420 DO 1691 STEP 420 LAYER Metal5 ;
TRACKS X 1640 DO 279 STEP 2280 LAYER TopMetal1 ; TRACKS X 1640 DO 279 STEP 2280 LAYER TopMetal1 ;
TRACKS Y 1640 DO 311 STEP 2280 LAYER TopMetal1 ; TRACKS Y 1640 DO 311 STEP 2280 LAYER TopMetal1 ;
TRACKS X 2000 DO 159 STEP 4000 LAYER TopMetal2 ;
TRACKS Y 2000 DO 177 STEP 4000 LAYER TopMetal2 ;
COMPONENTS 0 ; COMPONENTS 0 ;
END COMPONENTS END COMPONENTS
PINS 43 ; PINS 43 ;
@@ -93,12 +93,8 @@ TRACKS X 480 DO 1779 STEP 480 LAYER Metal3 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ; TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ;
TRACKS X 480 DO 1779 STEP 480 LAYER Metal4 ; TRACKS X 480 DO 1779 STEP 480 LAYER Metal4 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal4 ; TRACKS Y 420 DO 746 STEP 420 LAYER Metal4 ;
TRACKS X 480 DO 1779 STEP 480 LAYER Metal5 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal5 ;
TRACKS X 1640 DO 374 STEP 2280 LAYER TopMetal1 ; TRACKS X 1640 DO 374 STEP 2280 LAYER TopMetal1 ;
TRACKS Y 1640 DO 137 STEP 2280 LAYER TopMetal1 ; TRACKS Y 1640 DO 137 STEP 2280 LAYER TopMetal1 ;
TRACKS X 2000 DO 213 STEP 4000 LAYER TopMetal2 ;
TRACKS Y 2000 DO 78 STEP 4000 LAYER TopMetal2 ;
COMPONENTS 0 ; COMPONENTS 0 ;
END COMPONENTS END COMPONENTS
PINS 43 ; PINS 43 ;
@@ -198,12 +198,8 @@ TRACKS X 480 DO 1779 STEP 480 LAYER Metal3 ;
TRACKS Y 420 DO 1691 STEP 420 LAYER Metal3 ; TRACKS Y 420 DO 1691 STEP 420 LAYER Metal3 ;
TRACKS X 480 DO 1779 STEP 480 LAYER Metal4 ; TRACKS X 480 DO 1779 STEP 480 LAYER Metal4 ;
TRACKS Y 420 DO 1691 STEP 420 LAYER Metal4 ; TRACKS Y 420 DO 1691 STEP 420 LAYER Metal4 ;
TRACKS X 480 DO 1779 STEP 480 LAYER Metal5 ;
TRACKS Y 420 DO 1691 STEP 420 LAYER Metal5 ;
TRACKS X 1640 DO 374 STEP 2280 LAYER TopMetal1 ; TRACKS X 1640 DO 374 STEP 2280 LAYER TopMetal1 ;
TRACKS Y 1640 DO 311 STEP 2280 LAYER TopMetal1 ; TRACKS Y 1640 DO 311 STEP 2280 LAYER TopMetal1 ;
TRACKS X 2000 DO 213 STEP 4000 LAYER TopMetal2 ;
TRACKS Y 2000 DO 177 STEP 4000 LAYER TopMetal2 ;
COMPONENTS 0 ; COMPONENTS 0 ;
END COMPONENTS END COMPONENTS
PINS 43 ; PINS 43 ;
@@ -198,12 +198,8 @@ TRACKS X 480 DO 2232 STEP 480 LAYER Metal3 ;
TRACKS Y 420 DO 1691 STEP 420 LAYER Metal3 ; TRACKS Y 420 DO 1691 STEP 420 LAYER Metal3 ;
TRACKS X 480 DO 2232 STEP 480 LAYER Metal4 ; TRACKS X 480 DO 2232 STEP 480 LAYER Metal4 ;
TRACKS Y 420 DO 1691 STEP 420 LAYER Metal4 ; TRACKS Y 420 DO 1691 STEP 420 LAYER Metal4 ;
TRACKS X 480 DO 2232 STEP 480 LAYER Metal5 ;
TRACKS Y 420 DO 1691 STEP 420 LAYER Metal5 ;
TRACKS X 1640 DO 470 STEP 2280 LAYER TopMetal1 ; TRACKS X 1640 DO 470 STEP 2280 LAYER TopMetal1 ;
TRACKS Y 1640 DO 311 STEP 2280 LAYER TopMetal1 ; TRACKS Y 1640 DO 311 STEP 2280 LAYER TopMetal1 ;
TRACKS X 2000 DO 268 STEP 4000 LAYER TopMetal2 ;
TRACKS Y 2000 DO 177 STEP 4000 LAYER TopMetal2 ;
COMPONENTS 0 ; COMPONENTS 0 ;
END COMPONENTS END COMPONENTS
PINS 43 ; PINS 43 ;
@@ -93,12 +93,8 @@ TRACKS X 480 DO 2685 STEP 480 LAYER Metal3 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ; TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ;
TRACKS X 480 DO 2685 STEP 480 LAYER Metal4 ; TRACKS X 480 DO 2685 STEP 480 LAYER Metal4 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal4 ; TRACKS Y 420 DO 746 STEP 420 LAYER Metal4 ;
TRACKS X 480 DO 2685 STEP 480 LAYER Metal5 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal5 ;
TRACKS X 1640 DO 565 STEP 2280 LAYER TopMetal1 ; TRACKS X 1640 DO 565 STEP 2280 LAYER TopMetal1 ;
TRACKS Y 1640 DO 137 STEP 2280 LAYER TopMetal1 ; TRACKS Y 1640 DO 137 STEP 2280 LAYER TopMetal1 ;
TRACKS X 2000 DO 322 STEP 4000 LAYER TopMetal2 ;
TRACKS Y 2000 DO 78 STEP 4000 LAYER TopMetal2 ;
COMPONENTS 0 ; COMPONENTS 0 ;
END COMPONENTS END COMPONENTS
PINS 43 ; PINS 43 ;
@@ -198,12 +198,8 @@ TRACKS X 480 DO 2685 STEP 480 LAYER Metal3 ;
TRACKS Y 420 DO 1691 STEP 420 LAYER Metal3 ; TRACKS Y 420 DO 1691 STEP 420 LAYER Metal3 ;
TRACKS X 480 DO 2685 STEP 480 LAYER Metal4 ; TRACKS X 480 DO 2685 STEP 480 LAYER Metal4 ;
TRACKS Y 420 DO 1691 STEP 420 LAYER Metal4 ; TRACKS Y 420 DO 1691 STEP 420 LAYER Metal4 ;
TRACKS X 480 DO 2685 STEP 480 LAYER Metal5 ;
TRACKS Y 420 DO 1691 STEP 420 LAYER Metal5 ;
TRACKS X 1640 DO 565 STEP 2280 LAYER TopMetal1 ; TRACKS X 1640 DO 565 STEP 2280 LAYER TopMetal1 ;
TRACKS Y 1640 DO 311 STEP 2280 LAYER TopMetal1 ; TRACKS Y 1640 DO 311 STEP 2280 LAYER TopMetal1 ;
TRACKS X 2000 DO 322 STEP 4000 LAYER TopMetal2 ;
TRACKS Y 2000 DO 177 STEP 4000 LAYER TopMetal2 ;
COMPONENTS 0 ; COMPONENTS 0 ;
END COMPONENTS END COMPONENTS
PINS 43 ; PINS 43 ;
@@ -93,12 +93,8 @@ TRACKS X 480 DO 3591 STEP 480 LAYER Metal3 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ; TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ;
TRACKS X 480 DO 3591 STEP 480 LAYER Metal4 ; TRACKS X 480 DO 3591 STEP 480 LAYER Metal4 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal4 ; TRACKS Y 420 DO 746 STEP 420 LAYER Metal4 ;
TRACKS X 480 DO 3591 STEP 480 LAYER Metal5 ;
TRACKS Y 420 DO 746 STEP 420 LAYER Metal5 ;
TRACKS X 1640 DO 756 STEP 2280 LAYER TopMetal1 ; TRACKS X 1640 DO 756 STEP 2280 LAYER TopMetal1 ;
TRACKS Y 1640 DO 137 STEP 2280 LAYER TopMetal1 ; TRACKS Y 1640 DO 137 STEP 2280 LAYER TopMetal1 ;
TRACKS X 2000 DO 431 STEP 4000 LAYER TopMetal2 ;
TRACKS Y 2000 DO 78 STEP 4000 LAYER TopMetal2 ;
COMPONENTS 0 ; COMPONENTS 0 ;
END COMPONENTS END COMPONENTS
PINS 43 ; PINS 43 ;
Binary file not shown.
@@ -8,7 +8,7 @@ MACRO tt_logo_corner
ORIGIN 0.000 0.000 ; ORIGIN 0.000 0.000 ;
SIZE 100.000 BY 100.000 ; SIZE 100.000 BY 100.000 ;
OBS OBS
LAYER TopMetal2 ; LAYER TopMetal1 ;
RECT 45.000 99.500 55.000 100.000 ; RECT 45.000 99.500 55.000 100.000 ;
RECT 41.500 99.000 58.500 99.500 ; RECT 41.500 99.000 58.500 99.500 ;
RECT 39.000 98.500 61.000 99.000 ; RECT 39.000 98.500 61.000 99.000 ;
Binary file not shown.
+3 -1
View File
@@ -147,7 +147,9 @@ if __name__ == "__main__":
setup_logging(args.loglevel) setup_logging(args.loglevel)
pdk: TechName = "ihp-sg13g2" if args.ihp else "gf180mcuD" if args.gf else "sky130A" pdk: TechName = (
"ihp-sg13cmos5l" if args.ihp else "gf180mcuD" if args.gf else "sky130A"
)
if args.check_docs: if args.check_docs:
check_project_docs(args.project_dir, pdk) check_project_docs(args.project_dir, pdk)