mirror of
https://github.com/TinyTapeout/tt-support-tools.git
synced 2026-11-03 04:36:09 +01:00
feat!: replace ihp-sg13g2 with ihp-sg13cmos5l
This commit is contained in:
@@ -10,7 +10,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
pdk: [sky130A, ihp-sg13g2, gf180mcuD]
|
||||
pdk: [sky130A, ihp-sg13cmos5l, gf180mcuD]
|
||||
|
||||
runs-on: ubuntu-24.04
|
||||
|
||||
@@ -35,24 +35,24 @@ jobs:
|
||||
run: pip install -r requirements.txt
|
||||
|
||||
- name: Install librelane
|
||||
if: "${{ matrix.pdk != 'ihp-sg13g2' }}"
|
||||
if: "${{ matrix.pdk != 'ihp-sg13cmos5l' }}"
|
||||
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)
|
||||
if: "${{ matrix.pdk == 'ihp-sg13g2' }}"
|
||||
if: "${{ matrix.pdk == 'ihp-sg13cmos5l' }}"
|
||||
run: pip install librelane==${LIBRELANE_VERSION_DEV}
|
||||
|
||||
- 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}
|
||||
|
||||
- name: Clone the factory test (ihp-sg13g2)
|
||||
if: "${{ matrix.pdk == 'ihp-sg13g2' }}"
|
||||
- name: Clone the factory test (ihp-sg13cmos5l)
|
||||
if: "${{ matrix.pdk == 'ihp-sg13cmos5l' }}"
|
||||
run: git clone https://github.com/TinyTapeout/ttihp25b-factory-test ${PROJECT_DIR}
|
||||
|
||||
- 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
|
||||
|
||||
- name: Configure tt_tool.py args (gf180mcuD)
|
||||
|
||||
@@ -17,7 +17,7 @@ class DatasheetConfig(TypedDict):
|
||||
"caravel",
|
||||
"openframe",
|
||||
"openframe_sky130",
|
||||
"customframe_ihp_sg13g2",
|
||||
"customframe_ihp_sg13cmos5l",
|
||||
"customframe_gf180mcud",
|
||||
]
|
||||
theme_override_colour: str
|
||||
|
||||
+3
-3
@@ -434,8 +434,8 @@ class DocsHelper:
|
||||
|
||||
case "sky130A":
|
||||
content["pinout"] = "openframe_sky130"
|
||||
case "ihp-sg13g2":
|
||||
content["pinout"] = "customframe_ihp_sg13g2"
|
||||
case "ihp-sg13cmos5l":
|
||||
content["pinout"] = "customframe_ihp_sg13cmos5l"
|
||||
case "gf180mcuD":
|
||||
content["pinout"] = "customframe_gf180mcud"
|
||||
case _:
|
||||
@@ -451,7 +451,7 @@ class DocsHelper:
|
||||
content["pinout"] = "openframe_sky130"
|
||||
|
||||
elif shuttle_config["id"].startswith("ttihp"):
|
||||
content["pinout"] = "customframe_ihp_sg13g2"
|
||||
content["pinout"] = "customframe_ihp_sg13cmos5l"
|
||||
|
||||
elif shuttle_config["id"].startswith("ttgf"):
|
||||
content["pinout"] = "customframe_gf180mcud"
|
||||
|
||||
@@ -227,7 +227,7 @@
|
||||
]
|
||||
}
|
||||
|
||||
#let customframe_ihp_sg13g2 = {
|
||||
#let customframe_ihp_sg13cmos5l = {
|
||||
align(center,
|
||||
table(
|
||||
columns: 4,
|
||||
|
||||
@@ -483,7 +483,7 @@
|
||||
caravel: (diagram: "chip_pinout_qfn64", table: pins.caravel),
|
||||
openframe: (diagram: "chip_pinout_qfn64", table: pins.openframe),
|
||||
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)
|
||||
)
|
||||
|
||||
|
||||
@@ -119,7 +119,7 @@ if __name__ == "__main__":
|
||||
"--pdk",
|
||||
type=str,
|
||||
default="sky130A",
|
||||
choices=["sky130A", "ihp-sg13g2", "gf180mcuD"],
|
||||
choices=["sky130A", "ihp-sg13cmos5l", "gf180mcuD"],
|
||||
)
|
||||
parser.add_argument("--top", action="store_true")
|
||||
parser.add_argument("--bottom", action="store_true")
|
||||
|
||||
@@ -54,7 +54,7 @@ def parse_lyp_layers(lyp_file: str, only_valid: bool = True):
|
||||
|
||||
if " " in source:
|
||||
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
|
||||
# if a future PDK has it in both places, we'll trigger the
|
||||
# assertion below to decide which one has priority
|
||||
|
||||
@@ -112,11 +112,11 @@ def klayout_zero_area(gds: str):
|
||||
return klayout_drc(gds, "zero_area", "zeroarea.rb.drc")
|
||||
|
||||
|
||||
def klayout_sg13g2(gds: str):
|
||||
def klayout_sg13cmos5l(gds: str):
|
||||
return klayout_drc(
|
||||
gds,
|
||||
"sg13g2",
|
||||
f"{PDK_ROOT}/{PDK_NAME}/libs.tech/klayout/tech/drc/ihp-sg13g2.drc",
|
||||
"sg13cmos5l",
|
||||
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"
|
||||
else:
|
||||
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"
|
||||
else:
|
||||
template_def = f"{def_root}/tt_block_{tiles}_pg.def"
|
||||
@@ -413,8 +413,8 @@ def main():
|
||||
},
|
||||
{
|
||||
"name": "KLayout SG13G2 DRC",
|
||||
"check": lambda: klayout_sg13g2(gds_file),
|
||||
"techs": ["ihp-sg13g2"],
|
||||
"check": lambda: klayout_sg13cmos5l(gds_file),
|
||||
"techs": ["ihp-sg13cmos5l"],
|
||||
},
|
||||
{"name": "KLayout zero area", "check": lambda: klayout_zero_area(gds_file)},
|
||||
{
|
||||
@@ -445,7 +445,7 @@ def main():
|
||||
"check": lambda: analog_pin_check(
|
||||
gds_file, tech, is_analog, uses_3v3, analog_pins, pinout
|
||||
),
|
||||
"techs": ["sky130A", "ihp-sg13g2"],
|
||||
"techs": ["sky130A", "ihp-sg13cmos5l"],
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ drc_offgrid.xml
|
||||
drc_pin_label_purposes_overlapping_drawing.xml
|
||||
drc_zero_area.xml
|
||||
drc_nwell_urpm.xml
|
||||
drc_sg13g2.xml
|
||||
drc_sg13cmos5l.xml
|
||||
magic_drc.mag
|
||||
magic_drc.txt
|
||||
results.md
|
||||
|
||||
@@ -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
|
||||
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
|
||||
with the following minimum density rules disabled:
|
||||
- M1.j, M2.j, M3.j, M4.j, M5.j
|
||||
|
||||
+21
-26
@@ -1,4 +1,4 @@
|
||||
tech_names = ["sky130A", "ihp-sg13g2", "gf180mcuD"]
|
||||
tech_names = ["sky130A", "ihp-sg13cmos5l", "gf180mcuD"]
|
||||
|
||||
# fmt: off
|
||||
valid_layers_sky130A = [
|
||||
@@ -56,7 +56,7 @@ valid_layers_sky130A = [
|
||||
(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",
|
||||
"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",
|
||||
@@ -65,17 +65,14 @@ valid_layers_ihp_sg13g2 = [
|
||||
"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",
|
||||
"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",
|
||||
"Metal5.drawing", "Metal5.label", "Metal5.nofill", "Metal5.pin", "Metal5.slit", "Metal5.text", "Metal5.res",
|
||||
"TopVia1.drawing", "TopMetal1.drawing", "TopMetal1.label", "TopMetal1.nofill", "TopMetal1.pin", "TopMetal1.slit",
|
||||
"TopMetal1.text", "TopMetal1.res", "TopMetal2.nofill", "IND.drawing", "IND.pin", "IND.boundary", "IND.text",
|
||||
"TEXT.drawing", "Recog.drawing", "Recog.pin", "Recog.esd", "Recog.diode", "Recog.tsv", "Recog.pdiode", "Recog.mom",
|
||||
"DigiBnd.drawing", "DigiBnd.drawing0", "RES.drawing", "RES.label", "SRAM.drawing", "SRAM.label", "SRAM.boundary",
|
||||
"DigiSub.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", "Varicap.drawing", "EXTBlock.drawing", "prBoundary.drawing", "prBoundary.label", "prBoundary.boundary",
|
||||
"isoNWell.drawing",
|
||||
"Metal4.label", "Metal4.nofill", "Metal4.pin", "Metal4.slit", "Metal4.text", "Metal4.res", "TopMetal1.nofill",
|
||||
"IND.drawing", "IND.pin", "IND.boundary", "IND.text", "TEXT.drawing", "Recog.drawing", "Recog.pin", "Recog.esd",
|
||||
"Recog.diode", "Recog.tsv", "Recog.pdiode", "Recog.mom", "DigiBnd.drawing", "DigiBnd.drawing0", "RES.drawing",
|
||||
"RES.label", "SRAM.drawing", "SRAM.label", "SRAM.boundary", "DigiSub.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", "Varicap.drawing", "EXTBlock.drawing",
|
||||
"prBoundary.drawing", "prBoundary.label", "prBoundary.boundary", "isoNWell.drawing",
|
||||
]
|
||||
|
||||
valid_layers_gf180mcuD = [
|
||||
@@ -108,7 +105,7 @@ def analog_pin_rects(tech: str, uses_3v3: bool):
|
||||
x2, y2 = x1 + 0.9, y1 + 1.0
|
||||
rect = ((x1, y1), (x2, y2))
|
||||
yield (rect, pin_layer, via_layers)
|
||||
elif tech == "ihp-sg13g2":
|
||||
elif tech == "ihp-sg13cmos5l":
|
||||
pin_layer = (126, 0) # TopMetal1
|
||||
via_layers = [(125, 0)] # TopVia1
|
||||
for pin_number in range(8):
|
||||
@@ -127,12 +124,12 @@ def analog_pin_rects(tech: str, uses_3v3: bool):
|
||||
|
||||
valid_layers = {
|
||||
"sky130A": valid_layers_sky130A,
|
||||
"ihp-sg13g2": valid_layers_ihp_sg13g2,
|
||||
"ihp-sg13cmos5l": valid_layers_ihp_sg13cmos5l,
|
||||
"gf180mcuD": valid_layers_gf180mcuD,
|
||||
}
|
||||
lyp_filename = {
|
||||
"sky130A": "sky130A.lyp",
|
||||
"ihp-sg13g2": "sg13g2.lyp",
|
||||
"ihp-sg13cmos5l": "sg13cmos5l.lyp",
|
||||
"gf180mcuD": "gf180mcu.lyp",
|
||||
}
|
||||
|
||||
@@ -144,13 +141,11 @@ valid_lef_port_layers = {
|
||||
"met3.pin": (70, 16),
|
||||
"met4.pin": (71, 16),
|
||||
},
|
||||
"ihp-sg13g2": {
|
||||
"ihp-sg13cmos5l": {
|
||||
"Metal1.pin": (8, 2),
|
||||
"Metal2.pin": (10, 2),
|
||||
"Metal3.pin": (30, 2),
|
||||
"Metal4.pin": (50, 2),
|
||||
"Metal5.pin": (67, 2),
|
||||
"TopMetal1.pin": (126, 2),
|
||||
},
|
||||
}
|
||||
forbidden_layers = {
|
||||
@@ -159,10 +154,10 @@ forbidden_layers = {
|
||||
"met5.pin",
|
||||
"met5.label",
|
||||
],
|
||||
"ihp-sg13g2": [
|
||||
"TopMetal2.drawing",
|
||||
"TopMetal2.pin",
|
||||
"TopMetal2.label",
|
||||
"ihp-sg13cmos5l": [
|
||||
"TopMetal1.drawing",
|
||||
"TopMetal1.pin",
|
||||
"TopMetal1.label",
|
||||
],
|
||||
"gf180mcuD": [
|
||||
"Metal5",
|
||||
@@ -171,16 +166,16 @@ forbidden_layers = {
|
||||
}
|
||||
power_pins_layer = {
|
||||
"sky130A": "met4",
|
||||
"ihp-sg13g2": "TopMetal1",
|
||||
"ihp-sg13cmos5l": "Metal4",
|
||||
"gf180mcuD": "Metal4",
|
||||
}
|
||||
power_pins_min_width = {
|
||||
"sky130A": 1200, # 1.2 um
|
||||
"ihp-sg13g2": 2100, # 2.1 um
|
||||
"ihp-sg13cmos5l": 2100, # 2.1 um
|
||||
"gf180mcuD": 1200, # 1.2 um
|
||||
}
|
||||
boundary_layer = {
|
||||
"sky130A": "prBoundary.boundary",
|
||||
"ihp-sg13g2": "prBoundary.boundary",
|
||||
"ihp-sg13cmos5l": "prBoundary.boundary",
|
||||
"gf180mcuD": "PR_bndry",
|
||||
}
|
||||
|
||||
+3
-3
@@ -36,9 +36,9 @@
|
||||
"RUN_KLAYOUT_DRC": false
|
||||
},
|
||||
|
||||
"pdk::ihp-sg13g2": {
|
||||
"pdk::ihp-sg13cmos5l": {
|
||||
"DIE_AREA": [0, 0, 202.08, 154.98],
|
||||
"FP_DEF_TEMPLATE": "ref::$DESIGN_DIR/../tech/ihp-sg13g2/def/tt_block_1x1_pgvdd.def",
|
||||
"RT_MAX_LAYER": "Metal5"
|
||||
"FP_DEF_TEMPLATE": "ref::$DESIGN_DIR/../tech/ihp-sg13cmos5l/def/tt_block_1x1_pgvdd.def",
|
||||
"RT_MAX_LAYER": "Metal4"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ import json
|
||||
import os
|
||||
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):
|
||||
@@ -128,16 +128,16 @@ class Sky130Tech(Tech):
|
||||
class IHPTech(Tech):
|
||||
is_fpga = False
|
||||
def_suffix = "pgvdd"
|
||||
librelane_pdk_args = "--pdk ihp-sg13g2"
|
||||
librelane_pdk_args = "--pdk ihp-sg13cmos5l --manual-pdk"
|
||||
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"
|
||||
project_top_metal_layer = "TopMetal1"
|
||||
project_top_metal_layer = "Metal4"
|
||||
librelane_config = {}
|
||||
label_layers = [
|
||||
(8, 1), # Metal1.label
|
||||
(8, 25), # Metal1.text
|
||||
(67, 25), # Metal5.text
|
||||
(50, 25), # Metal4.text
|
||||
(126, 25), # TopMetal1.text
|
||||
]
|
||||
buried_layers = [
|
||||
@@ -147,32 +147,32 @@ class IHPTech(Tech):
|
||||
(51, 0), # HeatTrans.drawing
|
||||
(189, 4), # prBoundary.boundary
|
||||
]
|
||||
scramble_cells = "sg13g2_"
|
||||
mux_config_yaml_name = "ihp-sg13g2.yaml"
|
||||
scramble_cells = "sg13cmos5l_"
|
||||
mux_config_yaml_name = "ihp-sg13cmos5l.yaml"
|
||||
mux_macros = [
|
||||
"pg/ihp-sg13g2/tt_pg_1v5_hp_1",
|
||||
"pg/ihp-sg13g2/tt_pg_1v5_hp_2",
|
||||
"pg/ihp-sg13g2/tt_pg_1v5_hp_4",
|
||||
"pg/ihp-sg13g2/tt_pg_1v5_ll_1",
|
||||
"pg/ihp-sg13g2/tt_pg_1v5_ll_2",
|
||||
"pg/ihp-sg13g2/tt_pg_1v5_ll_4",
|
||||
"pg/ihp-sg13cmos5l/tt_pg_1v5_hp_1",
|
||||
"pg/ihp-sg13cmos5l/tt_pg_1v5_hp_2",
|
||||
"pg/ihp-sg13cmos5l/tt_pg_1v5_hp_4",
|
||||
"pg/ihp-sg13cmos5l/tt_pg_1v5_ll_1",
|
||||
"pg/ihp-sg13cmos5l/tt_pg_1v5_ll_2",
|
||||
"pg/ihp-sg13cmos5l/tt_pg_1v5_ll_4",
|
||||
]
|
||||
extra_logo_macros = [
|
||||
"tech/ihp-sg13g2/tt_logo_corner",
|
||||
"tech/ihp-sg13cmos5l/tt_logo_corner",
|
||||
]
|
||||
prboundary_layer = (189, 4) # prBoundary.boundary
|
||||
logo_layer = (67, 0) # Metal5.drawing
|
||||
logo_layer_name = "Metal5"
|
||||
logo_layer = (50, 0) # Metal4.drawing
|
||||
logo_layer_name = "Metal4"
|
||||
logo_pixel_size = 0.25 # um
|
||||
|
||||
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")
|
||||
|
||||
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__))
|
||||
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)
|
||||
for cell in cells.values():
|
||||
cell["url"] = URL_FORMAT.format(ref=cell["doc_ref"])
|
||||
@@ -277,7 +277,7 @@ class FpgaTech(Tech):
|
||||
|
||||
|
||||
tech_map: dict[TechName, Tech] = {
|
||||
"ihp-sg13g2": IHPTech(),
|
||||
"ihp-sg13cmos5l": IHPTech(),
|
||||
"gf180mcuD": GF180MCUDTech(),
|
||||
"sky130A": Sky130Tech(),
|
||||
"fpgaUp5k": FpgaTech(),
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
# 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
|
||||
# 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:
|
||||
# ------------------------------------------------
|
||||
-4
@@ -93,12 +93,8 @@ TRACKS X 480 DO 420 STEP 480 LAYER Metal3 ;
|
||||
TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ;
|
||||
TRACKS X 480 DO 420 STEP 480 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 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 ;
|
||||
END COMPONENTS
|
||||
PINS 51 ;
|
||||
-4
@@ -93,12 +93,8 @@ TRACKS X 480 DO 873 STEP 480 LAYER Metal3 ;
|
||||
TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ;
|
||||
TRACKS X 480 DO 873 STEP 480 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 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 ;
|
||||
END COMPONENTS
|
||||
PINS 51 ;
|
||||
-4
@@ -51,12 +51,8 @@ TRACKS X 480 DO 420 STEP 480 LAYER Metal3 ;
|
||||
TRACKS Y 420 DO 368 STEP 420 LAYER Metal3 ;
|
||||
TRACKS X 480 DO 420 STEP 480 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 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 ;
|
||||
END COMPONENTS
|
||||
PINS 43 ;
|
||||
-4
@@ -93,12 +93,8 @@ TRACKS X 480 DO 420 STEP 480 LAYER Metal3 ;
|
||||
TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ;
|
||||
TRACKS X 480 DO 420 STEP 480 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 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 ;
|
||||
END COMPONENTS
|
||||
PINS 43 ;
|
||||
-4
@@ -93,12 +93,8 @@ TRACKS X 480 DO 873 STEP 480 LAYER Metal3 ;
|
||||
TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ;
|
||||
TRACKS X 480 DO 873 STEP 480 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 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 ;
|
||||
END COMPONENTS
|
||||
PINS 43 ;
|
||||
-4
@@ -93,12 +93,8 @@ TRACKS X 480 DO 1326 STEP 480 LAYER Metal3 ;
|
||||
TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ;
|
||||
TRACKS X 480 DO 1326 STEP 480 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 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 ;
|
||||
END COMPONENTS
|
||||
PINS 43 ;
|
||||
-4
@@ -198,12 +198,8 @@ TRACKS X 480 DO 1326 STEP 480 LAYER Metal3 ;
|
||||
TRACKS Y 420 DO 1691 STEP 420 LAYER Metal3 ;
|
||||
TRACKS X 480 DO 1326 STEP 480 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 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 ;
|
||||
END COMPONENTS
|
||||
PINS 43 ;
|
||||
-4
@@ -93,12 +93,8 @@ TRACKS X 480 DO 1779 STEP 480 LAYER Metal3 ;
|
||||
TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ;
|
||||
TRACKS X 480 DO 1779 STEP 480 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 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 ;
|
||||
END COMPONENTS
|
||||
PINS 43 ;
|
||||
-4
@@ -198,12 +198,8 @@ TRACKS X 480 DO 1779 STEP 480 LAYER Metal3 ;
|
||||
TRACKS Y 420 DO 1691 STEP 420 LAYER Metal3 ;
|
||||
TRACKS X 480 DO 1779 STEP 480 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 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 ;
|
||||
END COMPONENTS
|
||||
PINS 43 ;
|
||||
-4
@@ -198,12 +198,8 @@ TRACKS X 480 DO 2232 STEP 480 LAYER Metal3 ;
|
||||
TRACKS Y 420 DO 1691 STEP 420 LAYER Metal3 ;
|
||||
TRACKS X 480 DO 2232 STEP 480 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 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 ;
|
||||
END COMPONENTS
|
||||
PINS 43 ;
|
||||
-4
@@ -93,12 +93,8 @@ TRACKS X 480 DO 2685 STEP 480 LAYER Metal3 ;
|
||||
TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ;
|
||||
TRACKS X 480 DO 2685 STEP 480 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 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 ;
|
||||
END COMPONENTS
|
||||
PINS 43 ;
|
||||
-4
@@ -198,12 +198,8 @@ TRACKS X 480 DO 2685 STEP 480 LAYER Metal3 ;
|
||||
TRACKS Y 420 DO 1691 STEP 420 LAYER Metal3 ;
|
||||
TRACKS X 480 DO 2685 STEP 480 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 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 ;
|
||||
END COMPONENTS
|
||||
PINS 43 ;
|
||||
-4
@@ -93,12 +93,8 @@ TRACKS X 480 DO 3591 STEP 480 LAYER Metal3 ;
|
||||
TRACKS Y 420 DO 746 STEP 420 LAYER Metal3 ;
|
||||
TRACKS X 480 DO 3591 STEP 480 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 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 ;
|
||||
END COMPONENTS
|
||||
PINS 43 ;
|
||||
Binary file not shown.
@@ -8,7 +8,7 @@ MACRO tt_logo_corner
|
||||
ORIGIN 0.000 0.000 ;
|
||||
SIZE 100.000 BY 100.000 ;
|
||||
OBS
|
||||
LAYER TopMetal2 ;
|
||||
LAYER TopMetal1 ;
|
||||
RECT 45.000 99.500 55.000 100.000 ;
|
||||
RECT 41.500 99.000 58.500 99.500 ;
|
||||
RECT 39.000 98.500 61.000 99.000 ;
|
||||
Binary file not shown.
+3
-1
@@ -147,7 +147,9 @@ if __name__ == "__main__":
|
||||
|
||||
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:
|
||||
check_project_docs(args.project_dir, pdk)
|
||||
|
||||
Reference in New Issue
Block a user