Files
periscope/tests/pcb/test_protocol_catalog_m10.py
T
michele f3be485b75 Fill protocol packs from recovered USB CTS, Type-C FTS, DVI 1.0, and IEEE 802.3-2012 Section Two (2.74.0).
NUMERIC rows cite document title, revision, section/table, and page. USB Zdiff, Type-C Rp/Rd, 10BASE-T, and 1000BASE-T stay UNKNOWN. PDFs are not in git.
2026-09-22 14:43:26 +02:00

116 lines
4.5 KiB
Python

"""M10 catalog skeletons: PCIe/CXL logical vs physical, I2C/CAN/RGMII, HS processor ids."""
from __future__ import annotations
import json
from backend.periscopex.protocol_catalog import (
CAN_CHECKS,
I2C_CHECKS,
PCIE_CHECKS,
PCI_PARALLEL_CHECKS,
RGMII_CHECKS,
build_m0_catalog,
load_catalog,
parse_catalog,
)
HS_LOGICAL = {
"pci", "pci-x", "pcie", "cxl", "ccix", "opencapi",
"upi", "dmi", "infinity-fabric", "hypertransport", "ucie",
}
NO_INVENTED = ("90", "100 ", "50 ", "120")
def test_m10_logical_physical_split_pcie_cxl():
cat = load_catalog()
pcie_log = next(p for p in cat.logical_protocols if p.id == "pcie")
cxl_log = next(p for p in cat.logical_protocols if p.id == "cxl")
pcie_phy = next(p for p in cat.physical_interfaces if p.id == "pcie-phy-pcb")
cxl_phy = next(p for p in cat.physical_interfaces if p.id == "cxl-phy-pcb")
assert pcie_log.id != pcie_phy.id
assert cxl_log.id != cxl_phy.id
assert pcie_phy.logical_protocol_id == "pcie"
assert cxl_phy.logical_protocol_id == "cxl"
assert pcie_phy.logical_protocol_id != cxl_phy.logical_protocol_id
assert pcie_phy.pcb_relevant == "YES"
assert cxl_phy.pcb_relevant == "YES"
assert set(pcie_phy.required_checks) == set(PCIE_CHECKS)
assert set(cxl_phy.required_checks) == set(PCIE_CHECKS)
def test_m10_high_speed_processor_ids_present():
cat = load_catalog()
logical = {p.id for p in cat.logical_protocols}
assert HS_LOGICAL <= logical
physical = {p.id: p for p in cat.physical_interfaces}
assert physical["pci-pcb"].pcb_relevant == "YES"
assert physical["pci-x-pcb"].pcb_relevant == "YES"
assert set(physical["pci-pcb"].required_checks) == set(PCI_PARALLEL_CHECKS)
assert physical["ccix-phy-pcb"].pcb_relevant == "YES"
assert physical["opencapi-phy-pcb"].pcb_relevant == "YES"
assert physical["hypertransport-phy-pcb"].pcb_relevant == "YES"
assert physical["upi-phy"].pcb_relevant == "CONDITIONAL"
assert physical["dmi-phy"].pcb_relevant == "CONDITIONAL"
assert physical["infinity-fabric-phy"].pcb_relevant == "CONDITIONAL"
assert physical["ucie-die-to-die"].pcb_relevant == "CONDITIONAL"
assert physical["ucie-die-to-die"].logical_protocol_id == "ucie"
for pid in HS_LOGICAL:
ifaces = [p for p in cat.physical_interfaces if p.logical_protocol_id == pid]
assert ifaces, pid
assert all(p.id != pid for p in ifaces)
def test_m10_i2c_can_rgmii_skeletons_named_checks_no_numbers():
cat = load_catalog()
i2c = next(p for p in cat.physical_interfaces if p.id == "i2c-pcb")
can = next(p for p in cat.physical_interfaces if p.id == "can-pcb")
rgmii = next(p for p in cat.physical_interfaces if p.id == "rgmii-pcb")
assert i2c.logical_protocol_id == "i2c"
assert can.logical_protocol_id == "can"
assert rgmii.logical_protocol_id == "rgmii"
assert i2c.pcb_relevant == "YES"
assert can.pcb_relevant == "YES"
assert rgmii.pcb_relevant == "YES"
assert set(i2c.required_checks) == set(I2C_CHECKS)
assert set(can.required_checks) == set(CAN_CHECKS)
assert set(rgmii.required_checks) == set(RGMII_CHECKS)
for iface in (i2c, can, rgmii):
for c in iface.constraints:
assert c.value is None
assert c.value_kind in {
"MISSING_SOURCE", "UNKNOWN", "PHY_DEPENDENT",
"CONTROLLER_DEPENDENT", "VENDOR_DEPENDENT", "NOT_APPLICABLE",
}
assert c.value_kind != "NUMERIC"
def test_m10_no_invented_ohms_and_no_usbif_fill():
loaded = load_catalog()
for iface in loaded.physical_interfaces:
for c in iface.constraints:
if c.value_kind == "NUMERIC":
assert c.source is not None
assert c.source.document
else:
assert c.value is None
assert c.unit is None
blob = json.dumps([
c.model_dump() for p in loaded.physical_interfaces for c in p.constraints
if p.logical_protocol_id in HS_LOGICAL | {"i2c", "can", "rgmii"}
])
for token in NO_INVENTED:
assert token not in blob
usb = next(p for p in loaded.physical_interfaces if p.id == "usb2-hs-dpair")
z = next(c for c in usb.constraints if c.parameter == "differential_impedance")
assert z.value_kind in {"MISSING_SOURCE", "UNKNOWN"}
assert z.value is None
assert z.source is None
def test_m10_builder_matches_committed_catalog():
loaded = load_catalog()
rebuilt = parse_catalog(build_m0_catalog())
assert loaded.model_dump() == rebuilt.model_dump()