# Two-pin SMT chip case sizes. Hand-maintained: cite a datasheet for every value you
# change. tests/test_smt_table.py pins the geometry these produce.
#
# * ``length`` is the terminal-to-terminal span. For reverse-geometry ("Wide") sizes
# that is the SHORT body dimension and ``width`` is the long one.
# * ``lead_length`` is the termination band (IPC ``T``). It feeds Smax = Lmax - 2*Tmin,
# so it sets pad length and the gap between pads. Where a vendor publishes two bands,
# use the bottom/solderable one: Yageo ``l2``, Vishay ``T2``, KOA ``d``, Panasonic
# ``b``.
# * ``lead_width`` equals ``width`` for every chip. The molded tantalum 2312/6032m is
# the sole exception.
# * Where MLCCs and resistors share a case size, the MLCC band is used: its larger Tmin
# gives the longer pad, which covers both. MLCCs do not exist at 2010 or above, nor
# in the wide-terminal family.
# * Metric aliases use the rotated convention -- the same axis order as the imperial
# code, as in Vishay's ``1218 | RR 3246M``. Do not "correct" 3263m to 6332m.
from dataclasses import dataclass, replace
from jitx.toleranced import Toleranced as tol
[docs]
@dataclass(frozen=True)
class SMTChipDef:
name: str
length: tol
width: tol
lead_length: tol
lead_width: tol
_IMPERIAL: dict[str, SMTChipDef] = {
# Yageo RC0075 (RC_L V.14), sole source for this size.
"009005": SMTChipDef(
"009005", tol(0.3, 0.01), tol(0.15, 0.01), tol(0.08, 0.03), tol(0.15, 0.01)
),
# Yageo RC0100 / Vishay CRCW01005 / Panasonic ERJXG / KOA 1F.
"01005": SMTChipDef(
"01005", tol(0.4, 0.02), tol(0.2, 0.02), tol(0.1, 0.03), tol(0.2, 0.02)
),
# Kyocera-AVX MLCC (t).
"0201": SMTChipDef(
"0201", tol(0.6, 0.03), tol(0.3, 0.03), tol(0.15, 0.05), tol(0.3, 0.03)
),
# KOA WK73R1E, bottom electrode d. Reverse geometry.
"0204": SMTChipDef(
"0204", tol(0.5, 0.05), tol(1.0, 0.05), tol(0.15, 0.05), tol(1.0, 0.05)
),
# KOA WK73R1J, bottom electrode d. Reverse geometry.
"0306": SMTChipDef(
"0306", tol(0.8, 0.1), tol(1.6, 0.1), tol(0.2, 0.1), tol(1.6, 0.1)
),
# Kyocera-AVX MLCC (t).
"0402": SMTChipDef(
"0402", tol(1.0, 0.1), tol(0.5, 0.1), tol(0.25, 0.15), tol(0.5, 0.1)
),
# Kyocera AVX AQ11 porcelain.
"0505": SMTChipDef(
"0505", tol(1.4, 0.38), tol(1.4, 0.38), tol(0.25, 0.15), tol(1.4, 0.38)
),
# Yageo AC0508 wide terminal, I2. Panasonic ERJ-B3 says 0.40.
"0508": SMTChipDef(
"0508", tol(1.25, 0.15), tol(2.0, 0.15), tol(0.35, 0.2), tol(2.0, 0.15)
),
# Kyocera-AVX MLCC (t), deliberately 0.05 above every resistor vendor.
# Body stays 1.6 x 0.8 (IEC); Vishay alone says 1.55 x 0.85.
"0603": SMTChipDef(
"0603", tol(1.6, 0.15), tol(0.8, 0.15), tol(0.35, 0.15), tol(0.8, 0.15)
),
# Yageo AC0612 wide terminal, I2. Panasonic ERJ-B2 says 0.50, Vishay RCL0612 0.35.
"0612": SMTChipDef(
"0612", tol(1.6, 0.2), tol(3.2, 0.2), tol(0.4, 0.15), tol(3.2, 0.2)
),
# Kyocera-AVX MLCC (t). Width 1.25 is unanimous across 8 vendors.
"0805": SMTChipDef(
"0805", tol(2.0, 0.2), tol(1.25, 0.2), tol(0.5, 0.25), tol(1.25, 0.2)
),
# Yageo AC1020 wide terminal, I2. Panasonic ERJ-B1 says 0.90; Vishay RCL1020's
# 0.38 is a 2x low outlier and is not used.
"1020": SMTChipDef(
"1020", tol(2.5, 0.2), tol(5.0, 0.2), tol(0.75, 0.2), tol(5.0, 0.2)
),
# Kyocera AVX AQ13 porcelain. Vishay VJ1111 says L = 2.98; AVX's 2.79 is kept.
"1111": SMTChipDef(
"1111", tol(2.79, 0.38), tol(2.79, 0.38), tol(0.38, 0.25), tol(2.79, 0.38)
),
# Yageo RC1206 I2. Body stays 3.2 x 1.6 (IEC/EIA, and what 3216m decodes from);
# Yageo alone says 3.10.
"1206": SMTChipDef(
"1206", tol(3.2, 0.2), tol(1.6, 0.2), tol(0.45, 0.2), tol(1.6, 0.2)
),
# Kyocera-AVX MLCC (t). Width stays 2.5 (IEC); Yageo and KOA say 2.6.
"1210": SMTChipDef(
"1210", tol(3.2, 0.2), tol(2.5, 0.2), tol(0.5, 0.25), tol(2.5, 0.2)
),
# Vishay CRCW1218 e3 (RR3246M), T1. Reverse geometry.
"1218": SMTChipDef(
"1218", tol(3.2, 0.1), tol(4.6, 0.15), tol(0.45, 0.2), tol(4.6, 0.15)
),
# Vishay RCL1225 e3 (RR3263M), T1. Reverse geometry.
"1225": SMTChipDef(
"1225", tol(3.2, 0.2), tol(6.3, 0.2), tol(0.8, 0.2), tol(6.3, 0.2)
),
# Ohmite FCSL76, blanket +/-0.20. Bottom-terminated; 1 mOhm variant band is 1.35.
"1530": SMTChipDef(
"1530", tol(3.8, 0.2), tol(7.6, 0.2), tol(0.6, 0.2), tol(7.6, 0.2)
),
# Vishay VJ1808 MLCC, P midpoint. 4.57 = 0.180" is the EIA nominal.
"1808": SMTChipDef(
"1808", tol(4.57, 0.3), tol(2.03, 0.25), tol(0.575, 0.325), tol(2.03, 0.25)
),
# KEMET C-series 1812/4532, B.
"1812": SMTChipDef(
"1812", tol(4.5, 0.3), tol(3.2, 0.3), tol(0.6, 0.35), tol(3.2, 0.3)
),
# KEMET C-series 1825/4564, B.
"1825": SMTChipDef(
"1825", tol(4.5, 0.3), tol(6.4, 0.4), tol(0.6, 0.35), tol(6.4, 0.4)
),
# Ohmite FCSL90, blanket +/-0.20. Bottom-terminated.
"1835": SMTChipDef(
"1835", tol(4.5, 0.2), tol(8.9, 0.2), tol(0.7, 0.2), tol(8.9, 0.2)
),
# Metric 5020 MLCC size. Inherited from the original table, not datasheet-verified.
"2008": SMTChipDef(
"2008", tol(5.0, 0.2), tol(2.0, 0.2), tol(0.5, 0.2), tol(2.0, 0.2)
),
# Yageo RC2010 (RC_L V.14), bottom band I2; Vishay CRCW2010 and Panasonic ERJ12Z
# say 0.60 on both faces. Pre-V12 Yageo revisions are stale for this size.
"2010": SMTChipDef(
"2010", tol(5.0, 0.1), tol(2.5, 0.15), tol(0.55, 0.2), tol(2.5, 0.15)
),
# Ohmite FCSL110, blanket +/-0.20. Wrap-around terminals, unlike 1530 and 1835.
"2043": SMTChipDef(
"2043", tol(5.0, 0.2), tol(11.0, 0.2), tol(0.8, 0.2), tol(11.0, 0.2)
),
# KEMET C-series 2220/5650, B. Vishay VJ2220 agrees on the band but says 5.59 x
# 5.08; KEMET's nominals are kept, and TDK C5750 agrees with them.
"2220": SMTChipDef(
"2220", tol(5.7, 0.4), tol(5.0, 0.4), tol(0.6, 0.35), tol(5.0, 0.4)
),
# Vishay VJ2225 MLCC, P midpoint. KEMET says 5.60 x 6.40.
"2225": SMTChipDef(
"2225", tol(5.59, 0.25), tol(6.35, 0.25), tol(0.6, 0.35), tol(6.35, 0.25)
),
# MOLDED TANTALUM, EIA case C / 6032-28 -- not a chip. Kyocera AVX TAJ / KEMET T491
# / Vishay 593D. lead_width 2.2 is the inset termination width (AVX W1), the one
# row where it differs from width -- do not normalise it. This part's 2.5mm height
# and polarity are not expressible in SMTChipDef.
"2312": SMTChipDef(
"2312", tol(6.0, 0.3), tol(3.2, 0.3), tol(1.3, 0.3), tol(2.2, 0.1)
),
# Vishay CRCW2512 e3 (RR6332M), T1 = T2. Matches IPC's RESC6332X65 body descriptor.
# Yageo RC2512 is the alternative: 6.35 +/-0.10 x 3.10 +/-0.15, same band.
"2512": SMTChipDef(
"2512", tol(6.3, 0.2), tol(3.15, 0.15), tol(0.6, 0.2), tol(3.15, 0.15)
),
# Stackpole CSS2725, T1 = T2 for 5 of 8 resistance variants; the rest span
# 1.30-1.80, which a single row cannot express.
"2725": SMTChipDef(
"2725", tol(6.81, 0.25), tol(6.45, 0.25), tol(2.16, 0.25), tol(6.45, 0.25)
),
# Stackpole CSS2728 / CSSH2728, T1 = T2, same for every resistance value.
"2728": SMTChipDef(
"2728", tol(6.71, 0.25), tol(7.19, 0.25), tol(1.14, 0.25), tol(7.19, 0.25)
),
# Vishay WSL2816, T over the 4-100 mOhm range; 2-3.99 mOhm parts use 2.49.
"2816": SMTChipDef(
"2816", tol(7.1, 0.254), tol(4.2, 0.254), tol(1.57, 0.254), tol(4.2, 0.254)
),
# Stackpole CSRF2817, bottom termination; 3-4 mOhm parts use 1.10. TE/CGS Type 3540
# agrees on the body but states a 1.80 bottom band.
"2817": SMTChipDef(
"2817", tol(7.1, 0.2), tol(4.2, 0.2), tol(1.0, 0.3), tol(4.2, 0.2)
),
# Ohmite FCSL150, blanket +/-0.20. Bottom-terminated. 7.5 x 15.0 mm = 0.295" x
# 0.591", hence the imperial code 2959.
"2959": SMTChipDef(
"2959", tol(7.5, 0.2), tol(15.0, 0.2), tol(1.1, 0.2), tol(15.0, 0.2)
),
# TT Electronics LRMAP3920, D. The only row where 2.0 +/-0.5 is correct -- do not
# copy it to other sizes or "fix" it here. Bourns CSS2H-3920 uses a different
# construction with a 0.43-1.20 sense terminal.
"3920": SMTChipDef(
"3920", tol(10.0, 0.3), tol(5.2, 0.3), tol(2.0, 0.5), tol(5.2, 0.3)
),
}
# Aliases, mainly metric.
_ALIASES: dict[str, tuple[str, ...]] = {
"009005": ("03015m",),
"01005": ("0402m",),
"0201": ("0603m",),
"0204": ("0510m", "Wide 0402"),
"0306": ("0816m", "Wide 0603"),
"0402": ("1005m",),
"0505": ("1414m",),
"0508": ("1220m", "Wide 0805"),
"0603": ("1608m",),
"0612": ("1632m", "Wide 1206"),
"0805": ("2012m",),
"1020": ("2550m",),
"1111": ("2828m",),
"1206": ("3216m",),
"1210": ("3225m",),
"1218": ("3246m",),
"1225": ("3263m", "Wide 2512"),
"1530": ("3876m", "Wide 3015"),
"1808": ("4520m",),
"1812": ("4532m",),
"1825": ("4564m",),
"1835": ("4589m", "Wide 3518"),
"2008": ("5020m",),
"2010": ("5025m",),
"2043": ("11050m", "Wide 4320"),
"2220": ("5650m",),
"2225": ("5664m",),
"2312": ("6032m",),
"2512": ("6332m",),
# 6966m and 7071m do not decode from their dimensions and no source settles them;
# DigiKey says 6863 and 7067. Left as-is.
"2725": ("6966m",),
"2728": ("7071m", "Wide 2827"),
"2816": ("7142m",),
"2817": ("7143m",),
"2959": ("15075m", "Wide 5929"),
"3920": ("10052m",),
}
SMT_CHIP_DEFS: dict[str, SMTChipDef] = {
**_IMPERIAL,
**{
alias: replace(row, name=alias)
for name, row in _IMPERIAL.items()
for alias in _ALIASES.get(name, ())
},
}