From 9fb98e9ddefb6b88bef1c6b97db966f20135a180 Mon Sep 17 00:00:00 2001 From: Santosh Kumar <56650638+santosh-kumar-git@users.noreply.github.com> Date: Tue, 15 Sep 2026 12:29:19 +0530 Subject: [PATCH] fix: honor length units in SOD pad dimensions --- src/fn/sod110.ts | 6 +- src/fn/sod123.ts | 6 +- src/fn/sod123fl.ts | 6 +- src/fn/sod123w.ts | 6 +- src/fn/sod128.ts | 6 +- src/fn/sod323f.ts | 6 +- src/fn/sod323fl.ts | 6 +- src/fn/sod323w.ts | 6 +- src/fn/sod723.ts | 6 +- src/fn/sod80.ts | 6 +- src/fn/sod882.ts | 6 +- src/fn/sod882d.ts | 6 +- .../sod110-inch-dimensions.snap.svg | 1 + .../sod123-inch-dimensions.snap.svg | 1 + .../sod123fl-inch-dimensions.snap.svg | 1 + .../sod123w-inch-dimensions.snap.svg | 1 + .../sod128-inch-dimensions.snap.svg | 1 + .../sod323f-inch-dimensions.snap.svg | 1 + .../sod323fl-inch-dimensions.snap.svg | 1 + .../sod323w-inch-dimensions.snap.svg | 1 + .../sod723-inch-dimensions.snap.svg | 1 + .../sod80-inch-dimensions.snap.svg | 1 + .../sod882-inch-dimensions.snap.svg | 1 + .../sod882d-inch-dimensions.snap.svg | 1 + tests/sod-length-units.test.ts | 79 +++++++++++++++++++ 25 files changed, 127 insertions(+), 36 deletions(-) create mode 100644 tests/__snapshots__/sod110-inch-dimensions.snap.svg create mode 100644 tests/__snapshots__/sod123-inch-dimensions.snap.svg create mode 100644 tests/__snapshots__/sod123fl-inch-dimensions.snap.svg create mode 100644 tests/__snapshots__/sod123w-inch-dimensions.snap.svg create mode 100644 tests/__snapshots__/sod128-inch-dimensions.snap.svg create mode 100644 tests/__snapshots__/sod323f-inch-dimensions.snap.svg create mode 100644 tests/__snapshots__/sod323fl-inch-dimensions.snap.svg create mode 100644 tests/__snapshots__/sod323w-inch-dimensions.snap.svg create mode 100644 tests/__snapshots__/sod723-inch-dimensions.snap.svg create mode 100644 tests/__snapshots__/sod80-inch-dimensions.snap.svg create mode 100644 tests/__snapshots__/sod882-inch-dimensions.snap.svg create mode 100644 tests/__snapshots__/sod882d-inch-dimensions.snap.svg create mode 100644 tests/sod-length-units.test.ts diff --git a/src/fn/sod110.ts b/src/fn/sod110.ts index e90bd4627..46bc1d9df 100644 --- a/src/fn/sod110.ts +++ b/src/fn/sod110.ts @@ -98,15 +98,15 @@ export const sodWithoutParsing = (parameters: z.infer) => { for (let i = 1; i <= parameters.num_pins; i++) { const { x, y } = getSodCoords({ pn: i, - p: Number.parseFloat(parameters.p), + p: length.parse(parameters.p), }) pads.push( rectpad( i, x, y, - Number.parseFloat(parameters.pl), - Number.parseFloat(parameters.pw), + length.parse(parameters.pl), + length.parse(parameters.pw), 0.1, ), ) diff --git a/src/fn/sod123.ts b/src/fn/sod123.ts index 350726abb..81ecccae1 100644 --- a/src/fn/sod123.ts +++ b/src/fn/sod123.ts @@ -69,15 +69,15 @@ export const sodWithoutParsing = (parameters: z.infer) => { for (let i = 1; i <= parameters.num_pins; i++) { const { x, y } = getSodCoords({ pn: i, - p: Number.parseFloat(parameters.p), + p: length.parse(parameters.p), }) pads.push( rectpad( i, x, y, - Number.parseFloat(parameters.pl), - Number.parseFloat(parameters.pw), + length.parse(parameters.pl), + length.parse(parameters.pw), 0.1125, ), ) diff --git a/src/fn/sod123fl.ts b/src/fn/sod123fl.ts index 5f605b049..ab9819f75 100644 --- a/src/fn/sod123fl.ts +++ b/src/fn/sod123fl.ts @@ -104,15 +104,15 @@ export const sodWithoutParsing = (parameters: z.infer) => { for (let i = 1; i <= parameters.num_pins; i++) { const { x, y } = getSodCoords({ pn: i, - p: Number.parseFloat(parameters.p), + p: length.parse(parameters.p), }) pads.push( rectpad( i, x, y, - Number.parseFloat(parameters.pl), - Number.parseFloat(parameters.pw), + length.parse(parameters.pl), + length.parse(parameters.pw), ), ) } diff --git a/src/fn/sod123w.ts b/src/fn/sod123w.ts index 6f2c23d4d..7c9177bfd 100644 --- a/src/fn/sod123w.ts +++ b/src/fn/sod123w.ts @@ -102,15 +102,15 @@ export const sodWithoutParsing = (parameters: z.infer) => { for (let i = 1; i <= parameters.num_pins; i++) { const { x, y } = getSodCoords({ pn: i, - p: Number.parseFloat(parameters.p), + p: length.parse(parameters.p), }) pads.push( rectpad( i, x, y, - Number.parseFloat(parameters.pl), - Number.parseFloat(parameters.pw), + length.parse(parameters.pl), + length.parse(parameters.pw), ), ) } diff --git a/src/fn/sod128.ts b/src/fn/sod128.ts index d49176aa9..faf36ae64 100644 --- a/src/fn/sod128.ts +++ b/src/fn/sod128.ts @@ -104,15 +104,15 @@ export const sodWithoutParsing = (parameters: z.infer) => { for (let i = 1; i <= parameters.num_pins; i++) { const { x, y } = getSodCoords({ pn: i, - p: Number.parseFloat(parameters.p), + p: length.parse(parameters.p), }) pads.push( rectpad( i, x, y, - Number.parseFloat(parameters.pl), - Number.parseFloat(parameters.pw), + length.parse(parameters.pl), + length.parse(parameters.pw), 0.125, ), ) diff --git a/src/fn/sod323f.ts b/src/fn/sod323f.ts index e4cba95e5..b2a356772 100644 --- a/src/fn/sod323f.ts +++ b/src/fn/sod323f.ts @@ -104,15 +104,15 @@ export const sodWithoutParsing = (parameters: z.infer) => { for (let i = 1; i <= parameters.num_pins; i++) { const { x, y } = getSodCoords({ pn: i, - pad_spacing: Number.parseFloat(parameters.pad_spacing), + pad_spacing: length.parse(parameters.pad_spacing), }) pads.push( rectpad( i, x, y, - Number.parseFloat(parameters.pl), - Number.parseFloat(parameters.pw), + length.parse(parameters.pl), + length.parse(parameters.pw), 0.0625, ), ) diff --git a/src/fn/sod323fl.ts b/src/fn/sod323fl.ts index 0d39af841..e332b58b2 100644 --- a/src/fn/sod323fl.ts +++ b/src/fn/sod323fl.ts @@ -104,15 +104,15 @@ export const sodWithoutParsing = (parameters: z.infer) => { for (let i = 1; i <= parameters.num_pins; i++) { const { x, y } = getSodCoords({ pn: i, - pad_spacing: Number.parseFloat(parameters.pad_spacing), + pad_spacing: length.parse(parameters.pad_spacing), }) pads.push( rectpad( i, x, y, - Number.parseFloat(parameters.pl), - Number.parseFloat(parameters.pw), + length.parse(parameters.pl), + length.parse(parameters.pw), ), ) } diff --git a/src/fn/sod323w.ts b/src/fn/sod323w.ts index b8d12539c..b39989912 100644 --- a/src/fn/sod323w.ts +++ b/src/fn/sod323w.ts @@ -104,15 +104,15 @@ export const sodWithoutParsing = (parameters: z.infer) => { for (let i = 1; i <= parameters.num_pins; i++) { const { x, y } = getSodCoords({ pn: i, - pad_spacing: Number.parseFloat(parameters.pad_spacing), + pad_spacing: length.parse(parameters.pad_spacing), }) pads.push( rectpad( i, x, y, - Number.parseFloat(parameters.pl), - Number.parseFloat(parameters.pw), + length.parse(parameters.pl), + length.parse(parameters.pw), ), ) } diff --git a/src/fn/sod723.ts b/src/fn/sod723.ts index 716d50579..9ea53c90c 100644 --- a/src/fn/sod723.ts +++ b/src/fn/sod723.ts @@ -103,15 +103,15 @@ export const sodWithoutParsing = (parameters: z.infer) => { for (let i = 1; i <= parameters.num_pins; i++) { const { x, y } = getSodCoords({ pn: i, - p: Number.parseFloat(parameters.p), + p: length.parse(parameters.p), }) pads.push( rectpad( i, x, y, - Number.parseFloat(parameters.pl), - Number.parseFloat(parameters.pw), + length.parse(parameters.pl), + length.parse(parameters.pw), ), ) } diff --git a/src/fn/sod80.ts b/src/fn/sod80.ts index 02b83d546..c4b835f85 100644 --- a/src/fn/sod80.ts +++ b/src/fn/sod80.ts @@ -96,15 +96,15 @@ export const sod80WithoutParsing = (parameters: z.infer) => { for (let i = 1; i <= parameters.num_pins; i++) { const { x, y } = getsod80Coords({ pn: i, - p: Number.parseFloat(parameters.p), + p: length.parse(parameters.p), }) pads.push( rectpad( i, x, y, - Number.parseFloat(parameters.pl), - Number.parseFloat(parameters.pw), + length.parse(parameters.pl), + length.parse(parameters.pw), ), ) } diff --git a/src/fn/sod882.ts b/src/fn/sod882.ts index f996fc10c..02d532a97 100644 --- a/src/fn/sod882.ts +++ b/src/fn/sod882.ts @@ -104,15 +104,15 @@ export const sodWithoutParsing = (parameters: z.infer) => { for (let i = 1; i <= parameters.num_pins; i++) { const { x, y } = getSodCoords({ pn: i, - p: Number.parseFloat(parameters.p), + p: length.parse(parameters.p), }) pads.push( rectpad( i, x, y, - Number.parseFloat(parameters.pl), - Number.parseFloat(parameters.pw), + length.parse(parameters.pl), + length.parse(parameters.pw), 0.025, ), ) diff --git a/src/fn/sod882d.ts b/src/fn/sod882d.ts index 6a8b382bf..342b6fc15 100644 --- a/src/fn/sod882d.ts +++ b/src/fn/sod882d.ts @@ -104,15 +104,15 @@ export const sodWithoutParsing = (parameters: z.infer) => { for (let i = 1; i <= parameters.num_pins; i++) { const { x, y } = getSodCoords({ pn: i, - p: Number.parseFloat(parameters.p), + p: length.parse(parameters.p), }) pads.push( rectpad( i, x, y, - Number.parseFloat(parameters.pl), - Number.parseFloat(parameters.pw), + length.parse(parameters.pl), + length.parse(parameters.pw), 0.0625, ), ) diff --git a/tests/__snapshots__/sod110-inch-dimensions.snap.svg b/tests/__snapshots__/sod110-inch-dimensions.snap.svg new file mode 100644 index 000000000..659fd80b8 --- /dev/null +++ b/tests/__snapshots__/sod110-inch-dimensions.snap.svg @@ -0,0 +1 @@ +{REF}+- \ No newline at end of file diff --git a/tests/__snapshots__/sod123-inch-dimensions.snap.svg b/tests/__snapshots__/sod123-inch-dimensions.snap.svg new file mode 100644 index 000000000..3e678ca01 --- /dev/null +++ b/tests/__snapshots__/sod123-inch-dimensions.snap.svg @@ -0,0 +1 @@ +{REF}+- \ No newline at end of file diff --git a/tests/__snapshots__/sod123fl-inch-dimensions.snap.svg b/tests/__snapshots__/sod123fl-inch-dimensions.snap.svg new file mode 100644 index 000000000..93c27391a --- /dev/null +++ b/tests/__snapshots__/sod123fl-inch-dimensions.snap.svg @@ -0,0 +1 @@ +{REF}+- \ No newline at end of file diff --git a/tests/__snapshots__/sod123w-inch-dimensions.snap.svg b/tests/__snapshots__/sod123w-inch-dimensions.snap.svg new file mode 100644 index 000000000..fd2b86a9d --- /dev/null +++ b/tests/__snapshots__/sod123w-inch-dimensions.snap.svg @@ -0,0 +1 @@ +{REF}+- \ No newline at end of file diff --git a/tests/__snapshots__/sod128-inch-dimensions.snap.svg b/tests/__snapshots__/sod128-inch-dimensions.snap.svg new file mode 100644 index 000000000..358e82b03 --- /dev/null +++ b/tests/__snapshots__/sod128-inch-dimensions.snap.svg @@ -0,0 +1 @@ +{REF}+- \ No newline at end of file diff --git a/tests/__snapshots__/sod323f-inch-dimensions.snap.svg b/tests/__snapshots__/sod323f-inch-dimensions.snap.svg new file mode 100644 index 000000000..ce038bcfa --- /dev/null +++ b/tests/__snapshots__/sod323f-inch-dimensions.snap.svg @@ -0,0 +1 @@ +{REF}+- \ No newline at end of file diff --git a/tests/__snapshots__/sod323fl-inch-dimensions.snap.svg b/tests/__snapshots__/sod323fl-inch-dimensions.snap.svg new file mode 100644 index 000000000..c288698ae --- /dev/null +++ b/tests/__snapshots__/sod323fl-inch-dimensions.snap.svg @@ -0,0 +1 @@ +{REF}+- \ No newline at end of file diff --git a/tests/__snapshots__/sod323w-inch-dimensions.snap.svg b/tests/__snapshots__/sod323w-inch-dimensions.snap.svg new file mode 100644 index 000000000..a422a14c6 --- /dev/null +++ b/tests/__snapshots__/sod323w-inch-dimensions.snap.svg @@ -0,0 +1 @@ +{REF}+- \ No newline at end of file diff --git a/tests/__snapshots__/sod723-inch-dimensions.snap.svg b/tests/__snapshots__/sod723-inch-dimensions.snap.svg new file mode 100644 index 000000000..fe35e867f --- /dev/null +++ b/tests/__snapshots__/sod723-inch-dimensions.snap.svg @@ -0,0 +1 @@ +{REF}+- \ No newline at end of file diff --git a/tests/__snapshots__/sod80-inch-dimensions.snap.svg b/tests/__snapshots__/sod80-inch-dimensions.snap.svg new file mode 100644 index 000000000..0381b5435 --- /dev/null +++ b/tests/__snapshots__/sod80-inch-dimensions.snap.svg @@ -0,0 +1 @@ +{REF}+- \ No newline at end of file diff --git a/tests/__snapshots__/sod882-inch-dimensions.snap.svg b/tests/__snapshots__/sod882-inch-dimensions.snap.svg new file mode 100644 index 000000000..a0fc0c221 --- /dev/null +++ b/tests/__snapshots__/sod882-inch-dimensions.snap.svg @@ -0,0 +1 @@ +{REF}+- \ No newline at end of file diff --git a/tests/__snapshots__/sod882d-inch-dimensions.snap.svg b/tests/__snapshots__/sod882d-inch-dimensions.snap.svg new file mode 100644 index 000000000..80bbd0a35 --- /dev/null +++ b/tests/__snapshots__/sod882d-inch-dimensions.snap.svg @@ -0,0 +1 @@ +{REF}+- \ No newline at end of file diff --git a/tests/sod-length-units.test.ts b/tests/sod-length-units.test.ts new file mode 100644 index 000000000..5ded17b63 --- /dev/null +++ b/tests/sod-length-units.test.ts @@ -0,0 +1,79 @@ +import { expect, test } from "bun:test" +import { convertCircuitJsonToPcbSvg } from "circuit-to-svg" +import { fp } from "../src/footprinter" +import { + sod110, + sod123, + sod123fl, + sod123w, + sod128, + sod323f, + sod323fl, + sod323w, + sod723, + sod80, + sod882, + sod882d, +} from "../src/fn" + +const variants = [ + ["sod110", sod110, "p"], + ["sod123", sod123, "p"], + ["sod123fl", sod123fl, "p"], + ["sod123w", sod123w, "p"], + ["sod128", sod128, "p"], + ["sod323f", sod323f, "pad_spacing"], + ["sod323fl", sod323fl, "pad_spacing"], + ["sod323w", sod323w, "pad_spacing"], + ["sod723", sod723, "p"], + ["sod80", sod80, "p"], + ["sod882", sod882, "p"], + ["sod882d", sod882d, "p"], +] as const + +for (const [name, generate, pitchParameter] of variants) { + test(`${name} converts inch pad dimensions and pitch to millimeters`, () => { + const { circuitJson } = generate({ + fn: name, + pl: "0.02in", + pw: "0.01in", + [pitchParameter]: "0.1in", + }) + const pads = circuitJson.filter((element) => element.type === "pcb_smtpad") + + expect(pads).toMatchObject([ + { + port_hints: ["1"], + x: -1.27, + y: 0, + width: 0.508, + height: 0.254, + }, + { + port_hints: ["2"], + x: 1.27, + y: 0, + width: 0.508, + height: 0.254, + }, + ]) + expect(convertCircuitJsonToPcbSvg(circuitJson)).toMatchSvgSnapshot( + import.meta.path, + `${name}-inch-dimensions`, + ) + }) +} + +test("SOD string definitions preserve physical dimensions expressed in mils", () => { + const circuitJson = fp.string("sod123_pl20mil_pw10mil_p100mil").circuitJson() + const pads = circuitJson.filter((element) => element.type === "pcb_smtpad") + + expect(pads).toMatchObject([ + { x: -1.27, width: 0.508, height: 0.254 }, + { x: 1.27, width: 0.508, height: 0.254 }, + ]) + expect(convertCircuitJsonToPcbSvg(circuitJson)).toMatchSvgSnapshot( + import.meta.path, + "sod123-inch-dimensions", + ) +})