Check ImpedenceFinder against datasheet SI rules, not a dump table.

Each layout_rules SI requirement (diff/SE Z, skew, max length, spacing,
ref plane, vias, layer, return, series R) is one PASS/FAIL/MARGIN finding
with FACT and REQUIREMENT. USB/HDMI/PCIe/ETH/LVDS/DDR only; I2C GPIO CC
and analog REGN are skipped. No invented 90 Ω.
This commit is contained in:
2026-09-20 10:45:27 +02:00
parent 187605763d
commit 65a91419a2
14 changed files with 956 additions and 67 deletions
+6 -2
View File
@@ -183,15 +183,19 @@ async def run_pcb_pipeline(
_step(project_id, "inventory", "running")
z0_by_net: dict[str, float] = {}
zrep: dict = {"nets": [], "skipped": None}
try:
from backend.periscopex.impedance_traces import analyze_where_needed
zrep = analyze_where_needed(layout, graph)
zpath = ws.local_path("impedance_nets.json")
zpath.write_text(json.dumps(zrep, indent=2) + "\n")
ws._upload_file("impedance_nets.json")
for row in zrep.get("nets") or []:
if not isinstance(row, dict) or row.get("error"):
continue
name = str(row.get("net_name") or row.get("name") or "")
z = row.get("z0_ohm") or row.get("mean_z0") or row.get("z0")
z = row.get("z0_avg_ohms") or row.get("z0_ohm") or row.get("mean_z0") or row.get("z0")
if name and isinstance(z, (int, float)):
z0_by_net[name] = float(z)
except Exception:
@@ -215,7 +219,7 @@ async def run_pcb_pipeline(
return
_step(project_id, "checks", "running")
findings = run_pcb_checks(graph, cmap, layout, plan)
findings = run_pcb_checks(graph, cmap, layout, plan, zrep)
_step(
project_id, "checks", "complete",
f"{len(findings)} deterministic findings",