@tscircuit/footprinter 0.0.78 → 0.0.79

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
@@ -63,6 +63,23 @@ var platedhole = (pn, x, y, id, od) => {
63
63
  // src/fn/dip.ts
64
64
  import { z } from "zod";
65
65
  import { length } from "circuit-json";
66
+
67
+ // src/helpers/silkscreenRef.ts
68
+ var silkscreenRef = (x, y, font_size) => {
69
+ return {
70
+ type: "pcb_silkscreen_text",
71
+ pcb_silkscreen_text_id: "silkscreen_text_1",
72
+ font: "tscircuit2024",
73
+ font_size,
74
+ pcb_component_id: "pcb_component_1",
75
+ text: "{REF}",
76
+ layer: "top",
77
+ anchor_position: { x, y },
78
+ anchor_alignment: "center"
79
+ };
80
+ };
81
+
82
+ // src/fn/dip.ts
66
83
  var extendDipDef = (newDefaults) => z.object({
67
84
  fn: z.string(),
68
85
  dip: z.literal(true),
@@ -163,8 +180,14 @@ var dip = (raw_params) => {
163
180
  };
164
181
  silkscreenPins.push(silkscreenPin);
165
182
  }
183
+ const silkscreenRefText = silkscreenRef(0, sh / 2 + 0.5, 0.4);
166
184
  return {
167
- circuitJson: [...platedHoles, silkscreenBorder, ...silkscreenPins],
185
+ circuitJson: [
186
+ ...platedHoles,
187
+ silkscreenBorder,
188
+ silkscreenRefText,
189
+ ...silkscreenPins
190
+ ],
168
191
  parameters
169
192
  };
170
193
  };
@@ -332,15 +355,18 @@ var passive = (params) => {
332
355
  throw new Error("could not infer pad width");
333
356
  if (ph === void 0)
334
357
  throw new Error("could not infer pad width");
358
+ const silkscreenRefText = silkscreenRef(0, h / 2, h / 12);
335
359
  if (tht) {
336
360
  return [
337
361
  platedhole(1, -p / 2, 0, pw, pw * 1 / 0.8),
338
- platedhole(2, p / 2, 0, pw, pw * 1 / 0.8)
362
+ platedhole(2, p / 2, 0, pw, pw * 1 / 0.8),
363
+ silkscreenRefText
339
364
  ];
340
365
  } else {
341
366
  return [
342
367
  rectpad(["1", "left"], -p / 2, 0, pw, ph),
343
- rectpad(["2", "right"], p / 2, 0, pw, ph)
368
+ rectpad(["2", "right"], p / 2, 0, pw, ph),
369
+ silkscreenRefText
344
370
  ];
345
371
  }
346
372
  };
@@ -439,8 +465,8 @@ var bga_def = z5.object({
439
465
  const m = s.match(/([A-Z]+)(\d+)/);
440
466
  if (!m)
441
467
  return s;
442
- let Y = ALPHABET.indexOf(m[1]);
443
- let X = parseInt(m[2]) - 1;
468
+ const Y = ALPHABET.indexOf(m[1]);
469
+ const X = Number.parseInt(m[2]) - 1;
444
470
  return Y * a.grid.x + X + 1;
445
471
  });
446
472
  }
@@ -503,7 +529,15 @@ ${JSON.stringify(
503
529
  );
504
530
  }
505
531
  }
506
- return { circuitJson: [...pads], parameters };
532
+ const silkscreenRefText = silkscreenRef(
533
+ 0,
534
+ grid.y * p / 2,
535
+ 0.2
536
+ );
537
+ return {
538
+ circuitJson: [...pads, silkscreenRefText],
539
+ parameters
540
+ };
507
541
  };
508
542
 
509
543
  // src/fn/soic.ts
@@ -571,6 +605,11 @@ var soicWithoutParsing = (parameters) => {
571
605
  const m = Math.min(1, parameters.p / 2);
572
606
  const sw = parameters.w - (parameters.legsoutside ? 0 : parameters.pl * 2) - 0.2;
573
607
  const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw + m;
608
+ const silkscreenRefText = silkscreenRef(
609
+ 0,
610
+ sh / 2 + 0.4,
611
+ sh / 12
612
+ );
574
613
  const silkscreenBorder = {
575
614
  type: "pcb_silkscreen_path",
576
615
  layer: "top",
@@ -590,7 +629,7 @@ var soicWithoutParsing = (parameters) => {
590
629
  { x: -sw / 2, y: -sh / 2 }
591
630
  ]
592
631
  };
593
- return [...pads, silkscreenBorder];
632
+ return [...pads, silkscreenBorder, silkscreenRefText];
594
633
  };
595
634
 
596
635
  // src/fn/quad.ts
@@ -840,7 +879,8 @@ var quad = (raw_params) => {
840
879
  y: corner_y - csz * dy
841
880
  }
842
881
  ],
843
- type: "pcb_silkscreen_path"
882
+ type: "pcb_silkscreen_path",
883
+ stroke_width: 0.1
844
884
  });
845
885
  }
846
886
  if ((arrow === "in1" || arrow === "in2") && !parameters.legsoutside) {
@@ -859,7 +899,8 @@ var quad = (raw_params) => {
859
899
  y: corner_y
860
900
  }
861
901
  ],
862
- type: "pcb_silkscreen_path"
902
+ type: "pcb_silkscreen_path",
903
+ stroke_width: 0
863
904
  },
864
905
  {
865
906
  layer: "top",
@@ -875,7 +916,8 @@ var quad = (raw_params) => {
875
916
  y: corner_y - csz * dy
876
917
  }
877
918
  ],
878
- type: "pcb_silkscreen_path"
919
+ type: "pcb_silkscreen_path",
920
+ stroke_width: 0.1
879
921
  }
880
922
  );
881
923
  }
@@ -902,12 +944,22 @@ var quad = (raw_params) => {
902
944
  y: arrow_y + 0.2 * rotate_arrow
903
945
  }
904
946
  ],
905
- type: "pcb_silkscreen_path"
947
+ type: "pcb_silkscreen_path",
948
+ stroke_width: 0.1
906
949
  });
907
950
  }
908
951
  }
952
+ const silkscreenRefText = silkscreenRef(
953
+ 0,
954
+ parameters.h / 2 + (parameters.legsoutside ? parameters.pl * 1.2 : 0.5),
955
+ 0.3
956
+ );
909
957
  return {
910
- circuitJson: [...pads, ...silkscreen_corners],
958
+ circuitJson: [
959
+ ...pads,
960
+ ...silkscreen_corners,
961
+ silkscreenRefText
962
+ ],
911
963
  parameters
912
964
  };
913
965
  };
@@ -1080,21 +1132,26 @@ var sot23WithoutParsing = (parameters) => {
1080
1132
  const { x, y } = getCcwSot23Coords({
1081
1133
  num_pins: parameters.num_pins,
1082
1134
  pn: i + 1,
1083
- w: parseFloat(parameters.w),
1084
- h: parseFloat(parameters.h),
1085
- pl: parseFloat(parameters.pl)
1135
+ w: Number.parseFloat(parameters.w),
1136
+ h: Number.parseFloat(parameters.h),
1137
+ pl: Number.parseFloat(parameters.pl)
1086
1138
  });
1087
1139
  pads.push(
1088
1140
  rectpad(
1089
1141
  i + 1,
1090
1142
  x,
1091
1143
  y,
1092
- parseFloat(parameters.pl),
1093
- parseFloat(parameters.pw)
1144
+ Number.parseFloat(parameters.pl),
1145
+ Number.parseFloat(parameters.pw)
1094
1146
  )
1095
1147
  );
1096
1148
  }
1097
- return pads;
1149
+ const silkscreenRefText = silkscreenRef(
1150
+ 0,
1151
+ Number(parameters.h),
1152
+ 0.3
1153
+ );
1154
+ return [...pads, silkscreenRefText];
1098
1155
  };
1099
1156
 
1100
1157
  // src/fn/dfn.ts
@@ -1141,7 +1198,8 @@ var dfn = (raw_params) => {
1141
1198
  { x: dx * sw / 2, y: dy * sh / 2 },
1142
1199
  { x: dx * sw / 2, y: dy * sh / 2 - dy * parameters.p }
1143
1200
  ],
1144
- type: "pcb_silkscreen_path"
1201
+ type: "pcb_silkscreen_path",
1202
+ stroke_width: 0.1
1145
1203
  });
1146
1204
  }
1147
1205
  const as = parameters.p / 4;
@@ -1169,10 +1227,20 @@ var dfn = (raw_params) => {
1169
1227
  x: atx,
1170
1228
  y: aty
1171
1229
  }
1172
- ]
1230
+ ],
1231
+ stroke_width: 0.1
1173
1232
  });
1233
+ const silkscreenRefText = silkscreenRef(
1234
+ 0,
1235
+ sh / 2 + 0.4,
1236
+ sh / 12
1237
+ );
1174
1238
  return {
1175
- circuitJson: [...pads, ...silkscreenPaths],
1239
+ circuitJson: [
1240
+ ...pads,
1241
+ silkscreenRefText,
1242
+ ...silkscreenPaths
1243
+ ],
1176
1244
  parameters
1177
1245
  };
1178
1246
  };
@@ -1196,7 +1264,11 @@ var pinrow = (raw_params) => {
1196
1264
  for (let i = 0; i < parameters.num_pins; i++) {
1197
1265
  holes.push(platedhole(i + 1, xoff + i * p, 0, id, od));
1198
1266
  }
1199
- return { circuitJson: holes, parameters };
1267
+ const silkscreenRefText = silkscreenRef(0, p / 2, 0.5);
1268
+ return {
1269
+ circuitJson: [...holes, silkscreenRefText],
1270
+ parameters
1271
+ };
1200
1272
  };
1201
1273
 
1202
1274
  // src/fn/sot563.ts
@@ -1257,8 +1329,14 @@ var sot723_def = z12.object({
1257
1329
  });
1258
1330
  var sot723 = (raw_params) => {
1259
1331
  const parameters = sot723_def.parse(raw_params);
1332
+ const pad = sot723WithoutParsing(parameters);
1333
+ const silkscreenRefText = silkscreenRef(
1334
+ 0,
1335
+ Number(parameters.h),
1336
+ 0.3
1337
+ );
1260
1338
  return {
1261
- circuitJson: sot723WithoutParsing(parameters),
1339
+ circuitJson: [...pad, silkscreenRefText],
1262
1340
  parameters
1263
1341
  };
1264
1342
  };
