mirror of
https://github.com/TinyTapeout/tt-support-tools.git
synced 2026-11-03 04:36:09 +01:00
feat(precheck/gf180mcuD): update to latest PDK
This commit is contained in:
@@ -10,7 +10,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
PDK_ROOT: /home/runner/pdk
|
||||
PDK_VERSION: ff08c23db8359afce3f134c454e7930586d0641c
|
||||
PDK_VERSION: e8daeda73ca8f5814dbc0b11d1d05802251a3750
|
||||
|
||||
steps:
|
||||
- name: Check out code
|
||||
|
||||
+10
-1
@@ -3,9 +3,18 @@
|
||||
,
|
||||
}:
|
||||
|
||||
let
|
||||
# KLayout 0.30.8 is required by the latest gf180mcu rule-framework DRC deck
|
||||
# (it uses LayoutToNetlist#copy, which older KLayout lacks). Pinned
|
||||
# separately so magic-vlsi keeps coming from the base nixpkgs above.
|
||||
klayoutPkgs = import
|
||||
(fetchTarball
|
||||
"https://github.com/NixOS/nixpkgs/archive/ffa10e26ae11d676b2db836259889f1f571cb14f.tar.gz")
|
||||
{ };
|
||||
in
|
||||
pkgs.mkShell {
|
||||
buildInputs = [
|
||||
pkgs.klayout
|
||||
klayoutPkgs.klayout
|
||||
pkgs.magic-vlsi
|
||||
];
|
||||
}
|
||||
|
||||
+27
-35
@@ -4,7 +4,6 @@ import logging
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import time
|
||||
import traceback
|
||||
@@ -130,44 +129,37 @@ def klayout_sg13g2(gds: str):
|
||||
)
|
||||
|
||||
|
||||
def klayout_gf180mcuD_antenna(gds: str):
|
||||
return klayout_drc(
|
||||
gds,
|
||||
"antenna",
|
||||
"antenna.drc",
|
||||
script_dir=f"{PDK_ROOT}/{PDK_NAME}/libs.tech/klayout/tech/drc/rule_decks",
|
||||
)
|
||||
def klayout_gf180mcuD_rule_deck(gds: str, top_module: str, check: str, decks: str):
|
||||
# All gf180mcuD DRC runs go through the PDK's unified rule deck
|
||||
# (gf180mcu.drc); `decks` selects which rule groups to run (see its
|
||||
# `-rd help=true` output).
|
||||
logging.info(f"Running klayout {check} on {gds}")
|
||||
script = f"{PDK_ROOT}/{PDK_NAME}/libs.tech/klayout/tech/drc/gf180mcu.drc"
|
||||
script_vars = {
|
||||
"input": gds,
|
||||
"topcell": top_module,
|
||||
"variant": "gf180mcuD", # metal_top=11K, mim_option=B, metal_level=5LM
|
||||
"run_mode": "deep",
|
||||
"threads": "1", # single-threaded to work around a klayout bug
|
||||
"decks": decks,
|
||||
}
|
||||
klayout_custom_drc(check, script, script_vars, ["report"])
|
||||
|
||||
|
||||
def klayout_gf180mcuD_antenna(gds: str, top_module: str):
|
||||
# Antenna rules only - they are part of the full deck but get their own
|
||||
# check, so the full DRC below excludes them to avoid running them twice.
|
||||
return klayout_gf180mcuD_rule_deck(gds, top_module, "antenna", "antenna")
|
||||
|
||||
|
||||
def klayout_gf180mcuD_drc(gds: str, top_module: str):
|
||||
logging.info(f"Running klayout gf180mcuD DRC on {gds}")
|
||||
run_dir = f"{REPORTS_PATH}/gf180mcuD_drc"
|
||||
os.makedirs(run_dir, exist_ok=True)
|
||||
report_file = f"{run_dir}/{os.path.splitext(os.path.basename(gds))[0]}_main.lyrdb"
|
||||
if os.path.exists(report_file):
|
||||
os.remove(report_file)
|
||||
|
||||
run_drc = f"{PDK_ROOT}/{PDK_NAME}/libs.tech/klayout/tech/drc/run_drc.py"
|
||||
subprocess.run(
|
||||
[
|
||||
sys.executable,
|
||||
run_drc,
|
||||
f"--path={gds}",
|
||||
f"--topcell={top_module}",
|
||||
"--variant=D", # gf180mcuD: metal_top=11K, mim_option=B, metal_level=5LM
|
||||
"--run_mode=deep",
|
||||
"--thr=1", # single-threaded to work around a klayout deadlock bug
|
||||
f"--run_dir={run_dir}",
|
||||
],
|
||||
# Full rule deck (FEOL + BEOL + connectivity) minus density and antenna.
|
||||
# Density is excluded because user projects rely on the metal fill that is
|
||||
# added after precheck to meet it; antenna has its own check above.
|
||||
return klayout_gf180mcuD_rule_deck(
|
||||
gds, top_module, "gf180mcuD", "all,-density,-antenna"
|
||||
)
|
||||
|
||||
# run_drc.py exits non-zero on violations, so we judge the result from the
|
||||
# report database it produces (matching the other klayout checks).
|
||||
if not os.path.exists(report_file):
|
||||
raise PrecheckFailure("Klayout gf180mcuD DRC did not produce a report")
|
||||
|
||||
check_drc_report("gf180mcuD DRC", report_file)
|
||||
|
||||
|
||||
def klayout_checks(gds: str, expected_name: str, tech: str):
|
||||
layout = pya.Layout()
|
||||
@@ -529,7 +521,7 @@ def main():
|
||||
},
|
||||
{
|
||||
"name": "Antenna check",
|
||||
"check": lambda: klayout_gf180mcuD_antenna(gds_file),
|
||||
"check": lambda: klayout_gf180mcuD_antenna(gds_file, top_module),
|
||||
"techs": ["gf180mcuD"],
|
||||
},
|
||||
{
|
||||
|
||||
@@ -3,7 +3,6 @@ name = "tt-precheck"
|
||||
requires-python = ">=3.11"
|
||||
dynamic = ["version"]
|
||||
dependencies = [
|
||||
"docopt",
|
||||
"gdstk",
|
||||
"klayout>=0.28.17.post1,<0.29.0",
|
||||
"numpy<2",
|
||||
|
||||
@@ -6,7 +6,7 @@ drc_zero_area.xml
|
||||
drc_nwell_urpm.xml
|
||||
drc_sg13g2.xml
|
||||
drc_antenna.xml
|
||||
gf180mcuD_drc/
|
||||
drc_gf180mcuD.xml
|
||||
magic_drc.mag
|
||||
magic_drc.txt
|
||||
results.md
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
#
|
||||
click==8.3.1
|
||||
# via yowasp-yosys
|
||||
docopt==0.6.2
|
||||
# via tt-precheck (pyproject.toml)
|
||||
gdstk==0.9.52
|
||||
# via tt-precheck (pyproject.toml)
|
||||
iniconfig==2.0.0
|
||||
|
||||
@@ -975,14 +975,14 @@ def test_gf180mcuD_drc_pass(gds_gf180_drc_pass: str):
|
||||
def test_gf180mcuD_drc_fail(gds_gf180_drc_fail: str):
|
||||
with pytest.raises(
|
||||
precheck.PrecheckFailure,
|
||||
match="Klayout gf180mcuD DRC failed with 1 DRC violations",
|
||||
match="Klayout gf180mcuD failed with 1 DRC violations",
|
||||
):
|
||||
precheck.klayout_gf180mcuD_drc(gds_gf180_drc_fail, "TEST_gf180_drc_fail")
|
||||
|
||||
|
||||
@gf180mcuD_only
|
||||
def test_antenna_pass(gds_antenna_pass: str):
|
||||
precheck.klayout_gf180mcuD_antenna(gds_antenna_pass)
|
||||
precheck.klayout_gf180mcuD_antenna(gds_antenna_pass, "TEST_antenna_pass")
|
||||
|
||||
|
||||
@gf180mcuD_only
|
||||
@@ -991,4 +991,4 @@ def test_antenna_fail(gds_antenna_fail: str):
|
||||
precheck.PrecheckFailure,
|
||||
match="Klayout antenna failed with 1 DRC violations",
|
||||
):
|
||||
precheck.klayout_gf180mcuD_antenna(gds_antenna_fail)
|
||||
precheck.klayout_gf180mcuD_antenna(gds_antenna_fail, "TEST_antenna_fail")
|
||||
|
||||
Reference in New Issue
Block a user