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.
116 lines
4.5 KiB
Python
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()
|