mdi1000base_t module#

MDI - Media Dependent Interface

This module defines the MDI bundle and associated constraint functions for the 1000Base-T Ethernet standard.

Create a 1000Base-T MDI Constraint and apply it between two jacks. The pairs are joined by ordinary nets, and the constraint names the two ends.

>>> class EthernetCircuit(Circuit):
...     def __init__(self):
...         self.ethernet_jack = EthernetJack(), EthernetJack()
...         eth0 = self.ethernet_jack[0].require(MDI1000BaseT)
...         eth1 = self.ethernet_jack[1].require(MDI1000BaseT)
...         self.ethernet = eth0 + eth1
...         self.mdiconstraint = MDI1000BaseT.Constraint()
...         self.mdiconstraint.constrain(eth0, eth1)

Apply it through ESD protection. Each protection channel passes the signal from A to B, so the protection component needs a BridgingPinModel between them; without one the path stops at the protection part.

>>> class EthernetCircuit(Circuit):
...     def __init__(self):
...         self.ethernet_jack = EthernetJack(), EthernetJack()
...         eth0 = self.ethernet_jack[0].require(MDI1000BaseT)
...         eth1 = self.ethernet_jack[1].require(MDI1000BaseT)
...         self.esd_pool = ESDPool(2)
...         self.pairs = []
...         for p in range(4):
...             protected = self.esd_pool.require(DualPair)
...             self.pairs.append((eth0.TP[p] + protected.A, protected.B + eth1.TP[p]))
...         self.mdiconstraint = MDI1000BaseT.Constraint()
...         self.mdiconstraint.constrain(eth0, eth1)

The ends here are require()-ed ports, so a constraint measures only once the pin assignment resolves, for example from code routes on the providing circuit’s physical pins, and the path is routed. Query the design issues with rt.submit(MyDesign).issues(satisfied=True, wait=30) inside with jitx.runtime as rt: and print each report group’s issues to see each measurement, or the issue that stops one; a group’s satisfied flag says whether its constraint is met.

class MDI1000BaseT[source]#

Bases: Port

TP = (DiffPair(), DiffPair(), DiffPair(), DiffPair())#
class Standard[source]#

Bases: object

skew = Toleranced(0, 8e-13, 8e-13)#

Intra pair skew - Allowable delay difference as a Toleranced value in Seconds.

loss = 12#

Max allowable power loss limit in dB.

impedance = Toleranced(95, 14.25, 14.25)#

The expected differential impedance for the differential pairs in Ohms

pair_to_pair_skew = Toleranced(0, 1.65e-10, 1.65e-10)#

Allowable inter-pair delay difference as a Toleranced value in Seconds.

class Constraint(standard=None, structure=None)[source]#

Bases: SignalConstraint[MDI1000BaseT]

Parameters:
diffpair_constraint: DiffPairConstraint#
inter_skew: Toleranced#
constrain(src, dst)[source]#

Called to apply implementation specific constraints. Note that all constraints should be added to the container by calling add() on self. It is valid to just set member attributes as well, as with everything in JITX, but be aware that your constraint may be used multiple times with different topologies, and thus be careful with overwriting values (e.g. some constraints may use a single DiffPairConstraint to constrain all its diff pairs).

Parameters:
class Provide(diffpairs)[source]#

Bases: Container

Construct provider for a 1000Base-T connection.

This constructs a provider for a 1000Base-T (Gigabit) MDI interface. This includes creating the appropriate option mappings for swapping the differential pairs.

>>> self += MDI1000BaseT.Provide(
...     [self.C.TXRX1A, self.C.TXRX1B, self.C.TXRX1C, self.C.TXRX1D]
... )
Parameters:

diffpairs (Sequence[DiffPair] | Sequence[tuple[Port, Port]])