Source code for jitxexamples.components.memories.MT53E1G32D2FW_046_WT_B

"""Micron MT53E1G32D2FW-046 WT:B LPDDR4X/LPDDR4 SDRAM.

32 Gb (4 GB), 1 Gig x 32: two dies, two x16 channels (A and B), dual rank,
in a 200-ball TFBGA, 10 mm x 14.5 mm x 1.1 mm (package code FW).

Source: Micron, *LPDDR4X/LPDDR4 SDRAM* data sheet
(``z42m_embedded_lpddr4x_lpddr4.pdf``, Rev. I, 04/2023),
https://mm.digikey.com/Volume0/opasdata/d220001/medias/docus/8606/z42m-embedded-lpddr4x-lpddr4.pdf.
Checked against it:

- Part number, density and organization: Figure 1 (part number chart) and
  Table 2 (part number list).
- Ball map: Figure 6, "200-Ball Dual-Channel, Dual-Rank Discrete FBGA". Every
  one of the 200 balls is mapped here, including the 12 DNU and 5 NC balls.
- Grid and body: Figure 10, "200-Ball TFBGA - 10mm x 14.5mm x 1.1mm (Package
  Code: FW)": 22 rows at 0.65 mm pitch, 12 columns at 0.8 mm pitch, body
  10 +/-0.1 mm by 14.5 +/-0.1 mm, height 1 +/-0.1 mm. Columns 6 and 7 and
  rows L and M carry no balls.

The data sheet gives the package's ball pads (0.40 mm SMD) but no PCB land
size. The land here is 0.40 mm to match them; check it against your
fabricator's BGA rules.
"""

from jitx import PadMapping
from jitx.component import Component
from jitx.landpattern import Pad
from jitx.net import Port
from jitx.toleranced import Toleranced
from jitxlib.landpatterns.generators.bga import BGA
from jitxlib.landpatterns.grid_layout import GridPosition
from jitxlib.landpatterns.grid_planner import GridPlanner
from jitxlib.landpatterns.package import RectanglePackage
from jitxlib.landpatterns.pads import SMDPadConfig
from jitxlib.symbols.box import BoxSymbol

from jitxexamples.protocols.memory.lpddr4 import LPDDR4, LPDDR4Rank, LPDDR4Width


