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:
@@ -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`, MAC–PHY = `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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user