substrate module#

BGA-escape substrate specialization.

BGAEscapeSubstrate extends the generic 20-layer substrate with the 85 ohm differential stripline routing structure and the per-signal-layer launch profile table (PerSignalLayerSpec), and anchors the antipad fence-via rules defined in constraints into the design tree. The substrate base file stays truly generic; everything BGA-escape-specific attaches here.

class PerSignalLayerSpec(signal_layer, deskew_layer, antipad_layers, upper_ref_fence_pour_layer, upper_ref_fence_tag, deskew_antipad_layers, deskew_antipad_fence_pour_layer, deskew_antipad_fence_tag, split_antipad_layers=None)[source]#

Bases: object

Layer-dependent geometry knobs for one signal-layer launch.

The deskew layer index d is 2 * signal_layer - 1 (Signal1 -> 1, Signal2 -> 3, Signal3 -> 5, Signal4 -> 7). Antipad keepouts span layers in antipad_layers; if split_antipad_layers is set, the keepout on those layers is split into per-via circular cuts instead of a single capsule covering both vias. The signal-via antipad fence pour sits on the upper reference plane (idx d-1); the deskew antipad fence pour sits on the lower reference plane (idx d+1).

Signal1 (d=1) has no upper-reference fence pour (only L1 sits above); those fields are None for that spec.

Parameters:
  • signal_layer (int)

  • deskew_layer (int)

  • antipad_layers (LayerSet)

  • upper_ref_fence_pour_layer (int | None)

  • upper_ref_fence_tag (type | None)

  • deskew_antipad_layers (LayerSet)

  • deskew_antipad_fence_pour_layer (int)

  • deskew_antipad_fence_tag (type)

  • split_antipad_layers (LayerSet | None)

signal_layer: int#
deskew_layer: int#
antipad_layers: LayerSet#
upper_ref_fence_pour_layer: int | None#
upper_ref_fence_tag: type | None#
deskew_antipad_layers: LayerSet#
deskew_antipad_fence_pour_layer: int#
deskew_antipad_fence_tag: type#
split_antipad_layers: LayerSet | None = None#
class BGAEscapeSubstrate(*args, **kwargs)[source]#

Bases: Generic_Substrate

Generic 20-layer substrate specialized for the BGA escape design.

Adds the 85 ohm differential stripline routing structure (one entry per signal layer plus its symmetric mirror) and the per-signal-layer launch profile table (queried by each EscapeLane), and anchors the constraints fence-via rules that drive antipad / fence-via generation around the BGA breakout cavity.

