Gate SI layout_rules to the quoted bus, not EN RC onto USB.

PE-SI-009 no longer treats ESP32 CHIP_PU/EN RC as a USB series R.
USB without a library Z number stays PE-SI-010 measurement-only.
Pintable skill 1.13.0 requires net_class on SI kinds (usb2/usb3/MDI/RGMII/DDR3).
This commit is contained in:
2026-09-20 13:13:19 +02:00
parent a63e5bd7ab
commit 312057b6d3
10 changed files with 546 additions and 82 deletions
+8 -1
View File
@@ -72,6 +72,10 @@ You **must** look for layout guidance. Emit `layout_rules` as a list. Use `[]` o
Do **not** emit impedance/50 Ω rules for I2C, GPIO, EN, analog REGN, or USB CC. Do **not** invent USB 90 Ω unless **this** datasheet states a number.
`net_class` is **required** for every SI kind (`impedance`, `length_match`, `max_length`, `spacing`, `ref_plane`, `si_via`, `layer`, `series_resistor`, `return_path`, `si`). Use one of: `usb2`, `usb3`, `eth_mdi`, `rgmii`, `sgmii`, `ddr3`, `hdmi`, `pcie`, `lvds`. PCB review will not map a rule onto another bus.
`series_resistor` is a termination / series R **on that HS net** (e.g. USB 22 Ω, RGMII 22 Ω). It is **not** CHIP_PU / EN / RESET RC (10 kΩ + 1 µF), ILIM, or a strap divider — omit those or use `decoupling_proximity` / leave them to timing checks.
#### Fields
- `pin` — number or name as printed (`"5"`, `"VIN"`, `"VDD"`, `"EP"`)
- `cap_value_hint` — only if shown (`"100nF"`, `"10µF"`)
@@ -81,7 +85,8 @@ Do **not** emit impedance/50 Ω rules for I2C, GPIO, EN, analog REGN, or USB CC.
- **Never invent** JEDEC, USB, IPC, or “standard 3 mm / 5 mm” distances
- `same_layer``true`/`false` only if text says same side / opposite side of the board; else null
- `min_via_count` — integer only if stated (“at least 4 vias”)
- `net_class` / `note` — short quote of the guidance
- `net_class` **required for SI kinds**: `usb2` | `usb3` | `eth_mdi` | `rgmii` | `sgmii` | `ddr3` | `hdmi` | `pcie` | `lvds`. Must match the quoted bus (PHY+RJ45 = `eth_mdi`, MACPHY = `rgmii`/`sgmii`, USB-C SuperSpeed = `usb3`, USB D+/D = `usb2`). Never leave SI `net_class` empty.
- `note` — short quote of the guidance
- `source_page` — 1-based page of the guidance (required when you emit a rule)
#### Examples
@@ -129,6 +134,8 @@ Thermal vias:
- Do not invent land-pattern pad sizes from the mechanical drawing alone
- Do not emit `length_match` or `impedance` for USB/HDMI/PCIe unless **this** datasheet states a skew/Z number
- Do not treat I2C, GPIO, EN, analog, or USB-CC as 50 Ω / 90 Ω pairs
- Do not emit `series_resistor` for EN / CHIP_PU / RESET RC, ILIM, or strap networks
- Do not emit an SI kind without `net_class` naming the quoted bus
- Do not use kinds outside the closed set
- One rule per distinct pin/guidance; prefer supply pins that show caps in the application figure
+21
View File
@@ -154,6 +154,27 @@ def validate(data: dict) -> list[str]:
errors.append(
f"layout_rules[{i}].same_layer must be a boolean or null"
)
si_kinds = {
"length_match", "impedance", "max_length", "spacing",
"ref_plane", "si_via", "layer", "series_resistor",
"return_path", "si",
}
nc = row.get("net_class")
if kind in si_kinds and not (isinstance(nc, str) and nc.strip()):
errors.append(
f"layout_rules[{i}] SI kind {kind!r} requires net_class "
f"(usb2|usb3|eth_mdi|rgmii|sgmii|ddr3|hdmi|pcie|lvds)"
)
note = str(row.get("note") or "")
pin = str(row.get("pin") or "")
if kind == "series_resistor" and (
re.search(r"[µu]F", note, re.I)
or re.search(r"\b(EN|CHIP_PU|CHIP_EN|STRAP|ILIM)\b", f"{note} {pin}", re.I)
):
errors.append(
f"layout_rules[{i}] series_resistor is HS termination, "
f"not EN/CHIP_PU RC or strap"
)
return errors