@tscircuit/footprinter 0.0.103 → 0.0.105

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -29,6 +29,7 @@ __export(fn_exports, {
29
29
  res: () => res,
30
30
  sod123: () => sod123,
31
31
  soic: () => soic,
32
+ sop8: () => sop8,
32
33
  sot23: () => sot23,
33
34
  sot235: () => sot235,
34
35
  sot236: () => sot236,
@@ -42,15 +43,6 @@ __export(fn_exports, {
42
43
  tssop: () => tssop
43
44
  });
44
45
 
45
- // src/helpers/u-curve.ts
46
- var u_curve = Array.from(
47
- { length: 9 },
48
- (_, i) => Math.cos(i / 8 * Math.PI - Math.PI)
49
- ).map((x) => ({
50
- x,
51
- y: -Math.sqrt(1 - x ** 2)
52
- }));
53
-
54
46
  // src/helpers/platedhole.ts
55
47
  import { mm } from "@tscircuit/mm";
56
48
  var platedhole = (pn, x, y, id, od) => {
@@ -67,10 +59,34 @@ var platedhole = (pn, x, y, id, od) => {
67
59
  };
68
60
  };
69
61
 
70
- // src/fn/dip.ts
62
+ // src/fn/soic.ts
71
63
  import { z } from "zod";
72
64
  import { length } from "circuit-json";
73
65
 
66
+ // src/helpers/u-curve.ts
67
+ var u_curve = Array.from(
68
+ { length: 9 },
69
+ (_, i) => Math.cos(i / 8 * Math.PI - Math.PI)
70
+ ).map((x) => ({
71
+ x,
72
+ y: -Math.sqrt(1 - x ** 2)
73
+ }));
74
+
75
+ // src/helpers/rectpad.ts
76
+ var rectpad = (pn, x, y, w, h) => {
77
+ return {
78
+ type: "pcb_smtpad",
79
+ x,
80
+ y,
81
+ width: w,
82
+ height: h,
83
+ layer: "top",
84
+ shape: "rect",
85
+ pcb_smtpad_id: "",
86
+ port_hints: Array.isArray(pn) ? pn.map((item) => item.toString()) : [pn.toString()]
87
+ };
88
+ };
89
+
74
90
  // src/helpers/silkscreenRef.ts
75
91
  var silkscreenRef = (x, y, font_size) => {
76
92
  return {
@@ -86,20 +102,157 @@ var silkscreenRef = (x, y, font_size) => {
86
102
  };
87
103
  };
88
104
 
89
- // src/fn/dip.ts
90
- var extendDipDef = (newDefaults) => z.object({
105
+ // src/fn/soic.ts
106
+ var extendSoicDef = (newDefaults) => z.object({
91
107
  fn: z.string(),
92
- num_pins: z.number().optional().default(6),
93
- wide: z.boolean().optional(),
94
- narrow: z.boolean().optional(),
95
- w: length.optional(),
96
- p: length.default(length.parse(newDefaults.p ?? "2.54mm")),
97
- id: length.optional(),
98
- od: length.optional()
108
+ num_pins: z.number().optional().default(8),
109
+ w: length.default(length.parse(newDefaults.w ?? "5.3mm")),
110
+ p: length.default(length.parse(newDefaults.p ?? "1.27mm")),
111
+ pw: length.optional(),
112
+ pl: length.optional(),
113
+ legsoutside: z.boolean().optional().default(newDefaults.legsoutside ?? false)
114
+ }).transform((v) => {
115
+ if (!v.pw && !v.pl) {
116
+ v.pw = length.parse("0.6mm");
117
+ v.pl = length.parse("1.0mm");
118
+ } else if (!v.pw) {
119
+ v.pw = v.pl * (0.6 / 1);
120
+ } else if (!v.pl) {
121
+ v.pl = v.pw * (1 / 0.6);
122
+ }
123
+ return v;
124
+ });
125
+ var soic_def = extendSoicDef({});
126
+ var getCcwSoicCoords = (parameters) => {
127
+ if (parameters.widthincludeslegs !== void 0) {
128
+ parameters.legsoutside = !parameters.widthincludeslegs;
129
+ }
130
+ const { num_pins, pn, w, p, pl, legsoutside } = parameters;
131
+ const ph = num_pins / 2;
132
+ const isLeft = pn <= ph;
133
+ const leftPinGaps = ph - 1;
134
+ const gs = p;
135
+ const h = gs * leftPinGaps;
136
+ const legoffset = legsoutside ? pl / 2 : -pl / 2;
137
+ if (isLeft) {
138
+ return { x: -w / 2 - legoffset, y: h / 2 - (pn - 1) * gs };
139
+ } else {
140
+ return { x: w / 2 + legoffset, y: -h / 2 + (pn - ph - 1) * gs };
141
+ }
142
+ };
143
+ var soic = (raw_params) => {
144
+ const parameters = soic_def.parse(raw_params);
145
+ return {
146
+ circuitJson: soicWithoutParsing(parameters),
147
+ parameters
148
+ };
149
+ };
150
+ var soicWithoutParsing = (parameters) => {
151
+ const pads = [];
152
+ for (let i = 0; i < parameters.num_pins; i++) {
153
+ const { x, y } = getCcwSoicCoords({
154
+ num_pins: parameters.num_pins,
155
+ pn: i + 1,
156
+ w: parameters.w,
157
+ p: parameters.p ?? 1.27,
158
+ pl: parameters.pl,
159
+ legsoutside: parameters.legsoutside
160
+ });
161
+ pads.push(
162
+ rectpad(i + 1, x, y, parameters.pl ?? "1mm", parameters.pw ?? "0.6mm")
163
+ );
164
+ }
165
+ const m = Math.min(1, parameters.p / 2);
166
+ const sw = parameters.w - (parameters.legsoutside ? 0 : parameters.pl * 2) - 0.2;
167
+ const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw + m;
168
+ const silkscreenRefText = silkscreenRef(
169
+ 0,
170
+ sh / 2 + 0.4,
171
+ sh / 12
172
+ );
173
+ const silkscreenBorder = {
174
+ type: "pcb_silkscreen_path",
175
+ layer: "top",
176
+ pcb_component_id: "",
177
+ pcb_silkscreen_path_id: "silkscreen_path_1",
178
+ stroke_width: 0.1,
179
+ route: [
180
+ { x: -sw / 2, y: -sh / 2 },
181
+ { x: -sw / 2, y: sh / 2 },
182
+ // Little U shape at the top
183
+ ...u_curve.map(({ x, y }) => ({
184
+ x: x * sw / 6,
185
+ y: y * sw / 6 + sh / 2
186
+ })),
187
+ { x: sw / 2, y: sh / 2 },
188
+ { x: sw / 2, y: -sh / 2 },
189
+ { x: -sw / 2, y: -sh / 2 }
190
+ ]
191
+ };
192
+ return [...pads, silkscreenBorder, silkscreenRefText];
193
+ };
194
+
195
+ // src/fn/sop8.ts
196
+ var sop8_def = extendSoicDef({});
197
+ var sop8 = (raw_params) => {
198
+ const parameters = sop8_def.parse(raw_params);
199
+ const pads = [];
200
+ for (let i = 0; i < parameters.num_pins; i++) {
201
+ const { x, y } = getCcwSoicCoords({
202
+ num_pins: parameters.num_pins,
203
+ pn: i + 1,
204
+ w: parameters.w,
205
+ p: parameters.p ?? 1.27,
206
+ pl: parameters.pl,
207
+ widthincludeslegs: true
208
+ });
209
+ pads.push(
210
+ rectpad(i + 1, x, y, parameters.pl ?? "1.5mm", parameters.pw ?? "0.6mm")
211
+ );
212
+ }
213
+ const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw;
214
+ const silkscreenRefText = silkscreenRef(
215
+ 0,
216
+ sh / 2 - 0.5,
217
+ sh / 12
218
+ );
219
+ const silkscreenLine = {
220
+ layer: "top",
221
+ pcb_component_id: "",
222
+ pcb_silkscreen_path_id: "",
223
+ type: "pcb_silkscreen_path",
224
+ route: [
225
+ { x: -parameters.w / 3, y: sh / 2 + 0.2 },
226
+ { x: parameters.w / 3, y: sh / 2 + 0.2 }
227
+ ],
228
+ stroke_width: 0.1
229
+ };
230
+ return {
231
+ circuitJson: [
232
+ ...pads,
233
+ silkscreenRefText,
234
+ silkscreenLine
235
+ ],
236
+ parameters
237
+ };
238
+ };
239
+
240
+ // src/fn/dip.ts
241
+ import { z as z2 } from "zod";
242
+ import { length as length2 } from "circuit-json";
243
+ var extendDipDef = (newDefaults) => z2.object({
244
+ fn: z2.string(),
245
+ num_pins: z2.number().optional().default(6),
246
+ wide: z2.boolean().optional(),
247
+ narrow: z2.boolean().optional(),
248
+ w: length2.optional(),
249
+ p: length2.default(length2.parse(newDefaults.p ?? "2.54mm")),
250
+ id: length2.optional(),
251
+ od: length2.optional()
99
252
  }).transform((v) => {
100
253
  if (!v.id && !v.od) {
101
- v.id = length.parse("1.0mm");
102
- v.od = length.parse("1.5mm");
254
+ v.id = length2.parse("1.0mm");
255
+ v.od = length2.parse("1.5mm");
103
256
  } else if (!v.id) {
104
257
  v.id = v.od * (1 / 1.5);
105
258
  } else if (!v.od) {
@@ -107,11 +260,11 @@ var extendDipDef = (newDefaults) => z.object({
107
260
  }
108
261
  if (!v.w) {
109
262
  if (v.wide) {
110
- v.w = length.parse("600mil");
263
+ v.w = length2.parse("600mil");
111
264
  } else if (v.narrow) {
112
- v.w = length.parse("300mil");
265
+ v.w = length2.parse("300mil");
113
266
  } else {
114
- v.w = length.parse(newDefaults.w ?? "300mil");
267
+ v.w = length2.parse(newDefaults.w ?? "300mil");
115
268
  }
116
269
  }
117
270
  return v;
@@ -198,25 +351,10 @@ var dip = (raw_params) => {
198
351
  };
199
352
  };
200
353
 
201
- // src/helpers/rectpad.ts
202
- var rectpad = (pn, x, y, w, h) => {
203
- return {
204
- type: "pcb_smtpad",
205
- x,
206
- y,
207
- width: w,
208
- height: h,
209
- layer: "top",
210
- shape: "rect",
211
- pcb_smtpad_id: "",
212
- port_hints: Array.isArray(pn) ? pn.map((item) => item.toString()) : [pn.toString()]
213
- };
214
- };
215
-
216
354
  // src/helpers/passive-fn.ts
217
355
  import mm2 from "@tscircuit/mm";
218
- import { z as z2 } from "zod";
219
- import { length as length2, distance } from "circuit-json";
356
+ import { z as z3 } from "zod";
357
+ import { length as length3, distance } from "circuit-json";
220
358
  var footprintSizes = [
221
359
  {
222
360
  imperial: "01005",
@@ -305,15 +443,15 @@ var imperialMap = footprintSizes.reduce(
305
443
  },
306
444
  {}
307
445
  );
308
- var passive_def = z2.object({
309
- tht: z2.boolean(),
310
- p: length2,
311
- pw: length2.optional(),
312
- ph: length2.optional(),
446
+ var passive_def = z3.object({
447
+ tht: z3.boolean(),
448
+ p: length3,
449
+ pw: length3.optional(),
450
+ ph: length3.optional(),
313
451
  metric: distance.optional(),
314
452
  imperial: distance.optional(),
315
- w: length2.optional(),
316
- h: length2.optional()
453
+ w: length3.optional(),
454
+ h: length3.optional()
317
455
  });
318
456
  var deriveXFromH = (h) => 0.079 * h ** 2 + 0.94 * h - 9e-3;
319
457
  var deriveZFromW = (w) => 1.09 * w + 0.6;
@@ -404,27 +542,27 @@ var res = (parameters) => {
404
542
  var ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
405
543
 
406
544
  // src/fn/bga.ts
407
- import { z as z5 } from "zod";
408
- import { length as length3, distance as distance2 } from "circuit-json";
545
+ import { z as z6 } from "zod";
546
+ import { length as length4, distance as distance2 } from "circuit-json";
409
547
 
410
548
  // src/helpers/zod/dim-2d.ts
411
- import { z as z3 } from "zod";
412
- var dim2d = z3.string().transform((a) => {
549
+ import { z as z4 } from "zod";
550
+ var dim2d = z4.string().transform((a) => {
413
551
  const [x, y] = a.split(/[x ]/);
414
552
  return {
415
553
  x: parseFloat(x),
416
554
  y: parseFloat(y)
417
555
  };
418
556
  }).pipe(
419
- z3.object({
420
- x: z3.number(),
421
- y: z3.number()
557
+ z4.object({
558
+ x: z4.number(),
559
+ y: z4.number()
422
560
  })
423
561
  );
424
562
 
425
563
  // src/helpers/zod/function-call.ts
426
- import { z as z4 } from "zod";
427
- var function_call = z4.string().or(z4.array(z4.any())).transform((a) => {
564
+ import { z as z5 } from "zod";
565
+ var function_call = z5.string().or(z5.array(z5.any())).transform((a) => {
428
566
  if (Array.isArray(a))
429
567
  return a;
430
568
  if (a.startsWith("(") && a.endsWith(")")) {
@@ -434,22 +572,22 @@ var function_call = z4.string().or(z4.array(z4.any())).transform((a) => {
434
572
  const numVal = Number(v);
435
573
  return isNaN(numVal) ? v : numVal;
436
574
  });
437
- }).pipe(z4.array(z4.string().or(z4.number())));
575
+ }).pipe(z5.array(z5.string().or(z5.number())));
438
576
 
439
577
  // src/fn/bga.ts
440
- var bga_def = z5.object({
441
- fn: z5.string(),
442
- num_pins: z5.number().optional().default(64),
578
+ var bga_def = z6.object({
579
+ fn: z6.string(),
580
+ num_pins: z6.number().optional().default(64),
443
581
  grid: dim2d.optional(),
444
582
  p: distance2.default("0.8mm"),
445
- w: length3.optional(),
446
- h: length3.optional(),
447
- ball: length3.optional().describe("ball diameter"),
448
- pad: length3.optional().describe("pad width/height"),
449
- tlorigin: z5.boolean().optional(),
450
- blorigin: z5.boolean().optional(),
451
- trorigin: z5.boolean().optional(),
452
- brorigin: z5.boolean().optional(),
583
+ w: length4.optional(),
584
+ h: length4.optional(),
585
+ ball: length4.optional().describe("ball diameter"),
586
+ pad: length4.optional().describe("pad width/height"),
587
+ tlorigin: z6.boolean().optional(),
588
+ blorigin: z6.boolean().optional(),
589
+ trorigin: z6.boolean().optional(),
590
+ brorigin: z6.boolean().optional(),
453
591
  missing: function_call.default([])
454
592
  }).transform((a) => {
455
593
  let origin = "tl";
@@ -538,98 +676,6 @@ var bga = (raw_params) => {
538
676
  };
539
677
  };
540
678
 
541
- // src/fn/soic.ts
542
- import { z as z6 } from "zod";
543
- import { length as length4 } from "circuit-json";
544
- var extendSoicDef = (newDefaults) => z6.object({
545
- fn: z6.string(),
546
- num_pins: z6.number().optional().default(8),
547
- w: length4.default(length4.parse(newDefaults.w ?? "5.3mm")),
548
- p: length4.default(length4.parse(newDefaults.p ?? "1.27mm")),
549
- pw: length4.optional(),
550
- pl: length4.optional(),
551
- legsoutside: z6.boolean().optional().default(newDefaults.legsoutside ?? false)
552
- }).transform((v) => {
553
- if (!v.pw && !v.pl) {
554
- v.pw = length4.parse("0.6mm");
555
- v.pl = length4.parse("1.0mm");
556
- } else if (!v.pw) {
557
- v.pw = v.pl * (0.6 / 1);
558
- } else if (!v.pl) {
559
- v.pl = v.pw * (1 / 0.6);
560
- }
561
- return v;
562
- });
563
- var soic_def = extendSoicDef({});
564
- var getCcwSoicCoords = (parameters) => {
565
- if (parameters.widthincludeslegs !== void 0) {
566
- parameters.legsoutside = !parameters.widthincludeslegs;
567
- }
568
- const { num_pins, pn, w, p, pl, legsoutside } = parameters;
569
- const ph = num_pins / 2;
570
- const isLeft = pn <= ph;
571
- const leftPinGaps = ph - 1;
572
- const gs = p;
573
- const h = gs * leftPinGaps;
574
- const legoffset = legsoutside ? pl / 2 : -pl / 2;
575
- if (isLeft) {
576
- return { x: -w / 2 - legoffset, y: h / 2 - (pn - 1) * gs };
577
- } else {
578
- return { x: w / 2 + legoffset, y: -h / 2 + (pn - ph - 1) * gs };
579
- }
580
- };
581
- var soic = (raw_params) => {
582
- const parameters = soic_def.parse(raw_params);
583
- return {
584
- circuitJson: soicWithoutParsing(parameters),
585
- parameters
586
- };
587
- };
588
- var soicWithoutParsing = (parameters) => {
589
- const pads = [];
590
- for (let i = 0; i < parameters.num_pins; i++) {
591
- const { x, y } = getCcwSoicCoords({
592
- num_pins: parameters.num_pins,
593
- pn: i + 1,
594
- w: parameters.w,
595
- p: parameters.p ?? 1.27,
596
- pl: parameters.pl,
597
- legsoutside: parameters.legsoutside
598
- });
599
- pads.push(
600
- rectpad(i + 1, x, y, parameters.pl ?? "1mm", parameters.pw ?? "0.6mm")
601
- );
602
- }
603
- const m = Math.min(1, parameters.p / 2);
604
- const sw = parameters.w - (parameters.legsoutside ? 0 : parameters.pl * 2) - 0.2;
605
- const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw + m;
606
- const silkscreenRefText = silkscreenRef(
607
- 0,
608
- sh / 2 + 0.4,
609
- sh / 12
610
- );
611
- const silkscreenBorder = {
612
- type: "pcb_silkscreen_path",
613
- layer: "top",
614
- pcb_component_id: "",
615
- pcb_silkscreen_path_id: "silkscreen_path_1",
616
- stroke_width: 0.1,
617
- route: [
618
- { x: -sw / 2, y: -sh / 2 },
619
- { x: -sw / 2, y: sh / 2 },
620
- // Little U shape at the top
621
- ...u_curve.map(({ x, y }) => ({
622
- x: x * sw / 6,
623
- y: y * sw / 6 + sh / 2
624
- })),
625
- { x: sw / 2, y: sh / 2 },
626
- { x: sw / 2, y: -sh / 2 },
627
- { x: -sw / 2, y: -sh / 2 }
628
- ]
629
- };
630
- return [...pads, silkscreenBorder, silkscreenRefText];
631
- };
632
-
633
679
  // src/fn/quad.ts
634
680
  import { z as z8 } from "zod";
635
681
  import { length as length5 } from "circuit-json";