DRS_DiffPair_85 = DifferentialRoutingStructure(name='85 ohm Differential Stripline', impedance=<Quantity(85, 'ohm')>, layers={1: Layer(trace_width=0.115, pair_spacing=0.118, clearance=0.05, velocity=173085256304.0608, insertion_loss=0.018).reference(0, 1.0).reference(2, 1.0).reference(1, 1.0).fence(<class 'jitxexamples.substrates.generic_20layer.Generic_Substrate.uFence_L1_L3'>, ViaFencePattern(pitch=0.35, offset=0.43, num_rows=1, min_pitch=None, max_pitch=None, initial_offset=None, input_shape_only=None), reference_layer=2).geometry(<class 'jitx.feature.KeepOut'>, 0.615, layers=<jitx.layerindex.LayerSet object>, pour=True), 3: Layer(trace_width=0.115, pair_spacing=0.118, clearance=0.05, velocity=173085256304.0608, insertion_loss=0.018).reference(2, 1.0).reference(4, 1.0).reference(3, 1.0).fence(<class 'jitxexamples.substrates.generic_20layer.Generic_Substrate.uFence_L3_L5'>, ViaFencePattern(pitch=0.35, offset=0.43, num_rows=1, min_pitch=None, max_pitch=None, initial_offset=None, input_shape_only=None), reference_layer=4).geometry(<class 'jitx.feature.KeepOut'>, 0.615, layers=<jitx.layerindex.LayerSet object>, pour=True), 5: Layer(trace_width=0.115, pair_spacing=0.118, clearance=0.05, velocity=173085256304.0608, insertion_loss=0.018).reference(4, 1.0).reference(6, 1.0).reference(5, 1.0).fence(<class 'jitxexamples.substrates.generic_20layer.Generic_Substrate.uFence_L5_L7'>, ViaFencePattern(pitch=0.35, offset=0.43, num_rows=1, min_pitch=None, max_pitch=None, initial_offset=None, input_shape_only=None), reference_layer=6).geometry(<class 'jitx.feature.KeepOut'>, 0.615, layers=<jitx.layerindex.LayerSet object>, pour=True), 7: Layer(trace_width=0.115, pair_spacing=0.118, clearance=0.05, velocity=173085256304.0608, insertion_loss=0.018).reference(6, 1.0).reference(8, 1.0).reference(7, 1.0).fence(<class 'jitxexamples.substrates.generic_20layer.Generic_Substrate.uFence_L7_L9'>, ViaFencePattern(pitch=0.35, offset=0.43, num_rows=1, min_pitch=None, max_pitch=None, initial_offset=None, input_shape_only=None), reference_layer=8).geometry(<class 'jitx.feature.KeepOut'>, 0.615, layers=<jitx.layerindex.LayerSet object>, pour=True), -2: Layer(trace_width=0.115, pair_spacing=0.118, clearance=0.05, velocity=173085256304.0608, insertion_loss=0.018).reference(-1, 1.0).reference(-3, 1.0).reference(-2, 1.0).fence(<class 'jitxexamples.substrates.generic_20layer.Generic_Substrate.uFence_L18_L20'>, ViaFencePattern(pitch=0.35, offset=0.43, num_rows=1, min_pitch=None, max_pitch=None, initial_offset=None, input_shape_only=None), reference_layer=-3).geometry(<class 'jitx.feature.KeepOut'>, 0.615, layers=<jitx.layerindex.LayerSet object>, pour=True), -4: Layer(trace_width=0.115, pair_spacing=0.118, clearance=0.05, velocity=173085256304.0608, insertion_loss=0.018).reference(-3, 1.0).reference(-5, 1.0).reference(-4, 1.0).fence(<class 'jitxexamples.substrates.generic_20layer.Generic_Substrate.uFence_L16_L18'>, ViaFencePattern(pitch=0.35, offset=0.43, num_rows=1, min_pitch=None, max_pitch=None, initial_offset=None, input_shape_only=None), reference_layer=-5).geometry(<class 'jitx.feature.KeepOut'>, 0.615, layers=<jitx.layerindex.LayerSet object>, pour=True), -6: Layer(trace_width=0.115, pair_spacing=0.118, clearance=0.05, velocity=173085256304.0608, insertion_loss=0.018).reference(-5, 1.0).reference(-7, 1.0).reference(-6, 1.0).fence(<class 'jitxexamples.substrates.generic_20layer.Generic_Substrate.uFence_L14_L16'>, ViaFencePattern(pitch=0.35, offset=0.43, num_rows=1, min_pitch=None, max_pitch=None, initial_offset=None, input_shape_only=None), reference_layer=-7).geometry(<class 'jitx.feature.KeepOut'>, 0.615, layers=<jitx.layerindex.LayerSet object>, pour=True), -8: Layer(trace_width=0.115, pair_spacing=0.118, clearance=0.05, velocity=173085256304.0608, insertion_loss=0.018).reference(-7, 1.0).reference(-9, 1.0).reference(-8, 1.0).fence(<class 'jitxexamples.substrates.generic_20layer.Generic_Substrate.uFence_L12_L14'>, ViaFencePattern(pitch=0.35, offset=0.43, num_rows=1, min_pitch=None, max_pitch=None, initial_offset=None, input_shape_only=None), reference_layer=-9).geometry(<class 'jitx.feature.KeepOut'>, 0.615, layers=<jitx.layerindex.LayerSet object>, pour=True)}, uncoupled_region=RoutingStructure(name='85 ohm Uncoupled (~42 ohm SE)', impedance=<Quantity(42, 'ohm')>, layers={1: Layer(trace_width=0.1, clearance=0.135, velocity=173085256304.0608, insertion_loss=0.018, neck_down=RoutingStructure.NeckDown(trace_width=0.1, clearance=0.135, insertion_loss=None, velocity=None)).reference(0, 1.0).reference(2, 1.0).reference(1, 1.0), 3: Layer(trace_width=0.1, clearance=0.135, velocity=173085256304.0608, insertion_loss=0.018, neck_down=RoutingStructure.NeckDown(trace_width=0.1, clearance=0.135, insertion_loss=None, velocity=None)).reference(2, 1.0).reference(4, 1.0).reference(3, 1.0), 5: Layer(trace_width=0.1, clearance=0.135, velocity=173085256304.0608, insertion_loss=0.018, neck_down=RoutingStructure.NeckDown(trace_width=0.1, clearance=0.135, insertion_loss=None, velocity=None)).reference(4, 1.0).reference(6, 1.0).reference(5, 1.0), 7: Layer(trace_width=0.1, clearance=0.135, velocity=173085256304.0608, insertion_loss=0.018, neck_down=RoutingStructure.NeckDown(trace_width=0.1, clearance=0.135, insertion_loss=None, velocity=None)).reference(6, 1.0).reference(8, 1.0).reference(7, 1.0), -2: Layer(trace_width=0.1, clearance=0.135, velocity=173085256304.0608, insertion_loss=0.018, neck_down=RoutingStructure.NeckDown(trace_width=0.1, clearance=0.135, insertion_loss=None, velocity=None)).reference(0, 1.0).reference(2, 1.0).reference(1, 1.0)._invert(Layer(trace_width=0.1, clearance=0.135, velocity=173085256304.0608, insertion_loss=0.018, neck_down=RoutingStructure.NeckDown(trace_width=0.1, clearance=0.135, insertion_loss=None, velocity=None)).reference(0, 1.0).reference(2, 1.0).reference(1, 1.0)._invert), -4: Layer(trace_width=0.1, clearance=0.135, velocity=173085256304.0608, insertion_loss=0.018, neck_down=RoutingStructure.NeckDown(trace_width=0.1, clearance=0.135, insertion_loss=None, velocity=None)).reference(2, 1.0).reference(4, 1.0).reference(3, 1.0)._invert(Layer(trace_width=0.1, clearance=0.135, velocity=173085256304.0608, insertion_loss=0.018, neck_down=RoutingStructure.NeckDown(trace_width=0.1, clearance=0.135, insertion_loss=None, velocity=None)).reference(2, 1.0).reference(4, 1.0).reference(3, 1.0)._invert), -6: Layer(trace_width=0.1, clearance=0.135, velocity=173085256304.0608, insertion_loss=0.018, neck_down=RoutingStructure.NeckDown(trace_width=0.1, clearance=0.135, insertion_loss=None, velocity=None)).reference(4, 1.0).reference(6, 1.0).reference(5, 1.0)._invert(Layer(trace_width=0.1, clearance=0.135, velocity=173085256304.0608, insertion_loss=0.018, neck_down=RoutingStructure.NeckDown(trace_width=0.1, clearance=0.135, insertion_loss=None, velocity=None)).reference(4, 1.0).reference(6, 1.0).reference(5, 1.0)._invert), -8: Layer(trace_width=0.1, clearance=0.135, velocity=173085256304.0608, insertion_loss=0.018, neck_down=RoutingStructure.NeckDown(trace_width=0.1, clearance=0.135, insertion_loss=None, velocity=None)).reference(6, 1.0).reference(8, 1.0).reference(7, 1.0)._invert(Layer(trace_width=0.1, clearance=0.135, velocity=173085256304.0608, insertion_loss=0.018, neck_down=RoutingStructure.NeckDown(trace_width=0.1, clearance=0.135, insertion_loss=None, velocity=None)).reference(6, 1.0).reference(8, 1.0).reference(7, 1.0)._invert)}))#
signal_via_antipad_fence = UnaryDesignConstraint(AntipadFenceTag, name=None, priority=20).fence_via(FenceVia(definition=<class 'jitxexamples.substrates.generic_20layer.Generic_Substrate.uGnd_L1_L7'>, pattern=ViaFencePattern(pitch=0.35, offset=0.15, num_rows=1, min_pitch=None, max_pitch=None, initial_offset=0.15, input_shape_only=True)))#
signal_via_antipad_fence_g3 = UnaryDesignConstraint(Ground3AntipadFenceTag, name=None, priority=20).fence_via(FenceVia(definition=<class 'jitxexamples.substrates.generic_20layer.Generic_Substrate.uGnd_L1_L5'>, pattern=ViaFencePattern(pitch=0.35, offset=0.15, num_rows=1, min_pitch=None, max_pitch=None, initial_offset=0.15, input_shape_only=True)))#
signal_via_antipad_fence_g2 = UnaryDesignConstraint(Ground2AntipadFenceTag, name=None, priority=9).fence_via(FenceVia(definition=<class 'jitxexamples.substrates.generic_20layer.Generic_Substrate.uGnd_L1_L3'>, pattern=ViaFencePattern(pitch=0.35, offset=0.15, num_rows=1, min_pitch=None, max_pitch=None, initial_offset=0.15, input_shape_only=True)))#
deskew_antipad_fence = UnaryDesignConstraint(DeskewAntipadFenceTag, name=None, priority=10).fence_via(FenceVia(definition=<class 'jitxexamples.substrates.generic_20layer.Generic_Substrate.uFence_L7_L9'>, pattern=ViaFencePattern(pitch=0.35, offset=0.15, num_rows=1, min_pitch=None, max_pitch=None, initial_offset=0.15, input_shape_only=True)))#
deskew_antipad_fence_g4 = UnaryDesignConstraint(Ground4DeskewAntipadFenceTag, name=None, priority=10).fence_via(FenceVia(definition=<class 'jitxexamples.substrates.generic_20layer.Generic_Substrate.uFence_L5_L7'>, pattern=ViaFencePattern(pitch=0.35, offset=0.15, num_rows=1, min_pitch=None, max_pitch=None, initial_offset=0.15, input_shape_only=True)))#
deskew_antipad_fence_g3 = UnaryDesignConstraint(Ground3DeskewAntipadFenceTag, name=None, priority=10).fence_via(FenceVia(definition=<class 'jitxexamples.substrates.generic_20layer.Generic_Substrate.uGnd_L1_L5'>, pattern=ViaFencePattern(pitch=0.35, offset=0.15, num_rows=1, min_pitch=None, max_pitch=None, initial_offset=0.15, input_shape_only=True)))#
deskew_antipad_fence_g2 = UnaryDesignConstraint(Ground2DeskewAntipadFenceTag, name=None, priority=10).fence_via(FenceVia(definition=<class 'jitxexamples.substrates.generic_20layer.Generic_Substrate.uFence_L1_L3'>, pattern=ViaFencePattern(pitch=0.35, offset=0.15, num_rows=1, min_pitch=None, max_pitch=None, initial_offset=0.15, input_shape_only=True)))#
classmethod spec_for_signal_layer(signal_layer)[source]#

Launch profile for a signal layer (1..4).

Return type:

PerSignalLayerSpec

Parameters:

signal_layer (int)