[docs] class FW200Depopulation(GridPlanner): """No balls in columns 6 and 7 or rows L and M of the 22 x 12 grid."""
[docs] def is_active(self, pos: GridPosition, num_rows: int, num_cols: int) -> bool | None: if pos.column in (5, 6) or pos.row in (10, 11): return False return None
[docs] class FW200Landpattern(BGA): """200-ball TFBGA, package code FW: 12 columns at 0.8 mm, 22 rows at 0.65 mm, columns 6 and 7 and rows L and M empty.""" AA: dict[int, Pad] AB: dict[int, Pad] def __init__(self) -> None: super().__init__( num_rows=22, num_cols=12, ball_diameter=0.40, pitch=(0.8, 0.65) ) self.pad_config(SMDPadConfig()) self.grid_planner(FW200Depopulation()) self.package_body( RectanglePackage( width=Toleranced(10.0, 0.1), length=Toleranced(14.5, 0.1), height=Toleranced(1.0, 0.1), ) )
[docs] class MT53E1G32D2FW_046_WT_B(Component): """Micron MT53E1G32D2FW-046 WT:B, 32 Gb LPDDR4X/LPDDR4, x32, dual rank. The LPDDR4 signals are the leaves of the :py:attr:`lpddr4` bundle; the other balls keep their data sheet names, with one port per supply or ground name. """ reference_designator_prefix = "U" mpn = "MT53E1G32D2FW-046 WT:B" manufacturer = "Micron" lpddr4 = LPDDR4(LPDDR4Width.x32, LPDDR4Rank.Rank2) """LPDDR4 interface. ``ch[0]`` is channel A and ``ch[1]`` channel B; in each channel byte lane ``d[0]`` is DQ0 to DQ7 and ``d[1]`` DQ8 to DQ15. ``ck.p``/``ck.n`` are CK_t/CK_c and ``dqs.p``/``dqs.n`` are DQS_t/DQS_c.""" ODT_CA_A = Port() ODT_CA_B = Port() RESET_n = Port() ZQ0 = Port() ZQ1 = Port() VDD1 = Port() VDD2 = Port() VDDQ = Port() VSS = Port() NC = Port() "No connect (5 balls)" DNU = Port() "Do not use (12 corner balls)" landpattern = FW200Landpattern() symbol = BoxSymbol() mapping = [ PadMapping( { lpddr4.ch[0].d[0].dq[0]: landpattern.B[2], # DQ0_A lpddr4.ch[0].d[0].dq[7]: landpattern.B[4], # DQ7_A lpddr4.ch[0].d[1].dq[7]: landpattern.B[9], # DQ15_A lpddr4.ch[0].d[1].dq[0]: landpattern.B[11], # DQ8_A lpddr4.ch[0].d[0].dq[1]: landpattern.C[2], # DQ1_A lpddr4.ch[0].d[0].dmi: landpattern.C[3], # DMI0_A lpddr4.ch[0].d[0].dq[6]: landpattern.C[4], # DQ6_A lpddr4.ch[0].d[1].dq[6]: landpattern.C[9], # DQ14_A lpddr4.ch[0].d[1].dmi: landpattern.C[10], # DMI1_A lpddr4.ch[0].d[1].dq[1]: landpattern.C[11], # DQ9_A lpddr4.ch[0].d[0].dqs.p: landpattern.D[3], # DQS0_t_A lpddr4.ch[0].d[1].dqs.p: landpattern.D[10], # DQS1_t_A lpddr4.ch[0].d[0].dq[2]: landpattern.E[2], # DQ2_A lpddr4.ch[0].d[0].dqs.n: landpattern.E[3], # DQS0_c_A lpddr4.ch[0].d[0].dq[5]: landpattern.E[4], # DQ5_A lpddr4.ch[0].d[1].dq[5]: landpattern.E[9], # DQ13_A lpddr4.ch[0].d[1].dqs.n: landpattern.E[10], # DQS1_c_A lpddr4.ch[0].d[1].dq[2]: landpattern.E[11], # DQ10_A lpddr4.ch[0].d[0].dq[3]: landpattern.F[2], # DQ3_A lpddr4.ch[0].d[0].dq[4]: landpattern.F[4], # DQ4_A lpddr4.ch[0].d[1].dq[4]: landpattern.F[9], # DQ12_A lpddr4.ch[0].d[1].dq[3]: landpattern.F[11], # DQ11_A lpddr4.ch[0].ca[0]: landpattern.H[2], # CA0_A lpddr4.ch[0].cs[1]: landpattern.H[3], # CS1_A lpddr4.ch[0].cs[0]: landpattern.H[4], # CS0_A lpddr4.ch[0].ca[2]: landpattern.H[9], # CA2_A lpddr4.ch[0].ca[3]: landpattern.H[10], # CA3_A lpddr4.ch[0].ca[4]: landpattern.H[11], # CA4_A lpddr4.ch[0].ca[1]: landpattern.J[2], # CA1_A lpddr4.ch[0].cke[0]: landpattern.J[4], # CKE0_A lpddr4.ch[0].cke[1]: landpattern.J[5], # CKE1_A lpddr4.ch[0].ck.p: landpattern.J[8], # CK_t_A lpddr4.ch[0].ck.n: landpattern.J[9], # CK_c_A lpddr4.ch[0].ca[5]: landpattern.J[11], # CA5_A lpddr4.ch[1].ca[1]: landpattern.P[2], # CA1_B lpddr4.ch[1].cke[0]: landpattern.P[4], # CKE0_B lpddr4.ch[1].cke[1]: landpattern.P[5], # CKE1_B lpddr4.ch[1].ck.p: landpattern.P[8], # CK_t_B lpddr4.ch[1].ck.n: landpattern.P[9], # CK_c_B lpddr4.ch[1].ca[5]: landpattern.P[11], # CA5_B lpddr4.ch[1].ca[0]: landpattern.R[2], # CA0_B lpddr4.ch[1].cs[1]: landpattern.R[3], # CS1_B lpddr4.ch[1].cs[0]: landpattern.R[4], # CS0_B lpddr4.ch[1].ca[2]: landpattern.R[9], # CA2_B lpddr4.ch[1].ca[3]: landpattern.R[10], # CA3_B lpddr4.ch[1].ca[4]: landpattern.R[11], # CA4_B lpddr4.ch[1].d[0].dq[3]: landpattern.U[2], # DQ3_B lpddr4.ch[1].d[0].dq[4]: landpattern.U[4], # DQ4_B lpddr4.ch[1].d[1].dq[4]: landpattern.U[9], # DQ12_B lpddr4.ch[1].d[1].dq[3]: landpattern.U[11], # DQ11_B lpddr4.ch[1].d[0].dq[2]: landpattern.V[2], # DQ2_B lpddr4.ch[1].d[0].dqs.n: landpattern.V[3], # DQS0_c_B lpddr4.ch[1].d[0].dq[5]: landpattern.V[4], # DQ5_B lpddr4.ch[1].d[1].dq[5]: landpattern.V[9], # DQ13_B lpddr4.ch[1].d[1].dqs.n: landpattern.V[10], # DQS1_c_B lpddr4.ch[1].d[1].dq[2]: landpattern.V[11], # DQ10_B lpddr4.ch[1].d[0].dqs.p: landpattern.W[3], # DQS0_t_B lpddr4.ch[1].d[1].dqs.p: landpattern.W[10], # DQS1_t_B lpddr4.ch[1].d[0].dq[1]: landpattern.Y[2], # DQ1_B lpddr4.ch[1].d[0].dmi: landpattern.Y[3], # DMI0_B lpddr4.ch[1].d[0].dq[6]: landpattern.Y[4], # DQ6_B lpddr4.ch[1].d[1].dq[6]: landpattern.Y[9], # DQ14_B lpddr4.ch[1].d[1].dmi: landpattern.Y[10], # DMI1_B lpddr4.ch[1].d[1].dq[1]: landpattern.Y[11], # DQ9_B lpddr4.ch[1].d[0].dq[0]: landpattern.AA[2], # DQ0_B lpddr4.ch[1].d[0].dq[7]: landpattern.AA[4], # DQ7_B lpddr4.ch[1].d[1].dq[7]: landpattern.AA[9], # DQ15_B lpddr4.ch[1].d[1].dq[0]: landpattern.AA[11], # DQ8_B DNU: [ landpattern.A[1], landpattern.A[2], landpattern.A[11], landpattern.A[12], landpattern.B[1], landpattern.B[12], landpattern.AA[1], landpattern.AA[12], landpattern.AB[1], landpattern.AB[2], landpattern.AB[11], landpattern.AB[12], ], VSS: [ landpattern.A[3], landpattern.A[10], landpattern.C[1], landpattern.C[5], landpattern.C[8], landpattern.C[12], landpattern.D[2], landpattern.D[4], landpattern.D[9], landpattern.D[11], landpattern.E[1], landpattern.E[5], landpattern.E[8], landpattern.E[12], landpattern.G[1], landpattern.G[3], landpattern.G[5], landpattern.G[8], landpattern.G[10], landpattern.G[12], landpattern.J[1], landpattern.J[3], landpattern.J[10], landpattern.J[12], landpattern.K[2], landpattern.K[4], landpattern.K[9], landpattern.K[11], landpattern.N[2], landpattern.N[4], landpattern.N[9], landpattern.N[11], landpattern.P[1], landpattern.P[3], landpattern.P[10], landpattern.P[12], landpattern.T[1], landpattern.T[3], landpattern.T[5], landpattern.T[8], landpattern.T[10], landpattern.T[12], landpattern.V[1], landpattern.V[5], landpattern.V[8], landpattern.V[12], landpattern.W[2], landpattern.W[4], landpattern.W[9], landpattern.W[11], landpattern.Y[1], landpattern.Y[5], landpattern.Y[8], landpattern.Y[12], landpattern.AB[3], landpattern.AB[5], landpattern.AB[8], landpattern.AB[10], ], VDD2: [ landpattern.A[4], landpattern.A[9], landpattern.F[5], landpattern.F[8], landpattern.H[1], landpattern.H[5], landpattern.H[8], landpattern.H[12], landpattern.K[1], landpattern.K[3], landpattern.K[10], landpattern.K[12], landpattern.N[1], landpattern.N[3], landpattern.N[10], landpattern.N[12], landpattern.R[1], landpattern.R[5], landpattern.R[8], landpattern.R[12], landpattern.U[5], landpattern.U[8], landpattern.AB[4], landpattern.AB[9], ], ZQ0: landpattern.A[5], ZQ1: landpattern.A[8], VDDQ: [ landpattern.B[3], landpattern.B[5], landpattern.B[8], landpattern.B[10], landpattern.D[1], landpattern.D[5], landpattern.D[8], landpattern.D[12], landpattern.F[3], landpattern.F[10], landpattern.U[3], landpattern.U[10], landpattern.W[1], landpattern.W[5], landpattern.W[8], landpattern.W[12], landpattern.AA[3], landpattern.AA[5], landpattern.AA[8], landpattern.AA[10], ], VDD1: [ landpattern.F[1], landpattern.F[12], landpattern.G[4], landpattern.G[9], landpattern.T[4], landpattern.T[9], landpattern.U[1], landpattern.U[12], ], ODT_CA_A: landpattern.G[2], NC: [ landpattern.G[11], landpattern.K[5], landpattern.K[8], landpattern.N[5], landpattern.N[8], ], ODT_CA_B: landpattern.T[2], RESET_n: landpattern.T[11], } ) ]