From d32af5627aa0f5a2ab58b182b534c47b2eb75461 Mon Sep 17 00:00:00 2001 From: Michele Bigi Date: Tue, 22 Sep 2026 18:03:44 +0200 Subject: [PATCH] Fill 1000BASE-T from IEEE 802.3-2012 Section Three Clause 40 (2.78.0). MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cable 100 Ω / 100 m / 570 ns / 50 ns skew stay CABLE. MDI 16 dB and 0.67 V are PHY. L2 PCB Zdiff UNKNOWN. 1000BASE-X 1000 Mb/s from Clause 36. --- .../backend/periscopex/protocol_catalog.py | 132 ++++++- .../periscopex/protocol_data/catalog.json | 329 +++++++++++++----- periscope/src/frontend/content/changelog.md | 7 + periscope/src/frontend/package.json | 2 +- tests/pcb/test_protocol_m6_m7.py | 4 +- tests/pcb/test_protocol_pdf_pack.py | 23 +- 6 files changed, 396 insertions(+), 101 deletions(-) diff --git a/periscope/src/backend/periscopex/protocol_catalog.py b/periscope/src/backend/periscopex/protocol_catalog.py index 0df4b5d..050e984 100644 --- a/periscope/src/backend/periscopex/protocol_catalog.py +++ b/periscope/src/backend/periscopex/protocol_catalog.py @@ -596,11 +596,12 @@ DOC_IEEE_S1_C14 = ( "number here; 100 Ω is twisted-pair link-segment / 100 Ω test load, not PCB Zdiff)" ) DOC_IEEE_S3_C40 = ( - "IEEE Std 802.3-2015 Section One does not contain Clause 40 (1000BASE-T); " - "need 802.3 Section Three" + "IEEE Std 802.3-2012 Section Three Clause 40 (this 1000BASE-T PCB field is not a single " + "number here; 100 Ω is Class D link-segment / 100 Ω test load, not PCB Zdiff)" ) DOC_IEEE_S3_C36 = ( - "IEEE Std 802.3-2012 Section Three (1000BASE-X; not in Section Two)" + "IEEE Std 802.3-2012 Section Three Clause 36 (1000BASE-X PCS/PMA). Optical PMD is " + "Clause 38; 1000BASE-CX copper is Clause 39 — this PCB field is not a single number" ) DOC_IEEE_TP_PMD = ( "ANSI X3.263:1995 TP-PMD (incorporated by IEEE 802.3-2012 Clause 25; not on file. " @@ -1279,6 +1280,84 @@ def build_m0_catalog() -> dict[str, Any]: nd = DOC_IEEE_S1_C14 out.append(_c(pid, p, "UNKNOWN", needed_document=nd)) continue + if lid == "1000base-t" and p == "data_rate": + out.append(_num( + pid, p, 1000.0, "Mb/s", + document=DOC_IEEE_2012, organization=ORG_IEEE, + revision=REV_IEEE_2012, section="40.1", page="179", + conditions=["1000BASE-T PHY over four pairs", "Section Three Clause 40"], + )) + continue + if lid == "1000base-t" and p == "maximum_channel_length": + out.append(_num( + pid, p, 100.0, "m", + document=DOC_IEEE_2012, organization=ORG_IEEE, + revision=REV_IEEE_2012, section="40.7.2", page="265", + source_type="CABLE", + conditions=[ + "Class D link segment of up to at least 100 m", + "4-pair Category 5 / Class D as in 40.7", + "not a PCB trace length", + ], + )) + continue + if lid == "1000base-t" and p == "cable_channel": + out.append(_num( + pid, p, 100.0, "ohm", + document=DOC_IEEE_2012, organization=ORG_IEEE, + revision=REV_IEEE_2012, section="40.7.2.2", page="265", + source_type="CABLE", + conditions=[ + "nominal differential characteristic impedance of each duplex channel", + "100 Ω, 1 MHz to 100 MHz, including cords and connecting hardware", + "not a PCB trace differential impedance", + ], + )) + continue + if lid == "1000base-t" and p == "return_loss": + out.append(_num( + pid, p, 16.0, "dB", + document=DOC_IEEE_2012, organization=ORG_IEEE, + revision=REV_IEEE_2012, section="40.8.3.1", page="270", + source_type="PHY", + conditions=[ + "MDI differential: reflection attenuated at least 16 dB", + "1.0 MHz to 40 MHz vs 100 Ω ± 15% cabling", + "40–100 MHz is a frequency-dependent formula (not packed)", + "not a PCB trace Zdiff number", + ], + )) + continue + if lid == "1000base-t" and p == "pair_to_pair_skew": + out.append(_num( + pid, p, 50.0, "ns", + document=DOC_IEEE_2012, organization=ORG_IEEE, + revision=REV_IEEE_2012, section="40.7.4.2", page="267", + source_type="CABLE", + conditions=["link-segment pair-to-pair skew maximum, 2–100 MHz"], + )) + continue + if lid == "1000base-t" and p in { + "differential_impedance", "impedance_tolerance", "termination", + "insertion_loss", + }: + out.append(_c(pid, p, "UNKNOWN", needed_document=DOC_IEEE_S3_C40)) + continue + if lid == "1000base-x" and p == "data_rate": + out.append(_num( + pid, p, 1000.0, "Mb/s", + document=DOC_IEEE_2012, organization=ORG_IEEE, + revision=REV_IEEE_2012, section="36.1.1", page="53", + conditions=["1000BASE-X family PCS/PMA", "Section Three Clause 36"], + )) + continue + if lid == "1000base-x" and p == "differential_impedance": + out.append(_c( + pid, p, "NOT_APPLICABLE", + mandatory="INFORMATIONAL", source_type="STANDARD", + conditions=["optical 1000BASE-X PMD is Clause 38; 1000BASE-CX copper is Clause 39"], + )) + continue if lid == "100base-fx" and p == "data_rate": out.append(_num( pid, p, 100.0, "Mb/s", @@ -1360,6 +1439,45 @@ def build_m0_catalog() -> dict[str, Any]: source_type="CABLE", conditions=["maximum propagation delay of a link segment", "pair also ≤ 5.7 ns/m"], )) + if lid == "1000base-t": + out.append(_num( + pid, "isolation_after_test", 2.0e6, "ohm", + document=DOC_IEEE_2012, organization=ORG_IEEE, + revision=REV_IEEE_2012, section="40.6.1.1", page="243", + conditions=[ + "PHY MDI that is not a PI", + "resistance after isolation test, measured at 500 V dc", + "minimum 2 MΩ", + ], + )) + out.append(_num( + pid, "isolation_rms", 1500.0, "V", + document=DOC_IEEE_2012, organization=ORG_IEEE, + revision=REV_IEEE_2012, section="40.6.1.1 a", page="243", + mandatory="OPTIONAL", + conditions=[ + "one of three allowed isolation tests", + "1500 V rms at 50 Hz to 60 Hz for 60 s", + ], + )) + out.append(_num( + pid, "peak_differential_output", 0.67, "V", + document=DOC_IEEE_2012, organization=ORG_IEEE, + revision=REV_IEEE_2012, section="40.6.1.2.1", page="251", + source_type="PHY", + conditions=[ + "MDI peak at template points A and B in test mode 1", + "0.67–0.82 V (0.75 V ± 0.83 dB)", + "transmitter test fixture 1, no intervening cable", + ], + )) + out.append(_num( + pid, "link_segment_delay_max", 570.0, "ns", + document=DOC_IEEE_2012, organization=ORG_IEEE, + revision=REV_IEEE_2012, section="40.7.4.1", page="267", + source_type="CABLE", + conditions=["maximum propagation delay of a link segment, 2–100 MHz"], + )) return out def _hdmi_cons(pid: str) -> list[dict[str, Any]]: @@ -1570,10 +1688,10 @@ def build_m0_catalog() -> dict[str, Any]: ETH_CHECKS, _eth_cons(pid, lid), connector=conn, hints=hints, notes=( - "IEEE 802.3-2015 Section One (Clause 14 10BASE-T) and " - "IEEE 802.3-2012 Section Two (Clauses 21–33) on file. " - "1000BASE-T is Clause 40 (Section Three, not here). " - "100 Ω in Clause 14/25 is cabling/link-segment, not PCB Z. " + "IEEE 802.3-2015 Section One (Clause 14 10BASE-T), " + "IEEE 802.3-2012 Section Two (Clauses 21–33), and " + "IEEE 802.3-2012 Section Three (Clause 40 1000BASE-T; Clause 36 1000BASE-X) on file. " + "100 Ω in Clause 14/25/40 is cabling/link-segment, not PCB Z. " "Not auto from RJ45. IEEE vs PHY vs PCB vs magnetics are distinct." ), incomplete=True, diff --git a/periscope/src/backend/periscopex/protocol_data/catalog.json b/periscope/src/backend/periscopex/protocol_data/catalog.json index fb987f5..9cd5cc0 100644 --- a/periscope/src/backend/periscopex/protocol_data/catalog.json +++ b/periscope/src/backend/periscopex/protocol_data/catalog.json @@ -4587,7 +4587,7 @@ "typical": false } ], - "notes": "IEEE 802.3-2015 Section One (Clause 14 10BASE-T) and IEEE 802.3-2012 Section Two (Clauses 21\u201333) on file. 1000BASE-T is Clause 40 (Section Three, not here). 100 \u03a9 in Clause 14/25 is cabling/link-segment, not PCB Z. Not auto from RJ45. IEEE vs PHY vs PCB vs magnetics are distinct.", + "notes": "IEEE 802.3-2015 Section One (Clause 14 10BASE-T), IEEE 802.3-2012 Section Two (Clauses 21\u201333), and IEEE 802.3-2012 Section Three (Clause 40 1000BASE-T; Clause 36 1000BASE-X) on file. 100 \u03a9 in Clause 14/25/40 is cabling/link-segment, not PCB Z. Not auto from RJ45. IEEE vs PHY vs PCB vs magnetics are distinct.", "incomplete": true }, { @@ -4988,7 +4988,7 @@ "typical": false } ], - "notes": "IEEE 802.3-2015 Section One (Clause 14 10BASE-T) and IEEE 802.3-2012 Section Two (Clauses 21\u201333) on file. 1000BASE-T is Clause 40 (Section Three, not here). 100 \u03a9 in Clause 14/25 is cabling/link-segment, not PCB Z. Not auto from RJ45. IEEE vs PHY vs PCB vs magnetics are distinct.", + "notes": "IEEE 802.3-2015 Section One (Clause 14 10BASE-T), IEEE 802.3-2012 Section Two (Clauses 21\u201333), and IEEE 802.3-2012 Section Three (Clause 40 1000BASE-T; Clause 36 1000BASE-X) on file. 100 \u03a9 in Clause 14/25/40 is cabling/link-segment, not PCB Z. Not auto from RJ45. IEEE vs PHY vs PCB vs magnetics are distinct.", "incomplete": true }, { @@ -5028,17 +5028,26 @@ { "id": "1000base-t-mdi-data_rate", "parameter": "data_rate", - "value_kind": "UNKNOWN", + "value_kind": "NUMERIC", "mandatory": "MANDATORY", "source_type": "STANDARD", "source_class": "NORMATIVE", - "value": null, - "unit": null, - "source": null, - "conditions": [], + "value": 1000.0, + "unit": "Mb/s", + "source": { + "document": "IEEE Std 802.3-2012 IEEE Standard for Ethernet", + "organization": "IEEE", + "revision": "2012", + "section": "40.1", + "table": null, + "page": "179" + }, + "conditions": [ + "1000BASE-T PHY over four pairs", + "Section Three Clause 40" + ], "value_origin": "SPEC", - "typical": false, - "needed_document": "IEEE Std 802.3-2015 Section One does not contain Clause 40 (1000BASE-T); need 802.3 Section Three" + "typical": false }, { "id": "1000base-t-mdi-signaling", @@ -5053,7 +5062,7 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2015 Section One does not contain Clause 40 (1000BASE-T); need 802.3 Section Three" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 40 (this 1000BASE-T PCB field is not a single number here; 100 \u03a9 is Class D link-segment / 100 \u03a9 test load, not PCB Zdiff)" }, { "id": "1000base-t-mdi-differential_impedance", @@ -5068,7 +5077,7 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2015 Section One does not contain Clause 40 (1000BASE-T); need 802.3 Section Three" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 40 (this 1000BASE-T PCB field is not a single number here; 100 \u03a9 is Class D link-segment / 100 \u03a9 test load, not PCB Zdiff)" }, { "id": "1000base-t-mdi-impedance_tolerance", @@ -5083,7 +5092,7 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2015 Section One does not contain Clause 40 (1000BASE-T); need 802.3 Section Three" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 40 (this 1000BASE-T PCB field is not a single number here; 100 \u03a9 is Class D link-segment / 100 \u03a9 test load, not PCB Zdiff)" }, { "id": "1000base-t-mdi-intra_pair_skew", @@ -5098,37 +5107,55 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2015 Section One does not contain Clause 40 (1000BASE-T); need 802.3 Section Three" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 40 (this 1000BASE-T PCB field is not a single number here; 100 \u03a9 is Class D link-segment / 100 \u03a9 test load, not PCB Zdiff)" }, { "id": "1000base-t-mdi-pair_to_pair_skew", "parameter": "pair_to_pair_skew", - "value_kind": "UNKNOWN", + "value_kind": "NUMERIC", "mandatory": "MANDATORY", - "source_type": "STANDARD", + "source_type": "CABLE", "source_class": "NORMATIVE", - "value": null, - "unit": null, - "source": null, - "conditions": [], + "value": 50.0, + "unit": "ns", + "source": { + "document": "IEEE Std 802.3-2012 IEEE Standard for Ethernet", + "organization": "IEEE", + "revision": "2012", + "section": "40.7.4.2", + "table": null, + "page": "267" + }, + "conditions": [ + "link-segment pair-to-pair skew maximum, 2\u2013100 MHz" + ], "value_origin": "SPEC", - "typical": false, - "needed_document": "IEEE Std 802.3-2015 Section One does not contain Clause 40 (1000BASE-T); need 802.3 Section Three" + "typical": false }, { "id": "1000base-t-mdi-maximum_channel_length", "parameter": "maximum_channel_length", - "value_kind": "UNKNOWN", + "value_kind": "NUMERIC", "mandatory": "MANDATORY", - "source_type": "STANDARD", + "source_type": "CABLE", "source_class": "NORMATIVE", - "value": null, - "unit": null, - "source": null, - "conditions": [], + "value": 100.0, + "unit": "m", + "source": { + "document": "IEEE Std 802.3-2012 IEEE Standard for Ethernet", + "organization": "IEEE", + "revision": "2012", + "section": "40.7.2", + "table": null, + "page": "265" + }, + "conditions": [ + "Class D link segment of up to at least 100 m", + "4-pair Category 5 / Class D as in 40.7", + "not a PCB trace length" + ], "value_origin": "SPEC", - "typical": false, - "needed_document": "IEEE Std 802.3-2015 Section One does not contain Clause 40 (1000BASE-T); need 802.3 Section Three" + "typical": false }, { "id": "1000base-t-mdi-insertion_loss", @@ -5143,22 +5170,33 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2015 Section One does not contain Clause 40 (1000BASE-T); need 802.3 Section Three" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 40 (this 1000BASE-T PCB field is not a single number here; 100 \u03a9 is Class D link-segment / 100 \u03a9 test load, not PCB Zdiff)" }, { "id": "1000base-t-mdi-return_loss", "parameter": "return_loss", - "value_kind": "UNKNOWN", + "value_kind": "NUMERIC", "mandatory": "MANDATORY", - "source_type": "STANDARD", + "source_type": "PHY", "source_class": "NORMATIVE", - "value": null, - "unit": null, - "source": null, - "conditions": [], + "value": 16.0, + "unit": "dB", + "source": { + "document": "IEEE Std 802.3-2012 IEEE Standard for Ethernet", + "organization": "IEEE", + "revision": "2012", + "section": "40.8.3.1", + "table": null, + "page": "270" + }, + "conditions": [ + "MDI differential: reflection attenuated at least 16 dB", + "1.0 MHz to 40 MHz vs 100 \u03a9 \u00b1 15% cabling", + "40\u2013100 MHz is a frequency-dependent formula (not packed)", + "not a PCB trace Zdiff number" + ], "value_origin": "SPEC", - "typical": false, - "needed_document": "IEEE Std 802.3-2015 Section One does not contain Clause 40 (1000BASE-T); need 802.3 Section Three" + "typical": false }, { "id": "1000base-t-mdi-crosstalk", @@ -5173,7 +5211,7 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2015 Section One does not contain Clause 40 (1000BASE-T); need 802.3 Section Three" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 40 (this 1000BASE-T PCB field is not a single number here; 100 \u03a9 is Class D link-segment / 100 \u03a9 test load, not PCB Zdiff)" }, { "id": "1000base-t-mdi-magnetics_requirements", @@ -5203,7 +5241,7 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2015 Section One does not contain Clause 40 (1000BASE-T); need 802.3 Section Three" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 40 (this 1000BASE-T PCB field is not a single number here; 100 \u03a9 is Class D link-segment / 100 \u03a9 test load, not PCB Zdiff)" }, { "id": "1000base-t-mdi-common_mode", @@ -5218,7 +5256,7 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2015 Section One does not contain Clause 40 (1000BASE-T); need 802.3 Section Three" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 40 (this 1000BASE-T PCB field is not a single number here; 100 \u03a9 is Class D link-segment / 100 \u03a9 test load, not PCB Zdiff)" }, { "id": "1000base-t-mdi-connector_requirements", @@ -5233,7 +5271,7 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2015 Section One does not contain Clause 40 (1000BASE-T); need 802.3 Section Three" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 40 (this 1000BASE-T PCB field is not a single number here; 100 \u03a9 is Class D link-segment / 100 \u03a9 test load, not PCB Zdiff)" }, { "id": "1000base-t-mdi-phy_requirements", @@ -5263,7 +5301,7 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2015 Section One does not contain Clause 40 (1000BASE-T); need 802.3 Section Three" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 40 (this 1000BASE-T PCB field is not a single number here; 100 \u03a9 is Class D link-segment / 100 \u03a9 test load, not PCB Zdiff)" }, { "id": "1000base-t-mdi-vias", @@ -5278,7 +5316,7 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2015 Section One does not contain Clause 40 (1000BASE-T); need 802.3 Section Three" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 40 (this 1000BASE-T PCB field is not a single number here; 100 \u03a9 is Class D link-segment / 100 \u03a9 test load, not PCB Zdiff)" }, { "id": "1000base-t-mdi-topology", @@ -5293,25 +5331,132 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2015 Section One does not contain Clause 40 (1000BASE-T); need 802.3 Section Three" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 40 (this 1000BASE-T PCB field is not a single number here; 100 \u03a9 is Class D link-segment / 100 \u03a9 test load, not PCB Zdiff)" }, { "id": "1000base-t-mdi-cable_channel", "parameter": "cable_channel", - "value_kind": "UNKNOWN", + "value_kind": "NUMERIC", + "mandatory": "MANDATORY", + "source_type": "CABLE", + "source_class": "NORMATIVE", + "value": 100.0, + "unit": "ohm", + "source": { + "document": "IEEE Std 802.3-2012 IEEE Standard for Ethernet", + "organization": "IEEE", + "revision": "2012", + "section": "40.7.2.2", + "table": null, + "page": "265" + }, + "conditions": [ + "nominal differential characteristic impedance of each duplex channel", + "100 \u03a9, 1 MHz to 100 MHz, including cords and connecting hardware", + "not a PCB trace differential impedance" + ], + "value_origin": "SPEC", + "typical": false + }, + { + "id": "1000base-t-mdi-isolation_after_test", + "parameter": "isolation_after_test", + "value_kind": "NUMERIC", "mandatory": "MANDATORY", "source_type": "STANDARD", "source_class": "NORMATIVE", - "value": null, - "unit": null, - "source": null, - "conditions": [], + "value": 2000000.0, + "unit": "ohm", + "source": { + "document": "IEEE Std 802.3-2012 IEEE Standard for Ethernet", + "organization": "IEEE", + "revision": "2012", + "section": "40.6.1.1", + "table": null, + "page": "243" + }, + "conditions": [ + "PHY MDI that is not a PI", + "resistance after isolation test, measured at 500 V dc", + "minimum 2 M\u03a9" + ], "value_origin": "SPEC", - "typical": false, - "needed_document": "IEEE Std 802.3-2015 Section One does not contain Clause 40 (1000BASE-T); need 802.3 Section Three" + "typical": false + }, + { + "id": "1000base-t-mdi-isolation_rms", + "parameter": "isolation_rms", + "value_kind": "NUMERIC", + "mandatory": "OPTIONAL", + "source_type": "STANDARD", + "source_class": "NORMATIVE", + "value": 1500.0, + "unit": "V", + "source": { + "document": "IEEE Std 802.3-2012 IEEE Standard for Ethernet", + "organization": "IEEE", + "revision": "2012", + "section": "40.6.1.1 a", + "table": null, + "page": "243" + }, + "conditions": [ + "one of three allowed isolation tests", + "1500 V rms at 50 Hz to 60 Hz for 60 s" + ], + "value_origin": "SPEC", + "typical": false + }, + { + "id": "1000base-t-mdi-peak_differential_output", + "parameter": "peak_differential_output", + "value_kind": "NUMERIC", + "mandatory": "MANDATORY", + "source_type": "PHY", + "source_class": "NORMATIVE", + "value": 0.67, + "unit": "V", + "source": { + "document": "IEEE Std 802.3-2012 IEEE Standard for Ethernet", + "organization": "IEEE", + "revision": "2012", + "section": "40.6.1.2.1", + "table": null, + "page": "251" + }, + "conditions": [ + "MDI peak at template points A and B in test mode 1", + "0.67\u20130.82 V (0.75 V \u00b1 0.83 dB)", + "transmitter test fixture 1, no intervening cable" + ], + "value_origin": "SPEC", + "typical": false + }, + { + "id": "1000base-t-mdi-link_segment_delay_max", + "parameter": "link_segment_delay_max", + "value_kind": "NUMERIC", + "mandatory": "MANDATORY", + "source_type": "CABLE", + "source_class": "NORMATIVE", + "value": 570.0, + "unit": "ns", + "source": { + "document": "IEEE Std 802.3-2012 IEEE Standard for Ethernet", + "organization": "IEEE", + "revision": "2012", + "section": "40.7.4.1", + "table": null, + "page": "267" + }, + "conditions": [ + "maximum propagation delay of a link segment, 2\u2013100 MHz" + ], + "value_origin": "SPEC", + "typical": false } ], - "notes": "IEEE 802.3-2015 Section One (Clause 14 10BASE-T) and IEEE 802.3-2012 Section Two (Clauses 21\u201333) on file. 1000BASE-T is Clause 40 (Section Three, not here). 100 \u03a9 in Clause 14/25 is cabling/link-segment, not PCB Z. Not auto from RJ45. IEEE vs PHY vs PCB vs magnetics are distinct.", + "notes": "IEEE 802.3-2015 Section One (Clause 14 10BASE-T), IEEE 802.3-2012 Section Two (Clauses 21\u201333), and IEEE 802.3-2012 Section Three (Clause 40 1000BASE-T; Clause 36 1000BASE-X) on file. 100 \u03a9 in Clause 14/25/40 is cabling/link-segment, not PCB Z. Not auto from RJ45. IEEE vs PHY vs PCB vs magnetics are distinct.", "incomplete": true }, { @@ -5633,7 +5778,7 @@ "needed_document": "IEEE 802.3bz / later 802.3 2.5GBASE-T clause (not in 2012 Section Two)" } ], - "notes": "IEEE 802.3-2015 Section One (Clause 14 10BASE-T) and IEEE 802.3-2012 Section Two (Clauses 21\u201333) on file. 1000BASE-T is Clause 40 (Section Three, not here). 100 \u03a9 in Clause 14/25 is cabling/link-segment, not PCB Z. Not auto from RJ45. IEEE vs PHY vs PCB vs magnetics are distinct.", + "notes": "IEEE 802.3-2015 Section One (Clause 14 10BASE-T), IEEE 802.3-2012 Section Two (Clauses 21\u201333), and IEEE 802.3-2012 Section Three (Clause 40 1000BASE-T; Clause 36 1000BASE-X) on file. 100 \u03a9 in Clause 14/25/40 is cabling/link-segment, not PCB Z. Not auto from RJ45. IEEE vs PHY vs PCB vs magnetics are distinct.", "incomplete": true }, { @@ -5954,7 +6099,7 @@ "needed_document": "IEEE 802.3bz / later 802.3 5GBASE-T clause (not in 2012 Section Two)" } ], - "notes": "IEEE 802.3-2015 Section One (Clause 14 10BASE-T) and IEEE 802.3-2012 Section Two (Clauses 21\u201333) on file. 1000BASE-T is Clause 40 (Section Three, not here). 100 \u03a9 in Clause 14/25 is cabling/link-segment, not PCB Z. Not auto from RJ45. IEEE vs PHY vs PCB vs magnetics are distinct.", + "notes": "IEEE 802.3-2015 Section One (Clause 14 10BASE-T), IEEE 802.3-2012 Section Two (Clauses 21\u201333), and IEEE 802.3-2012 Section Three (Clause 40 1000BASE-T; Clause 36 1000BASE-X) on file. 100 \u03a9 in Clause 14/25/40 is cabling/link-segment, not PCB Z. Not auto from RJ45. IEEE vs PHY vs PCB vs magnetics are distinct.", "incomplete": true }, { @@ -6275,7 +6420,7 @@ "needed_document": "IEEE Std 802.3-2012 Section Four Clause 55 (10GBASE-T; not in Section Two)" } ], - "notes": "IEEE 802.3-2015 Section One (Clause 14 10BASE-T) and IEEE 802.3-2012 Section Two (Clauses 21\u201333) on file. 1000BASE-T is Clause 40 (Section Three, not here). 100 \u03a9 in Clause 14/25 is cabling/link-segment, not PCB Z. Not auto from RJ45. IEEE vs PHY vs PCB vs magnetics are distinct.", + "notes": "IEEE 802.3-2015 Section One (Clause 14 10BASE-T), IEEE 802.3-2012 Section Two (Clauses 21\u201333), and IEEE 802.3-2012 Section Three (Clause 40 1000BASE-T; Clause 36 1000BASE-X) on file. 100 \u03a9 in Clause 14/25/40 is cabling/link-segment, not PCB Z. Not auto from RJ45. IEEE vs PHY vs PCB vs magnetics are distinct.", "incomplete": true }, { @@ -6596,7 +6741,7 @@ "needed_document": "SGMII is not an IEEE 802.3 MDI clause in 2012 Section Two" } ], - "notes": "IEEE 802.3-2015 Section One (Clause 14 10BASE-T) and IEEE 802.3-2012 Section Two (Clauses 21\u201333) on file. 1000BASE-T is Clause 40 (Section Three, not here). 100 \u03a9 in Clause 14/25 is cabling/link-segment, not PCB Z. Not auto from RJ45. IEEE vs PHY vs PCB vs magnetics are distinct.", + "notes": "IEEE 802.3-2015 Section One (Clause 14 10BASE-T), IEEE 802.3-2012 Section Two (Clauses 21\u201333), and IEEE 802.3-2012 Section Three (Clause 40 1000BASE-T; Clause 36 1000BASE-X) on file. 100 \u03a9 in Clause 14/25/40 is cabling/link-segment, not PCB Z. Not auto from RJ45. IEEE vs PHY vs PCB vs magnetics are distinct.", "incomplete": true }, { @@ -6635,17 +6780,26 @@ { "id": "1000base-x-pcb-data_rate", "parameter": "data_rate", - "value_kind": "UNKNOWN", + "value_kind": "NUMERIC", "mandatory": "MANDATORY", "source_type": "STANDARD", "source_class": "NORMATIVE", - "value": null, - "unit": null, - "source": null, - "conditions": [], + "value": 1000.0, + "unit": "Mb/s", + "source": { + "document": "IEEE Std 802.3-2012 IEEE Standard for Ethernet", + "organization": "IEEE", + "revision": "2012", + "section": "36.1.1", + "table": null, + "page": "53" + }, + "conditions": [ + "1000BASE-X family PCS/PMA", + "Section Three Clause 36" + ], "value_origin": "SPEC", - "typical": false, - "needed_document": "IEEE Std 802.3-2012 Section Three (1000BASE-X; not in Section Two)" + "typical": false }, { "id": "1000base-x-pcb-signaling", @@ -6660,22 +6814,23 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2012 Section Three (1000BASE-X; not in Section Two)" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 36 (1000BASE-X PCS/PMA). Optical PMD is Clause 38; 1000BASE-CX copper is Clause 39 \u2014 this PCB field is not a single number" }, { "id": "1000base-x-pcb-differential_impedance", "parameter": "differential_impedance", - "value_kind": "UNKNOWN", - "mandatory": "MANDATORY", + "value_kind": "NOT_APPLICABLE", + "mandatory": "INFORMATIONAL", "source_type": "STANDARD", "source_class": "NORMATIVE", "value": null, "unit": null, "source": null, - "conditions": [], + "conditions": [ + "optical 1000BASE-X PMD is Clause 38; 1000BASE-CX copper is Clause 39" + ], "value_origin": "SPEC", - "typical": false, - "needed_document": "IEEE Std 802.3-2012 Section Three (1000BASE-X; not in Section Two)" + "typical": false }, { "id": "1000base-x-pcb-impedance_tolerance", @@ -6690,7 +6845,7 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2012 Section Three (1000BASE-X; not in Section Two)" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 36 (1000BASE-X PCS/PMA). Optical PMD is Clause 38; 1000BASE-CX copper is Clause 39 \u2014 this PCB field is not a single number" }, { "id": "1000base-x-pcb-intra_pair_skew", @@ -6705,7 +6860,7 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2012 Section Three (1000BASE-X; not in Section Two)" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 36 (1000BASE-X PCS/PMA). Optical PMD is Clause 38; 1000BASE-CX copper is Clause 39 \u2014 this PCB field is not a single number" }, { "id": "1000base-x-pcb-pair_to_pair_skew", @@ -6720,7 +6875,7 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2012 Section Three (1000BASE-X; not in Section Two)" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 36 (1000BASE-X PCS/PMA). Optical PMD is Clause 38; 1000BASE-CX copper is Clause 39 \u2014 this PCB field is not a single number" }, { "id": "1000base-x-pcb-maximum_channel_length", @@ -6735,7 +6890,7 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2012 Section Three (1000BASE-X; not in Section Two)" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 36 (1000BASE-X PCS/PMA). Optical PMD is Clause 38; 1000BASE-CX copper is Clause 39 \u2014 this PCB field is not a single number" }, { "id": "1000base-x-pcb-insertion_loss", @@ -6750,7 +6905,7 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2012 Section Three (1000BASE-X; not in Section Two)" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 36 (1000BASE-X PCS/PMA). Optical PMD is Clause 38; 1000BASE-CX copper is Clause 39 \u2014 this PCB field is not a single number" }, { "id": "1000base-x-pcb-return_loss", @@ -6765,7 +6920,7 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2012 Section Three (1000BASE-X; not in Section Two)" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 36 (1000BASE-X PCS/PMA). Optical PMD is Clause 38; 1000BASE-CX copper is Clause 39 \u2014 this PCB field is not a single number" }, { "id": "1000base-x-pcb-crosstalk", @@ -6780,7 +6935,7 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2012 Section Three (1000BASE-X; not in Section Two)" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 36 (1000BASE-X PCS/PMA). Optical PMD is Clause 38; 1000BASE-CX copper is Clause 39 \u2014 this PCB field is not a single number" }, { "id": "1000base-x-pcb-magnetics_requirements", @@ -6810,7 +6965,7 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2012 Section Three (1000BASE-X; not in Section Two)" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 36 (1000BASE-X PCS/PMA). Optical PMD is Clause 38; 1000BASE-CX copper is Clause 39 \u2014 this PCB field is not a single number" }, { "id": "1000base-x-pcb-common_mode", @@ -6825,7 +6980,7 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2012 Section Three (1000BASE-X; not in Section Two)" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 36 (1000BASE-X PCS/PMA). Optical PMD is Clause 38; 1000BASE-CX copper is Clause 39 \u2014 this PCB field is not a single number" }, { "id": "1000base-x-pcb-connector_requirements", @@ -6840,7 +6995,7 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2012 Section Three (1000BASE-X; not in Section Two)" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 36 (1000BASE-X PCS/PMA). Optical PMD is Clause 38; 1000BASE-CX copper is Clause 39 \u2014 this PCB field is not a single number" }, { "id": "1000base-x-pcb-phy_requirements", @@ -6870,7 +7025,7 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2012 Section Three (1000BASE-X; not in Section Two)" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 36 (1000BASE-X PCS/PMA). Optical PMD is Clause 38; 1000BASE-CX copper is Clause 39 \u2014 this PCB field is not a single number" }, { "id": "1000base-x-pcb-vias", @@ -6885,7 +7040,7 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2012 Section Three (1000BASE-X; not in Section Two)" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 36 (1000BASE-X PCS/PMA). Optical PMD is Clause 38; 1000BASE-CX copper is Clause 39 \u2014 this PCB field is not a single number" }, { "id": "1000base-x-pcb-topology", @@ -6900,7 +7055,7 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2012 Section Three (1000BASE-X; not in Section Two)" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 36 (1000BASE-X PCS/PMA). Optical PMD is Clause 38; 1000BASE-CX copper is Clause 39 \u2014 this PCB field is not a single number" }, { "id": "1000base-x-pcb-cable_channel", @@ -6915,10 +7070,10 @@ "conditions": [], "value_origin": "SPEC", "typical": false, - "needed_document": "IEEE Std 802.3-2012 Section Three (1000BASE-X; not in Section Two)" + "needed_document": "IEEE Std 802.3-2012 Section Three Clause 36 (1000BASE-X PCS/PMA). Optical PMD is Clause 38; 1000BASE-CX copper is Clause 39 \u2014 this PCB field is not a single number" } ], - "notes": "IEEE 802.3-2015 Section One (Clause 14 10BASE-T) and IEEE 802.3-2012 Section Two (Clauses 21\u201333) on file. 1000BASE-T is Clause 40 (Section Three, not here). 100 \u03a9 in Clause 14/25 is cabling/link-segment, not PCB Z. Not auto from RJ45. IEEE vs PHY vs PCB vs magnetics are distinct.", + "notes": "IEEE 802.3-2015 Section One (Clause 14 10BASE-T), IEEE 802.3-2012 Section Two (Clauses 21\u201333), and IEEE 802.3-2012 Section Three (Clause 40 1000BASE-T; Clause 36 1000BASE-X) on file. 100 \u03a9 in Clause 14/25/40 is cabling/link-segment, not PCB Z. Not auto from RJ45. IEEE vs PHY vs PCB vs magnetics are distinct.", "incomplete": true }, { @@ -7249,7 +7404,7 @@ "needed_document": "ISO/IEC 9314-3:1990 fiber-PMD (incorporated by IEEE 802.3-2012 Clause 26; optical MDI, not copper PCB ohms)" } ], - "notes": "IEEE 802.3-2015 Section One (Clause 14 10BASE-T) and IEEE 802.3-2012 Section Two (Clauses 21\u201333) on file. 1000BASE-T is Clause 40 (Section Three, not here). 100 \u03a9 in Clause 14/25 is cabling/link-segment, not PCB Z. Not auto from RJ45. IEEE vs PHY vs PCB vs magnetics are distinct.", + "notes": "IEEE 802.3-2015 Section One (Clause 14 10BASE-T), IEEE 802.3-2012 Section Two (Clauses 21\u201333), and IEEE 802.3-2012 Section Three (Clause 40 1000BASE-T; Clause 36 1000BASE-X) on file. 100 \u03a9 in Clause 14/25/40 is cabling/link-segment, not PCB Z. Not auto from RJ45. IEEE vs PHY vs PCB vs magnetics are distinct.", "incomplete": true }, { @@ -7571,7 +7726,7 @@ "needed_document": "IEEE 802.3 10GBASE-R clauses (not in 2012 Section Two)" } ], - "notes": "IEEE 802.3-2015 Section One (Clause 14 10BASE-T) and IEEE 802.3-2012 Section Two (Clauses 21\u201333) on file. 1000BASE-T is Clause 40 (Section Three, not here). 100 \u03a9 in Clause 14/25 is cabling/link-segment, not PCB Z. Not auto from RJ45. IEEE vs PHY vs PCB vs magnetics are distinct.", + "notes": "IEEE 802.3-2015 Section One (Clause 14 10BASE-T), IEEE 802.3-2012 Section Two (Clauses 21\u201333), and IEEE 802.3-2012 Section Three (Clause 40 1000BASE-T; Clause 36 1000BASE-X) on file. 100 \u03a9 in Clause 14/25/40 is cabling/link-segment, not PCB Z. Not auto from RJ45. IEEE vs PHY vs PCB vs magnetics are distinct.", "incomplete": true }, { diff --git a/periscope/src/frontend/content/changelog.md b/periscope/src/frontend/content/changelog.md index cfa3e4f..45e5094 100644 --- a/periscope/src/frontend/content/changelog.md +++ b/periscope/src/frontend/content/changelog.md @@ -2,6 +2,13 @@ What's new in Periscope. +## 2.78.0 — 2026-09-22 — 1000BASE-T from IEEE 802.3-2012 Section Three + +IEEE Std 802.3-2012 Section Three Clause 40 fills 1000BASE-T: 1000 Mb/s, 100 m Class D link, cable 100 Ω, MDI return loss 16 dB (1–40 MHz), pair skew 50 ns, isolation 2 MΩ / 1500 V rms, MDI peak 0.67 V, link delay 570 ns. Cable 100 Ω is **CABLE**; L2 PCB Zdiff stays UNKNOWN. Clause 36 fills 1000BASE-X 1000 Mb/s (optical Zdiff N/A). Insertion-loss formula not packed as a single dB. + +- [Changed] `protocol_catalog.py` + `catalog.json`. +- [Changed] pytest `tests/pcb/test_protocol_pdf_pack.py`, `test_protocol_m6_m7.py`. + ## 2.77.0 — 2026-09-22 — 10BASE-T from IEEE 802.3-2015 Section One IEEE Std 802.3-2015 Section One Clause 14 fills 10BASE-T: 10 Mb/s, 100 m design-objective link, cable 100 Ω ± 15 Ω, 11.5 dB link insertion loss, MAU TD return loss 15 dB, isolation 2 MΩ / 1500 V rms, TD peak 2.2 V. Cable 100 Ω is **CABLE**, not L2 PCB Zdiff. 1000BASE-T (Clause 40) is not in this volume. diff --git a/periscope/src/frontend/package.json b/periscope/src/frontend/package.json index 9e04408..62615b3 100644 --- a/periscope/src/frontend/package.json +++ b/periscope/src/frontend/package.json @@ -1,6 +1,6 @@ { "name": "periscope-web", - "version": "2.77.0", + "version": "2.78.0", "private": true, "scripts": { "sync-version": "node scripts/sync-version.mjs", diff --git a/tests/pcb/test_protocol_m6_m7.py b/tests/pcb/test_protocol_m6_m7.py index b22340b..8e13a73 100644 --- a/tests/pcb/test_protocol_m6_m7.py +++ b/tests/pcb/test_protocol_m6_m7.py @@ -209,8 +209,8 @@ def test_mini_hdmi_is_connector_not_protocol_id(): def test_ethernet_hdmi_skeletons_unknown_needed_document(): cat = load_catalog() for lid in ( - "1000base-t", "2.5gbase-t", "5gbase-t", - "10gbase-t", "sgmii", "1000base-x", "10gbase-r", + "2.5gbase-t", "5gbase-t", + "10gbase-t", "sgmii", "10gbase-r", "hdmi-1.4", "hdmi-2.0", "hdmi-frl", ): ifaces = [p for p in cat.physical_interfaces if p.logical_protocol_id == lid] diff --git a/tests/pcb/test_protocol_pdf_pack.py b/tests/pcb/test_protocol_pdf_pack.py index d797076..ebdfe8f 100644 --- a/tests/pcb/test_protocol_pdf_pack.py +++ b/tests/pcb/test_protocol_pdf_pack.py @@ -203,10 +203,25 @@ def test_ieee8023_section2_100base_tx_not_10base_or_1000(): assert tby["differential_impedance"].value_kind == "UNKNOWN" assert "PCB" in (tby["differential_impedance"].needed_document or "") gbe = next(p for p in cat.physical_interfaces if p.id == "1000base-t-mdi") - gdr = next(c for c in gbe.constraints if c.parameter == "data_rate") - assert gdr.value_kind == "UNKNOWN" - assert "Clause 40" in (gdr.needed_document or "") - assert gdr.value is None + gby = {c.parameter: c for c in gbe.constraints} + _cite_ok(gby["data_rate"]) + assert gby["data_rate"].value == 1000.0 + assert gby["data_rate"].source.revision == "2012" + assert gby["data_rate"].source.section == "40.1" + assert gby["data_rate"].source.page == "179" + _cite_ok(gby["cable_channel"]) + assert gby["cable_channel"].value == 100.0 + assert gby["cable_channel"].source_type == "CABLE" + assert gby["cable_channel"].source.section == "40.7.2.2" + assert gby["differential_impedance"].value_kind == "UNKNOWN" + _cite_ok(gby["peak_differential_output"]) + assert gby["peak_differential_output"].value == 0.67 + assert gby["peak_differential_output"].source_type == "PHY" + x = next(p for p in cat.physical_interfaces if p.id == "1000base-x-pcb") + xr = next(c for c in x.constraints if c.parameter == "data_rate") + _cite_ok(xr) + assert xr.value == 1000.0 + assert xr.source.section == "36.1.1" fx = next(p for p in cat.physical_interfaces if p.id == "100base-fx-pcb") fxr = next(c for c in fx.constraints if c.parameter == "data_rate") _cite_ok(fxr)