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:
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user