steve/so-package
Small-outline IC packages by TI outline: SOIC-14/16 and 20W, SSOP-16/20/28, TSSOP-8 and TSSOP-48/56 (6.1 mm body).
No-lead small-outline IC packages by TI outline: WSON-8/10/12/16 and VSON-8, 0.4 to 0.8 mm pitch, with exposed thermal pad.
| 1 | """No-lead small-outline IC package (WSON, VSON, DFN) by TI package outline. Centred on the origin with the seating plane on the XY plane, pins 1 to n/2 |
| 2 | on the -Y side running +X, the others on +Y running back, and the exposed thermal pad in the middle. Dimensions from the TI outline named by `package`; see |
| 3 | the README.""" |
| 4 | from steve import Model |
| 5 | |
| 6 | package = "DSQ0010A" # TI package outline |
| 7 | detail = "full" # full: body, pin-1 mark, terminals and thermal pad; simple: the body only |
| 8 | |
| 9 | # outline: (kind, pins, pitch, body length along the pin rows, body width across them, height, standoff, terminal length, terminal width, thermal pad |
| 10 | # across the rows, thermal pad along them, terminal thickness), ranges as (min, max), single values as drawn (thickness is the outline's reference), mm. |
| 11 | # TI package outlines, https://www.ti.com/lit/pdf/<doc>: DSQ0010A mpds335 (4218906/A 04/2019), NGQ0008A mpds403 (4214922/A 03/2018), DNT0012B mpds48 |
| 12 | # (4214928/C 10/2021), NHR0016B mpds42 (4214932/B 08/2025), DRM0008A mpds160 (4218889/A 01/2025). Thermal pads are drawn as nominal +/-0.1. |
| 13 | OUTLINES = { |
| 14 | "DSQ0010A": ("WSON", 10, 0.4, (1.9, 2.1), (1.9, 2.1), (0.7, 0.8), (0.0, 0.05), (0.2, 0.4), (0.15, 0.25), 0.9, 1.5, 0.2), |
| 15 | "NGQ0008A": ("WSON", 8, 0.5, (2.9, 3.1), (2.9, 3.1), (0.7, 0.8), (0.0, 0.05), (0.3, 0.5), (0.2, 0.3), 1.6, 2.0, 0.1), |
| 16 | "DNT0012B": ("WSON", 12, 0.5, (3.9, 4.1), (3.9, 4.1), (0.7, 0.8), (0.0, 0.05), (0.3, 0.5), (0.2, 0.3), 2.6, 3.0, 0.1), |
| 17 | "NHR0016B": ("WSON", 16, 0.5, (4.9, 5.1), (3.9, 4.1), (0.7, 0.8), (0.0, 0.05), (0.3, 0.5), (0.2, 0.3), 2.6, 4.0, 0.1), |
| 18 | "DRM0008A": ("VSON", 8, 0.8, (3.9, 4.1), (3.9, 4.1), (0.8, 1.0), (0.0, 0.05), (0.3, 0.5), (0.23, 0.38), 2.45, 3.38, 0.1), |
| 19 | } |
| 20 | # The pin-1 mark is a proportion, for looks. |
| 21 | |
| 22 | |
| 23 | def mid(pair): |
| 24 | return (pair[0] + pair[1]) / 2 |
| 25 | |
| 26 | |
| 27 | kind, pins, pitch, L, W, H, standoff, term_l, term_w, pad_x, pad_y, thick = OUTLINES[package] |
| 28 | length, width, top, standoff, term_l, term_w = mid(L), mid(W), mid(H), mid(standoff), mid(term_l), mid(term_w) |
| 29 | per_row = pins // 2 |
| 30 | first = -(per_row - 1) * pitch / 2 |
| 31 | model = Model() |
| 32 | model.plane("body_plane", on="XY", offset=standoff, name="Body") |
| 33 | with model.sketch("body_sketch", on="body_plane", name="Body") as sk: |
| 34 | sk.rect("body_rect", (-length / 2, -width / 2), (length / 2, width / 2)) |
| 35 | model.extrude("body", "body_sketch", distance=top - standoff, name="Body") |
| 36 | if detail == "full": |
| 37 | model.plane("top_plane", on="XY", offset=top, name="Top") |
| 38 | with model.sketch("mark_sketch", on="top_plane", name="Pin-1 mark") as sk: |
| 39 | sk.circle("mark_circle", (-length / 2 + 0.15 * width, -width / 2 + 0.15 * width), 0.05 * width) |
| 40 | model.extrude("mark", "mark_sketch", distance=-0.03, op="cut", name="Pin-1 mark") |
| 41 | for tag, side in (("low", -1), ("high", 1)): |
| 42 | y_out, y_in = side * width / 2, side * (width / 2 - term_l) |
| 43 | with model.sketch(f"terms_{tag}", on="XY", name="Terminals") as sk: |
| 44 | for i in range(per_row): |
| 45 | x = first + i * pitch |
| 46 | sk.rect(f"term_{tag}_{i}", (x - term_w / 2, min(y_in, y_out)), (x + term_w / 2, max(y_in, y_out))) |
| 47 | model.extrude(f"terms_{tag}_body", f"terms_{tag}", distance=thick, name="Terminals") |
| 48 | # the thermal pad's across-the-rows size runs along Y, its along-the-rows size along X |
| 49 | with model.sketch("pad_sketch", on="XY", name="Thermal pad") as sk: |
| 50 | sk.rect("pad_rect", (-pad_y / 2, -pad_x / 2), (pad_y / 2, pad_x / 2)) |
| 51 | model.extrude("pad", "pad_sketch", distance=thick, name="Thermal pad") |
| 52 | model.material("pla", color="#26282b") |
| 53 | result = model.result() |
| 54 |
| 1 | name = "steve/son-package" |
| 2 | version = "1.0.0" |
| 3 | runtime = "steve" |
| 4 | license = "MIT" |
| 5 | summary = "No-lead small-outline IC packages by TI outline: WSON-8/10/12/16 and VSON-8, 0.4 to 0.8 mm pitch, with exposed thermal pad." |
| 6 | description = """No-lead small-outline IC packages for board layouts: body, pin-1 mark, terminals and exposed thermal pad, each from a named TI package outline. See the README.""" |
| 7 | tags = ["ic-package", "son", "wson", "vson", "dfn", "smd", "electronics"] |
| 8 | |
| 9 | [parameters.package] |
| 10 | type = "choice" |
| 11 | default = "DSQ0010A" |
| 12 | choices = ["DSQ0010A", "NGQ0008A", "DNT0012B", "NHR0016B", "DRM0008A"] |
| 13 | label = "TI package outline" |
| 14 | |
| 15 | [parameters.detail] |
| 16 | type = "choice" |
| 17 | default = "full" |
| 18 | choices = ["full", "simple"] |
| 19 | label = "Detail" |
| 20 | description = "full: body, pin-1 mark, terminals and thermal pad. simple: the body only." |
| 21 | |
| 22 | [[presets]] |
| 23 | id = "WSON-10-DSQ0010A" |
| 24 | title = "WSON-10 (DSQ0010A), 2x2 mm, 0.4 mm pitch" |
| 25 | params = { package = "DSQ0010A" } |
| 26 | aliases = ["WSON-10", "WSON10", "10 pin WSON", "DSQ0010A"] |
| 27 | standard = "TI package outline" |
| 28 | |
| 29 | [[presets]] |
| 30 | id = "WSON-8-NGQ0008A" |
| 31 | title = "WSON-8 (NGQ0008A), 3x3 mm, 0.5 mm pitch" |
| 32 | params = { package = "NGQ0008A" } |
| 33 | aliases = ["WSON-8", "WSON8", "8 pin WSON", "NGQ0008A"] |
| 34 | standard = "TI package outline" |
| 35 | |
| 36 | [[presets]] |
| 37 | id = "WSON-12-DNT0012B" |
| 38 | title = "WSON-12 (DNT0012B), 4x4 mm, 0.5 mm pitch" |
| 39 | params = { package = "DNT0012B" } |
| 40 | aliases = ["WSON-12", "WSON12", "12 pin WSON", "DNT0012B"] |
| 41 | standard = "TI package outline" |
| 42 | |
| 43 | [[presets]] |
| 44 | id = "WSON-16-NHR0016B" |
| 45 | title = "WSON-16 (NHR0016B), 4x5 mm, 0.5 mm pitch" |
| 46 | params = { package = "NHR0016B" } |
| 47 | aliases = ["WSON-16", "WSON16", "16 pin WSON", "NHR0016B"] |
| 48 | standard = "TI package outline" |
| 49 | |
| 50 | [[presets]] |
| 51 | id = "VSON-8-DRM0008A" |
| 52 | title = "VSON-8 (DRM0008A), 4x4 mm, 0.8 mm pitch" |
| 53 | params = { package = "DRM0008A" } |
| 54 | aliases = ["VSON-8", "VSON8", "8 pin VSON", "DRM0008A"] |
| 55 | standard = "TI package outline" |
| 56 | |
| 57 | [[presets]] |
| 58 | id = "WSON-10-DSQ0010A-simple" |
| 59 | title = "WSON-10 (DSQ0010A), simple" |
| 60 | params = { package = "DSQ0010A", detail = "simple" } |
| 61 | aliases = ["WSON-10 simple"] |
| 62 | standard = "TI package outline" |
| 63 |
No-lead small-outline IC packages (WSON, VSON), each modelled from a named TI package outline: the body, the terminals along two sides and the exposed thermal pad underneath. The package is centred on the origin with the seating plane on the XY plane. Pins 1 to n/2 are on the -Y side running +X, the others are on +Y running back, and the thermal pad is in the middle.
TI package outlines at https://www.ti.com/lit/pdf/<document>:
| Outline | Package | Body | Pitch | Document | Drawing |
|---|---|---|---|---|---|
| DSQ0010A | WSON-10 | 2 x 2 mm | 0.4 mm | mpds335 | 4218906/A 04/2019 |
| NGQ0008A | WSON-8 | 3 x 3 mm | 0.5 mm | mpds403 | 4214922/A 03/2018 |
| DNT0012B | WSON-12 | 4 x 4 mm | 0.5 mm | mpds48 | 4214928/C 10/2021 |
| NHR0016B | WSON-16 | 4 x 5 mm | 0.5 mm | mpds42 | 4214932/B 08/2025 |
| DRM0008A | VSON-8 | 4 x 4 mm | 0.8 mm | mpds160 | 4218889/A 01/2025 |
Each outline gives body length and width, height, standoff, terminal length and width, and the thermal pad's size. The model uses the middle of each range. The terminal thickness is the outline's reference value.
The thermal pad is the TI outline's. A footprint whose name gives a different pad size, such as DFN-8-1EP_4x4mm_P0.8mm_EP2.5x3.6mm against DRM0008A's 2.45 x 3.38 mm, isn't this part even when the body and pitch match.
Proportions, for looks only: the pin-1 mark on top. The thermal pad's chamfered pin-1 corner isn't modelled.
Other WSON, VSON and DFN sizes and the QFN packages aren't here yet; see COVERAGE.md.
| 1 | # No-lead small-outline package |
| 2 | |
| 3 | No-lead small-outline IC packages (WSON, VSON), each modelled from a named TI package outline: the body, the terminals along two sides and the exposed thermal pad underneath. The package is centred on the origin with the seating plane on the XY plane. Pins 1 to n/2 are on the -Y side running +X, the others are on +Y running back, and the thermal pad is in the middle. |
| 4 | |
| 5 | ## Source |
| 6 | |
| 7 | TI package outlines at `https://www.ti.com/lit/pdf/<document>`: |
| 8 | |
| 9 | | Outline | Package | Body | Pitch | Document | Drawing | |
| 10 | |---|---|---|---|---|---| |
| 11 | | DSQ0010A | WSON-10 | 2 x 2 mm | 0.4 mm | mpds335 | 4218906/A 04/2019 | |
| 12 | | NGQ0008A | WSON-8 | 3 x 3 mm | 0.5 mm | mpds403 | 4214922/A 03/2018 | |
| 13 | | DNT0012B | WSON-12 | 4 x 4 mm | 0.5 mm | mpds48 | 4214928/C 10/2021 | |
| 14 | | NHR0016B | WSON-16 | 4 x 5 mm | 0.5 mm | mpds42 | 4214932/B 08/2025 | |
| 15 | | DRM0008A | VSON-8 | 4 x 4 mm | 0.8 mm | mpds160 | 4218889/A 01/2025 | |
| 16 | |
| 17 | Each outline gives body length and width, height, standoff, terminal length and width, and the thermal pad's size. The model uses the middle of each range. The terminal thickness is the outline's reference value. |
| 18 | |
| 19 | The thermal pad is the TI outline's. A footprint whose name gives a different pad size, such as `DFN-8-1EP_4x4mm_P0.8mm_EP2.5x3.6mm` against DRM0008A's 2.45 x 3.38 mm, isn't this part even when the body and pitch match. |
| 20 | |
| 21 | **Proportions, for looks only:** the pin-1 mark on top. The thermal pad's chamfered pin-1 corner isn't modelled. |
| 22 | |
| 23 | Other WSON, VSON and DFN sizes and the QFN packages aren't here yet; see `COVERAGE.md`. |
| 24 |
No-lead small-outline IC packages for board layouts: body, pin-1 mark, terminals and exposed thermal pad, each from a named TI package outline. See the README.
No-lead small-outline IC packages (WSON, VSON), each modelled from a named TI package outline: the body, the terminals along two sides and the exposed thermal pad underneath. The package is centred on the origin with the seating plane on the XY plane. Pins 1 to n/2 are on the -Y side running +X, the others are on +Y running back, and the thermal pad is in the middle.
TI package outlines at https://www.ti.com/lit/pdf/<document>:
| Outline | Package | Body | Pitch | Document | Drawing |
|---|---|---|---|---|---|
| DSQ0010A | WSON-10 | 2 x 2 mm | 0.4 mm | mpds335 | 4218906/A 04/2019 |
| NGQ0008A | WSON-8 | 3 x 3 mm | 0.5 mm | mpds403 | 4214922/A 03/2018 |
| DNT0012B | WSON-12 | 4 x 4 mm | 0.5 mm | mpds48 | 4214928/C 10/2021 |
| NHR0016B | WSON-16 | 4 x 5 mm | 0.5 mm | mpds42 | 4214932/B 08/2025 |
| DRM0008A | VSON-8 | 4 x 4 mm | 0.8 mm | mpds160 | 4218889/A 01/2025 |
Each outline gives body length and width, height, standoff, terminal length and width, and the thermal pad's size. The model uses the middle of each range. The terminal thickness is the outline's reference value.
The thermal pad is the TI outline's. A footprint whose name gives a different pad size, such as DFN-8-1EP_4x4mm_P0.8mm_EP2.5x3.6mm against DRM0008A's 2.45 x 3.38 mm, isn't this part even when the body and pitch match.
Proportions, for looks only: the pin-1 mark on top. The thermal pad's chamfered pin-1 corner isn't modelled.
Other WSON, VSON and DFN sizes and the QFN packages aren't here yet; see COVERAGE.md.
Small-outline IC packages by TI outline: SOIC-14/16 and 20W, SSOP-16/20/28, TSSOP-8 and TSSOP-48/56 (6.1 mm body).
Small-outline transistor packages by TI outline: SOT-23, thin SOT-23-5/6/8, SC-70-3/6, SOT-553 and SOT-563.
TSSOP package, 4.4 mm body, 0.65 mm pitch: 14, 16, 20 and 24 pins.
Quad flat no-lead IC packages by TI outline: VQFN-20 (0.65 mm pitch) and VQFN-24/32/48/64 (0.5 mm pitch), with exposed thermal pad.