landpattern module#

NFVI1369 BGA land pattern for the AMD Versal Premium VP1002.

Ground truth

AM013 “Versal Adaptive SoC Packaging and Pinouts”, a living document at a stable URL. Cite by caption, not by number — the figure and table numbers move between editions, and a stale number still resolves, to a different package’s diagram, which looks entirely plausible. The captions below are stable; see AM013_MECHANICAL_FIGURE and AM013_LAND_TABLE for the edition each number below was read from.

  • The figure captioned “Package Dimensions for NFVI1369 (VP1002 and VP1052)” — body D/E = 35.00 BASIC, overall height A = 3.43/3.63/3.83, ball matrix M = 37, ball pitch e = 0.92 BASIC, ball array extent D1/E1 = 33.12 BASIC (= 36 x 0.92), physical ball diameter b = 0.50/0.64/0.70.

  • The table captioned “BGA Package Design Rules” — for 0.92 mm pitch the maximum PCB solder land (L) diameter is 0.51 mm (NSMD), with a 0.61 mm solder-mask opening.

What ball_diameter means here

The jitxlib BGA generator’s ball_diameter argument sets the copper land diameter of the PCB pad, not the physical solder-ball size. We therefore pass the design-rule table’s 0.51 mm land, not the mechanical drawing’s 0.64 mm nominal ball – the two sit near each other in the document and only one of them is a PCB dimension. Solder mask and paste follow SMDPadConfig defaults (mask expansion comes from the substrate’s registration constraints at build time; AM013’s 0.61 mm mask-opening target is noted for real boards).

Framework boundary

VersalBGA.get_pad is the public (row, column) -> Pad adapter over the framework-internal _get_pad, following jitxexamples.demos.si_bga_optimization.generic_bga. Rows are zero-indexed in BGA letter order (A=0 … AU=36, skipping I/O/Q/S/X/Z); columns are zero-indexed too, matching the generated coordinates (A1 = get_pad(0, 0)); the framework’s 1-based column offset lives inside the adapter.

class PackageSpec(code, num_rows, num_cols, pitch, land_diameter, body_size, height_min, height_max)[source]#

Bases: object

One Versal package option, as read from AM013.

Parameters:
code: str#
num_rows: int#
num_cols: int#
pitch: float#
land_diameter: float#
body_size: float#
height_min: float#
height_max: float#
class VersalBGA(*args, **kwargs)[source]#

Bases: BGA

Stock BGA generator plus a public pad-lookup adapter.

get_pad(row, column)[source]#

Public (row, column) -> Pad lookup, both zero-indexed.

Takes the same coordinates the generated module carries, so ball “A1” is get_pad(0, 0). The framework numbers columns from 1; that + 1 lives here and nowhere else, which is the point of the adapter — a caller-side conversion would put the same off-by-one at every call site. Also wraps the framework-internal _get_pad so design code stays clear of leading-underscore access and of the numbering mixin’s row-letter attribute layout.

Parameters:
make_landpattern(spec=PackageSpec(code='nfvi1369', num_rows=37, num_cols=37, pitch=0.92, land_diameter=0.51, body_size=35.0, height_min=3.43, height_max=3.83))[source]#

Build the land pattern for a full-grid Versal BGA package.

Return type:

VersalBGA

Parameters:

spec (PackageSpec)