@@ -1297,6 +1375,7 @@ var sot723WithoutParsing = (parameters) => {
1297
1375
 
1298
1376
  // src/fn/sod123.ts
1299
1377
  import { z as z13 } from "zod";
1378
+ import "circuit-json";
1300
1379
  var sod_def = z13.object({
1301
1380
  fn: z13.string(),
1302
1381
  w: z13.string().default("2.36mm"),
@@ -1307,8 +1386,15 @@ var sod_def = z13.object({
1307
1386
  });
1308
1387
  var sod123 = (raw_params) => {
1309
1388
  const parameters = sod_def.parse(raw_params);
1389
+ const silkscreenRefText = silkscreenRef(
1390
+ 0,
1391
+ Number(parameters.h) / 4 + 0.4,
1392
+ 0.3
1393
+ );
1310
1394
  return {
1311
- circuitJson: sodWithoutParsing(parameters),
1395
+ circuitJson: sodWithoutParsing(parameters).concat(
1396
+ silkscreenRefText
1397
+ ),
1312
1398
  parameters
1313
1399
  };
1314
1400
  };
@@ -1325,15 +1411,15 @@ var sodWithoutParsing = (parameters) => {
1325
1411
  for (let i = 0; i < 2; i++) {
1326
1412
  const { x, y } = getSodCoords({
1327
1413
  pn: i + 1,
1328
- pad_spacing: parseFloat(parameters.pad_spacing)
1414
+ pad_spacing: Number.parseFloat(parameters.pad_spacing)
1329
1415
  });
1330
1416
  pads.push(
1331
1417
  rectpad(
1332
1418
  i + 1,
1333
1419
  x,
1334
1420
  y,
1335
- parseFloat(parameters.pl),
1336
- parseFloat(parameters.pw)
1421
+ Number.parseFloat(parameters.pl),
1422
+ Number.parseFloat(parameters.pw)
1337
1423
  )
1338
1424
  );
1339
1425
  }
@@ -1342,15 +1428,15 @@ var sodWithoutParsing = (parameters) => {
1342
1428
 
1343
1429
  // src/fn/axial.ts
1344
1430
  import {
1345
- length as length7
1431
+ length as length8
1346
1432
  } from "@tscircuit/soup";
1347
1433
  import { z as z14 } from "zod";
1348
1434
  var axial_def = z14.object({
1349
1435
  fn: z14.string(),
1350
1436
  num_pins: z14.any().transform(() => 2),
1351
- p: length7.optional().default("2.54mm"),
1352
- id: length7.optional().default("0.7mm"),
1353
- od: length7.optional().default("1mm")
1437
+ p: length8.optional().default("2.54mm"),
1438
+ id: length8.optional().default("0.7mm"),
1439
+ od: length8.optional().default("1mm")
1354
1440
  });
1355
1441
  var axial = (raw_params) => {
1356
1442
  const parameters = axial_def.parse(raw_params);
@@ -1370,7 +1456,15 @@ var axial = (raw_params) => {
1370
1456
  stroke_width: 0.1,
1371
1457
  pcb_silkscreen_path_id: ""
1372
1458
  };
1373
- return { circuitJson: [...plated_holes, silkscreenLine], parameters };
1459
+ const silkscreenRefText = silkscreenRef(0, p / 4, 0.5);
1460
+ return {
1461
+ circuitJson: [
1462
+ ...plated_holes,
1463
+ silkscreenLine,
1464
+ silkscreenRefText
1465
+ ],
1466
+ parameters
1467
+ };
1374
1468
  };
1375
1469
 
1376
1470
  // src/fn/pushbutton.ts
@@ -1424,27 +1518,32 @@ var pushbutton = (raw_params) => {
1424
1518
  { x: width / 5, y: 0 }
1425
1519
  ])
1426
1520
  ];
1521
+ const silkscreenRefText = silkscreenRef(
1522
+ 0,
1523
+ height / 2 + 0.4,
1524
+ 0.5
1525
+ );
1427
1526
  return {
1428
- circuitJson: [...holes, ...silkscreenLines],
1527
+ circuitJson: [...holes, ...silkscreenLines, silkscreenRefText],
1429
1528
  parameters
1430
1529
  };
1431
1530
  };
1432
1531
 
1433
1532
  // src/fn/stampboard.ts
1434
1533
  import {
1435
- length as length8
1534
+ length as length9
1436
1535
  } from "circuit-json";
1437
1536
  import { z as z16 } from "zod";
1438
1537
  var stampboard_def = z16.object({
1439
1538
  fn: z16.string(),
1440
- w: length8.default("22.58mm"),
1441
- left: length8.optional(),
1442
- right: length8.optional(),
1443
- top: length8.optional(),
1444
- bottom: length8.optional(),
1445
- p: length8.default(length8.parse("2.54mm")),
1446
- pw: length8.default(length8.parse("1.6mm")),
1447
- pl: length8.default(length8.parse("3.2mm")),
1539
+ w: length9.default("22.58mm"),
1540
+ left: length9.optional(),
1541
+ right: length9.optional(),
1542
+ top: length9.optional(),
1543
+ bottom: length9.optional(),
1544
+ p: length9.default(length9.parse("2.54mm")),
1545
+ pw: length9.default(length9.parse("1.6mm")),
1546
+ pl: length9.default(length9.parse("3.2mm")),
1448
1547
  innerhole: z16.boolean().default(false)
1449
1548
  });
1450
1549
  var getHeight = (parameters) => {
@@ -1740,8 +1839,19 @@ var stampboard = (raw_params) => {
1740
1839
  stroke_width: 0.1,
1741
1840
  layer: "top"
1742
1841
  };
1842
+ const silkscreenRefText = silkscreenRef(
1843
+ 0,
1844
+ getHeight(params) / 2 + 0.5,
1845
+ getHeight(params) / 25
1846
+ );
1743
1847
  return {
1744
- circuitJson: [...rectpads, ...holes, silkscreenPath, silkscreenTriangle],
1848
+ circuitJson: [
1849
+ ...rectpads,
1850
+ ...holes,
1851
+ silkscreenPath,
1852
+ silkscreenTriangle,
1853
+ silkscreenRefText
1854
+ ],
1745
1855
  parameters: params
1746
1856
  };
1747
1857
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/fn/index.ts","../src/helpers/u-curve.ts","../src/helpers/platedhole.ts","../src/fn/dip.ts","../src/helpers/rectpad.ts","../src/helpers/passive-fn.ts","../src/fn/diode.ts","../src/fn/cap.ts","../src/fn/led.ts","../src/fn/res.ts","../src/helpers/zod/ALPHABET.ts","../src/fn/bga.ts","../src/helpers/zod/dim-2d.ts","../src/helpers/zod/function-call.ts","../src/fn/soic.ts","../src/fn/quad.ts","../src/helpers/zod/pin-order-specifier.ts","../src/helpers/get-quad-pin-map.ts","../src/fn/qfn.ts","../src/fn/qfp.ts","../src/fn/mlp.ts","../src/fn/ssop.ts","../src/fn/tssop.ts","../src/fn/sot236.ts","../src/fn/sot363.ts","../src/fn/sot23.ts","../src/fn/dfn.ts","../src/helpers/corner.ts","../src/fn/pinrow.ts","../src/fn/sot563.ts","../src/fn/ms012.ts","../src/fn/ms013.ts","../src/fn/sot723.ts","../src/fn/sod123.ts","../src/fn/axial.ts","../src/fn/pushbutton.ts","../src/helpers/silkscreenpath.ts","../src/fn/stampboard.ts","../src/helpers/is-not-null.ts","../src/footprinter.ts"],"sourcesContent":["export { dip } from \"./dip\"\nexport { diode } from \"./diode\"\nexport { cap } from \"./cap\"\nexport { led } from \"./led\"\nexport { res } from \"./res\"\nexport { bga } from \"./bga\"\nexport { soic } from \"./soic\"\nexport { quad } from \"./quad\"\nexport { qfn } from \"./qfn\"\nexport { qfp } from \"./qfp\"\nexport { mlp } from \"./mlp\"\nexport { ssop } from \"./ssop\"\nexport { tssop } from \"./tssop\"\nexport { sot236 } from \"./sot236\"\nexport { sot363 } from \"./sot363\"\nexport { sot23 } from \"./sot23\"\nexport { dfn } from \"./dfn\"\nexport { pinrow } from \"./pinrow\"\nexport { sot563 } from \"./sot563\"\nexport { ms012 } from \"./ms012\"\nexport { ms013 } from \"./ms013\"\nexport { sot723 } from \"./sot723\"\nexport { sod123 } from \"./sod123\"\nexport { axial } from \"./axial\"\nexport { pushbutton } from \"./pushbutton\"\nexport { stampboard } from \"./stampboard\"\n","export const u_curve = Array.from({ length: 9 }, (_, i) =>\n Math.cos((i / 8) * Math.PI - Math.PI),\n).map((x) => ({\n x,\n y: -Math.sqrt(1 - x ** 2),\n}))\n","import type { PcbPlatedHole } from \"circuit-json\"\nimport { mm } from \"@tscircuit/mm\"\n\nexport const platedhole = (\n pn: number,\n x: number,\n y: number,\n id: number | string,\n od: number | string,\n): PcbPlatedHole => {\n return {\n type: \"pcb_plated_hole\",\n shape: \"circle\",\n x,\n y,\n hole_diameter: mm(id),\n outer_diameter: mm(od),\n pcb_port_id: \"\",\n layers: [\"top\", \"bottom\"],\n port_hints: [pn.toString()],\n }\n}\n","import type {\n AnyCircuitElement,\n PcbFabricationNoteText,\n PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { u_curve } from \"../helpers/u-curve\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\n\nexport const extendDipDef = (newDefaults: { w?: string; p?: string }) =>\n z\n .object({\n fn: z.string(),\n dip: z.literal(true),\n num_pins: z.number(),\n wide: z.boolean().optional(),\n narrow: z.boolean().optional(),\n w: length.optional(),\n p: length.default(length.parse(newDefaults.p ?? \"2.54mm\")),\n id: length.optional(),\n od: length.optional(),\n })\n .transform((v) => {\n // Default inner diameter and outer diameter\n if (!v.id && !v.od) {\n v.id = length.parse(\"1.0mm\")\n v.od = length.parse(\"1.2mm\")\n } else if (!v.id) {\n v.id = v.od! * (1.0 / 1.2)\n } else if (!v.od) {\n v.od = v.id! * (1.2 / 1.0)\n }\n\n // Default width (TODO high pin counts should probably be wide?)\n if (!v.w) {\n if (v.wide) {\n v.w = length.parse(\"600mil\")\n } else if (v.narrow) {\n v.w = length.parse(\"300mil\")\n } else {\n v.w = length.parse(newDefaults.w ?? \"300mil\")\n }\n }\n return v as NowDefined<typeof v, \"w\" | \"p\" | \"id\" | \"od\">\n })\n\nexport const dip_def = extendDipDef({})\n\nexport const getCcwDipCoords = (\n pinCount: number,\n pn: number,\n w: number,\n p: number,\n) => {\n /** pin height */\n const ph = pinCount / 2\n const isLeft = pn <= ph\n\n /** Number of gaps between pins on each side, e.g. 4 pins = 3 spaces */\n const leftPinGaps = ph - 1\n\n /** gap size (pitch) */\n const gs = p\n\n const h = gs * leftPinGaps\n\n if (isLeft) {\n // The y position starts at h/2, then goes down by gap size\n // for each pin\n return { x: -w / 2, y: h / 2 - (pn - 1) * gs }\n } else {\n // The y position starts at -h/2, then goes up by gap size\n return { x: w / 2, y: -h / 2 + (pn - ph - 1) * gs }\n }\n}\n\n/**\n * Returns the plated holes for a DIP package.\n */\nexport const dip = (raw_params: {\n dip: true\n num_pins: number\n w: number\n p?: number\n id?: string | number\n od?: string | number\n}): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = dip_def.parse(raw_params)\n const platedHoles: AnyCircuitElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwDipCoords(\n parameters.num_pins,\n i + 1,\n parameters.w,\n parameters.p ?? 2.54,\n )\n platedHoles.push(\n platedhole(i + 1, x, y, parameters.id ?? \"0.8mm\", parameters.od ?? \"1mm\"),\n )\n }\n /** silkscreen width */\n const sw = parameters.w - parameters.od - 0.4\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.od + 0.4\n const silkscreenBorder: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: sh / 2 },\n // Little U shape at the top\n ...u_curve.map(({ x, y }) => ({\n x: (x * sw) / 6,\n y: (y * sw) / 6 + sh / 2,\n })),\n { x: sw / 2, y: sh / 2 },\n { x: sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: -sh / 2 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n const silkscreenPins: PcbFabricationNoteText[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const isLeft = i < parameters.num_pins / 2\n const pinLabelX = isLeft\n ? -parameters.w / 2 - parameters.p / 2 - 0.2\n : parameters.p / 2 + parameters.w / 2 + 0.2\n const pinLabelY = isLeft\n ? (-sh + 1.6) / 2 + i * parameters.p\n : (-sh + 1.6) / 2 + (i - parameters.num_pins / 2) * parameters.p\n const silkscreenPin = {\n type: \"pcb_fabrication_note_text\",\n layer: \"top\",\n pcb_component_id: `pin_${i + 1}`,\n pcb_silkscreen_text_id: `pin_${i + 1}`,\n text: `{pin${i + 1}}`,\n anchor_position: {\n x: pinLabelX,\n y: pinLabelY,\n },\n font_size: 0.3,\n font_color: \"red\",\n font: \"tscircuit2024\",\n anchor_alignment: \"top-left\",\n }\n\n silkscreenPins.push(silkscreenPin)\n }\n\n return {\n circuitJson: [...platedHoles, silkscreenBorder, ...silkscreenPins],\n parameters,\n }\n}\n","import type { PCBSMTPad } from \"@tscircuit/soup\"\nexport const rectpad = (\n pn: number | Array<string | number>,\n x: number,\n y: number,\n w: number,\n h: number,\n): PCBSMTPad => {\n return {\n type: \"pcb_smtpad\",\n x,\n y,\n width: w,\n height: h,\n layer: \"top\",\n shape: \"rect\",\n pcb_smtpad_id: \"\",\n port_hints: Array.isArray(pn)\n ? pn.map((item) => item.toString())\n : [pn.toString()],\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport mm from \"@tscircuit/mm\"\nimport { platedhole } from \"./platedhole\"\nimport { z } from \"zod\"\nimport { length, distance } from \"circuit-json\"\n\ntype StandardSize = {\n imperial: string\n metric: string\n Z_mm_min: number\n G_mm_min: number\n X_mm_min: number\n C_mm_ref: number\n}\n\n// https://www.worthingtonassembly.com/perfect-0201-footprint\n// https://static1.squarespace.com/static/54982a02e4b02e9f5e5d9ca7/t/660c692f69a0d83a4afecdf0/1712089391915/Discrete+Component+Footprints.pdf\n// https://page.venkel.com/hubfs/Resources/Technical/Resistors%20Landing%20Pattern.pdf\nconst sizes = [\n {\n imperial: \"01005\",\n metric: \"0402\",\n Z_mm_min: 0.58,\n G_mm_min: 0.18,\n X_mm_min: 0.21,\n C_mm_ref: 0.038,\n },\n {\n imperial: \"0201\",\n metric: \"0603\",\n Z_mm_min: 0.9,\n G_mm_min: 0.3,\n X_mm_min: 0.3,\n C_mm_ref: 0.6,\n },\n {\n imperial: \"0402\",\n metric: \"1005\",\n Z_mm_min: 1.6,\n G_mm_min: 0.4,\n X_mm_min: 0.7,\n C_mm_ref: 1,\n },\n {\n imperial: \"0603\",\n metric: \"1608\",\n Z_mm_min: 2.6,\n G_mm_min: 0.6,\n X_mm_min: 1.0,\n C_mm_ref: 1.7,\n },\n {\n imperial: \"0805\",\n metric: \"2012\",\n Z_mm_min: 3.0,\n G_mm_min: 0.6,\n X_mm_min: 1.2,\n C_mm_ref: 1.9,\n },\n {\n imperial: \"1206\",\n metric: \"3216\",\n Z_mm_min: 4.2,\n G_mm_min: 1.2,\n X_mm_min: 1.4,\n C_mm_ref: 2.8,\n },\n {\n imperial: \"1210\",\n metric: \"3225\",\n Z_mm_min: 4.2,\n G_mm_min: 1.2,\n X_mm_min: 2.4,\n C_mm_ref: 2.8,\n },\n {\n imperial: \"2010\",\n metric: \"5025\",\n Z_mm_min: 6.0,\n G_mm_min: 2.6,\n X_mm_min: 2.4,\n C_mm_ref: 4.4,\n },\n {\n imperial: \"2512\",\n metric: \"6332\",\n Z_mm_min: 7.2,\n G_mm_min: 3.8,\n X_mm_min: 3.0,\n C_mm_ref: 5.6,\n },\n]\nconst metricMap: Record<string, StandardSize> = sizes.reduce((acc: any, s) => {\n acc[s.metric] = s\n return acc\n}, {})\nconst imperialMap: Record<string, StandardSize> = sizes.reduce(\n (acc: any, s) => {\n acc[s.imperial] = s\n return acc\n },\n {},\n)\n\nexport const passive_def = z.object({\n tht: z.boolean(),\n p: length,\n pw: length.optional(),\n ph: length.optional(),\n metric: distance.optional(),\n imperial: distance.optional(),\n w: length.optional(),\n h: length.optional(),\n})\n\nexport type PassiveDef = z.input<typeof passive_def>\n\nconst deriveXFromH = (h: number) => 0.079 * h ** 2 + 0.94 * h - 0.009\nconst deriveZFromW = (w: number) => 1.09 * w + 0.6\nconst deriveGFromW = (w: number) => 0.59 * w - 0.31\nconst deriveCFromW = (w: number) => -0.01 * w ** 2 + 0.94 * w + 0.03\n\nexport const passive = (params: PassiveDef): AnySoupElement[] => {\n let { tht, p, pw, ph, metric, imperial, w, h } = params\n\n if (typeof w === \"string\") w = mm(w)\n if (typeof h === \"string\") h = mm(h)\n if (typeof p === \"string\") p = mm(p)\n if (typeof pw === \"string\") pw = mm(pw)\n if (typeof ph === \"string\") ph = mm(ph)\n\n if (h! > w!) {\n throw new Error(\n \"height cannot be greater than width (rotated footprint not yet implemented)\",\n )\n }\n\n /** standard size */\n let sz: StandardSize | undefined\n if (metric) {\n sz = metricMap[metric]\n }\n\n if (imperial) {\n sz = imperialMap[imperial]\n }\n\n if (!sz && w && h && !pw && !ph) {\n sz = {\n imperial: \"custom\",\n metric: \"custom\",\n Z_mm_min: deriveZFromW(w),\n G_mm_min: deriveGFromW(w),\n X_mm_min: deriveXFromH(h),\n C_mm_ref: deriveCFromW(w),\n }\n }\n\n if (sz) {\n w = sz.Z_mm_min\n h = sz.X_mm_min\n p = sz.C_mm_ref\n pw = (sz.Z_mm_min - sz.G_mm_min) / 2\n ph = (sz.Z_mm_min - sz.G_mm_min) / 2\n }\n\n if (pw === undefined) throw new Error(\"could not infer pad width\")\n if (ph === undefined) throw new Error(\"could not infer pad width\")\n\n if (tht) {\n return [\n platedhole(1, -p / 2, 0, pw, (pw * 1) / 0.8),\n platedhole(2, p / 2, 0, pw, (pw * 1) / 0.8),\n ]\n } else {\n return [\n rectpad([\"1\", \"left\"], -p / 2, 0, pw, ph),\n rectpad([\"2\", \"right\"], p / 2, 0, pw, ph),\n ]\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { passive } from \"src/helpers/passive-fn\"\n\nexport const diode = (parameters: {\n tht: boolean\n p: number\n}): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { PassiveDef, passive } from \"../helpers/passive-fn\"\n\nexport const cap = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { type PassiveDef, passive } from \"../helpers/passive-fn\"\n\nexport const led = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { passive, type PassiveDef } from \"../helpers/passive-fn\"\n\nexport const res = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","export const ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n","import type { AnySoupElement, PCBSMTPad } from \"@tscircuit/soup\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { ALPHABET } from \"../helpers/zod/ALPHABET\"\nimport { z } from \"zod\"\nimport { length, distance } from \"@tscircuit/soup\"\nimport { dim2d } from \"src/helpers/zod/dim-2d\"\nimport { function_call } from \"src/helpers/zod/function-call\"\nimport type { NowDefined } from \"src/helpers/zod/now-defined\"\n\nexport const bga_def = z\n .object({\n fn: z.string(),\n num_pins: z.number(),\n grid: dim2d.optional(),\n p: distance.default(\"0.8mm\"),\n w: length.optional(),\n h: length.optional(),\n ball: length.optional().describe(\"ball diameter\"),\n pad: length.optional().describe(\"pad width/height\"),\n\n tlorigin: z.boolean().optional(),\n blorigin: z.boolean().optional(),\n trorigin: z.boolean().optional(),\n brorigin: z.boolean().optional(),\n\n missing: function_call.default([]),\n })\n .transform((a) => {\n let origin: \"tl\" | \"bl\" | \"tr\" | \"br\" = \"tl\"\n if (a.blorigin) origin = \"bl\"\n if (a.trorigin) origin = \"tr\"\n if (a.brorigin) origin = \"br\"\n\n if (!a.grid) {\n // find the largest square for the number of pins\n const largest_square = Math.ceil(Math.sqrt(a.num_pins))\n a.grid = { x: largest_square, y: largest_square }\n }\n\n if (a.missing) {\n a.missing = a.missing.map((s) => {\n if (typeof s === \"number\") return s\n if (s === \"center\") return \"center\"\n if (s === \"topleft\") return \"topleft\"\n const m = s.match(/([A-Z]+)(\\d+)/)\n if (!m) return s\n let Y = ALPHABET.indexOf(m[1]!)\n let X = parseInt(m[2]!) - 1\n return Y * a.grid!.x + X + 1\n })\n }\n\n const new_def = { ...a, origin }\n\n return new_def as NowDefined<typeof new_def, \"w\" | \"h\" | \"grid\">\n })\n\nexport type BgaDefInput = z.input<typeof bga_def>\nexport type BgaDef = z.infer<typeof bga_def>\n\nexport const bga = (\n raw_params: BgaDefInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = bga_def.parse(raw_params)\n let { num_pins, grid, p, w, h, ball, pad, missing } = parameters\n\n ball ??= (0.75 / 1.27) * p\n\n pad ??= ball * 0.8\n\n const pads: PCBSMTPad[] = []\n\n const missing_pin_nums = (missing ?? []).filter((a) => typeof a === \"number\")\n const num_pins_missing = grid.x * grid.y - num_pins\n\n if (missing.length === 0 && num_pins_missing > 0) {\n // No missing pins specified, let's see if a squared center works\n // if num_pins_missing is a square\n if (Math.sqrt(num_pins_missing) % 1 === 0) {\n missing.push(\"center\")\n } else if (num_pins_missing === 1) {\n missing.push(\"topleft\")\n }\n }\n\n if (missing?.includes(\"center\")) {\n // Find the largest square that's square is less than\n // the number of missing pins\n const square_size = Math.floor(Math.sqrt(num_pins_missing))\n\n // Find the top left coordinate of the inner square, keep\n // in mind the full grid size is grid.x x grid.y\n const inner_square_x = Math.floor((grid.x - square_size) / 2)\n const inner_square_y = Math.floor((grid.y - square_size) / 2)\n\n // Add all the missing square pin numbers to missing_pin_nums\n for (let y = inner_square_y; y < inner_square_y + square_size; y++) {\n for (let x = inner_square_x; x < inner_square_x + square_size; x++) {\n missing_pin_nums.push(y * grid.x + x + 1)\n }\n }\n }\n\n if (missing?.includes(\"topleft\")) {\n missing_pin_nums.push(1)\n }\n\n if (num_pins_missing !== missing_pin_nums.length) {\n throw new Error(\n `not able to create bga component, unable to determine missing pins (try specifying them with \"missing+1+2+...\"\\n\\n${JSON.stringify(\n parameters,\n null,\n \" \",\n )}`,\n )\n }\n\n const missing_pin_nums_set = new Set(missing_pin_nums)\n\n let missing_pins_passed = 0\n for (let y = 0; y < grid.y; y++) {\n for (let x = 0; x < grid.x; x++) {\n let pin_num = y * grid.x + x + 1\n if (missing_pin_nums_set.has(pin_num)) {\n missing_pins_passed++\n continue\n }\n pin_num -= missing_pins_passed\n\n const pad_x = (x - (grid.x - 1) / 2) * p\n const pad_y = -(y - (grid.y - 1) / 2) * p\n\n // TODO handle >26 rows\n pads.push(\n rectpad([pin_num, `${ALPHABET[y]}${x + 1}`], pad_x, pad_y, pad, pad),\n )\n }\n }\n\n return { circuitJson: [...pads], parameters }\n}\n","import { z } from \"zod\"\n\nexport const dim2d = z\n .string()\n .transform((a) => {\n const [x, y] = a.split(/[x ]/)\n return {\n x: parseFloat(x),\n y: parseFloat(y),\n }\n })\n .pipe(\n z.object({\n x: z.number(),\n y: z.number(),\n }),\n )\n","import { z } from \"zod\"\n\nexport const function_call = z\n .string()\n .or(z.array(z.any()))\n .transform((a) => {\n if (Array.isArray(a)) return a\n if (a.startsWith(\"(\") && a.endsWith(\")\")) {\n a = a.slice(1, -1)\n }\n return a.split(\",\").map((v) => {\n const numVal = Number(v)\n return isNaN(numVal) ? v : numVal\n })\n })\n .pipe(z.array(z.string().or(z.number())))\n","import type { AnySoupElement, PcbSilkscreenPath } from \"@tscircuit/soup\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { z, type AnyZodObject } from \"zod\"\nimport { length } from \"@tscircuit/soup\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { u_curve } from \"../helpers/u-curve\"\nimport { rectpad } from \"src/helpers/rectpad\"\n\nexport const extendSoicDef = (newDefaults: {\n w?: string\n p?: string\n legsoutside?: boolean\n}) =>\n z\n .object({\n fn: z.string(),\n num_pins: z.number(),\n w: length.default(length.parse(newDefaults.w ?? \"5.3mm\")),\n p: length.default(length.parse(newDefaults.p ?? \"1.27mm\")),\n pw: length.optional(),\n pl: length.optional(),\n legsoutside: z\n .boolean()\n .optional()\n .default(newDefaults.legsoutside ?? false),\n })\n .transform((v) => {\n // Default inner diameter and outer diameter\n if (!v.pw && !v.pl) {\n v.pw = length.parse(\"0.6mm\")\n v.pl = length.parse(\"1.0mm\")\n } else if (!v.pw) {\n v.pw = v.pl! * (0.6 / 1.0)\n } else if (!v.pl) {\n v.pl = v.pw! * (1.0 / 0.6)\n }\n\n return v as NowDefined<typeof v, \"w\" | \"p\" | \"pw\" | \"pl\">\n })\n\nexport const soic_def = extendSoicDef({})\nexport type SoicInput = z.infer<typeof soic_def>\n\nexport const getCcwSoicCoords = (parameters: {\n num_pins: number\n pn: number\n w: number\n p: number\n pl: number\n legsoutside?: boolean\n widthincludeslegs?: boolean\n}) => {\n if (parameters.widthincludeslegs !== undefined) {\n parameters.legsoutside = !parameters.widthincludeslegs\n }\n const { num_pins, pn, w, p, pl, legsoutside } = parameters\n /** pin height */\n const ph = num_pins / 2\n const isLeft = pn <= ph\n\n /** Number of gaps between pins on each side, e.g. 4 pins = 3 spaces */\n const leftPinGaps = ph - 1\n\n /** gap size (pitch) */\n const gs = p\n\n const h = gs * leftPinGaps\n\n const legoffset = legsoutside ? pl / 2 : -pl / 2\n\n if (isLeft) {\n // The y position starts at h/2, then goes down by gap size\n // for each pin\n return { x: -w / 2 - legoffset, y: h / 2 - (pn - 1) * gs }\n } else {\n // The y position starts at -h/2, then goes up by gap size\n return { x: w / 2 + legoffset, y: -h / 2 + (pn - ph - 1) * gs }\n }\n}\n\n/**\n * Returns the plated holes for a SOIC package.\n */\nexport const soic = (raw_params: {\n soic: true\n num_pins: number\n w: number\n p?: number\n id?: string | number\n od?: string | number\n}): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = soic_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n\nexport const soicWithoutParsing = (parameters: z.infer<typeof soic_def>) => {\n const pads: AnySoupElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSoicCoords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n p: parameters.p ?? 1.27,\n pl: parameters.pl,\n legsoutside: parameters.legsoutside,\n })\n pads.push(\n rectpad(i + 1, x, y, parameters.pl ?? \"1mm\", parameters.pw ?? \"0.6mm\"),\n )\n }\n\n /** silkscreen width */\n const m = Math.min(1, parameters.p / 2)\n const sw =\n parameters.w - (parameters.legsoutside ? 0 : parameters.pl * 2) - 0.2\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw + m\n const silkscreenBorder: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n stroke_width: 0.1,\n route: [\n { x: -sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: sh / 2 },\n // Little U shape at the top\n ...u_curve.map(({ x, y }) => ({\n x: (x * sw) / 6,\n y: (y * sw) / 6 + sh / 2,\n })),\n { x: sw / 2, y: sh / 2 },\n { x: sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: -sh / 2 },\n ],\n }\n\n return [...pads, silkscreenBorder]\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { length } from \"@tscircuit/soup\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { pin_order_specifier } from \"src/helpers/zod/pin-order-specifier\"\nimport { getQuadPinMap } from \"src/helpers/get-quad-pin-map\"\nimport { dim2d } from \"src/helpers/zod/dim-2d\"\n\nexport const base_quad_def = z.object({\n fn: z.string(),\n cc: z.literal(true).optional(),\n ccw: z.literal(true).optional(),\n startingpin: z\n .string()\n .or(z.array(pin_order_specifier))\n .transform((a) => (typeof a === \"string\" ? a.slice(1, -1).split(\",\") : a))\n .pipe(z.array(pin_order_specifier))\n .optional(),\n num_pins: z.number(),\n w: length.optional(),\n h: length.optional(),\n p: length.default(length.parse(\"0.5mm\")),\n pw: length.optional(),\n pl: length.optional(),\n thermalpad: z.union([z.literal(true), dim2d]).optional(),\n legsoutside: z.boolean().optional(),\n})\n\nexport const quadTransform = <T extends z.infer<typeof base_quad_def>>(\n v: T,\n) => {\n if (v.w && !v.h) {\n v.h = v.w\n } else if (!v.w && v.h) {\n v.w = v.h\n }\n\n const side_pin_count = v.num_pins / 4\n\n if (!v.p && !v.pw && !v.pl && v.w) {\n // HACK: This is wayyy underspecified\n const approx_pin_size_of_side = side_pin_count + 4\n v.p = v.w / approx_pin_size_of_side\n }\n\n if (!v.p && v.w && v.h && v.pw && v.pl) {\n // HACK: This is wayyy underspecified\n v.p = (v.w - v.pl * 2) / (side_pin_count - 1)\n }\n\n if (!v.w && !v.h && v.p) {\n // HACK: underspecified\n v.w = v.p * (side_pin_count + 4)\n v.h = v.w\n }\n\n if (v.p && !v.pw && !v.pl) {\n v.pw = v.p / 2\n v.pl = v.p / 2\n } else if (!v.pw) {\n v.pw = v.pl! * (0.6 / 1.0)\n } else if (!v.pl) {\n v.pl = v.pw! * (1.0 / 0.6)\n }\n\n return v as NowDefined<T, \"w\" | \"h\" | \"p\" | \"pw\" | \"pl\">\n}\n\nexport const quad_def = base_quad_def.transform(quadTransform)\n\nconst SIDES_CCW = [\"left\", \"bottom\", \"right\", \"top\"] as const\n\nexport const getQuadCoords = (params: {\n pin_count: number\n pn: number // pin number\n w: number // width of the package\n h: number // height (length) of the package\n p: number // pitch between pins\n pl: number // length of the pin\n legsoutside?: boolean\n}) => {\n const { pin_count, pn, w, h, p, pl, legsoutside } = params\n const sidePinCount = pin_count / 4\n const side = SIDES_CCW[Math.floor((pn - 1) / sidePinCount)]\n const pos = (pn - 1) % sidePinCount\n\n /** inner box width */\n const ibw = p * (sidePinCount - 1)\n /** inner box height */\n const ibh = p * (sidePinCount - 1)\n\n /** pad center distance from edge (negative is inside, positive is outside) */\n const pcdfe = legsoutside ? pl / 2 : -pl / 2\n\n switch (side) {\n case \"left\":\n return { x: -w / 2 - pcdfe, y: ibh / 2 - pos * p, o: \"vert\" }\n case \"bottom\":\n return { x: -ibw / 2 + pos * p, y: -h / 2 - pcdfe, o: \"horz\" }\n case \"right\":\n return { x: w / 2 + pcdfe, y: -ibh / 2 + pos * p, o: \"vert\" }\n case \"top\":\n return { x: ibw / 2 - pos * p, y: h / 2 + pcdfe, o: \"horz\" }\n default:\n throw new Error(\"Invalid pin number\")\n }\n}\n\nexport const quad = (\n raw_params: z.input<typeof quad_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = quad_def.parse(raw_params)\n const pads: AnySoupElement[] = []\n const pin_map = getQuadPinMap(parameters)\n /** Side pin count */\n const spc = parameters.num_pins / 4\n for (let i = 0; i < parameters.num_pins; i++) {\n const {\n x,\n y,\n o: orientation,\n } = getQuadCoords({\n pin_count: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n h: parameters.h,\n p: parameters.p ?? 0.5,\n pl: parameters.pl,\n legsoutside: parameters.legsoutside,\n })\n\n let pw = parameters.pw\n let pl = parameters.pl\n if (orientation === \"vert\") {\n ;[pw, pl] = [pl, pw]\n }\n\n const pn = pin_map[i + 1]!\n pads.push(rectpad(pn, x, y, pw, pl))\n }\n\n if (parameters.thermalpad) {\n if (typeof parameters.thermalpad === \"boolean\") {\n const ibw = parameters.p * (spc - 1) + parameters.pw\n const ibh = parameters.p * (spc - 1) + parameters.pw\n pads.push(rectpad([\"thermalpad\"], 0, 0, ibw, ibh))\n } else {\n pads.push(\n rectpad(\n [\"thermalpad\"],\n 0,\n 0,\n parameters.thermalpad.x,\n parameters.thermalpad.y,\n ),\n )\n }\n }\n\n // Silkscreen corners\n const silkscreen_corners: PcbSilkscreenPath[] = []\n for (const [corner, dx, dy] of [\n [\"top-left\", -1, 1],\n [\"bottom-left\", -1, -1],\n [\"bottom-right\", 1, -1],\n [\"top-right\", 1, 1],\n ] as const) {\n // const dx = Math.floor(corner_index / 2) * 2 - 1\n // const dy = 1 - (corner_index % 2) * 2\n const corner_x = (parameters.w / 2) * dx\n const corner_y = (parameters.h / 2) * dy\n let arrow: \"none\" | \"in1\" | \"in2\" = \"none\"\n\n let arrow_x = corner_x\n let arrow_y = corner_y\n\n /** corner size */\n const csz = parameters.pw * 2\n\n if (pin_map[1] === 1 && corner === \"top-left\") {\n arrow = \"in1\"\n } else if (pin_map[spc * 4] === 1 && corner === \"top-left\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 3 + 1] === 1 && corner === \"top-right\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 3] === 1 && corner === \"top-right\") {\n arrow = \"in1\"\n } else if (pin_map[spc] === 1 && corner === \"bottom-left\") {\n arrow = \"in1\"\n } else if (pin_map[spc + 1] === 1 && corner === \"bottom-left\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 2] === 1 && corner === \"bottom-right\") {\n arrow = \"in1\"\n } else if (pin_map[spc * 2 + 1] === 1 && corner === \"bottom-right\") {\n arrow = \"in2\"\n }\n\n const rotate_arrow = arrow === \"in1\" ? 1 : -1\n if (parameters.legsoutside) {\n const arrow_dx = arrow === \"in1\" ? parameters.pl / 2 : parameters.pw / 2\n const arrow_dy = arrow === \"in1\" ? parameters.pw / 2 : parameters.pl / 2\n arrow_x += arrow_dx * dx * rotate_arrow\n arrow_y -= arrow_dy * dy * rotate_arrow\n }\n\n // Normal Corner\n if (arrow === \"none\" || parameters.legsoutside) {\n silkscreen_corners.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}`,\n route: [\n {\n x: corner_x - csz * dx,\n y: corner_y,\n },\n {\n x: corner_x,\n y: corner_y,\n },\n {\n x: corner_x,\n y: corner_y - csz * dy,\n },\n ],\n type: \"pcb_silkscreen_path\",\n })\n }\n\n // Two lines nearly forming a corner, used when the arrow needs to overlap\n // the corne (QFN components where legs are inside)\n if ((arrow === \"in1\" || arrow === \"in2\") && !parameters.legsoutside) {\n silkscreen_corners.push(\n {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_1`,\n route: [\n {\n x: corner_x - csz * dx,\n y: corner_y,\n },\n {\n x: corner_x - (csz * dx) / 2,\n y: corner_y,\n },\n ],\n type: \"pcb_silkscreen_path\",\n },\n {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_2`,\n route: [\n {\n x: corner_x,\n y: corner_y - (csz * dy) / 2,\n },\n {\n x: corner_x,\n y: corner_y - csz * dy,\n },\n ],\n type: \"pcb_silkscreen_path\",\n },\n )\n }\n if (arrow === \"in1\" || arrow === \"in2\") {\n silkscreen_corners.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_3`,\n route: [\n {\n x: arrow_x - 0.2 * -dx,\n y: arrow_y + 0.2 * rotate_arrow,\n },\n {\n x: arrow_x,\n y: arrow_y,\n },\n {\n x: arrow_x + 0.2 * rotate_arrow * -dx,\n y: arrow_y + 0.2,\n },\n {\n x: arrow_x - 0.2 * -dx,\n y: arrow_y + 0.2 * rotate_arrow,\n },\n ],\n type: \"pcb_silkscreen_path\",\n })\n }\n }\n\n return {\n circuitJson: [...pads, ...silkscreen_corners],\n parameters,\n }\n}\n","import { z } from \"zod\"\nexport const pin_order_specifier = z.enum([\n \"leftside\",\n \"topside\",\n \"rightside\",\n \"bottomside\",\n \"toppin\",\n \"bottompin\",\n \"leftpin\",\n \"rightpin\",\n])\n\nexport type PinOrderSpecifier = z.infer<typeof pin_order_specifier>\n","import type { PinOrderSpecifier } from \"./zod/pin-order-specifier\"\n\n/**\n * A counter-clockwise pin map is [1,2,3,4,5,6,7,8] for an 8-pin package\n *\n * 8 7\n * 1 6\n * 2 5\n * 3 4\n *\n * Given some parameters, we're returning how to map the pins in a quad package\n * with a different order. For example, if we pass in cw=true, we'll get the\n * following mapping\n *\n * 1 -> 1\n * 2 -> 8\n * 3 -> 7\n * 4 -> 6\n * 5 -> 5\n * 6 -> 4\n * 7 -> 3\n * 8 -> 2\n *\n * Which allows us to create the CW version of the package using...\n * new_pin = pin_map[normal_ccw_pin]\n *\n * 2 3\n * 1 4\n * 8 5\n * 7 6\n */\nexport const getQuadPinMap = ({\n num_pins,\n cw,\n ccw,\n startingpin,\n}: {\n num_pins: number\n cw?: boolean\n ccw?: boolean\n startingpin?: PinOrderSpecifier[]\n}): number[] => {\n const pin_map: number[] = []\n const pins_per_side = num_pins / 4\n let current_position_ccw_normal = 1\n\n /** Starting Flag Pins */\n const sfp: Record<PinOrderSpecifier, boolean> = {} as any\n for (const specifier of startingpin ?? []) {\n sfp[specifier] = true\n }\n if (!sfp.leftside && !sfp.topside && !sfp.rightside && !sfp.bottomside) {\n sfp.leftside = true\n }\n if (!sfp.bottompin && !sfp.leftpin && !sfp.rightpin && !sfp.toppin) {\n if (sfp.leftside) {\n sfp.toppin = true\n } else if (sfp.topside) {\n sfp.rightpin = true\n } else if (sfp.rightside) {\n sfp.bottompin = true\n } else if (sfp.bottomside) {\n sfp.leftpin = true\n }\n }\n\n if (sfp.leftside && sfp.toppin) {\n current_position_ccw_normal = 1\n } else if (sfp.leftside && sfp.bottompin) {\n current_position_ccw_normal = pins_per_side\n } else if (sfp.bottomside && sfp.leftpin) {\n current_position_ccw_normal = pins_per_side + 1\n } else if (sfp.bottomside && sfp.rightpin) {\n current_position_ccw_normal = pins_per_side * 2\n } else if (sfp.rightside && sfp.bottompin) {\n current_position_ccw_normal = pins_per_side * 2 + 1\n } else if (sfp.rightside && sfp.toppin) {\n current_position_ccw_normal = pins_per_side * 3\n } else if (sfp.topside && sfp.rightpin) {\n current_position_ccw_normal = pins_per_side * 3 + 1\n } else if (sfp.topside && sfp.leftpin) {\n current_position_ccw_normal = pins_per_side * 4\n }\n\n pin_map.push(-1) // the first index is meaningless\n\n // Each iteration we move the current position to the next pin, if we're\n // going CCW this means incrementing, if we're going CW this means\n // decrementing\n for (let i = 0; i < num_pins; i++) {\n pin_map[current_position_ccw_normal] = i + 1\n if (ccw || !cw) {\n current_position_ccw_normal++\n if (current_position_ccw_normal > num_pins) {\n current_position_ccw_normal = 1\n }\n } else {\n current_position_ccw_normal--\n if (current_position_ccw_normal < 1) {\n current_position_ccw_normal = num_pins\n }\n }\n }\n\n return pin_map\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { base_quad_def, quad, quad_def, quadTransform } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const qfn_def = base_quad_def.extend({}).transform(quadTransform)\n\nexport const qfn = (\n parameters: z.input<typeof qfn_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n parameters.legsoutside = false\n return quad(parameters)\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { quad, quad_def } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const qfp_def = quad_def\n\nexport const qfp = (\n raw_params: z.input<typeof quad_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n raw_params.legsoutside = true\n\n const quad_defaults = quad_def.parse(raw_params)\n if (!raw_params.p) {\n switch (raw_params.num_pins) {\n case 44:\n case 64:\n raw_params.p = 0.8\n break\n case 52:\n if (raw_params.w === 14) raw_params.p = 1\n else raw_params.p = 0.65\n break\n case 208:\n raw_params.p = 0.5\n break\n }\n }\n if (!raw_params.pl) {\n switch (raw_params.num_pins) {\n case 44:\n case 52:\n case 64:\n raw_params.pl = 2.25\n break\n case 208:\n raw_params.pl = 1.65\n break\n default:\n raw_params.pl = quad_defaults.pl * 4\n break\n }\n }\n if (!raw_params.pw) {\n switch (raw_params.num_pins) {\n case 44:\n case 64:\n raw_params.pw = 0.5\n break\n case 52:\n if (raw_params.w === 14) raw_params.pw = 0.45\n else raw_params.pw = 0.55\n break\n case 208:\n raw_params.pw = 0.3\n break\n default:\n raw_params.pw = quad_defaults.pw\n break\n }\n }\n return quad(raw_params)\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { base_quad_def, quad, quad_def, quadTransform } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const mlp_def = base_quad_def.extend({}).transform(quadTransform)\n\nexport const mlp = (\n parameters: z.input<typeof mlp_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n parameters.legsoutside = false\n if (parameters.thermalpad === undefined) {\n parameters.thermalpad = true\n }\n return quad(parameters)\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing, type SoicInput } from \"./soic\"\n\n// TODO we should accept MS-012 or MS-013\n\nexport const ssop_def = extendSoicDef({\n w: \"3.9mm\",\n p: \"1.27mm\",\n})\n\nexport const ssop = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = ssop_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing, type SoicInput } from \"./soic\"\n\nexport const tssop_def = extendSoicDef({\n w: \"6.1mm\",\n p: \"0.65mm\",\n legsoutside: true,\n})\n\nexport const tssop = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = tssop_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot236_def = extendSoicDef({\n p: \"0.95mm\",\n w: \"1.6mm\",\n legsoutside: true,\n})\n\nexport const sot236 = (\n raw_params: z.input<typeof sot236_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot236_def.parse({ ...raw_params, num_pins: 6 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot363_def = extendSoicDef({})\n\nexport const sot363 = (\n raw_params: z.input<typeof sot363_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot363_def.parse({\n fn: \"sot363\",\n num_pins: 6,\n w: 1.94,\n p: 0.65,\n pw: 0.3,\n pl: 0.7,\n legoutside: true,\n })\n\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\n\nexport const sot23_def = z.object({\n fn: z.string(),\n num_pins: z.number().default(3),\n w: z.string().default(\"1.92mm\"),\n h: z.string().default(\"2.74mm\"),\n pl: z.string().default(\"0.8mm\"),\n pw: z.string().default(\"0.764mm\"),\n})\n\nexport const sot23 = (\n raw_params: z.input<typeof sot23_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot23_def.parse(raw_params)\n return {\n circuitJson: sot23WithoutParsing(parameters),\n parameters: parameters,\n }\n}\n\nexport const getCcwSot23Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n}) => {\n const { pn, w, h, pl } = parameters\n\n if (pn === 1) {\n return { x: -1.7, y: 0 }\n } else if (pn === 2) {\n return { x: 1.7, y: -0.95 }\n } else {\n return { x: 1.7, y: 0.95 }\n }\n}\n\nexport const sot23WithoutParsing = (parameters: z.infer<typeof sot23_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSot23Coords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: parseFloat(parameters.w),\n h: parseFloat(parameters.h),\n pl: parseFloat(parameters.pl),\n })\n pads.push(\n rectpad(\n i + 1,\n x,\n y,\n parseFloat(parameters.pl),\n parseFloat(parameters.pw),\n ),\n )\n }\n\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"@tscircuit/soup\"\nimport {\n extendSoicDef,\n soicWithoutParsing,\n type SoicInput,\n getCcwSoicCoords,\n} from \"./soic\"\nimport { rectpad } from \"src/helpers/rectpad\"\nimport { z } from \"zod\"\nimport { CORNERS } from \"src/helpers/corner\"\n\nexport const dfn_def = extendSoicDef({})\n\n/**\n * Dual Flat No-lead\n *\n * Similar to SOIC but different silkscreen\n */\nexport const dfn = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = dfn_def.parse(raw_params)\n const pads: AnySoupElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSoicCoords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n p: parameters.p ?? 1.27,\n pl: parameters.pl,\n widthincludeslegs: true,\n })\n pads.push(\n rectpad(i + 1, x, y, parameters.pl ?? \"1mm\", parameters.pw ?? \"0.6mm\"),\n )\n }\n\n // The silkscreen is 4 corners and an arrow identifier for pin1\n const m = Math.min(1, parameters.p / 2)\n const sw = parameters.w + m\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw + m\n const silkscreenPaths: PcbSilkscreenPath[] = []\n\n for (const corner of CORNERS) {\n const { dx, dy } = corner\n silkscreenPaths.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"\",\n route: [\n { x: (dx * sw) / 2 - dx * parameters.p, y: (dy * sh) / 2 },\n { x: (dx * sw) / 2, y: (dy * sh) / 2 },\n { x: (dx * sw) / 2, y: (dy * sh) / 2 - dy * parameters.p },\n ],\n type: \"pcb_silkscreen_path\",\n })\n }\n\n // Arrow\n /** arrow size */\n const as = parameters.p / 4\n /** Arrow tip x */\n const atx = -sw / 2 - as / 2\n /** Arrow tip y */\n const aty = sh / 2 - parameters.p / 2\n\n silkscreenPaths.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"\",\n type: \"pcb_silkscreen_path\",\n route: [\n {\n x: atx,\n y: aty,\n },\n {\n x: atx - as,\n y: aty + as,\n },\n {\n x: atx - as,\n y: aty - as,\n },\n {\n x: atx,\n y: aty,\n },\n ],\n })\n\n return {\n circuitJson: [...pads, ...silkscreenPaths],\n parameters,\n }\n}\n","export const CORNERS = [\n { name: \"top-left\", dx: -1, dy: 1 },\n { name: \"top-right\", dx: 1, dy: 1 },\n { name: \"bottom-left\", dx: -1, dy: -1 },\n { name: \"bottom-right\", dx: 1, dy: -1 },\n]\n","import { z } from \"zod\"\nimport { length, type AnySoupElement } from \"@tscircuit/soup\"\nimport { platedhole } from \"../helpers/platedhole\"\n\nexport const pinrow_def = z.object({\n fn: z.string(),\n num_pins: z.number(),\n p: length.default(\"0.1in\").describe(\"pitch\"),\n id: length.default(\"1.0mm\").describe(\"inner diameter\"),\n od: length.default(\"1.2mm\").describe(\"outer diameter\"),\n})\n\nexport const pinrow = (\n raw_params: z.input<typeof pinrow_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = pinrow_def.parse(raw_params)\n const { p, id, od } = parameters\n const holes: any[] = []\n /** num_spaces */\n const ns = parameters.num_pins - 1\n const xoff = -(ns / 2) * p\n\n for (let i = 0; i < parameters.num_pins; i++) {\n holes.push(platedhole(i + 1, xoff + i * p, 0, id, od))\n }\n return { circuitJson: holes, parameters }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot563_def = extendSoicDef({})\n\nexport const sot563 = (\n raw_params: z.input<typeof sot563_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot563_def.parse({\n fn: \"sot563\",\n num_pins: 6,\n w: 1.94,\n p: 0.5,\n pw: 0.3,\n pl: 0.67,\n legoutside: true,\n })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const ms012_def = extendSoicDef({\n p: \"1.27mm\",\n w: \"3.9mm\",\n legsoutside: true,\n})\n\nexport const ms012 = (\n raw_params: z.input<typeof ms012_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = ms012_def.parse({ ...raw_params, num_pins: 8 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const ms013_def = extendSoicDef({\n p: \"1.27mm\",\n w: \"7.5mm\",\n legsoutside: true,\n})\n\nexport const ms013 = (\n raw_params: z.input<typeof ms013_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = ms013_def.parse({ ...raw_params, num_pins: 16 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\n\nexport const sot723_def = z.object({\n fn: z.string(),\n num_pins: z.number().default(3),\n w: z.string().default(\"1.2mm\"),\n h: z.string().default(\"1.2mm\"),\n pl: z.string().default(\"0.3mm\"),\n pw: z.string().default(\"0.32mm\"),\n})\n\nexport const sot723 = (\n raw_params: z.input<typeof sot723_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot723_def.parse(raw_params)\n return {\n circuitJson: sot723WithoutParsing(parameters),\n parameters,\n }\n}\n\nexport const getCcwSot723Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n}) => {\n const { pn, w, h, pl } = parameters\n\n if (pn === 1) {\n return { x: 0, y: 0 }\n } else if (pn === 2) {\n return { x: 1, y: -0.4 }\n } else {\n return { x: 1, y: 0.4 }\n }\n}\n\nexport const sot723WithoutParsing = (\n parameters: z.infer<typeof sot723_def>,\n) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 0; i < 3; i++) {\n const { x, y } = getCcwSot723Coords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: Number.parseFloat(parameters.w),\n h: Number.parseFloat(parameters.h),\n pl: Number.parseFloat(parameters.pl),\n })\n pads.push(\n rectpad(\n i + 1,\n x,\n y,\n Number.parseFloat(parameters.pl),\n i !== 0 ? Number.parseFloat(parameters.pw) : 0.42,\n ),\n )\n }\n\n return pads\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\n\nexport const sod_def = z.object({\n fn: z.string(),\n w: z.string().default(\"2.36mm\"),\n h: z.string().default(\"1.22mm\"),\n pl: z.string().default(\"0.9mm\"),\n pw: z.string().default(\"0.9mm\"),\n pad_spacing: z.string().default(\"4.19mm\"),\n})\n\nexport const sod123 = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n return {\n circuitJson: sodWithoutParsing(parameters),\n parameters,\n }\n}\n\nexport const getSodCoords = (parameters: {\n pn: number\n pad_spacing: number\n}) => {\n const { pn, pad_spacing } = parameters\n\n if (pn === 1) {\n return { x: -pad_spacing / 2, y: 0 }\n } else {\n return { x: pad_spacing / 2, y: 0 }\n }\n}\n\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 0; i < 2; i++) {\n const { x, y } = getSodCoords({\n pn: i + 1,\n pad_spacing: parseFloat(parameters.pad_spacing),\n })\n pads.push(\n rectpad(\n i + 1,\n x,\n y,\n parseFloat(parameters.pl),\n parseFloat(parameters.pw),\n ),\n )\n }\n\n return pads\n}\n","import {\n length,\n type AnySoupElement,\n type PcbSilkscreenLine,\n type PcbSilkscreenPath,\n} from \"@tscircuit/soup\"\nimport { passive, type PassiveDef } from \"../helpers/passive-fn\"\nimport { z } from \"zod\"\nimport { platedhole } from \"src/helpers/platedhole\"\n\nexport const axial_def = z.object({\n fn: z.string(),\n num_pins: z.any().transform(() => 2),\n p: length.optional().default(\"2.54mm\"),\n id: length.optional().default(\"0.7mm\"),\n od: length.optional().default(\"1mm\"),\n})\nexport type AxialDef = z.input<typeof axial_def>\n\nexport const axial = (\n raw_params: AxialDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = axial_def.parse(raw_params)\n\n const { p, id, od } = parameters\n\n const plated_holes = [\n platedhole(1, -p / 2, 0, id, od),\n platedhole(2, p / 2, 0, id, od),\n ]\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -p / 2 + od + id / 2, y: 0 },\n { x: p / 2 - od - id / 2, y: 0 },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return { circuitJson: [...plated_holes, silkscreenLine], parameters }\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { silkscreenpath } from \"../helpers/silkscreenpath\"\n\nexport const pushbutton_def = z.object({\n fn: z.literal(\"pushbutton\"),\n})\n\nexport const pushbutton = (\n raw_params: z.input<typeof pushbutton_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = pushbutton_def.parse(raw_params)\n\n const width = 4.5\n const height = 6.5\n const holeDiameter = 1\n\n const holes: AnyCircuitElement[] = [\n platedhole(1, -width / 2, height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(2, -width / 2, -height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(3, width / 2, -height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(4, width / 2, height / 2, holeDiameter, holeDiameter * 1.2),\n ]\n\n const silkscreenLines: AnyCircuitElement[] = [\n // Vertical lines indicating connections\n silkscreenpath([\n { x: -width / 2, y: -height / 2 },\n { x: -width / 2, y: height / 2 },\n ]),\n silkscreenpath([\n { x: width / 2, y: -height / 2 },\n { x: width / 2, y: height / 2 },\n ]),\n // Center indicating latch\n silkscreenpath([\n { x: -width / 2, y: 0 },\n { x: -width / 5, y: 0 },\n { x: ((width / 5) * 1) / Math.sqrt(2), y: height / 8 },\n ]),\n silkscreenpath([\n { x: width / 2, y: 0 },\n { x: width / 5, y: 0 },\n ]),\n ]\n\n return {\n circuitJson: [...holes, ...silkscreenLines],\n parameters,\n }\n}\n","import type { PcbSilkscreenPath } from \"circuit-json\"\n\nexport const silkscreenpath = (\n route: Array<{ x: number; y: number }>,\n options: {\n stroke_width?: number\n layer?: string\n pcb_component_id?: string\n pcb_silkscreen_path_id?: string\n } = {},\n): PcbSilkscreenPath => {\n return {\n type: \"pcb_silkscreen_path\",\n layer: options.layer || \"top\",\n pcb_component_id: options.pcb_component_id || \"\",\n pcb_silkscreen_path_id: options.pcb_silkscreen_path_id || \"\",\n route,\n stroke_width: options.stroke_width || 0.1,\n }\n}\n","import {\n length,\n type AnyCircuitElement,\n type PcbPlatedHole,\n type PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { platedhole } from \"src/helpers/platedhole\"\n\nexport const stampboard_def = z.object({\n fn: z.string(),\n w: length.default(\"22.58mm\"),\n left: length.optional(),\n right: length.optional(),\n top: length.optional(),\n bottom: length.optional(),\n p: length.default(length.parse(\"2.54mm\")),\n pw: length.default(length.parse(\"1.6mm\")),\n pl: length.default(length.parse(\"3.2mm\")),\n innerhole: z.boolean().default(false),\n})\n\nexport type Stampboard_def = z.input<typeof stampboard_def>\n\nconst getHeight = (parameters: Stampboard_def) => {\n const params = stampboard_def.parse(parameters)\n if (params.left && params.right) {\n return Math.max(params.left, params.right) * params.p\n }\n if (params.left) {\n return params.left * params.p\n }\n if (params.right) {\n return params.right * params.p\n }\n return 51 // Default height if no pins are provided\n}\n\nexport const stampboard = (\n raw_params: Stampboard_def,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const params = stampboard_def.parse(raw_params)\n const rectpads: AnyCircuitElement[] = []\n const holes: PcbPlatedHole[] = []\n let firstPinLocation: {\n x: number\n y: number\n } = { x: 0, y: 0 }\n let routes: { x: number; y: number }[] = []\n const innerDiameter = 1\n const outerDiameter = 1.2\n const triangleHeight = 1 // Adjust triangle size as needed\n const triangleWidth = 0.6 // Adjust triangle width as needed\n if (params.right) {\n const yoff = -((params.right - 1) / 2) * params.p\n for (let i = 0; i < params.right; i++) {\n if (i === 0 && !params.left && !params.bottom) {\n firstPinLocation = {\n x: params.w / 2 - params.pl * 1.4,\n y: yoff + i * params.p,\n }\n routes = [\n {\n x: firstPinLocation.x + triangleHeight / 2,\n y: firstPinLocation.y,\n }, // Tip of the triangle (pointing right)\n {\n x: firstPinLocation.x - triangleHeight / 2,\n y: firstPinLocation.y + triangleWidth / 2,\n }, // Bottom corner of the base\n {\n x: firstPinLocation.x - triangleHeight / 2,\n y: firstPinLocation.y - triangleWidth / 2,\n }, // Top corner of the base\n {\n x: firstPinLocation.x + triangleHeight / 2,\n y: firstPinLocation.y,\n }, // Close the path at the tip\n ]\n }\n rectpads.push(\n rectpad(\n i + 1,\n params.w / 2 - params.pl / 2,\n yoff + i * params.p,\n params.pl,\n params.pw,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1,\n params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1,\n params.w / 2 - params.pl + outerDiameter / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n if (params.left) {\n const yoff = -((params.left - 1) / 2) * params.p\n for (let i = 0; i < params.left; i++) {\n if (i === params.left - 1) {\n firstPinLocation = {\n x: -params.w / 2 + params.pl * 1.4,\n y: yoff + i * params.p,\n }\n routes = [\n {\n x: firstPinLocation.x - triangleHeight / 2,\n y: firstPinLocation.y,\n }, // Tip of the triangle (pointing left)\n {\n x: firstPinLocation.x + triangleHeight / 2,\n y: firstPinLocation.y + triangleWidth / 2,\n }, // Top corner of the base\n {\n x: firstPinLocation.x + triangleHeight / 2,\n y: firstPinLocation.y - triangleWidth / 2,\n }, // Bottom corner of the base\n {\n x: firstPinLocation.x - triangleHeight / 2,\n y: firstPinLocation.y,\n }, // Close the path at the tip\n ]\n }\n rectpads.push(\n rectpad(\n i + 1,\n -params.w / 2 + params.pl / 2,\n yoff + i * params.p,\n params.pl,\n params.pw,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1,\n -params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1,\n -params.w / 2 + params.pl - outerDiameter / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n if (params.top) {\n const xoff = -((params.top - 1) / 2) * params.p\n for (let i = 0; i < params.top; i++) {\n if (\n i === params.top - 1 &&\n !params.left &&\n !params.bottom &&\n !params.right\n ) {\n firstPinLocation = {\n x: xoff + i * params.p,\n y: getHeight(params) / 2 - params.pl * 1.4,\n }\n routes = [\n {\n x: firstPinLocation.x,\n y: firstPinLocation.y + triangleHeight / 2,\n }, // Tip of the triangle (pointing up)\n {\n x: firstPinLocation.x - triangleWidth / 2,\n y: firstPinLocation.y - triangleHeight / 2,\n }, // Left corner of the base\n {\n x: firstPinLocation.x + triangleWidth / 2,\n y: firstPinLocation.y - triangleHeight / 2,\n }, // Right corner of the base\n {\n x: firstPinLocation.x,\n y: firstPinLocation.y + triangleHeight / 2,\n }, // Close the path at the tip\n ]\n }\n rectpads.push(\n rectpad(\n i + 1,\n xoff + i * params.p,\n getHeight(params) / 2 - params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1,\n xoff + i * params.p,\n getHeight(params) / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1,\n xoff + i * params.p,\n getHeight(params) / 2 - params.pl + outerDiameter / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n if (params.bottom) {\n const xoff = -((params.bottom - 1) / 2) * params.p\n for (let i = 0; i < params.bottom; i++) {\n if (i === 0 && !params.left) {\n firstPinLocation = {\n x: xoff + i * params.p,\n y: -getHeight(params) / 2 + params.pl * 1.4,\n }\n routes = [\n {\n x: firstPinLocation.x,\n y: firstPinLocation.y - triangleHeight / 2,\n }, // Tip of the triangle (pointing down)\n {\n x: firstPinLocation.x - triangleWidth / 2,\n y: firstPinLocation.y + triangleHeight / 2,\n }, // Left corner of the base\n {\n x: firstPinLocation.x + triangleWidth / 2,\n y: firstPinLocation.y + triangleHeight / 2,\n }, // Right corner of the base\n {\n x: firstPinLocation.x,\n y: firstPinLocation.y - triangleHeight / 2,\n }, // Close the path at the tip\n ]\n }\n rectpads.push(\n rectpad(\n i + 1,\n xoff + i * params.p,\n -getHeight(params) / 2 + params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1,\n xoff + i * params.p,\n -getHeight(params) / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1,\n xoff + i * params.p,\n -getHeight(params) / 2 + params.pl - outerDiameter / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n\n const silkscreenTriangle: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"pcb_silkscreen_triangle_1\",\n pcb_component_id: \"2\",\n route: routes,\n stroke_width: 0.1,\n layer: \"top\",\n }\n\n const silkscreenPath: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"pcb_silkscreen_path_1\",\n pcb_component_id: \"1\",\n route: [\n { x: -params.w / 2, y: getHeight(params) / 2 },\n { x: params.w / 2, y: getHeight(params) / 2 },\n { x: params.w / 2, y: -getHeight(params) / 2 },\n { x: -params.w / 2, y: -getHeight(params) / 2 },\n { x: -params.w / 2, y: getHeight(params) / 2 },\n ],\n stroke_width: 0.1,\n layer: \"top\",\n }\n\n return {\n circuitJson: [...rectpads, ...holes, silkscreenPath, silkscreenTriangle],\n parameters: params,\n }\n}\n","export function isNotNull<T>(value: T | null): value is T {\n return value !== null\n}\n","import * as FOOTPRINT_FN from \"./fn\"\nimport type { AnySoupElement } from \"@tscircuit/soup\"\nimport type { AnyCircuitElement } from \"circuit-json\"\nimport type { AnyFootprinterDefinitionOutput } from \"./helpers/zod/AnyFootprinterDefinitionOutput\"\nimport { isNotNull } from \"./helpers/is-not-null\"\n\nexport type FootprinterParamsBuilder<K extends string> = {\n [P in K | \"params\" | \"soup\"]: P extends \"params\" | \"soup\"\n ? Footprinter[P]\n : (v?: number | string) => FootprinterParamsBuilder<K>\n}\n\ntype CommonPassiveOptionKey =\n | \"metric\"\n | \"imperial\"\n | \"tht\"\n | \"p\"\n | \"pw\"\n | \"ph\"\n | \"w\"\n | \"h\"\n\nexport type Footprinter = {\n dip: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\" | \"wide\" | \"narrow\">\n cap: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n res: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n diode: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n led: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n lr: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"l\" | \"pl\" | \"pr\">\n qfp: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\" | \"wide\" | \"narrow\">\n quad: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\n \"w\" | \"l\" | \"square\" | \"pl\" | \"pr\" | \"pb\" | \"pt\" | \"p\" | \"pw\" | \"ph\"\n >\n bga: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\n \"grid\" | \"p\" | \"w\" | \"h\" | \"ball\" | \"pad\" | \"missing\"\n >\n qfn: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\">\n soic: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\">\n mlp: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\">\n ssop: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n tssop: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n dfn: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n pinrow: (num_pins: number) => FootprinterParamsBuilder<\"p\" | \"id\" | \"od\">\n axial: () => FootprinterParamsBuilder<\"p\" | \"id\" | \"od\">\n pushbutton: () => FootprinterParamsBuilder<\n \"tllabel\" | \"trlabel\" | \"bllabel\" | \"brlabel\"\n >\n stampboard: () => FootprinterParamsBuilder<\n \"w\" | \"left\" | \"right\" | \"top\" | \"bottom\" | \"p\" | \"pw\" | \"pl\" | \"innerhole\"\n >\n params: () => any\n /** @deprecated use circuitJson() instead */\n soup: () => AnySoupElement[]\n circuitJson: () => AnyCircuitElement[]\n json: () => AnyFootprinterDefinitionOutput[]\n}\n\nexport const string = (def: string): Footprinter => {\n let fp = footprinter()\n\n // special case: 0402, 0603, etc.\n if ((def.length === 4 || def.length === 5) && /^\\d+$/.test(def))\n def = `res${def}`\n\n const def_parts = def\n .split(\"_\")\n .map((s) => {\n const m = s.match(/([a-z]+)([\\(\\d\\.\\+\\?].*)?/)\n const [_, fn, v] = m ?? []\n if (v?.includes(\"?\")) return null\n return { fn: m?.[1]!, v: m?.[2]! }\n })\n .filter(isNotNull)\n\n for (const { fn, v } of def_parts) {\n fp = fp[fn](v)\n }\n\n fp.setString(def)\n\n return fp\n}\n\nexport const footprinter = (): Footprinter & {\n string: typeof string\n setString: (string) => void\n} => {\n const proxy = new Proxy(\n {},\n {\n get: (target: any, prop: string) => {\n // console.log(prop, target)\n if (prop === \"soup\" || prop === \"circuitJson\") {\n if (\"fn\" in target && FOOTPRINT_FN[target.fn]) {\n return () => FOOTPRINT_FN[target.fn](target).circuitJson\n }\n\n if (!FOOTPRINT_FN[target.fn]) {\n throw new Error(\n `Invalid footprint function, got \"${target.fn}\"${\n target.string ? `, from string \"${target.string}\"` : \"\"\n }`,\n )\n }\n\n return () => {\n // TODO improve error\n throw new Error(\n `No function found for footprinter, make sure to specify .dip, .lr, .p, etc. Got \"${prop}\"`,\n )\n }\n }\n if (prop === \"json\") {\n if (!FOOTPRINT_FN[target.fn]) {\n throw new Error(\n `Invalid footprint function, got \"${target.fn}\"${\n target.string ? `, from string \"${target.string}\"` : \"\"\n }`,\n )\n }\n return () => FOOTPRINT_FN[target.fn](target).parameters\n }\n if (prop === \"params\") {\n // TODO\n return () => target\n }\n if (prop === \"setString\") {\n return (v: string) => {\n target.string = v\n return proxy\n }\n }\n return (v: any) => {\n if (Object.keys(target).length === 0) {\n if (`${prop}${v}` in FOOTPRINT_FN) {\n target[`${prop}${v}`] = true\n target.fn = `${prop}${v}`\n } else {\n target[prop] = true\n target.fn = prop\n if (prop === \"res\" || prop === \"cap\") {\n if (v) {\n target.imperial = v // res0402, cap0603 etc.\n }\n } else {\n target.num_pins = Number.parseFloat(v)\n }\n }\n } else {\n // handle dip_w or other invalid booleans\n if (!v && [\"w\", \"h\", \"p\"].includes(prop as string)) {\n // ignore\n } else {\n target[prop] = v ?? true\n }\n }\n return proxy\n }\n },\n },\n )\n return proxy as any\n}\nfootprinter.string = string\n\nexport const fp = footprinter\n"],"mappings":"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","names":["mm","z","length","mm","z","length","distance","z","z","z","distance","length","z","length","z","length","z","length","z","z","length","z","z","z","length","z","length","z","z","z","z","length","z","z","length","z","z","length","z","z","length","fp"]}
1
+ {"version":3,"sources":["../src/fn/index.ts","../src/helpers/u-curve.ts","../src/helpers/platedhole.ts","../src/fn/dip.ts","../src/helpers/silkscreenRef.ts","../src/helpers/rectpad.ts","../src/helpers/passive-fn.ts","../src/fn/diode.ts","../src/fn/cap.ts","../src/fn/led.ts","../src/fn/res.ts","../src/helpers/zod/ALPHABET.ts","../src/fn/bga.ts","../src/helpers/zod/dim-2d.ts","../src/helpers/zod/function-call.ts","../src/fn/soic.ts","../src/fn/quad.ts","../src/helpers/zod/pin-order-specifier.ts","../src/helpers/get-quad-pin-map.ts","../src/fn/qfn.ts","../src/fn/qfp.ts","../src/fn/mlp.ts","../src/fn/ssop.ts","../src/fn/tssop.ts","../src/fn/sot236.ts","../src/fn/sot363.ts","../src/fn/sot23.ts","../src/fn/dfn.ts","../src/helpers/corner.ts","../src/fn/pinrow.ts","../src/fn/sot563.ts","../src/fn/ms012.ts","../src/fn/ms013.ts","../src/fn/sot723.ts","../src/fn/sod123.ts","../src/fn/axial.ts","../src/fn/pushbutton.ts","../src/helpers/silkscreenpath.ts","../src/fn/stampboard.ts","../src/helpers/is-not-null.ts","../src/footprinter.ts"],"sourcesContent":["export { dip } from \"./dip\"\nexport { diode } from \"./diode\"\nexport { cap } from \"./cap\"\nexport { led } from \"./led\"\nexport { res } from \"./res\"\nexport { bga } from \"./bga\"\nexport { soic } from \"./soic\"\nexport { quad } from \"./quad\"\nexport { qfn } from \"./qfn\"\nexport { qfp } from \"./qfp\"\nexport { mlp } from \"./mlp\"\nexport { ssop } from \"./ssop\"\nexport { tssop } from \"./tssop\"\nexport { sot236 } from \"./sot236\"\nexport { sot363 } from \"./sot363\"\nexport { sot23 } from \"./sot23\"\nexport { dfn } from \"./dfn\"\nexport { pinrow } from \"./pinrow\"\nexport { sot563 } from \"./sot563\"\nexport { ms012 } from \"./ms012\"\nexport { ms013 } from \"./ms013\"\nexport { sot723 } from \"./sot723\"\nexport { sod123 } from \"./sod123\"\nexport { axial } from \"./axial\"\nexport { pushbutton } from \"./pushbutton\"\nexport { stampboard } from \"./stampboard\"\n","export const u_curve = Array.from({ length: 9 }, (_, i) =>\n Math.cos((i / 8) * Math.PI - Math.PI),\n).map((x) => ({\n x,\n y: -Math.sqrt(1 - x ** 2),\n}))\n","import type { PcbPlatedHole } from \"circuit-json\"\nimport { mm } from \"@tscircuit/mm\"\n\nexport const platedhole = (\n pn: number,\n x: number,\n y: number,\n id: number | string,\n od: number | string,\n): PcbPlatedHole => {\n return {\n type: \"pcb_plated_hole\",\n shape: \"circle\",\n x,\n y,\n hole_diameter: mm(id),\n outer_diameter: mm(od),\n pcb_port_id: \"\",\n layers: [\"top\", \"bottom\"],\n port_hints: [pn.toString()],\n }\n}\n","import type {\n AnyCircuitElement,\n PcbFabricationNoteText,\n PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { u_curve } from \"../helpers/u-curve\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const extendDipDef = (newDefaults: { w?: string; p?: string }) =>\n z\n .object({\n fn: z.string(),\n dip: z.literal(true),\n num_pins: z.number(),\n wide: z.boolean().optional(),\n narrow: z.boolean().optional(),\n w: length.optional(),\n p: length.default(length.parse(newDefaults.p ?? \"2.54mm\")),\n id: length.optional(),\n od: length.optional(),\n })\n .transform((v) => {\n // Default inner diameter and outer diameter\n if (!v.id && !v.od) {\n v.id = length.parse(\"1.0mm\")\n v.od = length.parse(\"1.2mm\")\n } else if (!v.id) {\n v.id = v.od! * (1.0 / 1.2)\n } else if (!v.od) {\n v.od = v.id! * (1.2 / 1.0)\n }\n\n // Default width (TODO high pin counts should probably be wide?)\n if (!v.w) {\n if (v.wide) {\n v.w = length.parse(\"600mil\")\n } else if (v.narrow) {\n v.w = length.parse(\"300mil\")\n } else {\n v.w = length.parse(newDefaults.w ?? \"300mil\")\n }\n }\n return v as NowDefined<typeof v, \"w\" | \"p\" | \"id\" | \"od\">\n })\n\nexport const dip_def = extendDipDef({})\n\nexport const getCcwDipCoords = (\n pinCount: number,\n pn: number,\n w: number,\n p: number,\n) => {\n /** pin height */\n const ph = pinCount / 2\n const isLeft = pn <= ph\n\n /** Number of gaps between pins on each side, e.g. 4 pins = 3 spaces */\n const leftPinGaps = ph - 1\n\n /** gap size (pitch) */\n const gs = p\n\n const h = gs * leftPinGaps\n\n if (isLeft) {\n // The y position starts at h/2, then goes down by gap size\n // for each pin\n return { x: -w / 2, y: h / 2 - (pn - 1) * gs }\n } else {\n // The y position starts at -h/2, then goes up by gap size\n return { x: w / 2, y: -h / 2 + (pn - ph - 1) * gs }\n }\n}\n\n/**\n * Returns the plated holes for a DIP package.\n */\nexport const dip = (raw_params: {\n dip: true\n num_pins: number\n w: number\n p?: number\n id?: string | number\n od?: string | number\n}): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = dip_def.parse(raw_params)\n const platedHoles: AnyCircuitElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwDipCoords(\n parameters.num_pins,\n i + 1,\n parameters.w,\n parameters.p ?? 2.54,\n )\n platedHoles.push(\n platedhole(i + 1, x, y, parameters.id ?? \"0.8mm\", parameters.od ?? \"1mm\"),\n )\n }\n /** silkscreen width */\n const sw = parameters.w - parameters.od - 0.4\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.od + 0.4\n const silkscreenBorder: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: sh / 2 },\n // Little U shape at the top\n ...u_curve.map(({ x, y }) => ({\n x: (x * sw) / 6,\n y: (y * sw) / 6 + sh / 2,\n })),\n { x: sw / 2, y: sh / 2 },\n { x: sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: -sh / 2 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n const silkscreenPins: PcbFabricationNoteText[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const isLeft = i < parameters.num_pins / 2\n const pinLabelX = isLeft\n ? -parameters.w / 2 - parameters.p / 2 - 0.2\n : parameters.p / 2 + parameters.w / 2 + 0.2\n const pinLabelY = isLeft\n ? (-sh + 1.6) / 2 + i * parameters.p\n : (-sh + 1.6) / 2 + (i - parameters.num_pins / 2) * parameters.p\n const silkscreenPin = {\n type: \"pcb_fabrication_note_text\",\n layer: \"top\",\n pcb_component_id: `pin_${i + 1}`,\n pcb_silkscreen_text_id: `pin_${i + 1}`,\n text: `{pin${i + 1}}`,\n anchor_position: {\n x: pinLabelX,\n y: pinLabelY,\n },\n font_size: 0.3,\n font_color: \"red\",\n font: \"tscircuit2024\",\n anchor_alignment: \"top-left\",\n }\n\n silkscreenPins.push(silkscreenPin)\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, sh / 2 + 0.5, 0.4)\n\n return {\n circuitJson: [\n ...platedHoles,\n silkscreenBorder,\n silkscreenRefText,\n ...silkscreenPins,\n ],\n parameters,\n }\n}\n","import type { PcbSilkscreenText } from \"circuit-json\"\n\nexport const silkscreenRef: (\n x: number,\n y: number,\n font_size: number,\n) => PcbSilkscreenText = (x: number, y: number, font_size: number) => {\n return {\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: \"silkscreen_text_1\",\n font: \"tscircuit2024\",\n font_size: font_size,\n pcb_component_id: \"pcb_component_1\",\n text: \"{REF}\",\n layer: \"top\",\n anchor_position: { x: x, y: y },\n anchor_alignment: \"center\",\n }\n}\nexport type SilkscreenRef = ReturnType<typeof silkscreenRef>\n","import type { PCBSMTPad } from \"@tscircuit/soup\"\nexport const rectpad = (\n pn: number | Array<string | number>,\n x: number,\n y: number,\n w: number,\n h: number,\n): PCBSMTPad => {\n return {\n type: \"pcb_smtpad\",\n x,\n y,\n width: w,\n height: h,\n layer: \"top\",\n shape: \"rect\",\n pcb_smtpad_id: \"\",\n port_hints: Array.isArray(pn)\n ? pn.map((item) => item.toString())\n : [pn.toString()],\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport mm from \"@tscircuit/mm\"\nimport { platedhole } from \"./platedhole\"\nimport { z } from \"zod\"\nimport { length, distance } from \"circuit-json\"\nimport { type SilkscreenRef, silkscreenRef } from \"./silkscreenRef\"\n\ntype StandardSize = {\n imperial: string\n metric: string\n Z_mm_min: number\n G_mm_min: number\n X_mm_min: number\n C_mm_ref: number\n}\n\n// https://www.worthingtonassembly.com/perfect-0201-footprint\n// https://static1.squarespace.com/static/54982a02e4b02e9f5e5d9ca7/t/660c692f69a0d83a4afecdf0/1712089391915/Discrete+Component+Footprints.pdf\n// https://page.venkel.com/hubfs/Resources/Technical/Resistors%20Landing%20Pattern.pdf\nconst sizes = [\n {\n imperial: \"01005\",\n metric: \"0402\",\n Z_mm_min: 0.58,\n G_mm_min: 0.18,\n X_mm_min: 0.21,\n C_mm_ref: 0.038,\n },\n {\n imperial: \"0201\",\n metric: \"0603\",\n Z_mm_min: 0.9,\n G_mm_min: 0.3,\n X_mm_min: 0.3,\n C_mm_ref: 0.6,\n },\n {\n imperial: \"0402\",\n metric: \"1005\",\n Z_mm_min: 1.6,\n G_mm_min: 0.4,\n X_mm_min: 0.7,\n C_mm_ref: 1,\n },\n {\n imperial: \"0603\",\n metric: \"1608\",\n Z_mm_min: 2.6,\n G_mm_min: 0.6,\n X_mm_min: 1.0,\n C_mm_ref: 1.7,\n },\n {\n imperial: \"0805\",\n metric: \"2012\",\n Z_mm_min: 3.0,\n G_mm_min: 0.6,\n X_mm_min: 1.2,\n C_mm_ref: 1.9,\n },\n {\n imperial: \"1206\",\n metric: \"3216\",\n Z_mm_min: 4.2,\n G_mm_min: 1.2,\n X_mm_min: 1.4,\n C_mm_ref: 2.8,\n },\n {\n imperial: \"1210\",\n metric: \"3225\",\n Z_mm_min: 4.2,\n G_mm_min: 1.2,\n X_mm_min: 2.4,\n C_mm_ref: 2.8,\n },\n {\n imperial: \"2010\",\n metric: \"5025\",\n Z_mm_min: 6.0,\n G_mm_min: 2.6,\n X_mm_min: 2.4,\n C_mm_ref: 4.4,\n },\n {\n imperial: \"2512\",\n metric: \"6332\",\n Z_mm_min: 7.2,\n G_mm_min: 3.8,\n X_mm_min: 3.0,\n C_mm_ref: 5.6,\n },\n]\nconst metricMap: Record<string, StandardSize> = sizes.reduce((acc: any, s) => {\n acc[s.metric] = s\n return acc\n}, {})\nconst imperialMap: Record<string, StandardSize> = sizes.reduce(\n (acc: any, s) => {\n acc[s.imperial] = s\n return acc\n },\n {},\n)\n\nexport const passive_def = z.object({\n tht: z.boolean(),\n p: length,\n pw: length.optional(),\n ph: length.optional(),\n metric: distance.optional(),\n imperial: distance.optional(),\n w: length.optional(),\n h: length.optional(),\n})\n\nexport type PassiveDef = z.input<typeof passive_def>\n\nconst deriveXFromH = (h: number) => 0.079 * h ** 2 + 0.94 * h - 0.009\nconst deriveZFromW = (w: number) => 1.09 * w + 0.6\nconst deriveGFromW = (w: number) => 0.59 * w - 0.31\nconst deriveCFromW = (w: number) => -0.01 * w ** 2 + 0.94 * w + 0.03\n\nexport const passive = (params: PassiveDef): AnySoupElement[] => {\n let { tht, p, pw, ph, metric, imperial, w, h } = params\n\n if (typeof w === \"string\") w = mm(w)\n if (typeof h === \"string\") h = mm(h)\n if (typeof p === \"string\") p = mm(p)\n if (typeof pw === \"string\") pw = mm(pw)\n if (typeof ph === \"string\") ph = mm(ph)\n\n if (h! > w!) {\n throw new Error(\n \"height cannot be greater than width (rotated footprint not yet implemented)\",\n )\n }\n\n /** standard size */\n let sz: StandardSize | undefined\n if (metric) {\n sz = metricMap[metric]\n }\n\n if (imperial) {\n sz = imperialMap[imperial]\n }\n\n if (!sz && w && h && !pw && !ph) {\n sz = {\n imperial: \"custom\",\n metric: \"custom\",\n Z_mm_min: deriveZFromW(w),\n G_mm_min: deriveGFromW(w),\n X_mm_min: deriveXFromH(h),\n C_mm_ref: deriveCFromW(w),\n }\n }\n\n if (sz) {\n w = sz.Z_mm_min\n h = sz.X_mm_min\n p = sz.C_mm_ref\n pw = (sz.Z_mm_min - sz.G_mm_min) / 2\n ph = (sz.Z_mm_min - sz.G_mm_min) / 2\n }\n\n if (pw === undefined) throw new Error(\"could not infer pad width\")\n if (ph === undefined) throw new Error(\"could not infer pad width\")\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, h / 2, h / 12)\n if (tht) {\n return [\n platedhole(1, -p / 2, 0, pw, (pw * 1) / 0.8),\n platedhole(2, p / 2, 0, pw, (pw * 1) / 0.8),\n silkscreenRefText,\n ]\n } else {\n return [\n rectpad([\"1\", \"left\"], -p / 2, 0, pw, ph),\n rectpad([\"2\", \"right\"], p / 2, 0, pw, ph),\n silkscreenRefText,\n ]\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { passive } from \"src/helpers/passive-fn\"\n\nexport const diode = (parameters: {\n tht: boolean\n p: number\n}): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { type PassiveDef, passive } from \"../helpers/passive-fn\"\n\nexport const cap = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { type PassiveDef, passive } from \"../helpers/passive-fn\"\n\nexport const led = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { passive, type PassiveDef } from \"../helpers/passive-fn\"\n\nexport const res = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","export const ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n","import type { AnySoupElement, PCBSMTPad } from \"@tscircuit/soup\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { ALPHABET } from \"../helpers/zod/ALPHABET\"\nimport { z } from \"zod\"\nimport { length, distance } from \"@tscircuit/soup\"\nimport { dim2d } from \"src/helpers/zod/dim-2d\"\nimport { function_call } from \"src/helpers/zod/function-call\"\nimport type { NowDefined } from \"src/helpers/zod/now-defined\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const bga_def = z\n .object({\n fn: z.string(),\n num_pins: z.number(),\n grid: dim2d.optional(),\n p: distance.default(\"0.8mm\"),\n w: length.optional(),\n h: length.optional(),\n ball: length.optional().describe(\"ball diameter\"),\n pad: length.optional().describe(\"pad width/height\"),\n\n tlorigin: z.boolean().optional(),\n blorigin: z.boolean().optional(),\n trorigin: z.boolean().optional(),\n brorigin: z.boolean().optional(),\n\n missing: function_call.default([]),\n })\n .transform((a) => {\n let origin: \"tl\" | \"bl\" | \"tr\" | \"br\" = \"tl\"\n if (a.blorigin) origin = \"bl\"\n if (a.trorigin) origin = \"tr\"\n if (a.brorigin) origin = \"br\"\n\n if (!a.grid) {\n // find the largest square for the number of pins\n const largest_square = Math.ceil(Math.sqrt(a.num_pins))\n a.grid = { x: largest_square, y: largest_square }\n }\n\n if (a.missing) {\n a.missing = a.missing.map((s) => {\n if (typeof s === \"number\") return s\n if (s === \"center\") return \"center\"\n if (s === \"topleft\") return \"topleft\"\n const m = s.match(/([A-Z]+)(\\d+)/)\n if (!m) return s\n const Y = ALPHABET.indexOf(m[1]!)\n const X = Number.parseInt(m[2]!) - 1\n return Y * a.grid!.x + X + 1\n })\n }\n\n const new_def = { ...a, origin }\n\n return new_def as NowDefined<typeof new_def, \"w\" | \"h\" | \"grid\">\n })\n\nexport type BgaDefInput = z.input<typeof bga_def>\nexport type BgaDef = z.infer<typeof bga_def>\n\nexport const bga = (\n raw_params: BgaDefInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = bga_def.parse(raw_params)\n let { num_pins, grid, p, w, h, ball, pad, missing } = parameters\n\n ball ??= (0.75 / 1.27) * p\n\n pad ??= ball * 0.8\n\n const pads: PCBSMTPad[] = []\n\n const missing_pin_nums = (missing ?? []).filter((a) => typeof a === \"number\")\n const num_pins_missing = grid.x * grid.y - num_pins\n\n if (missing.length === 0 && num_pins_missing > 0) {\n // No missing pins specified, let's see if a squared center works\n // if num_pins_missing is a square\n if (Math.sqrt(num_pins_missing) % 1 === 0) {\n missing.push(\"center\")\n } else if (num_pins_missing === 1) {\n missing.push(\"topleft\")\n }\n }\n\n if (missing?.includes(\"center\")) {\n // Find the largest square that's square is less than\n // the number of missing pins\n const square_size = Math.floor(Math.sqrt(num_pins_missing))\n\n // Find the top left coordinate of the inner square, keep\n // in mind the full grid size is grid.x x grid.y\n const inner_square_x = Math.floor((grid.x - square_size) / 2)\n const inner_square_y = Math.floor((grid.y - square_size) / 2)\n\n // Add all the missing square pin numbers to missing_pin_nums\n for (let y = inner_square_y; y < inner_square_y + square_size; y++) {\n for (let x = inner_square_x; x < inner_square_x + square_size; x++) {\n missing_pin_nums.push(y * grid.x + x + 1)\n }\n }\n }\n\n if (missing?.includes(\"topleft\")) {\n missing_pin_nums.push(1)\n }\n\n if (num_pins_missing !== missing_pin_nums.length) {\n throw new Error(\n `not able to create bga component, unable to determine missing pins (try specifying them with \"missing+1+2+...\"\\n\\n${JSON.stringify(\n parameters,\n null,\n \" \",\n )}`,\n )\n }\n\n const missing_pin_nums_set = new Set(missing_pin_nums)\n\n let missing_pins_passed = 0\n for (let y = 0; y < grid.y; y++) {\n for (let x = 0; x < grid.x; x++) {\n let pin_num = y * grid.x + x + 1\n if (missing_pin_nums_set.has(pin_num)) {\n missing_pins_passed++\n continue\n }\n pin_num -= missing_pins_passed\n\n const pad_x = (x - (grid.x - 1) / 2) * p\n const pad_y = -(y - (grid.y - 1) / 2) * p\n\n // TODO handle >26 rows\n pads.push(\n rectpad([pin_num, `${ALPHABET[y]}${x + 1}`], pad_x, pad_y, pad, pad),\n )\n }\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n (grid.y * p) / 2,\n 0.2,\n )\n\n return {\n circuitJson: [...pads, silkscreenRefText as AnySoupElement],\n parameters,\n }\n}\n","import { z } from \"zod\"\n\nexport const dim2d = z\n .string()\n .transform((a) => {\n const [x, y] = a.split(/[x ]/)\n return {\n x: parseFloat(x),\n y: parseFloat(y),\n }\n })\n .pipe(\n z.object({\n x: z.number(),\n y: z.number(),\n }),\n )\n","import { z } from \"zod\"\n\nexport const function_call = z\n .string()\n .or(z.array(z.any()))\n .transform((a) => {\n if (Array.isArray(a)) return a\n if (a.startsWith(\"(\") && a.endsWith(\")\")) {\n a = a.slice(1, -1)\n }\n return a.split(\",\").map((v) => {\n const numVal = Number(v)\n return isNaN(numVal) ? v : numVal\n })\n })\n .pipe(z.array(z.string().or(z.number())))\n","import type { AnySoupElement, PcbSilkscreenPath } from \"@tscircuit/soup\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { z, type AnyZodObject } from \"zod\"\nimport { length } from \"@tscircuit/soup\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { u_curve } from \"../helpers/u-curve\"\nimport { rectpad } from \"src/helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nexport const extendSoicDef = (newDefaults: {\n w?: string\n p?: string\n legsoutside?: boolean\n}) =>\n z\n .object({\n fn: z.string(),\n num_pins: z.number(),\n w: length.default(length.parse(newDefaults.w ?? \"5.3mm\")),\n p: length.default(length.parse(newDefaults.p ?? \"1.27mm\")),\n pw: length.optional(),\n pl: length.optional(),\n legsoutside: z\n .boolean()\n .optional()\n .default(newDefaults.legsoutside ?? false),\n })\n .transform((v) => {\n // Default inner diameter and outer diameter\n if (!v.pw && !v.pl) {\n v.pw = length.parse(\"0.6mm\")\n v.pl = length.parse(\"1.0mm\")\n } else if (!v.pw) {\n v.pw = v.pl! * (0.6 / 1.0)\n } else if (!v.pl) {\n v.pl = v.pw! * (1.0 / 0.6)\n }\n\n return v as NowDefined<typeof v, \"w\" | \"p\" | \"pw\" | \"pl\">\n })\n\nexport const soic_def = extendSoicDef({})\nexport type SoicInput = z.infer<typeof soic_def>\n\nexport const getCcwSoicCoords = (parameters: {\n num_pins: number\n pn: number\n w: number\n p: number\n pl: number\n legsoutside?: boolean\n widthincludeslegs?: boolean\n}) => {\n if (parameters.widthincludeslegs !== undefined) {\n parameters.legsoutside = !parameters.widthincludeslegs\n }\n const { num_pins, pn, w, p, pl, legsoutside } = parameters\n /** pin height */\n const ph = num_pins / 2\n const isLeft = pn <= ph\n\n /** Number of gaps between pins on each side, e.g. 4 pins = 3 spaces */\n const leftPinGaps = ph - 1\n\n /** gap size (pitch) */\n const gs = p\n\n const h = gs * leftPinGaps\n\n const legoffset = legsoutside ? pl / 2 : -pl / 2\n\n if (isLeft) {\n // The y position starts at h/2, then goes down by gap size\n // for each pin\n return { x: -w / 2 - legoffset, y: h / 2 - (pn - 1) * gs }\n } else {\n // The y position starts at -h/2, then goes up by gap size\n return { x: w / 2 + legoffset, y: -h / 2 + (pn - ph - 1) * gs }\n }\n}\n\n/**\n * Returns the plated holes for a SOIC package.\n */\nexport const soic = (raw_params: {\n soic: true\n num_pins: number\n w: number\n p?: number\n id?: string | number\n od?: string | number\n}): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = soic_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters) as AnySoupElement[],\n parameters,\n }\n}\n\nexport const soicWithoutParsing = (parameters: z.infer<typeof soic_def>) => {\n const pads: AnySoupElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSoicCoords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n p: parameters.p ?? 1.27,\n pl: parameters.pl,\n legsoutside: parameters.legsoutside,\n })\n pads.push(\n rectpad(i + 1, x, y, parameters.pl ?? \"1mm\", parameters.pw ?? \"0.6mm\"),\n )\n }\n\n /** silkscreen width */\n const m = Math.min(1, parameters.p / 2)\n const sw =\n parameters.w - (parameters.legsoutside ? 0 : parameters.pl * 2) - 0.2\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw + m\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n sh / 2 + 0.4,\n sh / 12,\n )\n const silkscreenBorder: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n stroke_width: 0.1,\n route: [\n { x: -sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: sh / 2 },\n // Little U shape at the top\n ...u_curve.map(({ x, y }) => ({\n x: (x * sw) / 6,\n y: (y * sw) / 6 + sh / 2,\n })),\n { x: sw / 2, y: sh / 2 },\n { x: sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: -sh / 2 },\n ],\n }\n\n return [...pads, silkscreenBorder, silkscreenRefText] as AnySoupElement[]\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { length } from \"@tscircuit/soup\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { pin_order_specifier } from \"src/helpers/zod/pin-order-specifier\"\nimport { getQuadPinMap } from \"src/helpers/get-quad-pin-map\"\nimport { dim2d } from \"src/helpers/zod/dim-2d\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const base_quad_def = z.object({\n fn: z.string(),\n cc: z.literal(true).optional(),\n ccw: z.literal(true).optional(),\n startingpin: z\n .string()\n .or(z.array(pin_order_specifier))\n .transform((a) => (typeof a === \"string\" ? a.slice(1, -1).split(\",\") : a))\n .pipe(z.array(pin_order_specifier))\n .optional(),\n num_pins: z.number(),\n w: length.optional(),\n h: length.optional(),\n p: length.default(length.parse(\"0.5mm\")),\n pw: length.optional(),\n pl: length.optional(),\n thermalpad: z.union([z.literal(true), dim2d]).optional(),\n legsoutside: z.boolean().optional(),\n})\n\nexport const quadTransform = <T extends z.infer<typeof base_quad_def>>(\n v: T,\n) => {\n if (v.w && !v.h) {\n v.h = v.w\n } else if (!v.w && v.h) {\n v.w = v.h\n }\n\n const side_pin_count = v.num_pins / 4\n\n if (!v.p && !v.pw && !v.pl && v.w) {\n // HACK: This is wayyy underspecified\n const approx_pin_size_of_side = side_pin_count + 4\n v.p = v.w / approx_pin_size_of_side\n }\n\n if (!v.p && v.w && v.h && v.pw && v.pl) {\n // HACK: This is wayyy underspecified\n v.p = (v.w - v.pl * 2) / (side_pin_count - 1)\n }\n\n if (!v.w && !v.h && v.p) {\n // HACK: underspecified\n v.w = v.p * (side_pin_count + 4)\n v.h = v.w\n }\n\n if (v.p && !v.pw && !v.pl) {\n v.pw = v.p / 2\n v.pl = v.p / 2\n } else if (!v.pw) {\n v.pw = v.pl! * (0.6 / 1.0)\n } else if (!v.pl) {\n v.pl = v.pw! * (1.0 / 0.6)\n }\n\n return v as NowDefined<T, \"w\" | \"h\" | \"p\" | \"pw\" | \"pl\">\n}\n\nexport const quad_def = base_quad_def.transform(quadTransform)\n\nconst SIDES_CCW = [\"left\", \"bottom\", \"right\", \"top\"] as const\n\nexport const getQuadCoords = (params: {\n pin_count: number\n pn: number // pin number\n w: number // width of the package\n h: number // height (length) of the package\n p: number // pitch between pins\n pl: number // length of the pin\n legsoutside?: boolean\n}) => {\n const { pin_count, pn, w, h, p, pl, legsoutside } = params\n const sidePinCount = pin_count / 4\n const side = SIDES_CCW[Math.floor((pn - 1) / sidePinCount)]\n const pos = (pn - 1) % sidePinCount\n\n /** inner box width */\n const ibw = p * (sidePinCount - 1)\n /** inner box height */\n const ibh = p * (sidePinCount - 1)\n\n /** pad center distance from edge (negative is inside, positive is outside) */\n const pcdfe = legsoutside ? pl / 2 : -pl / 2\n\n switch (side) {\n case \"left\":\n return { x: -w / 2 - pcdfe, y: ibh / 2 - pos * p, o: \"vert\" }\n case \"bottom\":\n return { x: -ibw / 2 + pos * p, y: -h / 2 - pcdfe, o: \"horz\" }\n case \"right\":\n return { x: w / 2 + pcdfe, y: -ibh / 2 + pos * p, o: \"vert\" }\n case \"top\":\n return { x: ibw / 2 - pos * p, y: h / 2 + pcdfe, o: \"horz\" }\n default:\n throw new Error(\"Invalid pin number\")\n }\n}\n\nexport const quad = (\n raw_params: z.input<typeof quad_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = quad_def.parse(raw_params)\n const pads: AnySoupElement[] = []\n const pin_map = getQuadPinMap(parameters)\n /** Side pin count */\n const spc = parameters.num_pins / 4\n for (let i = 0; i < parameters.num_pins; i++) {\n const {\n x,\n y,\n o: orientation,\n } = getQuadCoords({\n pin_count: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n h: parameters.h,\n p: parameters.p ?? 0.5,\n pl: parameters.pl,\n legsoutside: parameters.legsoutside,\n })\n\n let pw = parameters.pw\n let pl = parameters.pl\n if (orientation === \"vert\") {\n ;[pw, pl] = [pl, pw]\n }\n\n const pn = pin_map[i + 1]!\n pads.push(rectpad(pn, x, y, pw, pl))\n }\n\n if (parameters.thermalpad) {\n if (typeof parameters.thermalpad === \"boolean\") {\n const ibw = parameters.p * (spc - 1) + parameters.pw\n const ibh = parameters.p * (spc - 1) + parameters.pw\n pads.push(rectpad([\"thermalpad\"], 0, 0, ibw, ibh))\n } else {\n pads.push(\n rectpad(\n [\"thermalpad\"],\n 0,\n 0,\n parameters.thermalpad.x,\n parameters.thermalpad.y,\n ),\n )\n }\n }\n\n // Silkscreen corners\n const silkscreen_corners: PcbSilkscreenPath[] = []\n for (const [corner, dx, dy] of [\n [\"top-left\", -1, 1],\n [\"bottom-left\", -1, -1],\n [\"bottom-right\", 1, -1],\n [\"top-right\", 1, 1],\n ] as const) {\n // const dx = Math.floor(corner_index / 2) * 2 - 1\n // const dy = 1 - (corner_index % 2) * 2\n const corner_x = (parameters.w / 2) * dx\n const corner_y = (parameters.h / 2) * dy\n let arrow: \"none\" | \"in1\" | \"in2\" = \"none\"\n\n let arrow_x = corner_x\n let arrow_y = corner_y\n\n /** corner size */\n const csz = parameters.pw * 2\n\n if (pin_map[1] === 1 && corner === \"top-left\") {\n arrow = \"in1\"\n } else if (pin_map[spc * 4] === 1 && corner === \"top-left\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 3 + 1] === 1 && corner === \"top-right\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 3] === 1 && corner === \"top-right\") {\n arrow = \"in1\"\n } else if (pin_map[spc] === 1 && corner === \"bottom-left\") {\n arrow = \"in1\"\n } else if (pin_map[spc + 1] === 1 && corner === \"bottom-left\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 2] === 1 && corner === \"bottom-right\") {\n arrow = \"in1\"\n } else if (pin_map[spc * 2 + 1] === 1 && corner === \"bottom-right\") {\n arrow = \"in2\"\n }\n\n const rotate_arrow = arrow === \"in1\" ? 1 : -1\n if (parameters.legsoutside) {\n const arrow_dx = arrow === \"in1\" ? parameters.pl / 2 : parameters.pw / 2\n const arrow_dy = arrow === \"in1\" ? parameters.pw / 2 : parameters.pl / 2\n arrow_x += arrow_dx * dx * rotate_arrow\n arrow_y -= arrow_dy * dy * rotate_arrow\n }\n\n // Normal Corner\n if (arrow === \"none\" || parameters.legsoutside) {\n silkscreen_corners.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}`,\n route: [\n {\n x: corner_x - csz * dx,\n y: corner_y,\n },\n {\n x: corner_x,\n y: corner_y,\n },\n {\n x: corner_x,\n y: corner_y - csz * dy,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n })\n }\n\n // Two lines nearly forming a corner, used when the arrow needs to overlap\n // the corne (QFN components where legs are inside)\n if ((arrow === \"in1\" || arrow === \"in2\") && !parameters.legsoutside) {\n silkscreen_corners.push(\n {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_1`,\n route: [\n {\n x: corner_x - csz * dx,\n y: corner_y,\n },\n {\n x: corner_x - (csz * dx) / 2,\n y: corner_y,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0,\n },\n {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_2`,\n route: [\n {\n x: corner_x,\n y: corner_y - (csz * dy) / 2,\n },\n {\n x: corner_x,\n y: corner_y - csz * dy,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n },\n )\n }\n if (arrow === \"in1\" || arrow === \"in2\") {\n silkscreen_corners.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_3`,\n route: [\n {\n x: arrow_x - 0.2 * -dx,\n y: arrow_y + 0.2 * rotate_arrow,\n },\n {\n x: arrow_x,\n y: arrow_y,\n },\n {\n x: arrow_x + 0.2 * rotate_arrow * -dx,\n y: arrow_y + 0.2,\n },\n {\n x: arrow_x - 0.2 * -dx,\n y: arrow_y + 0.2 * rotate_arrow,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n })\n }\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n parameters.h / 2 + (parameters.legsoutside ? parameters.pl * 1.2 : 0.5),\n 0.3,\n )\n return {\n circuitJson: [\n ...pads,\n ...silkscreen_corners,\n silkscreenRefText,\n ] as AnySoupElement[],\n parameters,\n }\n}\n","import { z } from \"zod\"\nexport const pin_order_specifier = z.enum([\n \"leftside\",\n \"topside\",\n \"rightside\",\n \"bottomside\",\n \"toppin\",\n \"bottompin\",\n \"leftpin\",\n \"rightpin\",\n])\n\nexport type PinOrderSpecifier = z.infer<typeof pin_order_specifier>\n","import type { PinOrderSpecifier } from \"./zod/pin-order-specifier\"\n\n/**\n * A counter-clockwise pin map is [1,2,3,4,5,6,7,8] for an 8-pin package\n *\n * 8 7\n * 1 6\n * 2 5\n * 3 4\n *\n * Given some parameters, we're returning how to map the pins in a quad package\n * with a different order. For example, if we pass in cw=true, we'll get the\n * following mapping\n *\n * 1 -> 1\n * 2 -> 8\n * 3 -> 7\n * 4 -> 6\n * 5 -> 5\n * 6 -> 4\n * 7 -> 3\n * 8 -> 2\n *\n * Which allows us to create the CW version of the package using...\n * new_pin = pin_map[normal_ccw_pin]\n *\n * 2 3\n * 1 4\n * 8 5\n * 7 6\n */\nexport const getQuadPinMap = ({\n num_pins,\n cw,\n ccw,\n startingpin,\n}: {\n num_pins: number\n cw?: boolean\n ccw?: boolean\n startingpin?: PinOrderSpecifier[]\n}): number[] => {\n const pin_map: number[] = []\n const pins_per_side = num_pins / 4\n let current_position_ccw_normal = 1\n\n /** Starting Flag Pins */\n const sfp: Record<PinOrderSpecifier, boolean> = {} as any\n for (const specifier of startingpin ?? []) {\n sfp[specifier] = true\n }\n if (!sfp.leftside && !sfp.topside && !sfp.rightside && !sfp.bottomside) {\n sfp.leftside = true\n }\n if (!sfp.bottompin && !sfp.leftpin && !sfp.rightpin && !sfp.toppin) {\n if (sfp.leftside) {\n sfp.toppin = true\n } else if (sfp.topside) {\n sfp.rightpin = true\n } else if (sfp.rightside) {\n sfp.bottompin = true\n } else if (sfp.bottomside) {\n sfp.leftpin = true\n }\n }\n\n if (sfp.leftside && sfp.toppin) {\n current_position_ccw_normal = 1\n } else if (sfp.leftside && sfp.bottompin) {\n current_position_ccw_normal = pins_per_side\n } else if (sfp.bottomside && sfp.leftpin) {\n current_position_ccw_normal = pins_per_side + 1\n } else if (sfp.bottomside && sfp.rightpin) {\n current_position_ccw_normal = pins_per_side * 2\n } else if (sfp.rightside && sfp.bottompin) {\n current_position_ccw_normal = pins_per_side * 2 + 1\n } else if (sfp.rightside && sfp.toppin) {\n current_position_ccw_normal = pins_per_side * 3\n } else if (sfp.topside && sfp.rightpin) {\n current_position_ccw_normal = pins_per_side * 3 + 1\n } else if (sfp.topside && sfp.leftpin) {\n current_position_ccw_normal = pins_per_side * 4\n }\n\n pin_map.push(-1) // the first index is meaningless\n\n // Each iteration we move the current position to the next pin, if we're\n // going CCW this means incrementing, if we're going CW this means\n // decrementing\n for (let i = 0; i < num_pins; i++) {\n pin_map[current_position_ccw_normal] = i + 1\n if (ccw || !cw) {\n current_position_ccw_normal++\n if (current_position_ccw_normal > num_pins) {\n current_position_ccw_normal = 1\n }\n } else {\n current_position_ccw_normal--\n if (current_position_ccw_normal < 1) {\n current_position_ccw_normal = num_pins\n }\n }\n }\n\n return pin_map\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { base_quad_def, quad, quad_def, quadTransform } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const qfn_def = base_quad_def.extend({}).transform(quadTransform)\n\nexport const qfn = (\n parameters: z.input<typeof qfn_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n parameters.legsoutside = false\n return quad(parameters)\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { quad, quad_def } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const qfp_def = quad_def\n\nexport const qfp = (\n raw_params: z.input<typeof quad_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n raw_params.legsoutside = true\n\n const quad_defaults = quad_def.parse(raw_params)\n if (!raw_params.p) {\n switch (raw_params.num_pins) {\n case 44:\n case 64:\n raw_params.p = 0.8\n break\n case 52:\n if (raw_params.w === 14) raw_params.p = 1\n else raw_params.p = 0.65\n break\n case 208:\n raw_params.p = 0.5\n break\n }\n }\n if (!raw_params.pl) {\n switch (raw_params.num_pins) {\n case 44:\n case 52:\n case 64:\n raw_params.pl = 2.25\n break\n case 208:\n raw_params.pl = 1.65\n break\n default:\n raw_params.pl = quad_defaults.pl * 4\n break\n }\n }\n if (!raw_params.pw) {\n switch (raw_params.num_pins) {\n case 44:\n case 64:\n raw_params.pw = 0.5\n break\n case 52:\n if (raw_params.w === 14) raw_params.pw = 0.45\n else raw_params.pw = 0.55\n break\n case 208:\n raw_params.pw = 0.3\n break\n default:\n raw_params.pw = quad_defaults.pw\n break\n }\n }\n return quad(raw_params)\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { base_quad_def, quad, quad_def, quadTransform } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const mlp_def = base_quad_def.extend({}).transform(quadTransform)\n\nexport const mlp = (\n parameters: z.input<typeof mlp_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n parameters.legsoutside = false\n if (parameters.thermalpad === undefined) {\n parameters.thermalpad = true\n }\n return quad(parameters)\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing, type SoicInput } from \"./soic\"\n\n// TODO we should accept MS-012 or MS-013\n\nexport const ssop_def = extendSoicDef({\n w: \"3.9mm\",\n p: \"1.27mm\",\n})\n\nexport const ssop = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = ssop_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing, type SoicInput } from \"./soic\"\n\nexport const tssop_def = extendSoicDef({\n w: \"6.1mm\",\n p: \"0.65mm\",\n legsoutside: true,\n})\n\nexport const tssop = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = tssop_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot236_def = extendSoicDef({\n p: \"0.95mm\",\n w: \"1.6mm\",\n legsoutside: true,\n})\n\nexport const sot236 = (\n raw_params: z.input<typeof sot236_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot236_def.parse({ ...raw_params, num_pins: 6 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot363_def = extendSoicDef({})\n\nexport const sot363 = (\n raw_params: z.input<typeof sot363_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot363_def.parse({\n fn: \"sot363\",\n num_pins: 6,\n w: 1.94,\n p: 0.65,\n pw: 0.3,\n pl: 0.7,\n legoutside: true,\n })\n\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const sot23_def = z.object({\n fn: z.string(),\n num_pins: z.number().default(3),\n w: z.string().default(\"1.92mm\"),\n h: z.string().default(\"2.74mm\"),\n pl: z.string().default(\"0.8mm\"),\n pw: z.string().default(\"0.764mm\"),\n})\n\nexport const sot23 = (\n raw_params: z.input<typeof sot23_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot23_def.parse(raw_params)\n return {\n circuitJson: sot23WithoutParsing(parameters),\n parameters: parameters,\n }\n}\n\nexport const getCcwSot23Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n}) => {\n const { pn, w, h, pl } = parameters\n\n if (pn === 1) {\n return { x: -1.7, y: 0 }\n } else if (pn === 2) {\n return { x: 1.7, y: -0.95 }\n } else {\n return { x: 1.7, y: 0.95 }\n }\n}\n\nexport const sot23WithoutParsing = (parameters: z.infer<typeof sot23_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSot23Coords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: Number.parseFloat(parameters.w),\n h: Number.parseFloat(parameters.h),\n pl: Number.parseFloat(parameters.pl),\n })\n pads.push(\n rectpad(\n i + 1,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n Number(parameters.h),\n 0.3,\n )\n return [...pads, silkscreenRefText as AnySoupElement]\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"@tscircuit/soup\"\nimport {\n extendSoicDef,\n soicWithoutParsing,\n type SoicInput,\n getCcwSoicCoords,\n} from \"./soic\"\nimport { rectpad } from \"src/helpers/rectpad\"\nimport { z } from \"zod\"\nimport { CORNERS } from \"src/helpers/corner\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const dfn_def = extendSoicDef({})\n\n/**\n * Dual Flat No-lead\n *\n * Similar to SOIC but different silkscreen\n */\nexport const dfn = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = dfn_def.parse(raw_params)\n const pads: AnySoupElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSoicCoords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n p: parameters.p ?? 1.27,\n pl: parameters.pl,\n widthincludeslegs: true,\n })\n pads.push(\n rectpad(i + 1, x, y, parameters.pl ?? \"1mm\", parameters.pw ?? \"0.6mm\"),\n )\n }\n\n // The silkscreen is 4 corners and an arrow identifier for pin1\n const m = Math.min(1, parameters.p / 2)\n const sw = parameters.w + m\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw + m\n const silkscreenPaths: PcbSilkscreenPath[] = []\n\n for (const corner of CORNERS) {\n const { dx, dy } = corner\n silkscreenPaths.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"\",\n route: [\n { x: (dx * sw) / 2 - dx * parameters.p, y: (dy * sh) / 2 },\n { x: (dx * sw) / 2, y: (dy * sh) / 2 },\n { x: (dx * sw) / 2, y: (dy * sh) / 2 - dy * parameters.p },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n })\n }\n\n // Arrow\n /** arrow size */\n const as = parameters.p / 4\n /** Arrow tip x */\n const atx = -sw / 2 - as / 2\n /** Arrow tip y */\n const aty = sh / 2 - parameters.p / 2\n\n silkscreenPaths.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"\",\n type: \"pcb_silkscreen_path\",\n route: [\n {\n x: atx,\n y: aty,\n },\n {\n x: atx - as,\n y: aty + as,\n },\n {\n x: atx - as,\n y: aty - as,\n },\n {\n x: atx,\n y: aty,\n },\n ],\n stroke_width: 0.1,\n })\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n sh / 2 + 0.4,\n sh / 12,\n )\n return {\n circuitJson: [\n ...pads,\n silkscreenRefText,\n ...silkscreenPaths,\n ] as AnySoupElement[],\n parameters,\n }\n}\n","export const CORNERS = [\n { name: \"top-left\", dx: -1, dy: 1 },\n { name: \"top-right\", dx: 1, dy: 1 },\n { name: \"bottom-left\", dx: -1, dy: -1 },\n { name: \"bottom-right\", dx: 1, dy: -1 },\n]\n","import { z } from \"zod\"\nimport { length, type AnySoupElement } from \"@tscircuit/soup\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const pinrow_def = z.object({\n fn: z.string(),\n num_pins: z.number(),\n p: length.default(\"0.1in\").describe(\"pitch\"),\n id: length.default(\"1.0mm\").describe(\"inner diameter\"),\n od: length.default(\"1.2mm\").describe(\"outer diameter\"),\n})\n\nexport const pinrow = (\n raw_params: z.input<typeof pinrow_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = pinrow_def.parse(raw_params)\n const { p, id, od } = parameters\n const holes: any[] = []\n /** num_spaces */\n const ns = parameters.num_pins - 1\n const xoff = -(ns / 2) * p\n\n for (let i = 0; i < parameters.num_pins; i++) {\n holes.push(platedhole(i + 1, xoff + i * p, 0, id, od))\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, p / 2, 0.5)\n return {\n circuitJson: [...holes, silkscreenRefText] as AnySoupElement[],\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot563_def = extendSoicDef({})\n\nexport const sot563 = (\n raw_params: z.input<typeof sot563_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot563_def.parse({\n fn: \"sot563\",\n num_pins: 6,\n w: 1.94,\n p: 0.5,\n pw: 0.3,\n pl: 0.67,\n legoutside: true,\n })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const ms012_def = extendSoicDef({\n p: \"1.27mm\",\n w: \"3.9mm\",\n legsoutside: true,\n})\n\nexport const ms012 = (\n raw_params: z.input<typeof ms012_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = ms012_def.parse({ ...raw_params, num_pins: 8 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const ms013_def = extendSoicDef({\n p: \"1.27mm\",\n w: \"7.5mm\",\n legsoutside: true,\n})\n\nexport const ms013 = (\n raw_params: z.input<typeof ms013_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = ms013_def.parse({ ...raw_params, num_pins: 16 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const sot723_def = z.object({\n fn: z.string(),\n num_pins: z.number().default(3),\n w: z.string().default(\"1.2mm\"),\n h: z.string().default(\"1.2mm\"),\n pl: z.string().default(\"0.3mm\"),\n pw: z.string().default(\"0.32mm\"),\n})\n\nexport const sot723 = (\n raw_params: z.input<typeof sot723_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot723_def.parse(raw_params)\n const pad = sot723WithoutParsing(parameters)\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n Number(parameters.h),\n 0.3,\n )\n return {\n circuitJson: [...pad, silkscreenRefText as AnySoupElement],\n parameters,\n }\n}\n\nexport const getCcwSot723Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n}) => {\n const { pn, w, h, pl } = parameters\n\n if (pn === 1) {\n return { x: 0, y: 0 }\n } else if (pn === 2) {\n return { x: 1, y: -0.4 }\n } else {\n return { x: 1, y: 0.4 }\n }\n}\n\nexport const sot723WithoutParsing = (\n parameters: z.infer<typeof sot723_def>,\n) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 0; i < 3; i++) {\n const { x, y } = getCcwSot723Coords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: Number.parseFloat(parameters.w),\n h: Number.parseFloat(parameters.h),\n pl: Number.parseFloat(parameters.pl),\n })\n pads.push(\n rectpad(\n i + 1,\n x,\n y,\n Number.parseFloat(parameters.pl),\n i !== 0 ? Number.parseFloat(parameters.pw) : 0.42,\n ),\n )\n }\n\n return pads\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\n\nexport const sod_def = z.object({\n fn: z.string(),\n w: z.string().default(\"2.36mm\"),\n h: z.string().default(\"1.22mm\"),\n pl: z.string().default(\"0.9mm\"),\n pw: z.string().default(\"0.9mm\"),\n pad_spacing: z.string().default(\"4.19mm\"),\n})\n\nexport const sod123 = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n Number(parameters.h) / 4 + 0.4,\n 0.3,\n )\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\nexport const getSodCoords = (parameters: {\n pn: number\n pad_spacing: number\n}) => {\n const { pn, pad_spacing } = parameters\n\n if (pn === 1) {\n return { x: -pad_spacing / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: pad_spacing / 2, y: 0 }\n }\n}\n\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 0; i < 2; i++) {\n const { x, y } = getSodCoords({\n pn: i + 1,\n pad_spacing: Number.parseFloat(parameters.pad_spacing),\n })\n pads.push(\n rectpad(\n i + 1,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import {\n length,\n type AnySoupElement,\n type PcbSilkscreenLine,\n type PcbSilkscreenPath,\n} from \"@tscircuit/soup\"\nimport { passive, type PassiveDef } from \"../helpers/passive-fn\"\nimport { z } from \"zod\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\n\nexport const axial_def = z.object({\n fn: z.string(),\n num_pins: z.any().transform(() => 2),\n p: length.optional().default(\"2.54mm\"),\n id: length.optional().default(\"0.7mm\"),\n od: length.optional().default(\"1mm\"),\n})\nexport type AxialDef = z.input<typeof axial_def>\n\nexport const axial = (\n raw_params: AxialDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = axial_def.parse(raw_params)\n\n const { p, id, od } = parameters\n\n const plated_holes = [\n platedhole(1, -p / 2, 0, id, od),\n platedhole(2, p / 2, 0, id, od),\n ]\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -p / 2 + od + id / 2, y: 0 },\n { x: p / 2 - od - id / 2, y: 0 },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, p / 4, 0.5)\n return {\n circuitJson: [\n ...plated_holes,\n silkscreenLine,\n silkscreenRefText as AnySoupElement,\n ],\n parameters,\n }\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { silkscreenpath } from \"../helpers/silkscreenpath\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const pushbutton_def = z.object({\n fn: z.literal(\"pushbutton\"),\n})\n\nexport const pushbutton = (\n raw_params: z.input<typeof pushbutton_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = pushbutton_def.parse(raw_params)\n\n const width = 4.5\n const height = 6.5\n const holeDiameter = 1\n\n const holes: AnyCircuitElement[] = [\n platedhole(1, -width / 2, height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(2, -width / 2, -height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(3, width / 2, -height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(4, width / 2, height / 2, holeDiameter, holeDiameter * 1.2),\n ]\n\n const silkscreenLines: AnyCircuitElement[] = [\n // Vertical lines indicating connections\n silkscreenpath([\n { x: -width / 2, y: -height / 2 },\n { x: -width / 2, y: height / 2 },\n ]),\n silkscreenpath([\n { x: width / 2, y: -height / 2 },\n { x: width / 2, y: height / 2 },\n ]),\n // Center indicating latch\n silkscreenpath([\n { x: -width / 2, y: 0 },\n { x: -width / 5, y: 0 },\n { x: ((width / 5) * 1) / Math.sqrt(2), y: height / 8 },\n ]),\n silkscreenpath([\n { x: width / 2, y: 0 },\n { x: width / 5, y: 0 },\n ]),\n ]\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n height / 2 + 0.4,\n 0.5,\n )\n return {\n circuitJson: [...holes, ...silkscreenLines, silkscreenRefText],\n parameters,\n }\n}\n","import type { PcbSilkscreenPath } from \"circuit-json\"\n\nexport const silkscreenpath = (\n route: Array<{ x: number; y: number }>,\n options: {\n stroke_width?: number\n layer?: string\n pcb_component_id?: string\n pcb_silkscreen_path_id?: string\n } = {},\n): PcbSilkscreenPath => {\n return {\n type: \"pcb_silkscreen_path\",\n layer: options.layer || \"top\",\n pcb_component_id: options.pcb_component_id || \"\",\n pcb_silkscreen_path_id: options.pcb_silkscreen_path_id || \"\",\n route,\n stroke_width: options.stroke_width || 0.1,\n }\n}\n","import {\n length,\n type AnyCircuitElement,\n type PcbPlatedHole,\n type PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const stampboard_def = z.object({\n fn: z.string(),\n w: length.default(\"22.58mm\"),\n left: length.optional(),\n right: length.optional(),\n top: length.optional(),\n bottom: length.optional(),\n p: length.default(length.parse(\"2.54mm\")),\n pw: length.default(length.parse(\"1.6mm\")),\n pl: length.default(length.parse(\"3.2mm\")),\n innerhole: z.boolean().default(false),\n})\n\nexport type Stampboard_def = z.input<typeof stampboard_def>\n\nconst getHeight = (parameters: Stampboard_def) => {\n const params = stampboard_def.parse(parameters)\n if (params.left && params.right) {\n return Math.max(params.left, params.right) * params.p\n }\n if (params.left) {\n return params.left * params.p\n }\n if (params.right) {\n return params.right * params.p\n }\n return 51 // Default height if no pins are provided\n}\n\nexport const stampboard = (\n raw_params: Stampboard_def,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const params = stampboard_def.parse(raw_params)\n const rectpads: AnyCircuitElement[] = []\n const holes: PcbPlatedHole[] = []\n let firstPinLocation: {\n x: number\n y: number\n } = { x: 0, y: 0 }\n let routes: { x: number; y: number }[] = []\n const innerDiameter = 1\n const outerDiameter = 1.2\n const triangleHeight = 1 // Adjust triangle size as needed\n const triangleWidth = 0.6 // Adjust triangle width as needed\n if (params.right) {\n const yoff = -((params.right - 1) / 2) * params.p\n for (let i = 0; i < params.right; i++) {\n if (i === 0 && !params.left && !params.bottom) {\n firstPinLocation = {\n x: params.w / 2 - params.pl * 1.4,\n y: yoff + i * params.p,\n }\n routes = [\n {\n x: firstPinLocation.x + triangleHeight / 2,\n y: firstPinLocation.y,\n }, // Tip of the triangle (pointing right)\n {\n x: firstPinLocation.x - triangleHeight / 2,\n y: firstPinLocation.y + triangleWidth / 2,\n }, // Bottom corner of the base\n {\n x: firstPinLocation.x - triangleHeight / 2,\n y: firstPinLocation.y - triangleWidth / 2,\n }, // Top corner of the base\n {\n x: firstPinLocation.x + triangleHeight / 2,\n y: firstPinLocation.y,\n }, // Close the path at the tip\n ]\n }\n rectpads.push(\n rectpad(\n i + 1,\n params.w / 2 - params.pl / 2,\n yoff + i * params.p,\n params.pl,\n params.pw,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1,\n params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1,\n params.w / 2 - params.pl + outerDiameter / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n if (params.left) {\n const yoff = -((params.left - 1) / 2) * params.p\n for (let i = 0; i < params.left; i++) {\n if (i === params.left - 1) {\n firstPinLocation = {\n x: -params.w / 2 + params.pl * 1.4,\n y: yoff + i * params.p,\n }\n routes = [\n {\n x: firstPinLocation.x - triangleHeight / 2,\n y: firstPinLocation.y,\n }, // Tip of the triangle (pointing left)\n {\n x: firstPinLocation.x + triangleHeight / 2,\n y: firstPinLocation.y + triangleWidth / 2,\n }, // Top corner of the base\n {\n x: firstPinLocation.x + triangleHeight / 2,\n y: firstPinLocation.y - triangleWidth / 2,\n }, // Bottom corner of the base\n {\n x: firstPinLocation.x - triangleHeight / 2,\n y: firstPinLocation.y,\n }, // Close the path at the tip\n ]\n }\n rectpads.push(\n rectpad(\n i + 1,\n -params.w / 2 + params.pl / 2,\n yoff + i * params.p,\n params.pl,\n params.pw,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1,\n -params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1,\n -params.w / 2 + params.pl - outerDiameter / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n if (params.top) {\n const xoff = -((params.top - 1) / 2) * params.p\n for (let i = 0; i < params.top; i++) {\n if (\n i === params.top - 1 &&\n !params.left &&\n !params.bottom &&\n !params.right\n ) {\n firstPinLocation = {\n x: xoff + i * params.p,\n y: getHeight(params) / 2 - params.pl * 1.4,\n }\n routes = [\n {\n x: firstPinLocation.x,\n y: firstPinLocation.y + triangleHeight / 2,\n }, // Tip of the triangle (pointing up)\n {\n x: firstPinLocation.x - triangleWidth / 2,\n y: firstPinLocation.y - triangleHeight / 2,\n }, // Left corner of the base\n {\n x: firstPinLocation.x + triangleWidth / 2,\n y: firstPinLocation.y - triangleHeight / 2,\n }, // Right corner of the base\n {\n x: firstPinLocation.x,\n y: firstPinLocation.y + triangleHeight / 2,\n }, // Close the path at the tip\n ]\n }\n rectpads.push(\n rectpad(\n i + 1,\n xoff + i * params.p,\n getHeight(params) / 2 - params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1,\n xoff + i * params.p,\n getHeight(params) / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1,\n xoff + i * params.p,\n getHeight(params) / 2 - params.pl + outerDiameter / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n if (params.bottom) {\n const xoff = -((params.bottom - 1) / 2) * params.p\n for (let i = 0; i < params.bottom; i++) {\n if (i === 0 && !params.left) {\n firstPinLocation = {\n x: xoff + i * params.p,\n y: -getHeight(params) / 2 + params.pl * 1.4,\n }\n routes = [\n {\n x: firstPinLocation.x,\n y: firstPinLocation.y - triangleHeight / 2,\n }, // Tip of the triangle (pointing down)\n {\n x: firstPinLocation.x - triangleWidth / 2,\n y: firstPinLocation.y + triangleHeight / 2,\n }, // Left corner of the base\n {\n x: firstPinLocation.x + triangleWidth / 2,\n y: firstPinLocation.y + triangleHeight / 2,\n }, // Right corner of the base\n {\n x: firstPinLocation.x,\n y: firstPinLocation.y - triangleHeight / 2,\n }, // Close the path at the tip\n ]\n }\n rectpads.push(\n rectpad(\n i + 1,\n xoff + i * params.p,\n -getHeight(params) / 2 + params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1,\n xoff + i * params.p,\n -getHeight(params) / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1,\n xoff + i * params.p,\n -getHeight(params) / 2 + params.pl - outerDiameter / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n\n const silkscreenTriangle: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"pcb_silkscreen_triangle_1\",\n pcb_component_id: \"2\",\n route: routes,\n stroke_width: 0.1,\n layer: \"top\",\n }\n\n const silkscreenPath: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"pcb_silkscreen_path_1\",\n pcb_component_id: \"1\",\n route: [\n { x: -params.w / 2, y: getHeight(params) / 2 },\n { x: params.w / 2, y: getHeight(params) / 2 },\n { x: params.w / 2, y: -getHeight(params) / 2 },\n { x: -params.w / 2, y: -getHeight(params) / 2 },\n { x: -params.w / 2, y: getHeight(params) / 2 },\n ],\n stroke_width: 0.1,\n layer: \"top\",\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n getHeight(params) / 2 + 0.5,\n getHeight(params) / 25,\n )\n return {\n circuitJson: [\n ...rectpads,\n ...holes,\n silkscreenPath,\n silkscreenTriangle,\n silkscreenRefText,\n ],\n parameters: params,\n }\n}\n","export function isNotNull<T>(value: T | null): value is T {\n return value !== null\n}\n","import * as FOOTPRINT_FN from \"./fn\"\nimport type { AnySoupElement } from \"@tscircuit/soup\"\nimport type { AnyCircuitElement } from \"circuit-json\"\nimport type { AnyFootprinterDefinitionOutput } from \"./helpers/zod/AnyFootprinterDefinitionOutput\"\nimport { isNotNull } from \"./helpers/is-not-null\"\n\nexport type FootprinterParamsBuilder<K extends string> = {\n [P in K | \"params\" | \"soup\"]: P extends \"params\" | \"soup\"\n ? Footprinter[P]\n : (v?: number | string) => FootprinterParamsBuilder<K>\n}\n\ntype CommonPassiveOptionKey =\n | \"metric\"\n | \"imperial\"\n | \"tht\"\n | \"p\"\n | \"pw\"\n | \"ph\"\n | \"w\"\n | \"h\"\n\nexport type Footprinter = {\n dip: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\" | \"wide\" | \"narrow\">\n cap: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n res: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n diode: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n led: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n lr: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"l\" | \"pl\" | \"pr\">\n qfp: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\" | \"wide\" | \"narrow\">\n quad: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\n \"w\" | \"l\" | \"square\" | \"pl\" | \"pr\" | \"pb\" | \"pt\" | \"p\" | \"pw\" | \"ph\"\n >\n bga: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\n \"grid\" | \"p\" | \"w\" | \"h\" | \"ball\" | \"pad\" | \"missing\"\n >\n qfn: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\">\n soic: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\">\n mlp: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\">\n ssop: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n tssop: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n dfn: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n pinrow: (num_pins: number) => FootprinterParamsBuilder<\"p\" | \"id\" | \"od\">\n axial: () => FootprinterParamsBuilder<\"p\" | \"id\" | \"od\">\n pushbutton: () => FootprinterParamsBuilder<\n \"tllabel\" | \"trlabel\" | \"bllabel\" | \"brlabel\"\n >\n stampboard: () => FootprinterParamsBuilder<\n \"w\" | \"left\" | \"right\" | \"top\" | \"bottom\" | \"p\" | \"pw\" | \"pl\" | \"innerhole\"\n >\n params: () => any\n /** @deprecated use circuitJson() instead */\n soup: () => AnySoupElement[]\n circuitJson: () => AnyCircuitElement[]\n json: () => AnyFootprinterDefinitionOutput[]\n}\n\nexport const string = (def: string): Footprinter => {\n let fp = footprinter()\n\n // special case: 0402, 0603, etc.\n if ((def.length === 4 || def.length === 5) && /^\\d+$/.test(def))\n def = `res${def}`\n\n const def_parts = def\n .split(\"_\")\n .map((s) => {\n const m = s.match(/([a-z]+)([\\(\\d\\.\\+\\?].*)?/)\n const [_, fn, v] = m ?? []\n if (v?.includes(\"?\")) return null\n return { fn: m?.[1]!, v: m?.[2]! }\n })\n .filter(isNotNull)\n\n for (const { fn, v } of def_parts) {\n fp = fp[fn](v)\n }\n\n fp.setString(def)\n\n return fp\n}\n\nexport const footprinter = (): Footprinter & {\n string: typeof string\n setString: (string) => void\n} => {\n const proxy = new Proxy(\n {},\n {\n get: (target: any, prop: string) => {\n // console.log(prop, target)\n if (prop === \"soup\" || prop === \"circuitJson\") {\n if (\"fn\" in target && FOOTPRINT_FN[target.fn]) {\n return () => FOOTPRINT_FN[target.fn](target).circuitJson\n }\n\n if (!FOOTPRINT_FN[target.fn]) {\n throw new Error(\n `Invalid footprint function, got \"${target.fn}\"${\n target.string ? `, from string \"${target.string}\"` : \"\"\n }`,\n )\n }\n\n return () => {\n // TODO improve error\n throw new Error(\n `No function found for footprinter, make sure to specify .dip, .lr, .p, etc. Got \"${prop}\"`,\n )\n }\n }\n if (prop === \"json\") {\n if (!FOOTPRINT_FN[target.fn]) {\n throw new Error(\n `Invalid footprint function, got \"${target.fn}\"${\n target.string ? `, from string \"${target.string}\"` : \"\"\n }`,\n )\n }\n return () => FOOTPRINT_FN[target.fn](target).parameters\n }\n if (prop === \"params\") {\n // TODO\n return () => target\n }\n if (prop === \"setString\") {\n return (v: string) => {\n target.string = v\n return proxy\n }\n }\n return (v: any) => {\n if (Object.keys(target).length === 0) {\n if (`${prop}${v}` in FOOTPRINT_FN) {\n target[`${prop}${v}`] = true\n target.fn = `${prop}${v}`\n } else {\n target[prop] = true\n target.fn = prop\n if (prop === \"res\" || prop === \"cap\") {\n if (v) {\n target.imperial = v // res0402, cap0603 etc.\n }\n } else {\n target.num_pins = Number.parseFloat(v)\n }\n }\n } else {\n // handle dip_w or other invalid booleans\n if (!v && [\"w\", \"h\", \"p\"].includes(prop as string)) {\n // ignore\n } else {\n target[prop] = v ?? true\n }\n }\n return proxy\n }\n },\n },\n )\n return proxy as any\n}\nfootprinter.string = string\n\nexport const fp = footprinter\n"],"mappings":"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","names":["mm","z","length","z","length","mm","z","length","distance","z","z","z","distance","length","z","length","z","length","z","length","z","z","length","z","z","z","length","z","length","z","z","z","z","length","z","z","length","z","z","length","z","z","length","fp"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tscircuit/footprinter",
3
3
  "type": "module",
4
- "version": "0.0.78",
4
+ "version": "0.0.79",
5
5
  "description": "",
6
6
  "main": "dist/index.js",
7
7
  "files": [