@tscircuit/footprinter 0.0.285 → 0.0.287
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 +120 -76
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/fn/index.ts","../src/helpers/silkscreenRef.ts","../src/helpers/zod/base_def.ts","../src/fn/dip.ts","../src/helpers/platedhole.ts","../src/helpers/platedHoleWithRectPad.ts","../src/helpers/u-curve.ts","../src/helpers/rectpad.ts","../src/helpers/passive-fn.ts","../src/fn/diode.ts","../src/fn/cap.ts","../src/fn/led.ts","../src/helpers/chipArray.ts","../src/helpers/res0402-array2.ts","../src/helpers/res0402-array4.ts","../src/helpers/res0603-array2.ts","../src/helpers/res0603-array4.ts","../src/fn/res.ts","../src/helpers/circlepad.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/helpers/pillpad.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/tqfp.ts","../src/fn/qfp.ts","../src/fn/mlp.ts","../src/fn/ssop.ts","../src/fn/tssop.ts","../src/fn/sot363.ts","../src/fn/sot886.ts","../src/fn/sot23.ts","../src/fn/sot25.ts","../src/fn/dfn.ts","../src/helpers/corner.ts","../src/fn/pinrow.ts","../src/helpers/silkscreenPin.ts","../src/helpers/determine-pin-label-anchor-side.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/radial.ts","../src/helpers/generateCircleArcs.ts","../src/fn/pushbutton.ts","../src/helpers/silkscreenpath.ts","../src/fn/stampboard.ts","../src/fn/stampreceiver.ts","../src/fn/lqfp.ts","../src/fn/breakoutheaders.ts","../src/fn/hc49.ts","../src/fn/pad.ts","../src/fn/to92.ts","../src/helpers/platedHolePill.ts","../src/fn/sod523.ts","../src/fn/sop8.ts","../src/fn/sod80.ts","../src/fn/sod123w.ts","../src/fn/sod323.ts","../src/fn/sod923.ts","../src/fn/sod882.ts","../src/fn/sod323f.ts","../src/fn/sod123f.ts","../src/fn/sod123fl.ts","../src/fn/sod723.ts","../src/fn/sod128.ts","../src/fn/sot89.ts","../src/fn/to220.ts","../src/fn/minimelf.ts","../src/fn/sod882d.ts","../src/fn/melf.ts","../src/fn/micromelf.ts","../src/fn/sma.ts","../src/fn/smf.ts","../src/fn/smb.ts","../src/fn/smc.ts","../src/fn/sot223.ts","../src/fn/sot23w.ts","../src/fn/to92s.ts","../src/fn/jst.ts","../src/fn/sod110.ts","../src/fn/vssop.ts","../src/fn/msop.ts","../src/fn/sod323w.ts","../src/fn/sod323fl.ts","../src/fn/son.ts","../src/fn/solderjumper.ts","../src/fn/sot457.ts","../src/fn/sot963.ts","../src/fn/potentiometer.ts","../src/fn/electrolytic.ts","../src/fn/smbf.ts","../src/fn/sot323.ts","../src/fn/smtpad.ts","../src/fn/platedhole.ts","../src/fn/sot.ts","../src/fn/sot343.ts","../src/fn/m2host.ts","../src/fn/to92l.ts","../src/helpers/is-not-null.ts","../src/helpers/apply-origin.ts","../src/helpers/apply-norefdes.ts","../src/helpers/apply-nosilkscreen.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 { tqfp } from \"./tqfp\"\nexport { qfp } from \"./qfp\"\nexport { mlp } from \"./mlp\"\nexport { ssop } from \"./ssop\"\nexport { tssop } from \"./tssop\"\nexport { sot363 } from \"./sot363\"\nexport { sot886 } from \"./sot886\"\nexport { sot23 } from \"./sot23\"\nexport { sot25 } from \"./sot25\"\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 { radial } from \"./radial\"\nexport { pushbutton } from \"./pushbutton\"\nexport { stampboard } from \"./stampboard\"\nexport { stampreceiver } from \"./stampreceiver\"\nexport { lqfp } from \"./lqfp\"\nexport { breakoutheaders } from \"./breakoutheaders\"\nexport { hc49 } from \"./hc49\"\nexport { pad } from \"./pad\"\nexport { to92 } from \"./to92\"\nexport { sod523 } from \"./sod523\"\nexport { sop8 } from \"./sop8\"\nexport { sod80 } from \"./sod80\"\nexport { sod123w } from \"./sod123w\"\nexport { sod323 } from \"./sod323\"\nexport { sod923 } from \"./sod923\"\nexport { sod882 } from \"./sod882\"\nexport { sod323f } from \"./sod323f\"\nexport { sod123f } from \"./sod123f\"\nexport { sod123fl } from \"./sod123fl\"\nexport { sod723 } from \"./sod723\"\nexport { sod128 } from \"./sod128\"\nexport { sot89 } from \"./sot89\"\nexport { to220 } from \"./to220\"\nexport { minimelf } from \"./minimelf\"\nexport { sod882d } from \"./sod882d\"\nexport { melf } from \"./melf\"\nexport { micromelf } from \"./micromelf\"\nexport { sma } from \"./sma\"\nexport { smf } from \"./smf\"\nexport { smb } from \"./smb\"\nexport { smc } from \"./smc\"\nexport { sot223 } from \"./sot223\"\nexport { sot23w } from \"./sot23w\"\nexport { to92s } from \"./to92s\"\nexport { jst } from \"./jst\"\nexport { sod110 } from \"./sod110\"\nexport { vssop } from \"./vssop\"\nexport { msop } from \"./msop\"\nexport { sod323w } from \"./sod323w\"\nexport { sod323fl } from \"./sod323fl\"\nexport { son } from \"./son\"\nexport { solderjumper } from \"./solderjumper\"\nexport { sot457 } from \"./sot457\"\nexport { sot963 } from \"./sot963\"\nexport { potentiometer } from \"./potentiometer\"\nexport { electrolytic } from \"./electrolytic\"\nexport { smbf } from \"./smbf\"\nexport { sot323 } from \"./sot323\"\nexport { smtpad } from \"./smtpad\"\nexport { platedhole } from \"./platedhole\"\nexport { sot } from \"./sot\"\nexport { sot343 } from \"./sot343\"\nexport { m2host } from \"./m2host\"\nexport { to92l } from \"./to92l\"\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 { z } from \"zod\"\n\nexport const base_def = z.object({\n norefdes: z\n .boolean()\n .optional()\n .describe(\"disable reference designator label\"),\n invert: z\n .boolean()\n .optional()\n .describe(\"hint to invert the orientation of the 3D model\"),\n faceup: z\n .boolean()\n .optional()\n .describe(\"The male pin header should face upwards, out of the top layer\"),\n nosilkscreen: z\n .boolean()\n .optional()\n .describe(\"omit all silkscreen elements from the footprint\"),\n})\n","import type {\n AnyCircuitElement,\n PcbFabricationNoteText,\n PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nimport { z } from \"zod\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { platedHoleWithRectPad } from \"../helpers/platedHoleWithRectPad\"\n\nimport { u_curve } from \"../helpers/u-curve\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\n\nfunction convertMilToMm(value: string | number): number {\n if (typeof value === \"string\") {\n if (value.trim().toLowerCase().endsWith(\"mil\")) {\n return parseFloat(value) * 0.0254\n }\n return parseFloat(value)\n }\n return Number(value)\n}\n\nconst lengthInMm = z\n .union([z.string(), z.number()])\n .transform((val) => convertMilToMm(val))\n\nexport const extendDipDef = (newDefaults: { w?: string; p?: string }) =>\n base_def\n .extend({\n fn: z.string(),\n num_pins: z.number().optional().default(6),\n wide: z.boolean().optional(),\n narrow: z.boolean().optional(),\n w: lengthInMm.optional(),\n p: lengthInMm.default(newDefaults.p ?? \"2.54mm\"),\n id: lengthInMm.optional(),\n od: lengthInMm.optional(),\n nosquareplating: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"do not use rectangular pad for pin 1\"),\n })\n .transform((v) => {\n if (!v.id && !v.od) {\n if (Math.abs(v.p - 1.27) < 0.01) {\n v.id = convertMilToMm(\"0.55mm\")\n v.od = convertMilToMm(\"0.95mm\")\n } else {\n v.id = convertMilToMm(\"0.8mm\")\n v.od = convertMilToMm(\"1.6mm\")\n }\n } else if (!v.id) {\n v.id = v.od! * (1.0 / 1.5)\n } else if (!v.od) {\n v.od = v.id! * (1.5 / 1.0)\n }\n\n if (!v.w) {\n if (v.wide) {\n v.w = convertMilToMm(\"600mil\")\n } else if (v.narrow) {\n v.w = convertMilToMm(\"300mil\")\n } else {\n v.w = convertMilToMm(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 nosquareplating: boolean,\n) => {\n const ph = pinCount / 2\n const isLeft = pn <= ph\n const leftPinGaps = ph - 1\n const gs = p\n const h = gs * leftPinGaps\n\n if (isLeft) {\n return { x: -w / 2, y: h / 2 - (pn - 1) * gs }\n }\n return { x: w / 2, y: -h / 2 + (pn - ph - 1) * gs }\n}\n\n/**\n * DIP footprint with silk line **outside** the holes and pads.\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\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 parameters.nosquareplating,\n )\n if (i === 0 && !parameters.nosquareplating) {\n platedHoles.push(\n platedHoleWithRectPad(\n i + 1,\n x,\n y,\n parameters.id ?? \"0.8mm\",\n parameters.od ?? \"1mm\",\n parameters.od ?? \"1mm\",\n ),\n )\n continue\n }\n platedHoles.push(\n platedhole(i + 1, x, y, parameters.id ?? \"0.8mm\", parameters.od ?? \"1mm\"),\n )\n }\n\n const padEdgeHeight =\n (parameters.num_pins / 2 - 1) * parameters.p + parameters.od\n\n // Gap between rows (inner edge to inner edge)\n const innerGap = parameters.w - parameters.od\n // Silk width (small box between rows)\n const sw = innerGap - 1 // clearance\n\n // Silk height still spans the whole row length\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.od + 0.4\n\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 // U-notch curve outside the pads\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\n /** Pin labels placed just outside silk line */\n const silkscreenPins: PcbFabricationNoteText[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const isLeft = i < parameters.num_pins / 2\n // Place fabrication text outside the outer edge of the holes/pads\n // Hole centers are at ±w/2; outer pad edge is at ±(w/2 + od/2)\n // Add a small clearance margin to keep text away from holes\n const clearance = 0.6\n // Use CCW pin coordinates for correct top-left origin for pin1\n const { y: pinCenterY } = getCcwDipCoords(\n parameters.num_pins,\n i + 1,\n parameters.w,\n parameters.p ?? 2.54,\n parameters.nosquareplating,\n )\n const pinLabelX = isLeft\n ? -parameters.w / 2 - parameters.od / 2 - clearance\n : parameters.w / 2 + parameters.od / 2 + clearance\n // Align label vertically with the actual pin center to preserve CCW order\n const pinLabelY = pinCenterY\n silkscreenPins.push({\n type: \"pcb_fabrication_note_text\",\n pcb_fabrication_note_text_id: `pin_${i + 1}`,\n layer: \"top\",\n pcb_component_id: `pin_${i + 1}`,\n text: `{pin${i + 1}}`,\n anchor_position: { x: pinLabelX, y: pinLabelY },\n font_size: 0.3,\n font: \"tscircuit2024\",\n anchor_alignment: \"top_left\",\n })\n }\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 { 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 pcb_plated_hole_id: \"\",\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 { mm } from \"@tscircuit/mm\"\nimport type { PcbHoleCircularWithRectPad } from \"circuit-json\"\n\nexport const platedHoleWithRectPad = (\n pn: number,\n x: number,\n y: number,\n holeDiameter: number | string,\n rectPadWidth: number | string,\n rectPadHeight: number | string,\n holeOffsetX: number,\n holeOffsetY: number,\n): PcbHoleCircularWithRectPad => {\n return {\n pcb_plated_hole_id: \"\",\n type: \"pcb_plated_hole\",\n shape: \"circular_hole_with_rect_pad\",\n x,\n y,\n hole_diameter: mm(holeDiameter),\n hole_shape: \"circle\",\n pad_shape: \"rect\",\n rect_pad_width: mm(rectPadWidth),\n rect_pad_height: mm(rectPadHeight),\n pcb_port_id: \"\",\n layers: [\"top\", \"bottom\"],\n port_hints: [pn.toString()],\n hole_offset_x: holeOffsetX,\n hole_offset_y: holeOffsetY,\n }\n}\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 { PCBSMTPad } from \"circuit-json\"\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 { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\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\"\nimport { base_def } from \"./zod/base_def\"\n\ntype StandardSize = {\n imperial: string\n metric: string\n p_mm_min: number // pad-to-pad spacing\n ph_mm_min: number // pad height\n pw_mm_min: number // pad width\n h_mm_min: number // body height\n w_mm_min: number // body width\n}\n\n// Updated footprint sizes\nexport const footprintSizes: StandardSize[] = [\n {\n imperial: \"01005\",\n metric: \"0402\",\n p_mm_min: 0.5,\n pw_mm_min: 0.4,\n ph_mm_min: 0.3,\n w_mm_min: 0.58,\n h_mm_min: 0.21,\n },\n {\n imperial: \"0504\",\n metric: \"1310\",\n p_mm_min: 1.1,\n pw_mm_min: 0.65,\n ph_mm_min: 1.3,\n w_mm_min: 0.58,\n h_mm_min: 0.21,\n },\n {\n imperial: \"1812\",\n metric: \"4532\",\n p_mm_min: 4.275,\n pw_mm_min: 1.125,\n ph_mm_min: 3.4,\n w_mm_min: 5.4,\n h_mm_min: 3.4,\n },\n {\n imperial: \"0201\",\n metric: \"0603\",\n p_mm_min: 0.66,\n pw_mm_min: 0.46,\n ph_mm_min: 0.4,\n w_mm_min: 0.9,\n h_mm_min: 0.3,\n },\n {\n imperial: \"0402\",\n metric: \"1005\",\n p_mm_min: 1.02,\n pw_mm_min: 0.54,\n ph_mm_min: 0.64,\n w_mm_min: 1.56,\n h_mm_min: 0.64,\n },\n {\n imperial: \"0603\",\n metric: \"1608\",\n p_mm_min: 1.65,\n pw_mm_min: 0.8,\n ph_mm_min: 0.95,\n w_mm_min: 2.45,\n h_mm_min: 0.95,\n },\n {\n imperial: \"0805\",\n metric: \"2012\",\n p_mm_min: 1.825,\n pw_mm_min: 1.025,\n ph_mm_min: 1.4,\n w_mm_min: 2.8499999999999996,\n h_mm_min: 1.4,\n },\n {\n imperial: \"1206\",\n metric: \"3216\",\n p_mm_min: 2.925,\n pw_mm_min: 1.125,\n ph_mm_min: 1.75,\n w_mm_min: 4.05,\n h_mm_min: 1.75,\n },\n {\n imperial: \"1210\",\n metric: \"3225\",\n p_mm_min: 2.925,\n pw_mm_min: 1.125,\n ph_mm_min: 2.65,\n w_mm_min: 4.05,\n h_mm_min: 2.65,\n },\n {\n imperial: \"2010\",\n metric: \"5025\",\n p_mm_min: 4.625,\n pw_mm_min: 1.225,\n ph_mm_min: 2.65,\n w_mm_min: 5.85,\n h_mm_min: 2.65,\n },\n {\n imperial: \"2512\",\n metric: \"6332\",\n p_mm_min: 5.925,\n pw_mm_min: 1.225,\n ph_mm_min: 3.35,\n w_mm_min: 7.15,\n h_mm_min: 3.35,\n },\n]\n\nconst metricMap = Object.fromEntries(footprintSizes.map((s) => [s.metric, s]))\nconst imperialMap = Object.fromEntries(\n footprintSizes.map((s) => [s.imperial, s]),\n)\n\nexport const passive_def = base_def.extend({\n tht: z.boolean(),\n p: length.optional(),\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 textbottom: z.boolean().optional(),\n})\n\nexport type PassiveDef = z.input<typeof passive_def>\n\nexport const passive = (params: PassiveDef): AnyCircuitElement[] => {\n let { tht, p, pw, ph, metric, imperial, w, h, textbottom } = 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 !== undefined && w !== undefined && h > w) {\n throw new Error(\n \"height cannot be greater than width (rotated footprint not yet implemented)\",\n )\n }\n\n let sz: StandardSize | undefined\n if (metric) sz = metricMap[metric]\n if (imperial) sz = imperialMap[imperial]\n\n if (sz) {\n w = sz.w_mm_min\n h = sz.h_mm_min\n p = sz.p_mm_min\n pw = sz.pw_mm_min\n ph = sz.ph_mm_min\n }\n\n if (p === undefined || pw === undefined || ph === undefined) {\n throw new Error(\"Could not determine required pad dimensions (p, pw, ph)\")\n }\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: p / 2, y: ph / 2 + 0.4 },\n { x: -p / 2 - pw / 2 - 0.2, y: ph / 2 + 0.4 },\n { x: -p / 2 - pw / 2 - 0.2, y: -ph / 2 - 0.4 },\n { x: p / 2, y: -ph / 2 - 0.4 },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n const textY = textbottom ? -ph / 2 - 0.9 : ph / 2 + 0.9\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, textY, 0.2)\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 silkscreenLine,\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 silkscreenLine,\n silkscreenRefText,\n ]\n }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { passive, type PassiveDef } from \"src/helpers/passive-fn\"\n\nexport const diode = (parameters: {\n tht: boolean\n p: number\n}): { circuitJson: AnySoupElement[]; parameters: PassiveDef } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { type PassiveDef, passive } from \"../helpers/passive-fn\"\n\nexport const cap = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: PassiveDef } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { type PassiveDef, passive } from \"../helpers/passive-fn\"\n\nexport const led = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: PassiveDef } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { rectpad } from \"./rectpad\"\nimport { type SilkscreenRef, silkscreenRef } from \"./silkscreenRef\"\n\nexport interface ChipArrayParams {\n padSpacing: number // Horizontal spacing between left and right columns\n padWidth: number\n padHeight: number\n padPitch: number // Vertical spacing between pads\n numRows: number // Number of rows (2 for 0402_x2, 4 for 0402_x4)\n textbottom?: boolean\n}\n\n/**\n * Common function for generating chip array footprints (e.g., resistor arrays).\n * Creates pads in a 2-column layout with pin numbering going down the left column\n * then up the right column.\n *\n * @param params Configuration parameters for the array\n * @returns Array of circuit elements (pads, silkscreen, pin1 marker, ref text)\n */\nexport const chipArray = (params: ChipArrayParams): AnyCircuitElement[] => {\n const { padSpacing, padWidth, padHeight, padPitch, numRows, textbottom } =\n params\n\n // Calculate Y positions for pads (centered around origin)\n const yPositions: number[] = []\n const halfRange = (numRows - 1) * (padPitch / 2)\n for (let i = 0; i < numRows; i++) {\n yPositions.push(halfRange - i * padPitch)\n }\n\n const pads: AnyCircuitElement[] = []\n\n // Left column: pins 1 to numRows\n yPositions.forEach((y, index) => {\n pads.push(rectpad(index + 1, -padSpacing / 2, y, padWidth, padHeight))\n })\n\n // Right column: pins numRows+1 to 2*numRows (reverse order)\n yPositions\n .slice()\n .reverse()\n .forEach((y, index) => {\n pads.push(\n rectpad(index + numRows + 1, padSpacing / 2, y, padWidth, padHeight),\n )\n })\n\n // Calculate silkscreen boundaries - match KiCad style (two horizontal lines)\n const top = Math.max(...yPositions) + padHeight / 2 + 0.4\n const bottom = Math.min(...yPositions) - padHeight / 2 - 0.4\n const left = -padSpacing / 2 - padWidth / 2 - 0.4\n const right = padSpacing / 2 + padWidth / 2 + 0.4\n\n // Silkscreen: two horizontal lines (matching KiCad style)\n const silkscreenTop: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: right * 0.5, y: top },\n { x: left * 0.5, y: top },\n ],\n stroke_width: 0.12,\n pcb_silkscreen_path_id: \"silkscreen_top\",\n }\n\n const silkscreenBottom: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: right * 0.5, y: bottom },\n { x: left * 0.5, y: bottom },\n ],\n stroke_width: 0.12,\n pcb_silkscreen_path_id: \"silkscreen_bottom\",\n }\n\n // Pin 1 marker: corner indicator at top-left (where pin1 pad is located)\n // Match KiCad style - small L-shaped corner marker\n const pin1X = -padSpacing / 2\n const pin1Y = Math.max(...yPositions)\n const pin1MarkerSize = 0.2\n const pin1Left = pin1X - padWidth / 2 - 0.1\n const pin1Top = pin1Y + padHeight / 2 + 0.1\n const pin1Marker: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"pin1_marker\",\n route: [\n { x: pin1Left, y: pin1Top },\n { x: pin1Left - pin1MarkerSize, y: pin1Top },\n { x: pin1Left, y: pin1Top + pin1MarkerSize },\n { x: pin1Left, y: pin1Top },\n ],\n stroke_width: 0.1,\n }\n\n // Reference text\n const textY = textbottom ? bottom - 0.9 : top + 0.9\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, textY, 0.2)\n\n return [\n ...pads,\n silkscreenTop,\n silkscreenBottom,\n pin1Marker,\n silkscreenRefText,\n ]\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { chipArray } from \"./chipArray\"\n\nconst padSpacing = 1.0 // Horizontal spacing between columns (KiCad: 1.0mm)\nconst padWidth = 0.5 // Pad width (KiCad: 0.5mm)\nconst padHeight = 0.4 // Pad height (KiCad: 0.4mm)\nconst padPitch = 0.7 // Vertical pitch between pads (KiCad: 0.7mm)\n\nexport const res0402Array2 = (params: {\n textbottom?: boolean\n}): AnyCircuitElement[] => {\n return chipArray({\n padSpacing,\n padWidth,\n padHeight,\n padPitch,\n numRows: 2,\n textbottom: params.textbottom,\n })\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { chipArray } from \"./chipArray\"\n\nconst padSpacing = 1.0 // Horizontal spacing between columns (KiCad: 1.0mm)\nconst padWidth = 0.5 // Pad width (KiCad: 0.5mm)\nconst padHeight = 0.32 // Pad height (KiCad: 0.32mm)\nconst padPitch = 0.5 // Vertical pitch between pads (KiCad: 0.5mm)\n\nexport const res0402Array4 = (params: {\n textbottom?: boolean\n}): AnyCircuitElement[] => {\n return chipArray({\n padSpacing,\n padWidth,\n padHeight,\n padPitch,\n numRows: 4,\n textbottom: params.textbottom,\n })\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { chipArray } from \"./chipArray\"\n\nconst padSpacing = 1.7 // Horizontal spacing between columns (KiCad: 1.7mm)\nconst padWidth = 0.9 // Pad width (KiCad: 0.9mm)\nconst padHeight = 0.4 // Pad height (KiCad: 0.4mm)\nconst padPitch = 0.8 // Vertical pitch between pads (KiCad: 0.8mm)\n\nexport const res0603Array2 = (params: {\n textbottom?: boolean\n}): AnyCircuitElement[] => {\n return chipArray({\n padSpacing,\n padWidth,\n padHeight,\n padPitch,\n numRows: 2,\n textbottom: params.textbottom,\n })\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { chipArray } from \"./chipArray\"\n\nconst padSpacing = 1.7 // Horizontal spacing between columns (KiCad: 1.7mm)\nconst padWidth = 0.9 // Pad width (KiCad: 0.9mm)\nconst padHeight = 0.4 // Pad height (KiCad: 0.4mm)\nconst padPitch = 0.8 // Vertical pitch between pads (KiCad: 0.8mm)\n\nexport const res0603Array4 = (params: {\n textbottom?: boolean\n}): AnyCircuitElement[] => {\n return chipArray({\n padSpacing,\n padWidth,\n padHeight,\n padPitch,\n numRows: 4,\n textbottom: params.textbottom,\n })\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { passive, type PassiveDef } from \"../helpers/passive-fn\"\nimport { res0402Array2 } from \"../helpers/res0402-array2\"\nimport { res0402Array4 } from \"../helpers/res0402-array4\"\nimport { res0603Array2 } from \"../helpers/res0603-array2\"\nimport { res0603Array4 } from \"../helpers/res0603-array4\"\n\ntype ResArrayParams = PassiveDef & {\n array?: number | string\n x?: number | string\n}\n\nconst getArrayCount = (parameters: ResArrayParams): number | undefined => {\n const arrayValue = parameters.array ?? parameters.x\n if (typeof arrayValue === \"number\") {\n return Number.isNaN(arrayValue) ? undefined : arrayValue\n }\n if (typeof arrayValue === \"string\") {\n const parsed = Number.parseInt(arrayValue, 10)\n return Number.isNaN(parsed) ? undefined : parsed\n }\n\n if (typeof parameters.imperial === \"string\") {\n const match = parameters.imperial.match(/(?:array|x)(2|4)$/)\n const count = match?.[1]\n if (count) {\n return Number.parseInt(count, 10)\n }\n }\n\n return undefined\n}\n\nconst getImperialBase = (imperial?: string | number): string | undefined => {\n if (!imperial) return undefined\n const imperialString = typeof imperial === \"number\" ? `${imperial}` : imperial\n return imperialString.split(\"_\")[0]\n}\n\nexport const res = (\n rawParameters: ResArrayParams,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const arrayCount = getArrayCount(rawParameters)\n const imperialBase = getImperialBase(rawParameters.imperial)\n\n if (arrayCount === 2 && imperialBase === \"0402\") {\n return {\n circuitJson: res0402Array2(rawParameters),\n parameters: rawParameters,\n }\n }\n\n if (arrayCount === 4 && imperialBase === \"0402\") {\n return {\n circuitJson: res0402Array4(rawParameters),\n parameters: rawParameters,\n }\n }\n\n if (arrayCount === 2 && imperialBase === \"0603\") {\n return {\n circuitJson: res0603Array2(rawParameters),\n parameters: rawParameters,\n }\n }\n\n if (arrayCount === 4 && imperialBase === \"0603\") {\n return {\n circuitJson: res0603Array4(rawParameters),\n parameters: rawParameters,\n }\n }\n\n return { circuitJson: passive(rawParameters), parameters: rawParameters }\n}\n","import type { PcbSmtPad } from \"circuit-json\"\n\nexport const circlepad = (\n pn: number | Array<string | number>,\n { x, y, radius }: { x: number; y: number; radius: number },\n): PcbSmtPad => {\n return {\n type: \"pcb_smtpad\",\n x,\n y,\n radius,\n layer: \"top\",\n shape: \"circle\",\n pcb_smtpad_id: \"\",\n port_hints: Array.isArray(pn)\n ? pn.map((item) => item.toString())\n : [pn.toString()],\n }\n}\n","export const ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n","import type { AnySoupElement, PCBSMTPad } from \"circuit-json\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { circlepad } from \"../helpers/circlepad\"\nimport { ALPHABET } from \"../helpers/zod/ALPHABET\"\nimport { z } from \"zod\"\nimport { base_def } from \"../helpers/zod/base_def\"\nimport { length, distance } from \"circuit-json\"\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\"\nimport { type PcbSilkscreenPath } from \"circuit-json\"\n\nexport const bga_def = base_def\n .extend({\n fn: z.string(),\n num_pins: z.number().optional().default(64),\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 circularpads: z.boolean().optional().describe(\"use circular pads\"),\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 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 // Calculate physical pad position (always centered around origin)\n const pad_x = (x - (grid.x - 1) / 2) * p\n const pad_y = (y - (grid.y - 1) / 2) * p\n\n // Calculate pin number based on origin\n let pin_x = x\n let pin_y = y\n switch (parameters.origin) {\n case \"bl\":\n pin_x = x\n pin_y = grid.y - 1 - y\n break\n case \"br\":\n pin_x = grid.x - 1 - x\n pin_y = grid.y - 1 - y\n break\n case \"tr\":\n pin_x = grid.x - 1 - x\n pin_y = y\n break\n case \"tl\":\n default:\n // Keep original x,y for pin numbering\n break\n }\n\n let pin_num = pin_y * grid.x + pin_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 // TODO handle >26 rows\n const portHints = [pin_num, `${ALPHABET[pin_y]}${pin_x + 1}`]\n pads.push(\n parameters.circularpads\n ? circlepad(portHints, {\n x: pad_x,\n y: pad_y,\n radius: pad / 2,\n })\n : rectpad(portHints, 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 // Add pin 1 marker\n const pin1MarkerSize = p / 6 // Make marker smaller, more proportional\n\n // Calculate marker position and route based on origin\n let markerRoute: Array<{ x: number; y: number }>\n const edgeX = (grid.x * p) / 2\n const edgeY = (grid.y * p) / 2\n\n switch (parameters.origin) {\n case \"bl\":\n markerRoute = [\n { x: -edgeX, y: -edgeY }, // Start at corner\n { x: -edgeX, y: -edgeY - pin1MarkerSize }, // Up\n { x: -edgeX - pin1MarkerSize, y: -edgeY }, // Left\n { x: -edgeX, y: -edgeY }, // Back to start\n ]\n break\n case \"br\":\n markerRoute = [\n { x: edgeX, y: -edgeY }, // Start at corner\n { x: edgeX, y: -edgeY - pin1MarkerSize }, // Up\n { x: edgeX + pin1MarkerSize, y: -edgeY }, // Right\n { x: edgeX, y: -edgeY }, // Back to start\n ]\n break\n case \"tr\":\n markerRoute = [\n { x: edgeX, y: edgeY }, // Start at corner\n { x: edgeX, y: edgeY + pin1MarkerSize }, // Down\n { x: edgeX + pin1MarkerSize, y: edgeY }, // Right\n { x: edgeX, y: edgeY }, // Back to start\n ]\n break\n case \"tl\":\n default:\n markerRoute = [\n { x: -edgeX, y: edgeY }, // Start at corner\n { x: -edgeX, y: edgeY + pin1MarkerSize }, // Down\n { x: -edgeX - pin1MarkerSize, y: edgeY }, // Left\n { x: -edgeX, y: edgeY }, // Back to start\n ]\n break\n }\n\n const pin1Marker: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"pin1_marker\",\n route: markerRoute,\n stroke_width: 0.05,\n }\n\n return {\n circuitJson: [...pads, silkscreenRefText, pin1Marker 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 \"circuit-json\"\nimport { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { u_curve } from \"../helpers/u-curve\"\nimport { rectpad } from \"src/helpers/rectpad\"\nimport { pillpad } from \"src/helpers/pillpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const extendSoicDef = (newDefaults: {\n w?: string\n p?: string\n pw?: string\n pl?: string\n num_pins?: number\n legsoutside?: boolean\n pillpads?: boolean\n}) =>\n base_def\n .extend({\n fn: z.string(),\n num_pins: z.number().optional().default(8),\n w: length.default(length.parse(newDefaults.w ?? \"5.3mm\")),\n p: length.default(length.parse(newDefaults.p ?? \"1.27mm\")),\n pw: length.default(length.parse(newDefaults.pw ?? \"0.6mm\")),\n pl: length.default(length.parse(newDefaults.pl ?? \"1.0mm\")),\n legsoutside: z\n .boolean()\n .optional()\n .default(newDefaults.legsoutside ?? false),\n pillpads: z\n .boolean()\n .optional()\n .default(newDefaults.pillpads ?? false),\n silkscreen_stroke_width: z.number().optional().default(0.1),\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<\n typeof v,\n \"w\" | \"p\" | \"pw\" | \"pl\" | \"pillpads\" | \"silkscreen_stroke_width\"\n >\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 }\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 * 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: SoicInput } => {\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,\n pl: parameters.pl,\n legsoutside: parameters.legsoutside,\n })\n if (parameters.pillpads) {\n pads.push(pillpad(i + 1, x, y, parameters.pl, parameters.pw))\n } else {\n pads.push(rectpad(i + 1, x, y, parameters.pl, parameters.pw))\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: parameters.silkscreen_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 { PCBSMTPad } from \"circuit-json\"\n\nexport const pillpad = (\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 radius: h / 2,\n layer: \"top\",\n shape: \"pill\",\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, PcbSilkscreenPath } from \"circuit-json\"\nimport { optional, z } from \"zod\"\nimport { length } from \"circuit-json\"\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\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const base_quad_def = base_def.extend({\n fn: z.string(),\n cc: z.boolean().default(true).optional(),\n ccw: z.boolean().default(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().optional().default(64),\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().default(false),\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 + 0.1, y: ibh / 2 - pos * p, o: \"vert\" }\n case \"bottom\":\n return { x: -ibw / 2 + pos * p, y: -h / 2 - pcdfe + 0.1, o: \"horz\" }\n case \"right\":\n return { x: w / 2 + pcdfe - 0.1, y: -ibh / 2 + pos * p, o: \"vert\" }\n case \"top\":\n return { x: ibw / 2 - pos * p, y: h / 2 + pcdfe - 0.1, 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 \"circuit-json\"\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 if (!parameters.pl) {\n parameters.pl = 0.875\n }\n if (!parameters.pw) {\n parameters.pw = 0.25\n }\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 tqfp_def = quad_def\n\n// TQFP (Thin Quad Flat Package) with intelligent defaults\nexport const tqfp = (\n raw_params: z.input<typeof quad_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n raw_params.legsoutside = true\n\n // Apply pitch defaults based on pin count if not specified\n if (!raw_params.p) {\n switch (raw_params.num_pins) {\n case 32:\n raw_params.p = 0.8\n break\n case 44:\n case 48:\n raw_params.p = 0.5\n break\n case 64:\n case 80:\n case 100:\n raw_params.p = 0.5\n break\n case 144:\n raw_params.p = 0.5\n break\n }\n }\n\n // Apply pad length defaults if not specified\n // Based on KiCad footprint library standards\n if (!raw_params.pl) {\n switch (raw_params.num_pins) {\n case 32:\n case 44:\n case 48:\n case 64:\n case 80:\n case 100:\n raw_params.pl = 1.475\n break\n case 144:\n raw_params.pl = 1.6\n break\n }\n }\n\n // Apply pad width defaults if not specified\n // Based on KiCad footprint library standards\n if (!raw_params.pw) {\n switch (raw_params.num_pins) {\n case 32:\n raw_params.pw = 0.55\n break\n case 44:\n case 48:\n case 64:\n case 80:\n case 100:\n raw_params.pw = 0.3\n break\n case 144:\n raw_params.pw = 0.25\n break\n }\n }\n\n return quad(raw_params)\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 \"circuit-json\"\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 \"circuit-json\"\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 \"circuit-json\"\nimport { extendSoicDef, soicWithoutParsing, type SoicInput } from \"./soic\"\n\nexport const tssop_def = extendSoicDef({\n w: \"7.1mm\",\n p: \"0.65mm\",\n pl: \"1.35mm\",\n pw: \"0.40mm\",\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 \"circuit-json\"\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: 2.56,\n p: 0.65,\n pw: 0.4,\n pl: 0.65,\n legoutside: true,\n })\n\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sot886_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(6).default(6),\n w: z.string().default(\"1.01mm\"),\n h: z.string().default(\"1.45mm\"),\n p: z.string().default(\"0.5mm\"),\n pl: z.string().default(\"0.33mm\"),\n pw: z.string().default(\"0.27mm\"),\n string: z.string().optional(),\n})\n\nexport const sot886 = (\n raw_params: z.input<typeof sot886_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = sot886_def.parse({ fn: \"sot886\", ...raw_params })\n\n const w = length.parse(parameters.w)\n const h = length.parse(parameters.h)\n const p = length.parse(parameters.p)\n const pl = length.parse(parameters.pl)\n const pw = length.parse(parameters.pw)\n\n const pads: AnyCircuitElement[] = []\n for (let i = 0; i < 6; i++) {\n const { x, y } = getSot886PadCoord(i + 1, w, p, pl)\n pads.push(rectpad(i + 1, x, y, pl, pw))\n }\n\n const silkscreenTopLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -w / 2, y: h / 2 },\n { x: w / 2, y: h / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenBottomLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -w / 2, y: -h / 2 },\n { x: w / 2, y: -h / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const pin1Position = getSot886PadCoord(1, w, p, pl)\n const pin1Marking: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"pin_marker_1\",\n route: [\n { x: pin1Position.x - pl / 2 - 0.3, y: pin1Position.y },\n { x: pin1Position.x - pl / 2 - 0.45, y: pin1Position.y + 0.15 },\n { x: pin1Position.x - pl / 2 - 0.45, y: pin1Position.y - 0.15 },\n { x: pin1Position.x - pl / 2 - 0.3, y: pin1Position.y },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"pin_marker_1\",\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, h / 2 + 0.4, 0.25)\n\n return {\n circuitJson: [\n ...pads,\n silkscreenTopLine,\n silkscreenBottomLine,\n silkscreenRefText,\n pin1Marking,\n ],\n parameters,\n }\n}\n\nexport const getSot886PadCoord = (\n pn: number,\n w: number,\n p: number,\n pl: number,\n) => {\n const padCenterOffset = w / 2 - pl / 2\n if (pn <= 3) {\n return { x: -padCenterOffset, y: p - (pn - 1) * p }\n }\n return { x: padCenterOffset, y: -p + (pn - 4) * p }\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sot23_def = base_def.extend({\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(\"1.32mm\"),\n pw: z.string().default(\"0.6mm\"),\n p: z.string().default(\"0.95mm\"),\n string: z.string().optional(),\n})\n\nexport const sot23_6_or_8_def = extendSoicDef({\n p: \"0.95mm\",\n w: \"1.6mm\",\n legsoutside: true,\n})\n\nexport const sot23 = (\n raw_params: z.input<typeof sot23_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const match = raw_params.string?.match(/^sot23_(\\d+)/)\n const numPins = match ? Number.parseInt(match[1]!, 10) : 3\n\n if (numPins === 6 || numPins === 8) {\n const parameters = sot23_6_or_8_def.parse({\n ...raw_params,\n num_pins: numPins,\n })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters: parameters,\n }\n }\n\n const parameters = sot23_def.parse({\n ...raw_params,\n num_pins: numPins,\n })\n\n if (parameters.num_pins === 3) {\n return {\n circuitJson: sot23_3(parameters),\n parameters: parameters,\n }\n }\n if (parameters.num_pins === 5) {\n return {\n circuitJson: sot23_5(parameters),\n parameters: parameters,\n }\n }\n throw new Error(\"Invalid number of pins\")\n}\nexport const getCcwSot23Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n p: number\n}) => {\n const { pn, w, h, pl, p } = parameters\n\n if (pn === 1) {\n return { x: -1.155, y: p }\n }\n if (pn === 2) {\n return { x: -1.155, y: -p }\n }\n\n return { x: 1.15, y: 0 }\n}\n\nexport const sot23_3 = (parameters: z.infer<typeof sot23_def>) => {\n const pads: AnyCircuitElement[] = []\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 p: Number.parseFloat(parameters.p),\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.parseInt(parameters.h),\n 0.3,\n )\n return [...pads, silkscreenRefText as AnyCircuitElement]\n}\n\nexport const getCcwSot235Coords = (parameters: {\n h: number\n p: number\n pn: number\n}) => {\n const { p, h, pn } = parameters\n if (pn === 1) {\n return { x: -h / 2 - 0.5, y: p }\n }\n if (pn === 2) {\n return { x: -h / 2 - 0.5, y: 0 }\n }\n if (pn === 3) {\n return { x: -h / 2 - 0.5, y: -p }\n }\n if (pn === 4) {\n return { x: h / 2 + 0.5, y: -p }\n }\n if (pn === 5) {\n return { x: h / 2 + 0.5, y: p }\n }\n throw new Error(\"Invalid pin number\")\n}\n\nexport const sot23_5 = (parameters: z.infer<typeof sot23_def>) => {\n const pads: AnyCircuitElement[] = []\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getCcwSot235Coords({\n h: Number.parseFloat(parameters.h),\n p: Number.parseFloat(parameters.p),\n pn: i,\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n\n const width =\n ((parameters.num_pins + 1) / 2) * Number.parseFloat(parameters.p)\n const height = Number.parseFloat(parameters.h)\n const silkscreenPath1: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -width / 3, y: height / 2 + Number.parseFloat(parameters.p) / 1.3 },\n { x: width / 3, y: height / 2 + Number.parseFloat(parameters.p) / 1.3 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.05,\n }\n const silkscreenPath2: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_2\",\n route: [\n { x: -width / 3, y: -height / 2 - Number.parseFloat(parameters.p) / 1.3 },\n { x: width / 3, y: -height / 2 - Number.parseFloat(parameters.p) / 1.3 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.05,\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, height + 0.3, 0.3)\n const pin1Position = getCcwSot235Coords({\n h: Number.parseFloat(parameters.h),\n p: Number.parseFloat(parameters.p),\n pn: 1,\n })\n pin1Position.x = pin1Position.x - Number.parseFloat(parameters.pw) * 1.5\n const triangleHeight = 0.3 // Adjust triangle size as needed\n const triangleWidth = 0.4 // Adjust triangle width as needed\n const pin1Indicator: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"pin1_indicator\",\n route: [\n {\n x: pin1Position.x + triangleHeight / 2,\n y: pin1Position.y,\n }, // Tip of the triangle (pointing right)\n {\n x: pin1Position.x - triangleHeight / 2,\n y: pin1Position.y + triangleWidth / 2,\n }, // Bottom corner of the base\n {\n x: pin1Position.x - triangleHeight / 2,\n y: pin1Position.y - triangleWidth / 2,\n }, // Top corner of the base\n {\n x: pin1Position.x + triangleHeight / 2,\n y: pin1Position.y,\n }, // Close the path at the tip\n ],\n stroke_width: 0.05,\n }\n\n return [\n ...pads,\n silkscreenRefText,\n silkscreenPath1,\n silkscreenPath2,\n pin1Indicator as AnyCircuitElement,\n ]\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { sot23_def, sot23_5 } from \"./sot23\"\n\nexport const sot25_def = sot23_def.extend({})\n\nexport const sot25 = (\n raw_params: z.input<typeof sot25_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = sot25_def.parse({\n ...raw_params,\n num_pins: 5,\n })\n return {\n circuitJson: sot23_5(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\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, rotation, type AnySoupElement } from \"circuit-json\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { platedHoleWithRectPad } from \"../helpers/platedHoleWithRectPad\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { silkscreenPin } from \"src/helpers/silkscreenPin\"\nimport { mm } from \"@tscircuit/mm\"\nimport { determinePinlabelAnchorSide } from \"src/helpers/determine-pin-label-anchor-side\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const pinrow_def = base_def\n .extend({\n fn: z.string(),\n num_pins: z.number().optional().default(6),\n rows: z\n .union([z.string(), z.number()])\n .transform((val) => Number(val))\n .optional()\n .default(1)\n .describe(\"number of rows\"),\n p: length.default(\"0.1in\").describe(\"pitch\"),\n id: length.default(\"1.0mm\").describe(\"inner diameter\"),\n od: length.default(\"1.5mm\").describe(\"outer diameter\"),\n male: z.boolean().optional().describe(\"for male pin headers\"),\n female: z.boolean().optional().describe(\"for female pin headers\"),\n smd: z.boolean().optional().describe(\"surface mount device\"),\n surfacemount: z\n .boolean()\n .optional()\n .describe(\"surface mount device (verbose)\"),\n rightangle: z.boolean().optional().describe(\"right angle\"),\n pw: length.optional().default(\"1.0mm\").describe(\"pad width for SMD\"),\n pl: length.optional().default(\"2.0mm\").describe(\"pad length for SMD\"),\n pinlabeltextalignleft: z.boolean().optional().default(false),\n pinlabeltextaligncenter: z.boolean().optional().default(false),\n pinlabeltextalignright: z.boolean().optional().default(false),\n pinlabelverticallyinverted: z.boolean().optional().default(false),\n pinlabelorthogonal: z.boolean().optional().default(false),\n nosquareplating: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"do not use rectangular pad for pin 1\"),\n nopinlabels: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"omit silkscreen pin labels\"),\n doublesidedpinlabel: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"add silkscreen pins in top and bottom layers\"),\n bottomsidepinlabel: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n \"place the silkscreen reference text on the bottom layer instead of top\",\n ),\n })\n .transform((data) => {\n const pinlabelAnchorSide = determinePinlabelAnchorSide(data)\n return {\n ...data,\n pinlabelAnchorSide,\n male: data.male ?? !data.female,\n female: data.female ?? false,\n smd: data.smd ?? data.surfacemount ?? false,\n rightangle: data.rightangle ?? false,\n }\n })\n .superRefine((data, ctx) => {\n if (data.male && data.female) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"'male' and 'female' cannot both be true; it should be male or female.\",\n path: [\"male\", \"female\"],\n })\n }\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 {\n p,\n id,\n od,\n rows,\n num_pins,\n pinlabelAnchorSide,\n pinlabelverticallyinverted,\n pinlabelorthogonal,\n pinlabeltextalignleft,\n pinlabeltextalignright,\n nopinlabels,\n doublesidedpinlabel,\n bottomsidepinlabel,\n } = parameters\n let pinlabelTextAlign: \"center\" | \"left\" | \"right\" = \"center\"\n if (pinlabeltextalignleft) pinlabelTextAlign = \"left\"\n else if (pinlabeltextalignright) pinlabelTextAlign = \"right\"\n\n const holes: AnySoupElement[] = []\n const numPinsPerRow = Math.ceil(num_pins / rows)\n const ySpacing = -p\n\n const calculateAnchorPosition = ({\n xoff,\n yoff,\n od,\n anchorSide,\n smd,\n pw,\n pl,\n }: {\n xoff: number\n yoff: number\n od: number\n anchorSide: \"top\" | \"bottom\" | \"left\" | \"right\"\n smd: boolean\n pw: number\n pl: number\n }): { anchor_x: number; anchor_y: number } => {\n let dx = 0\n let dy = 0\n if (smd) {\n const offset = od / 5\n switch (anchorSide) {\n case \"right\":\n dx = pw / 2 + offset\n break\n case \"top\":\n dy = pl / 2 + offset\n break\n case \"bottom\":\n dy = -(pl / 2 + offset)\n break\n case \"left\":\n dx = -(pw / 2 + offset)\n break\n }\n } else {\n const offset = od * 0.75\n switch (anchorSide) {\n case \"right\":\n dx = offset\n break\n case \"top\":\n dy = offset\n break\n case \"bottom\":\n dy = -offset\n break\n case \"left\":\n dx = -offset\n break\n }\n }\n return { anchor_x: xoff + dx, anchor_y: yoff + dy }\n }\n\n // Helper to add plated hole and silkscreen label\n const addPin = (pinNumber: number, xoff: number, yoff: number) => {\n if (parameters.smd) {\n // SMD pads\n holes.push(rectpad(pinNumber, xoff, yoff, parameters.pw, parameters.pl))\n } else {\n // Through-hole\n if (pinNumber === 1 && !parameters.nosquareplating) {\n // Always use square plating for pin 1 (no need to check nosquareplating anymore)\n holes.push(\n platedHoleWithRectPad(pinNumber, xoff, yoff, id, od, od, 0, 0),\n )\n } else {\n // Other pins with standard circular pad\n holes.push(platedhole(pinNumber, xoff, yoff, id, od))\n }\n }\n const { anchor_x, anchor_y } = calculateAnchorPosition({\n xoff,\n yoff,\n od,\n anchorSide: pinlabelAnchorSide,\n smd: parameters.smd,\n pw: parameters.pw,\n pl: parameters.pl,\n })\n if (!nopinlabels) {\n if (!bottomsidepinlabel) {\n holes.push(\n silkscreenPin({\n fs: od / 5,\n pn: pinNumber,\n anchor_x,\n anchor_y,\n anchorplacement: pinlabelAnchorSide,\n textalign: pinlabelTextAlign,\n orthogonal: pinlabelorthogonal,\n verticallyinverted: pinlabelverticallyinverted,\n layer: \"top\",\n }),\n )\n } else {\n holes.push(\n silkscreenPin({\n fs: od / 5,\n pn: pinNumber,\n anchor_x,\n anchor_y,\n anchorplacement: pinlabelAnchorSide,\n textalign: pinlabelTextAlign,\n orthogonal: pinlabelorthogonal,\n verticallyinverted: pinlabelverticallyinverted,\n layer: \"bottom\",\n }),\n )\n }\n if (doublesidedpinlabel) {\n holes.push(\n silkscreenPin({\n fs: od / 5,\n pn: pinNumber,\n anchor_x,\n anchor_y,\n anchorplacement: pinlabelAnchorSide,\n textalign: pinlabelTextAlign,\n orthogonal: pinlabelorthogonal,\n verticallyinverted: pinlabelverticallyinverted,\n layer: \"bottom\",\n }),\n )\n }\n }\n }\n\n // Track used positions to prevent overlaps\n const usedPositions = new Set<string>()\n\n // Check if BGA-style numbering should be used\n const useBGAStyle = rows > 2 && numPinsPerRow > 2\n\n if (rows === 1) {\n // Single row: left to right, pin 1 to num_pins\n const xStart = -((num_pins - 1) / 2) * p\n for (let i = 0; i < num_pins; i++) {\n const pinNumber = i + 1\n const xoff = xStart + i * p\n const posKey = `${xoff},${0}`\n if (usedPositions.has(posKey)) throw new Error(`Overlap at ${posKey}`)\n usedPositions.add(posKey)\n addPin(pinNumber, xoff, 0)\n }\n } else if (useBGAStyle) {\n // BGA-style: row-major numbering (left to right, top to bottom)\n const xStart = -((numPinsPerRow - 1) / 2) * p\n let currentPin = 1\n for (let row = 0; row < rows && currentPin <= num_pins; row++) {\n for (let col = 0; col < numPinsPerRow && currentPin <= num_pins; col++) {\n const xoff = xStart + col * p\n const yoff = row * ySpacing\n const posKey = `${xoff},${yoff}`\n if (usedPositions.has(posKey)) throw new Error(`Overlap at ${posKey}`)\n usedPositions.add(posKey)\n addPin(currentPin++, xoff, yoff)\n }\n }\n } else {\n // Multi-row: counterclockwise spiral traversal\n const xStart = -((numPinsPerRow - 1) / 2) * p\n let currentPin = 1\n let top = 0\n let bottom = rows - 1\n let left = 0\n let right = numPinsPerRow - 1\n\n while (currentPin <= num_pins && top <= bottom && left <= right) {\n // Left column: top to bottom\n for (let row = top; row <= bottom && currentPin <= num_pins; row++) {\n const xoff = xStart + left * p\n const yoff = row * ySpacing\n const posKey = `${xoff},${yoff}`\n if (usedPositions.has(posKey)) throw new Error(`Overlap at ${posKey}`)\n usedPositions.add(posKey)\n addPin(currentPin++, xoff, yoff)\n }\n left++\n\n // Bottom row: left to right\n for (let col = left; col <= right && currentPin <= num_pins; col++) {\n const xoff = xStart + col * p\n const yoff = bottom * ySpacing\n const posKey = `${xoff},${yoff}`\n if (usedPositions.has(posKey)) throw new Error(`Overlap at ${posKey}`)\n usedPositions.add(posKey)\n addPin(currentPin++, xoff, yoff)\n }\n bottom--\n\n if (left <= right) {\n // Right column: bottom to top\n for (let row = bottom; row >= top && currentPin <= num_pins; row--) {\n const xoff = xStart + right * p\n const yoff = row * ySpacing\n const posKey = `${xoff},${yoff}`\n if (usedPositions.has(posKey)) throw new Error(`Overlap at ${posKey}`)\n usedPositions.add(posKey)\n addPin(currentPin++, xoff, yoff)\n }\n right--\n }\n\n if (top <= bottom) {\n // Top row: right to left\n for (let col = right; col >= left && currentPin <= num_pins; col--) {\n const xoff = xStart + col * p\n const yoff = top * ySpacing\n const posKey = `${xoff},${yoff}`\n if (usedPositions.has(posKey)) throw new Error(`Overlap at ${posKey}`)\n usedPositions.add(posKey)\n addPin(currentPin++, xoff, yoff)\n }\n top++\n }\n }\n\n // Verify all pins were assigned\n if (currentPin - 1 < num_pins) {\n throw new Error(\n `Missing pins: assigned ${currentPin - 1}, expected ${num_pins}`,\n )\n }\n }\n\n // Add centered silkscreen reference text\n const refText: SilkscreenRef = silkscreenRef(0, p, 0.5)\n\n return {\n circuitJson: [...holes, refText],\n parameters,\n }\n}\n","import type { LayerRef, PcbSilkscreenText } from \"circuit-json\"\n\ntype TextAlignType = \"left\" | \"center\" | \"right\"\ntype AnchorPlacementType = \"top\" | \"bottom\" | \"left\" | \"right\"\ntype RotationType = 0 | 90 | 180 | 270\n\n// fs is font size // pn is pin number\nexport const silkscreenPin = ({\n fs,\n pn,\n anchor_x,\n anchor_y,\n textalign = \"center\",\n orthogonal = false,\n verticallyinverted = false,\n layer = \"top\",\n}: {\n fs: number\n pn: number\n anchor_x: number\n anchor_y: number\n textalign?: TextAlignType\n anchorplacement?: AnchorPlacementType\n orthogonal?: boolean\n verticallyinverted?: boolean\n layer?: LayerRef\n}): PcbSilkscreenText => {\n let ccw_rotation: RotationType = 0\n if (orthogonal && verticallyinverted) {\n ccw_rotation = 270\n } else if (verticallyinverted) {\n ccw_rotation = 180\n } else if (orthogonal) {\n ccw_rotation = 90\n } else {\n ccw_rotation = 0\n }\n\n let anchor_alignment: PcbSilkscreenText[\"anchor_alignment\"] = \"center\"\n if (textalign === \"left\") {\n if (verticallyinverted) anchor_alignment = \"center_right\"\n else anchor_alignment = \"center_left\"\n }\n if (textalign === \"right\") {\n if (verticallyinverted) anchor_alignment = \"center_left\"\n else anchor_alignment = \"center_right\"\n }\n\n if (layer === \"bottom\") {\n if (anchor_alignment === \"center_left\") {\n anchor_alignment = \"center_right\"\n } else if (anchor_alignment === \"center_right\") {\n anchor_alignment = \"center_left\"\n }\n }\n\n return {\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: \"silkscreen_text_1\",\n font: \"tscircuit2024\",\n font_size: fs,\n pcb_component_id: \"pcb_component_1\",\n text: `{PIN${pn}}`,\n layer: layer,\n anchor_position: { x: anchor_x, y: anchor_y },\n anchor_alignment: anchor_alignment,\n ccw_rotation: ccw_rotation,\n }\n}\n","type PinlabelAnchorSideParams = {\n pinlabeltextalignleft: boolean\n pinlabeltextalignright: boolean\n pinlabelverticallyinverted: boolean\n pinlabelorthogonal: boolean\n}\n\nexport function determinePinlabelAnchorSide({\n pinlabeltextalignleft,\n pinlabeltextalignright,\n pinlabelorthogonal,\n}: PinlabelAnchorSideParams): \"top\" | \"bottom\" | \"left\" | \"right\" {\n let pinlabelAnchorSide: \"top\" | \"bottom\" | \"left\" | \"right\" = \"top\"\n // Default to center if no alignment specified\n if (pinlabelorthogonal) {\n pinlabelAnchorSide = \"left\"\n } else {\n pinlabelAnchorSide = \"top\"\n }\n if (pinlabeltextalignleft) {\n if (pinlabelorthogonal) {\n pinlabelAnchorSide = \"bottom\"\n } else {\n pinlabelAnchorSide = \"right\"\n }\n }\n if (pinlabeltextalignright) {\n if (pinlabelorthogonal) {\n pinlabelAnchorSide = \"top\"\n } else {\n pinlabelAnchorSide = \"left\"\n }\n }\n return pinlabelAnchorSide\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sot563_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(6).default(6),\n w: z.string().default(\"2.1mm\"),\n h: z.string().default(\"2.45mm\"),\n p: z.string().default(\"0.5mm\"),\n pl: z.string().default(\"0.675mm\"),\n pw: z.string().default(\"0.35mm\"),\n string: z.string().optional(),\n})\n\nexport const sot563 = (\n raw_params: z.input<typeof sot563_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = sot563_def.parse({ ...raw_params, fn: \"sot563\" })\n\n const w = length.parse(parameters.w)\n const h = length.parse(parameters.h)\n const p = length.parse(parameters.p)\n const pl = length.parse(parameters.pl)\n const pw = length.parse(parameters.pw)\n\n const pads: AnyCircuitElement[] = []\n for (let i = 0; i < 6; i++) {\n const { x, y } = getSot563PadCoord(i + 1, w, p, pl)\n pads.push(rectpad(i + 1, x, y, pl, pw))\n }\n\n const silkscreenTopLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -w / 2, y: h / 2 },\n { x: w / 2, y: h / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenBottomLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -w / 2, y: -h / 2 },\n { x: w / 2, y: -h / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const pin1Position = getSot563PadCoord(1, w, p, pl)\n const pin1Marking: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"pin_marker_1\",\n route: [\n { x: pin1Position.x - pl / 2 - 0.3, y: pin1Position.y },\n { x: pin1Position.x - pl / 2 - 0.45, y: pin1Position.y + 0.15 },\n { x: pin1Position.x - pl / 2 - 0.45, y: pin1Position.y - 0.15 },\n { x: pin1Position.x - pl / 2 - 0.3, y: pin1Position.y },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"pin_marker_1\",\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, h / 2 + 0.4, 0.25)\n\n return {\n circuitJson: [\n ...pads,\n silkscreenTopLine,\n silkscreenBottomLine,\n silkscreenRefText,\n pin1Marking,\n ],\n parameters,\n }\n}\n\nexport const getSot563PadCoord = (\n pn: number,\n w: number,\n p: number,\n pl: number,\n) => {\n const padCenterOffset = w / 2 - pl / 2\n if (pn <= 3) {\n return { x: -padCenterOffset, y: p - (pn - 1) * p }\n }\n return { x: padCenterOffset, y: -p + (pn - 4) * p }\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\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: AnyCircuitElement[]; 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 \"circuit-json\"\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 { length, type AnySoupElement } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sot723_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(3).default(3),\n w: z.string().default(\"1.2mm\"),\n h: z.string().default(\"1.2mm\"),\n pw: z.string().default(\"0.40mm\"),\n pl: z.string().default(\"0.45mm\"),\n p: z.string().default(\"0.575mm\"),\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 length.parse(parameters.h),\n 0.2,\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 p: number\n}) => {\n const { pn, w, h, pl, p } = parameters\n\n if (pn === 1) {\n return { x: p, y: 0 }\n }\n if (pn === 2) {\n return { x: -p, y: -0.4 }\n }\n return { x: -p, y: 0.4 }\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 p: Number.parseFloat(parameters.p),\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\n return pads\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\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(\"1.2mm\"),\n p: z.string().default(\"3.30mm\"),\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 length.parse(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 p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\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 \"circuit-json\"\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\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const axial_def = base_def.extend({\n fn: z.string(),\n p: length.optional().default(\"2.54mm\"),\n id: length.optional().default(\"0.7mm\"),\n od: length.optional().default(\"1.4mm\"),\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, 1.5, 0.5)\n return {\n circuitJson: [\n ...plated_holes,\n silkscreenLine,\n silkscreenRefText as AnySoupElement,\n ],\n parameters,\n }\n}\n","import {\n length,\n type AnySoupElement,\n type PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { z } from \"zod\"\nimport { generateCircleArcs } from \"../helpers/generateCircleArcs\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const radial_def = base_def.extend({\n fn: z.string(),\n\n p: length.optional().default(\"5mm\"),\n id: length.optional().default(\"0.8mm\"),\n od: length.optional().default(\"1.6mm\"),\n\n ceramic: z.boolean().optional(),\n electrolytic: z.boolean().optional(),\n polarized: z.boolean().optional(),\n})\n\nexport type RadialDef = z.input<typeof radial_def>\n\nexport const radial = (\n raw_params: RadialDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = radial_def.parse(raw_params)\n\n const { p, id, od } = parameters\n\n if (id === 0.8 && od === 1.6) {\n parameters.id = p === 5 ? 0.8 : p * 0.25\n parameters.od = p === 5 ? 1.6 : p * 0.5\n }\n\n const plated_holes = [\n platedhole(1, -p / 2, 0, parameters.id, parameters.od),\n platedhole(2, p / 2, 0, parameters.id, parameters.od),\n ]\n\n const bodyR = p + 0.1\n\n const { topArc, bottomArc } = generateCircleArcs(\n 0,\n 0,\n bodyR,\n parameters.od / 2,\n parameters.od,\n )\n\n const strokeWidth = 0.02 * p\n\n const silkscreenBodyTop: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: topArc,\n stroke_width: strokeWidth,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenBodyBottom: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: bottomArc,\n stroke_width: strokeWidth,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenCenterLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: 0, y: bodyR },\n { x: 0, y: -bodyR },\n ],\n stroke_width: strokeWidth,\n pcb_silkscreen_path_id: \"\",\n }\n\n const plusSize = 0.1 * p\n const plusX = -(p + plusSize + 0.04 * p)\n const plusY = bodyR - plusSize - 0.08 * p\n\n const plusHoriz: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: plusX - plusSize, y: plusY },\n { x: plusX + plusSize, y: plusY },\n ],\n stroke_width: strokeWidth,\n pcb_silkscreen_path_id: \"\",\n }\n\n const plusVert: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: plusX, y: plusY - plusSize },\n { x: plusX, y: plusY + plusSize },\n ],\n stroke_width: strokeWidth,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n bodyR + 0.12 * p,\n 0.1 * p,\n )\n\n const circuitJson: AnySoupElement[] = [\n ...plated_holes,\n silkscreenBodyTop,\n silkscreenBodyBottom,\n silkscreenCenterLine,\n silkscreenRefText as AnySoupElement,\n ]\n\n const hasPolarity =\n parameters.electrolytic === true || parameters.polarized === true\n if (hasPolarity) {\n circuitJson.push(plusHoriz, plusVert)\n }\n\n return {\n circuitJson,\n parameters,\n }\n}\n","export type CircleArcPoint = { x: number; y: number }\n\nexport const generateCircleArcs = (\n centerX: number,\n centerY: number,\n radius: number,\n cut: number,\n cutHeight: number,\n segmentLength = 0.1,\n): {\n topArc: CircleArcPoint[]\n bottomArc: CircleArcPoint[]\n} => {\n const topArc: CircleArcPoint[] = []\n const bottomArc: CircleArcPoint[] = []\n\n // choose angular step so the arc length between points is ~segmentLength\n const segments = Math.max(1, Math.ceil((Math.PI * radius) / segmentLength))\n const thetaStep = Math.PI / segments\n\n for (let i = 0; i <= segments; i++) {\n const theta = i * thetaStep\n const x = centerX + Math.cos(theta) * radius\n const y = centerY + Math.sin(theta) * radius\n\n if (\n x < centerX - cut &&\n y >= centerY - cutHeight / 2 &&\n y <= centerY + cutHeight / 2\n ) {\n continue\n }\n topArc.push({ x, y })\n }\n\n for (let i = 0; i <= segments; i++) {\n const theta = Math.PI + i * thetaStep\n const x = centerX + Math.cos(theta) * radius\n const y = centerY + Math.sin(theta) * radius\n\n if (\n x < centerX - cut &&\n y >= centerY - cutHeight / 2 &&\n y <= centerY + cutHeight / 2\n ) {\n continue\n }\n bottomArc.push({ x, y })\n }\n\n return { topArc, bottomArc }\n}\n","import { length, 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\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const pushbutton_def = base_def.extend({\n fn: z.literal(\"pushbutton\"),\n w: length.default(4.5),\n h: length.default(6.5),\n id: length.default(1),\n od: length.default(1.2),\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 = parameters.w\n const height = parameters.h\n const holeDiameter = parameters.id\n\n const holes: AnyCircuitElement[] = [\n platedhole(1, -width / 2, height / 2, holeDiameter, holeDiameter * 1.5),\n platedhole(2, -width / 2, -height / 2, holeDiameter, holeDiameter * 1.5),\n platedhole(3, width / 2, -height / 2, holeDiameter, holeDiameter * 1.5),\n platedhole(4, width / 2, height / 2, holeDiameter, holeDiameter * 1.5),\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 type PcbSilkscreenText,\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\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const stampboard_def = base_def.extend({\n fn: z.string(),\n w: length.default(\"22.58mm\"),\n h: length.optional(),\n left: length.optional().default(20),\n right: length.optional().default(20),\n top: length.optional().default(2),\n bottom: length.optional().default(2),\n p: length.default(length.parse(\"2.54mm\")),\n pw: length.default(length.parse(\"1.6mm\")),\n pl: length.default(length.parse(\"2.4mm\")),\n innerhole: z.boolean().default(false),\n innerholeedgedistance: length.default(length.parse(\"1.61mm\")),\n silkscreenlabels: z.boolean().default(false),\n silkscreenlabelmargin: length.default(length.parse(\"0.1mm\")),\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}\nconst getTriangleDir = (x: number, y: number, side: string) => {\n let routes: { x: number; y: number }[] = []\n const triangleHeight = 1 // Adjust triangle size as needed\n const triangleWidth = 0.6 // Adjust triangle width as needed\n if (side === \"right\") {\n routes = [\n {\n x: x + triangleHeight / 2,\n y: y,\n }, // Tip of the triangle (pointing right)\n {\n x: x - triangleHeight / 2,\n y: y + triangleWidth / 2,\n }, // Bottom corner of the base\n {\n x: x - triangleHeight / 2,\n y: y - triangleWidth / 2,\n }, // Top corner of the base\n {\n x: x + triangleHeight / 2,\n y: y,\n }, // Close the path at the tip\n ]\n }\n if (side === \"left\") {\n routes = [\n {\n x: x - triangleHeight / 2,\n y: y,\n }, // Tip of the triangle (pointing left)\n {\n x: x + triangleHeight / 2,\n y: y + triangleWidth / 2,\n }, // Top corner of the base\n {\n x: x + triangleHeight / 2,\n y: y - triangleWidth / 2,\n }, // Bottom corner of the base\n {\n x: x - triangleHeight / 2,\n y: y,\n }, // Close the path at the tip\n ]\n }\n if (side === \"top\") {\n routes = [\n {\n x: x,\n y: y + triangleHeight / 2,\n }, // Tip of the triangle (pointing up)\n {\n x: x - triangleWidth / 2,\n y: y - triangleHeight / 2,\n }, // Left corner of the base\n {\n x: x + triangleWidth / 2,\n y: y - triangleHeight / 2,\n }, // Right corner of the base\n {\n x: x,\n y: y + triangleHeight / 2,\n }, // Close the path at the tip\n ]\n }\n if (side === \"bottom\") {\n routes = [\n {\n x: x,\n y: y - triangleHeight / 2,\n }, // Tip of the triangle (pointing down)\n {\n x: x - triangleWidth / 2,\n y: y + triangleHeight / 2,\n }, // Left corner of the base\n {\n x: x + triangleWidth / 2,\n y: y + triangleHeight / 2,\n }, // Right corner of the base\n {\n x: x,\n y: y - triangleHeight / 2,\n }, // Close the path at the tip\n ]\n }\n return routes\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 height = params.h ?? getHeight(params)\n const rectpads: AnyCircuitElement[] = []\n const holes: PcbPlatedHole[] = []\n const pinLabels: PcbSilkscreenText[] = []\n let routes: { x: number; y: number }[] = []\n const innerDiameter = 1\n const outerDiameter = innerDiameter\n const totalPadsNumber =\n params.left + params.right + (params.bottom ?? 0) + (params.top ?? 0)\n const maxLabelLength = `pin${totalPadsNumber}`.length\n const textHalf = (maxLabelLength * 0.7) / 2\n if (params.right) {\n const yoff = -((params.right - 1) / 2) * params.p\n for (let i = 0; i < params.right; i++) {\n if (\n i === 0 &&\n !params.left &&\n !params.bottom &&\n !params.silkscreenlabels\n ) {\n routes = getTriangleDir(\n params.w / 2 - params.pl * 1.4,\n yoff + i * params.p,\n \"right\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1 + params.left + (params.bottom ?? 0),\n params.w / 2 - params.pl / 2,\n yoff + i * params.p,\n params.pl,\n params.pw,\n ),\n )\n if (params.silkscreenlabels) {\n const padIndex = i + 1 + params.left + (params.bottom ?? 0)\n const label = `pin${padIndex}`\n pinLabels.push({\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: `pin_${padIndex}`,\n pcb_component_id: \"1\",\n layer: \"top\",\n anchor_position: {\n x:\n params.w / 2 -\n params.pl -\n (textHalf + params.silkscreenlabelmargin),\n y: yoff + i * params.p,\n },\n text: label,\n font_size: 0.7,\n font: \"tscircuit2024\",\n anchor_alignment: \"center\",\n })\n }\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1 + params.left + (params.bottom ?? 0) + totalPadsNumber,\n params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1 + params.left + (params.bottom ?? 0) + totalPadsNumber * 2,\n params.w / 2 - params.innerholeedgedistance,\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 === 0 && !params.silkscreenlabels) {\n routes = getTriangleDir(\n -params.w / 2 + params.pl * 1.4,\n yoff - i * params.p,\n \"left\",\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.silkscreenlabels) {\n const padIndex = i + 1\n const label = `pin${padIndex}`\n pinLabels.push({\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: `pin_${padIndex}`,\n pcb_component_id: \"1\",\n layer: \"top\",\n anchor_position: {\n x:\n -params.w / 2 +\n params.pl +\n (textHalf + params.silkscreenlabelmargin),\n y: yoff - i * params.p,\n },\n text: label,\n font_size: 0.7,\n font: \"tscircuit2024\",\n anchor_alignment: \"center\",\n })\n }\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1 + totalPadsNumber,\n -params.w / 2,\n yoff - i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1 + totalPadsNumber * 2,\n -params.w / 2 + params.innerholeedgedistance,\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 === 0 &&\n !params.left &&\n !params.bottom &&\n !params.right &&\n !params.silkscreenlabels\n ) {\n routes = getTriangleDir(\n xoff - i * params.p,\n height / 2 - params.pl * 1.4,\n \"top\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1 + params.left + params.right + (params.bottom ?? 0),\n xoff - i * params.p,\n height / 2 - params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n if (params.silkscreenlabels) {\n const padIndex =\n i + 1 + params.left + params.right + (params.bottom ?? 0)\n const label = `pin${padIndex}`\n pinLabels.push({\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: `pin_${padIndex}`,\n pcb_component_id: \"1\",\n layer: \"top\",\n anchor_position: {\n x: xoff - i * params.p,\n y:\n height / 2 -\n params.pl -\n (textHalf + params.silkscreenlabelmargin),\n },\n text: label,\n font_size: 0.7,\n font: \"tscircuit2024\",\n anchor_alignment: \"center\",\n ccw_rotation: 270,\n })\n }\n if (params.innerhole) {\n holes.push(\n platedhole(\n i +\n 1 +\n params.left +\n params.right +\n (params.bottom ?? 0) +\n totalPadsNumber,\n xoff - i * params.p,\n height / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i +\n 1 +\n params.left +\n params.right +\n (params.bottom ?? 0) +\n totalPadsNumber * 2,\n xoff - i * params.p,\n height / 2 - params.innerholeedgedistance,\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 && !params.silkscreenlabels) {\n routes = getTriangleDir(\n xoff + i * params.p,\n -height / 2 + params.pl * 1.4,\n \"bottom\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1 + params.left,\n xoff + i * params.p,\n -height / 2 + params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n if (params.silkscreenlabels) {\n const padIndex = i + 1 + params.left\n const label = `pin${padIndex}`\n pinLabels.push({\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: `pin_${padIndex}`,\n pcb_component_id: \"1\",\n layer: \"top\",\n anchor_position: {\n x: xoff + i * params.p,\n y:\n -height / 2 +\n params.pl +\n (textHalf + params.silkscreenlabelmargin),\n },\n text: label,\n font_size: 0.7,\n font: \"tscircuit2024\",\n anchor_alignment: \"center\",\n ccw_rotation: 90,\n })\n }\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1 + params.left + totalPadsNumber,\n xoff + i * params.p,\n -height / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1 + params.left + totalPadsNumber * 2,\n xoff + i * params.p,\n -height / 2 + params.innerholeedgedistance,\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: height / 2 },\n { x: params.w / 2, y: height / 2 },\n { x: params.w / 2, y: -height / 2 },\n { x: -params.w / 2, y: -height / 2 },\n { x: -params.w / 2, y: height / 2 },\n ],\n stroke_width: 0.1,\n layer: \"top\",\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n height / 1.8,\n height / 25,\n )\n return {\n circuitJson: [\n ...rectpads,\n ...holes,\n ...pinLabels,\n silkscreenPath,\n ...(params.silkscreenlabels ? [] : [silkscreenTriangle]),\n silkscreenRefText,\n ],\n parameters: params,\n }\n}\n","import {\n length,\n type AnyCircuitElement,\n type PcbPlatedHole,\n type PcbSilkscreenPath,\n type PcbSilkscreenText,\n} from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const stampreceiver_def = base_def.extend({\n fn: z.string(),\n w: length.default(\"22.58mm\"),\n h: length.optional(),\n left: length.optional().default(20),\n right: length.optional().default(20),\n top: length.optional().default(2),\n bottom: length.optional().default(2),\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 innerholeedgedistance: length.default(length.parse(\"1.61mm\")),\n})\n\nexport type Stampreceiver_def = z.input<typeof stampreceiver_def>\n\nconst getHeight = (parameters: Stampreceiver_def): number => {\n const params = stampreceiver_def.parse(parameters)\n\n // Calculate height based on the presence of left and right parameters\n if (params.left && params.right) {\n return Math.max(params.left, params.right) * params.p\n }\n\n if (params.left) {\n return params.left * params.p\n }\n\n if (params.right) {\n return params.right * params.p\n }\n\n // Return default height if neither left nor right is provided\n return 51\n}\ntype Point = { x: number; y: number }\ntype Direction = \"left\" | \"right\" | \"top\" | \"bottom\"\n\nconst getTriangleDir = (\n x: number,\n y: number,\n side: Direction,\n triangleHeight = 1,\n triangleWidth = 0.6,\n): Point[] => {\n const halfHeight = triangleHeight / 2\n const halfWidth = triangleWidth / 2\n\n const routes: Record<Direction, Point[]> = {\n left: [\n { x: x + halfHeight, y }, // Tip\n { x: x - halfHeight, y: y + halfWidth }, // Bottom corner\n { x: x - halfHeight, y: y - halfWidth }, // Top corner\n { x: x + halfHeight, y }, // Close path\n ],\n right: [\n { x: x - halfHeight, y }, // Tip\n { x: x + halfHeight, y: y + halfWidth }, // Top corner\n { x: x + halfHeight, y: y - halfWidth }, // Bottom corner\n { x: x - halfHeight, y }, // Close path\n ],\n top: [\n { x, y: y - halfHeight }, // Tip\n { x: x - halfWidth, y: y + halfHeight }, // Left corner\n { x: x + halfWidth, y: y + halfHeight }, // Right corner\n { x, y: y - halfHeight }, // Close path\n ],\n bottom: [\n { x, y: y + halfHeight }, // Tip\n { x: x - halfWidth, y: y - halfHeight }, // Left corner\n { x: x + halfWidth, y: y - halfHeight }, // Right corner\n { x, y: y + halfHeight }, // Close path\n ],\n }\n\n return routes[side]\n}\nexport const stampreceiver = (\n raw_params: Stampreceiver_def,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const params = stampreceiver_def.parse(raw_params)\n const height = params.h ?? getHeight(params)\n const rectpads: AnyCircuitElement[] = []\n const pinLabels: PcbSilkscreenText[] = []\n const holes: PcbPlatedHole[] = []\n const innerDiameter = 1\n const outerDiameter = 1.2\n const totalPadsNumber =\n params.left + params.right + (params.bottom ?? 0) + (params.top ?? 0)\n let routes: { x: number; y: number }[] = []\n let padIndex = 1\n\n // Process Left Pads (top to bottom)\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 === 0) {\n routes = getTriangleDir(\n -params.w / 2 - params.pl / 2,\n yoff - i * params.p,\n \"left\",\n )\n }\n rectpads.push(\n rectpad(\n padIndex,\n -params.w / 2 + params.pl / 2,\n yoff - i * params.p,\n params.pl,\n params.pw,\n ),\n )\n pinLabels.push({\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: `pin_${padIndex}`,\n pcb_component_id: \"1\",\n layer: \"top\",\n anchor_position: {\n x: -params.w / 2 + params.pl / 2 - 4.5,\n y: yoff - i * params.p,\n },\n text: `pin${padIndex}`,\n font_size: 0.7,\n font: \"tscircuit2024\",\n anchor_alignment: \"center\",\n })\n padIndex++\n params.innerhole &&\n holes.push(\n platedhole(\n padIndex + totalPadsNumber,\n -params.w / 2 + params.innerholeedgedistance,\n yoff - i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n\n // Process Bottom Pads (right to left)\n if (params.bottom) {\n const xoff = ((params.bottom - 1) / 2) * params.p\n for (let i = params.bottom - 1; i >= 0; i--) {\n rectpads.push(\n rectpad(\n padIndex,\n xoff - i * params.p,\n -height / 2 + params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n pinLabels.push({\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: `pin_${padIndex}`,\n pcb_component_id: \"1\",\n layer: \"top\",\n anchor_position: {\n x: xoff - i * params.p,\n y: -height / 2 + params.pl / 2 - 3.2,\n },\n text: `pin${padIndex}`,\n font_size: 0.7,\n font: \"tscircuit2024\",\n anchor_alignment: \"center\",\n })\n padIndex++\n params.innerhole &&\n holes.push(\n platedhole(\n padIndex + totalPadsNumber,\n xoff - i * params.p,\n -height / 2 + params.innerholeedgedistance,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n\n // Process Right Pads (bottom to top)\n if (params.right) {\n const yoff = -((params.right - 1) / 2) * params.p\n for (let i = 0; i < params.right; i++) {\n rectpads.push(\n rectpad(\n padIndex,\n params.w / 2 - params.pl / 2,\n yoff + i * params.p,\n params.pl,\n params.pw,\n ),\n )\n pinLabels.push({\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: `pin_${padIndex}`,\n pcb_component_id: \"1\",\n layer: \"top\",\n anchor_position: {\n x: params.w / 2 - params.pl / 2 + 3.7,\n y: yoff + i * params.p,\n },\n text: `pin${padIndex}`,\n font_size: 0.7,\n font: \"tscircuit2024\",\n anchor_alignment: \"center\",\n })\n padIndex++\n params.innerhole &&\n holes.push(\n platedhole(\n padIndex + totalPadsNumber,\n params.w / 2 - params.innerholeedgedistance,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n\n // Process Top Pads (left to right)\n if (params.top) {\n const xoff = -((params.top - 1) / 2) * params.p\n for (let i = params.top - 1; i >= 0; i--) {\n rectpads.push(\n rectpad(\n padIndex,\n xoff + i * params.p,\n height / 2 - params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n pinLabels.push({\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: `pin_${padIndex}`,\n pcb_component_id: \"1\",\n layer: \"top\",\n anchor_position: {\n x: xoff + i * params.p,\n y: height / 2 - params.pl / 2 + 3.2,\n },\n text: `pin${padIndex}`,\n font_size: 0.7,\n font: \"tscircuit2024\",\n anchor_alignment: \"center\",\n })\n padIndex++\n params.innerhole &&\n holes.push(\n platedhole(\n padIndex + totalPadsNumber,\n xoff + i * params.p,\n height / 2 - params.innerholeedgedistance,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n\n const silkscreenTriangle: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"1\",\n pcb_component_id: \"1\",\n layer: \"top\",\n route: routes,\n stroke_width: 0.1,\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 {\n x: -params.w / 2 - params.pl / 3,\n y: height / 2 + params.pl / 3,\n },\n {\n x: params.w / 2 + params.pl / 3,\n y: height / 2 + params.pl / 3,\n },\n {\n x: params.w / 2 + params.pl / 3,\n y: -height / 2 - params.pl / 3,\n },\n {\n x: -params.w / 2 - params.pl / 3,\n y: -height / 2 - params.pl / 3,\n },\n {\n x: -params.w / 2 - params.pl / 3,\n y: height / 2 + params.pl / 3,\n },\n ],\n stroke_width: 0.1,\n layer: \"top\",\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n height / 1.8,\n height / 25,\n )\n return {\n circuitJson: [\n ...holes,\n ...rectpads,\n ...pinLabels,\n silkscreenPath,\n silkscreenTriangle,\n silkscreenRefText,\n ],\n parameters: params,\n }\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { quad, quad_def } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const lqfp_def = quad_def\n\nexport const lqfp = (\n parameters: z.input<typeof lqfp_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n parameters.legsoutside = true\n if (!parameters.pl) {\n parameters.pl = 1.5\n }\n if (!parameters.pw) {\n parameters.pw = 0.3\n }\n return quad(parameters)\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 { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const breakoutheaders_def = base_def.extend({\n fn: z.string(),\n w: length.default(\"10mm\"),\n h: length.optional(),\n left: length.optional().default(20),\n right: length.optional().default(20),\n top: length.optional().default(0),\n bottom: length.optional().default(0),\n p: length.default(length.parse(\"2.54mm\")),\n id: length.optional().default(length.parse(\"1mm\")),\n od: length.optional().default(length.parse(\"1.5mm\")),\n})\n\nexport type breakoutheaders_def = z.input<typeof breakoutheaders_def>\n\nconst getHeight = (parameters: breakoutheaders_def): number => {\n const params = breakoutheaders_def.parse(parameters)\n\n // Calculate height based on the presence of left and right parameters\n if (params.left && params.right) {\n return Math.max(params.left, params.right) * params.p\n }\n\n if (params.left) {\n return params.left * params.p\n }\n\n if (params.right) {\n return params.right * params.p\n }\n\n return 51\n}\n\ntype Point = { x: number; y: number }\ntype Direction = \"left\" | \"right\" | \"top\" | \"bottom\"\n\nconst getTrianglePath = (\n x: number,\n y: number,\n side: Direction,\n triangleHeight = 1,\n triangleWidth = 0.6,\n): Point[] => {\n const halfHeight = triangleHeight / 2\n const halfWidth = triangleWidth / 2\n\n const silkscreenTriangleRoutes: Record<Direction, Point[]> = {\n left: [\n { x: x + halfHeight, y },\n { x: x - halfHeight, y: y + halfWidth },\n { x: x - halfHeight, y: y - halfWidth },\n { x: x + halfHeight, y },\n ],\n right: [\n { x: x - halfHeight, y },\n { x: x + halfHeight, y: y + halfWidth },\n { x: x + halfHeight, y: y - halfWidth },\n { x: x - halfHeight, y },\n ],\n top: [\n { x, y: y - halfHeight },\n { x: x - halfWidth, y: y + halfHeight },\n { x: x + halfWidth, y: y + halfHeight },\n { x, y: y - halfHeight },\n ],\n bottom: [\n { x, y: y + halfHeight },\n { x: x - halfWidth, y: y - halfHeight },\n { x: x + halfWidth, y: y - halfHeight },\n { x, y: y + halfHeight },\n ],\n }\n\n return silkscreenTriangleRoutes[side]\n}\nexport const breakoutheaders = (\n raw_params: breakoutheaders_def,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const params = breakoutheaders_def.parse(raw_params)\n const height = params.h ?? getHeight(params)\n const holes: PcbPlatedHole[] = []\n const innerDiameter = params.id\n const outerDiameter = params.od\n let silkscreenTriangleRoutes: { x: number; y: number }[] = []\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 silkscreenTriangleRoutes = getTrianglePath(\n params.w / 2 + outerDiameter * 1.4,\n yoff + i * params.p,\n \"right\",\n )\n }\n holes.push(\n platedhole(\n i + 1 + params.left + (params.bottom ?? 0),\n params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\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 silkscreenTriangleRoutes = getTrianglePath(\n -params.w / 2 - outerDiameter * 1.4,\n yoff + i * params.p,\n \"left\",\n )\n }\n holes.push(\n platedhole(\n i + 1,\n -params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\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 silkscreenTriangleRoutes = getTrianglePath(\n xoff + i * params.p,\n height / 2 + outerDiameter * 1.4,\n \"top\",\n )\n }\n holes.push(\n platedhole(\n i + 1 + params.right + (params.bottom ?? 0) + params.left,\n xoff + i * params.p,\n height / 2,\n innerDiameter,\n outerDiameter,\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 silkscreenTriangleRoutes = getTrianglePath(\n xoff + i * params.p,\n -height / 2 - outerDiameter * 1.4,\n \"bottom\",\n )\n }\n holes.push(\n platedhole(\n i + 1 + params.left,\n xoff + i * params.p,\n -height / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n\n const silkscreenTriangle: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"1\",\n pcb_component_id: \"1\",\n layer: \"top\",\n route: silkscreenTriangleRoutes,\n stroke_width: 0.1,\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 {\n x: -params.w / 2 - outerDiameter,\n y: height / 2 + outerDiameter,\n },\n {\n x: params.w / 2 + outerDiameter,\n y: height / 2 + outerDiameter,\n },\n {\n x: params.w / 2 + outerDiameter,\n y: -height / 2 - outerDiameter,\n },\n {\n x: -params.w / 2 - outerDiameter,\n y: -height / 2 - outerDiameter,\n },\n {\n x: -params.w / 2 - outerDiameter,\n y: height / 2 + outerDiameter,\n },\n ],\n stroke_width: 0.1,\n layer: \"top\",\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n height / 1.7,\n height / 25,\n )\n return {\n circuitJson: [\n ...holes,\n silkscreenPath,\n silkscreenRefText,\n silkscreenTriangle,\n ],\n parameters: params,\n }\n}\n","import {\n length,\n type AnySoupElement,\n type PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { z } from \"zod\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nconst generate_u_curve = (\n centerX: number,\n centerY: number,\n radius: number,\n direction: \"left\" | \"right\",\n) => {\n return Array.from({ length: 25 }, (_, i) => {\n const theta = (i / 24) * Math.PI - Math.PI / 2\n return {\n x: centerX + (direction === \"right\" ? 1 : -1) * Math.cos(theta) * radius,\n y: centerY + Math.sin(theta) * radius,\n }\n })\n}\n\nexport const hc49_def = base_def.extend({\n fn: z.string(),\n p: length.optional().default(\"4.88mm\"),\n id: length.optional().default(\"0.8mm\"),\n od: length.optional().default(\"1.5mm\"),\n w: length.optional().default(\"5.6mm\"),\n h: length.optional().default(\"3.5mm\"),\n})\n\nexport type Hc49Def = z.input<typeof hc49_def>\n\nexport const hc49 = (\n raw_params: Hc49Def,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = hc49_def.parse(raw_params)\n\n const { p, id, od, w, h } = parameters\n const radius = h / 2\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 leftCurve = generate_u_curve(-w / 2, 0, radius, \"left\")\n const rightCurve = generate_u_curve(w / 2, 0, radius, \"right\")\n\n const silkscreenBody: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n ...leftCurve,\n ...leftCurve.slice(1).reverse(),\n { x: -w / 2, y: -h / 2 },\n { x: w / 2, y: -h / 2 },\n ...rightCurve,\n { x: w / 2, y: h / 2 },\n { x: -w / 2, y: h / 2 },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, p / 4, 0.5)\n\n return {\n circuitJson: [\n ...plated_holes,\n silkscreenBody,\n silkscreenRefText as AnySoupElement,\n ],\n parameters,\n }\n}\n","import { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef } from \"../helpers/silkscreenRef\"\nimport type { AnySoupElement } from \"circuit-json\"\nimport { length } from \"circuit-json\"\nimport { mm } from \"@tscircuit/mm\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const pad_def = base_def.extend({\n w: length,\n h: length,\n})\n\nexport type PadDef = z.input<typeof pad_def>\n\nexport const pad = (\n params: PadDef,\n): { circuitJson: AnySoupElement[]; parameters: PadDef } => {\n const { w, h } = params\n const width = mm(w)\n const height = mm(h)\n\n return {\n circuitJson: [\n rectpad(1, 0, 0, width, height),\n silkscreenRef(0, height / 2 + 0.5, 0.2),\n ],\n parameters: params,\n }\n}\n","import { z } from \"zod\"\nimport { mm } from \"@tscircuit/mm\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { platedHoleWithRectPad } from \"src/helpers/platedHoleWithRectPad\"\nimport { platedHolePill } from \"src/helpers/platedHolePill\"\nimport type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const to92_def = base_def.extend({\n fn: z.string(),\n num_pins: z.union([z.literal(3), z.literal(2)]).default(3),\n p: z.string().default(\"1.27mm\"),\n id: z.string().default(\"0.72mm\"),\n od: z.string().default(\"0.95mm\"),\n w: z.string().default(\"4.5mm\"),\n h: z.string().default(\"4.5mm\"),\n inline: z.boolean().default(false),\n string: z.string().optional(),\n})\n\nconst generateSemicircle = (\n centerX: number,\n centerY: number,\n radius: number,\n): { x: number; y: number }[] => {\n return Array.from({ length: 25 }, (_, i) => {\n const theta = (i / 24) * Math.PI\n return {\n x: centerX + Math.cos(theta) * radius,\n y: centerY + Math.sin(theta) * radius,\n }\n })\n}\n\nexport const to92_2 = (parameters: z.infer<typeof to92_def>) => {\n const { p, id, od, h } = parameters\n const holeY = Number.parseFloat(h) / 2\n const padSpacing = Number.parseFloat(p)\n\n return [\n platedHoleWithRectPad(1, -padSpacing, holeY - padSpacing, id, od, od, 0, 0),\n platedhole(2, padSpacing, holeY - padSpacing, id, od),\n ]\n}\n\nexport const to92 = (\n raw_params: z.input<typeof to92_def>,\n): {\n circuitJson: AnyCircuitElement[]\n parameters: z.infer<typeof to92_def>\n} => {\n const match = raw_params.string?.match(/^to92_(\\d+)/)\n const numPins = match ? Number.parseInt(match[1]!, 10) : 3\n\n const parameters = to92_def.parse({\n ...raw_params,\n num_pins: numPins,\n })\n\n const { p, id, od, w, h, inline } = parameters\n const holeY = Number.parseFloat(h) / 2\n const padSpacing = Number.parseFloat(p)\n const holeDia = Number.parseFloat(id)\n const padDia = Number.parseFloat(od)\n\n const padWidth = padDia\n const padHeight = padDia * (1.5 / 1.05)\n\n let platedHoles: AnyCircuitElement[] = []\n\n if (parameters.num_pins === 3) {\n if (inline) {\n platedHoles = [\n platedHoleWithRectPad(\n 1,\n -padSpacing,\n holeY - padSpacing,\n holeDia,\n padDia,\n padHeight,\n 0,\n 0,\n ),\n platedHolePill(2, 0, holeY - padSpacing, holeDia, padWidth, padHeight),\n platedHolePill(\n 3,\n padSpacing,\n holeY - padSpacing,\n holeDia,\n padWidth,\n padHeight,\n ),\n ]\n } else {\n platedHoles = [\n platedHoleWithRectPad(\n 1,\n -padSpacing,\n holeY - padSpacing,\n holeDia,\n padDia,\n padDia,\n 0,\n 0,\n ),\n platedhole(2, 0, holeY, holeDia, padDia),\n platedhole(3, padSpacing, holeY - padSpacing, holeDia, padDia),\n ]\n }\n } else if (parameters.num_pins === 2) {\n platedHoles = [\n platedHoleWithRectPad(\n 1,\n -padSpacing,\n holeY - padSpacing,\n holeDia,\n padWidth,\n padHeight,\n 0,\n 0,\n ),\n platedHolePill(\n 2,\n padSpacing,\n holeY - padSpacing,\n holeDia,\n padWidth,\n padHeight,\n ),\n ]\n } else {\n throw new Error(\"Invalid number of pins for TO-92\")\n }\n\n const radius = Number.parseFloat(w) / 2\n const semicircle = generateSemicircle(0, holeY, radius)\n\n const silkscreenBody: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n ...semicircle,\n { x: -radius, y: 0 },\n { x: radius, y: 0 },\n semicircle[0],\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, holeY + 1, 0.5)\n\n return {\n circuitJson: [\n ...platedHoles,\n silkscreenBody,\n silkscreenRefText as AnyCircuitElement,\n ],\n parameters,\n }\n}\n","import { mm } from \"@tscircuit/mm\"\nimport type { AnyCircuitElement } from \"circuit-json\"\n\nexport const platedHolePill = (\n pn: number,\n x: number,\n y: number,\n holeDiameter: number,\n outerWidth: number,\n outerHeight: number,\n): AnyCircuitElement => {\n return {\n pcb_plated_hole_id: \"\",\n type: \"pcb_plated_hole\",\n shape: \"pill\",\n x,\n y,\n outer_width: mm(outerWidth),\n outer_height: mm(outerHeight),\n hole_width: mm(holeDiameter),\n hole_height: mm(holeDiameter),\n pcb_port_id: \"\",\n layers: [\"top\", \"bottom\"],\n port_hints: [pn.toString()],\n ccw_rotation: 0,\n }\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"2.15mm\"),\n h: z.string().default(\"1.20mm\"),\n pl: z.string().default(\"0.5mm\"),\n pw: z.string().default(\"0.6mm\"),\n p: z.string().default(\"1.4mm\"),\n})\n\nexport const sod523 = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h),\n 0.3,\n )\n\n // Define silkscreen path that goes till half of the second pad\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\nexport const getSodCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { extendSoicDef, type SoicInput, getCcwSoicCoords } from \"./soic\"\nimport { rectpad } from \"src/helpers/rectpad\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const sop8_def = extendSoicDef({})\n\nexport const sop8 = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sop8_def.parse(raw_params)\n const pads: AnySoupElement[] = []\n\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 ?? \"1.5mm\", parameters.pw ?? \"0.6mm\"),\n )\n }\n\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n sh / 2 - 0.5,\n sh / 12,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"\",\n type: \"pcb_silkscreen_path\",\n route: [\n { x: -parameters.w / 3, y: sh / 2 + 0.2 },\n { x: parameters.w / 3, y: sh / 2 + 0.2 },\n ],\n stroke_width: 0.1,\n }\n\n return {\n circuitJson: [\n ...pads,\n silkscreenRefText,\n silkscreenLine,\n ] as AnySoupElement[],\n parameters,\n }\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod80_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"5.0mm\"),\n h: z.string().default(\"2.30mm\"),\n pl: z.string().default(\"1.25mm\"),\n pw: z.string().default(\"2mm\"),\n p: z.string().default(\"3.75mm\"),\n})\n\nexport const sod80 = (\n raw_params: z.input<typeof sod80_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod80_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) / 2 + 1,\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2 + 0.5,\n y: length.parse(parameters.h) / 2 + 0.5,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.5,\n y: length.parse(parameters.h) / 2 + 0.5,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.5,\n y: -length.parse(parameters.h) / 2 - 0.5,\n },\n {\n x: length.parse(parameters.p) / 2 + 0.5,\n y: -length.parse(parameters.h) / 2 - 0.5,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sod80WithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\nexport const getsod80Coords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n return pn === 1 ? { x: -p / 2, y: 0 } : { x: p / 2, y: 0 }\n}\n\nexport const sod80WithoutParsing = (parameters: z.infer<typeof sod80_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getsod80Coords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"4.4mm\"),\n h: z.string().default(\"2.1mm\"),\n pl: z.string().default(\"1.2mm\"),\n pw: z.string().default(\"1.2mm\"),\n p: z.string().default(\"2.9mm\"),\n})\n\nexport const sod123w = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) - 0.5,\n 0.3,\n )\n\n // Define silkscreen path that goes till half of the second pad\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\nexport const getSodCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n }\n return { x: p / 2, y: 0 }\n}\n\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"3.30mm\"),\n h: z.string().default(\"1.80mm\"),\n pl: z.string().default(\"0.60mm\"),\n pw: z.string().default(\"0.45mm\"),\n p: z.string().default(\"2.1mm\"),\n})\n\nexport const sod323 = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) - 0.5,\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\nexport const getSodCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n }\n return { x: p / 2, y: 0 }\n}\n\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"1.4mm\"),\n h: z.string().default(\"0.9mm\"),\n pl: z.string().default(\"0.36mm\"),\n pw: z.string().default(\"0.25mm\"),\n p: z.string().default(\"0.85mm\"),\n})\n\nexport const sod923 = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h),\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2 + 0.15,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.15,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.15,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2 + 0.15,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\nexport const getSodCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"1.3mm\"),\n h: z.string().default(\"0.9mm\"),\n pl: z.string().default(\"0.4mm\"),\n pw: z.string().default(\"0.7mm\"),\n p: z.string().default(\"0.7mm\"),\n})\n\nexport const sod882 = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) + 0.1,\n 0.3,\n )\n\n // Define silkscreen path that goes till half of the second pad\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2 + 0.2,\n y: length.parse(parameters.h) / 2 + 0.2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: length.parse(parameters.h) / 2 + 0.2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: -length.parse(parameters.h) / 2 - 0.2,\n },\n {\n x: length.parse(parameters.p) / 2 + 0.2,\n y: -length.parse(parameters.h) / 2 - 0.2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\nexport const getSodCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"3,05mm\"),\n h: z.string().default(\"1.65mm\"),\n pl: z.string().default(\"0.6mm\"),\n pw: z.string().default(\"0.6mm\"),\n pad_spacing: z.string().default(\"2.2mm\"),\n})\n\nexport const sod323f = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h),\n 0.3,\n )\n\n // Define silkscreen path that goes till half of the second pad\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.pad_spacing) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.pad_spacing) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\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\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n pad_spacing: Number.parseFloat(parameters.pad_spacing),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"4.4mm\"),\n h: z.string().default(\"2.1mm\"),\n pl: z.string().default(\"1.2mm\"),\n pw: z.string().default(\"1.2mm\"),\n p: z.string().default(\"2.9mm\"),\n})\n\nexport const sod123f = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h),\n 0.3,\n )\n\n // Define silkscreen path that goes till half of the second pad\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\nexport const getSodCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod123FL_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"4.4mm\"),\n h: z.string().default(\"2.1mm\"),\n pl: z.string().default(\"0.91mm\"),\n pw: z.string().default(\"1.22mm\"),\n p: z.string().default(\"3.146mm\"),\n})\n\nexport const sod123fl = (\n raw_params: z.input<typeof sod123FL_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod123FL_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h),\n 0.3,\n )\n\n // Define silkscreen path that goes till half of the second pad\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\nexport const getSodCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod123FL_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"1.80mm\"),\n h: z.string().default(\"1.00mm\"),\n pl: z.string().default(\"0.66mm\"),\n pw: z.string().default(\"0.5mm\"),\n p: z.string().default(\"0.8mm\"),\n})\n\nexport const sod723 = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h),\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.1,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.1,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\nexport const getSodCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"6.2mm\"),\n h: z.string().default(\"3.4mm\"),\n pl: z.string().default(\"1.4mm\"),\n pw: z.string().default(\"2.1mm\"),\n p: z.string().default(\"4.4mm\"),\n})\n\nexport const sod128 = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) / 2 + 0.4,\n 0.3,\n )\n\n // Define silkscreen path that goes till half of the second pad\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\nexport const getSodCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sot89_def = base_def.extend({\n fn: z.string(),\n num_pins: z.union([z.literal(3), z.literal(5)]).default(3),\n w: z.string().default(\"4.20mm\"),\n h: z.string().default(\"4.80mm\"),\n pl: z.string().default(\"1.3mm\"),\n pw: z.string().default(\"0.9mm\"),\n p: z.string().default(\"1.5mm\"),\n string: z.string().optional(),\n})\n\nexport const sot89_3 = (parameters: z.infer<typeof sot89_def>) => {\n const pads: AnyCircuitElement[] = []\n\n const padGap = Number.parseFloat(parameters.p)\n const padWidth = Number.parseFloat(parameters.pw)\n const length = Number.parseFloat(parameters.w)\n const padHeight = Number.parseFloat(parameters.pl)\n const centerExtra = 0.175\n const outerPadXShift = (padHeight - (padHeight + centerExtra)) / 2\n\n pads.push(\n rectpad(1, -length / 2 + outerPadXShift, padGap, padHeight, padWidth),\n rectpad(2, -length / 2, 0, padHeight + centerExtra, padWidth),\n rectpad(3, -length / 2 + outerPadXShift, -padGap, padHeight, padWidth),\n )\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, 0, 0.3)\n\n const width = Number.parseFloat(parameters.w) / 2 - 1\n const height = Number.parseFloat(parameters.h) / 2\n const silkscreenPath1: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -width, y: height },\n { x: width, y: height },\n { x: width, y: height / 2 + 0.5 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n const silkscreenPath2: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_2\",\n route: [\n { x: -width, y: -height },\n { x: width, y: -height },\n { x: width, y: -height / 2 - 0.5 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n\n return [\n ...pads,\n silkscreenPath1,\n silkscreenPath2,\n silkscreenRefText as AnyCircuitElement,\n ]\n}\n\nexport const sot89_5 = (parameters: z.infer<typeof sot89_def>) => {\n const pads: AnyCircuitElement[] = []\n\n const padGap = Number.parseFloat(parameters.p)\n const padWidth = Number.parseFloat(parameters.pw)\n const length = Number.parseFloat(parameters.w)\n\n pads.push(\n rectpad(1, -1.85, -1.5, 1.5, 0.7),\n rectpad(2, -1.85, 1.5, 1.5, 0.7),\n rectpad(3, 0, 0, 0.8, 2),\n rectpad(4, 1.85, -1.5, 1.5, 0.7),\n rectpad(5, 1.85, 1.5, 1.5, 0.7),\n )\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n Number.parseFloat(parameters.h) / 2 + 0.5,\n 0.3,\n )\n\n const width = Number.parseFloat(parameters.w) / 2 - 1\n const height = Number.parseFloat(parameters.h) / 2\n const silkscreenPath1: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -width, y: height },\n { x: width, y: height },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n const silkscreenPath2: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_2\",\n route: [\n { x: -width, y: -height },\n { x: width, y: -height },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n\n return [\n ...pads,\n silkscreenPath1,\n silkscreenPath2,\n silkscreenRefText as AnyCircuitElement,\n ]\n}\n\nexport const sot89 = (\n raw_params: z.input<typeof sot89_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const match = raw_params.string?.match(/^sot89_(\\d+)/)\n const numPins = match ? Number.parseInt(match[1]!, 10) : 3\n\n const parameters = sot89_def.parse({\n ...raw_params,\n num_pins: numPins,\n })\n\n if (parameters.num_pins === 3) {\n return {\n circuitJson: sot89_3(parameters),\n parameters: parameters,\n }\n }\n\n if (parameters.num_pins === 5) {\n return {\n circuitJson: sot89_5(parameters),\n parameters: parameters,\n }\n }\n\n throw new Error(\"Invalid number of pins for SOT89\")\n}\n","import {\n type AnyCircuitElement,\n type PcbSilkscreenPath,\n length,\n} from \"circuit-json\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { z } from \"zod\"\nimport { type SilkscreenRef, silkscreenRef } from \"../helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const to220_def = base_def.extend({\n fn: z.string(),\n p: length.optional().default(\"5.0mm\"),\n id: length.optional().default(\"1.0mm\"),\n od: length.optional().default(\"1.9mm\"),\n w: length.optional().default(\"13mm\"),\n h: length.optional().default(\"7mm\"),\n num_pins: z.number().optional(),\n string: z.string().optional(),\n})\n\nexport type To220Def = z.input<typeof to220_def>\n\nexport const to220 = (\n raw_params: To220Def,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = to220_def.parse(raw_params)\n const { fn, id, od, w, h, string } = parameters\n\n const numPins = Number.parseInt(string?.split(\"_\")[1] ?? \"3\")\n\n const holeY = -1\n const halfWidth = w / 2\n const halfHeight = h / 2\n\n const minPitch = 2.5\n const maxHoleWidth = w * 0.4\n const computedPitch = Math.max(minPitch, maxHoleWidth / (numPins - 1))\n\n const plated_holes = Array.from({ length: numPins }, (_, i) => {\n const x =\n numPins % 2 === 0\n ? (i - numPins / 2 + 0.5) * computedPitch\n : (i - Math.floor(numPins / 2)) * computedPitch\n return platedhole(i + 1, x, holeY, id, od)\n })\n\n const silkscreenBody: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -halfWidth, y: -halfHeight },\n { x: halfWidth, y: -halfHeight },\n { x: halfWidth, y: halfHeight },\n { x: -halfWidth, y: halfHeight },\n { x: -halfWidth, y: -halfHeight },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n const yLine = -halfHeight + (2 * h) / 3\n const horizontalLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -halfWidth, y: yLine },\n { x: halfWidth, y: yLine },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n const verticalLines: PcbSilkscreenPath[] = [\n {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -w / 6, y: yLine },\n { x: -w / 6, y: halfHeight },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n },\n {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: w / 6, y: yLine },\n { x: w / 6, y: halfHeight },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n },\n ]\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, h / 2 + 0.6, 0.5)\n\n return {\n circuitJson: [\n ...plated_holes,\n silkscreenBody,\n horizontalLine,\n ...verticalLines,\n silkscreenRefText as AnyCircuitElement,\n ],\n parameters: { ...parameters, p: computedPitch },\n }\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const minimelf_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"5.40mm\"),\n h: z.string().default(\"2.30mm\"),\n pl: z.string().default(\"1.30mm\"),\n pw: z.string().default(\"1.70mm\"),\n p: z.string().default(\"3.5mm\"),\n})\n\nexport const minimelf = (\n raw_params: z.input<typeof minimelf_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = minimelf_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) / 2 + 0.4,\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: miniMelfWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\nexport const getMiniMelfCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n return pn === 1 ? { x: -p / 2, y: 0 } : { x: p / 2, y: 0 }\n}\n\nexport const miniMelfWithoutParsing = (\n parameters: z.infer<typeof minimelf_def>,\n) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getMiniMelfCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"1.90mm\"),\n h: z.string().default(\"1.33mm\"),\n pl: z.string().default(\"0.5mm\"),\n pw: z.string().default(\"0.7mm\"),\n p: z.string().default(\"0.8mm\"),\n})\n\nexport const sod882d = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) + 0.1,\n 0.3,\n )\n\n // Define silkscreen path that goes till half of the second pad\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2 + 0.1,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2 + 0.1,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\nexport const getSodCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const melf_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"7.0mm\"),\n h: z.string().default(\"3.35mm\"),\n pl: z.string().default(\"1.50mm\"),\n pw: z.string().default(\"2.70mm\"),\n p: z.string().default(\"4.8mm\"),\n})\n\nexport const melf = (\n raw_params: z.input<typeof melf_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = melf_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h),\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: melfWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\nexport const getMelfCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\nexport const melfWithoutParsing = (parameters: z.infer<typeof melf_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getMelfCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const micromelf_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"3.0mm\"),\n h: z.string().default(\"1.80mm\"),\n pl: z.string().default(\"0.80mm\"),\n pw: z.string().default(\"1.20mm\"),\n p: z.string().default(\"1.6mm\"),\n})\n\nexport const micromelf = (\n raw_params: z.input<typeof micromelf_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = micromelf_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h),\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.1,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.1,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: microMelfWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\nexport const getMicroMelfCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\nexport const microMelfWithoutParsing = (\n parameters: z.infer<typeof micromelf_def>,\n) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getMicroMelfCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sma_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"7.10mm\"),\n h: z.string().default(\"3.40mm\"),\n pl: z.string().default(\"2.45mm\"),\n pw: z.string().default(\"1.80mm\"),\n p: z.string().default(\"4.05mm\"),\n})\n\nexport const sma = (\n raw_params: z.input<typeof sma_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sma_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) / 2 + 0.5,\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.5,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.5,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: smaWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for sma pads\nexport const getSmaCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n }\n return { x: p / 2, y: 0 }\n}\n\n// Function to generate sma pads\nexport const smaWithoutParsing = (parameters: z.infer<typeof sma_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSmaCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const smf_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"4.80mm\"),\n h: z.string().default(\"2.10mm\"),\n pl: z.string().default(\"1.30mm\"),\n pw: z.string().default(\"1.40mm\"),\n p: z.string().default(\"2.9mm\"),\n})\n\nexport const smf = (\n raw_params: z.input<typeof smf_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = smf_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) - 0.5,\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: smfWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for smf pads\nexport const getSmfCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\n// Function to generate smf pads\nexport const smfWithoutParsing = (parameters: z.infer<typeof smf_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSmfCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const smb_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"7.30mm\"),\n h: z.string().default(\"4.40mm\"),\n pl: z.string().default(\"2.50mm\"),\n pw: z.string().default(\"2.30mm\"),\n p: z.string().default(\"4.30mm\"),\n})\n\nexport const smb = (\n raw_params: z.input<typeof smb_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = smb_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) / 2 + 0.5,\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.1,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.1,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: smbWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for smb pads\nexport const getSmbCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\n// Function to generate smb pads\nexport const smbWithoutParsing = (parameters: z.infer<typeof smb_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSmbCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const smc_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"10.70mm\"),\n h: z.string().default(\"6.60mm\"),\n pl: z.string().default(\"3.30mm\"),\n pw: z.string().default(\"2.50mm\"),\n p: z.string().default(\"6.80mm\"),\n})\n\nexport const smc = (\n raw_params: z.input<typeof smc_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = smc_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, 3, 0.3)\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2 - 0.8,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.8,\n y: length.parse(parameters.h) / 2 - 0.8,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.8,\n y: -length.parse(parameters.h) / 2 + 0.8,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2 + 0.8,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: smcWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for smc pads\nexport const getSmcCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n }\n return { x: p / 2, y: 0 }\n}\n\n// Function to generate smc pads\nexport const smcWithoutParsing = (parameters: z.infer<typeof smc_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSmcCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sot223_def = base_def.extend({\n fn: z.string(),\n num_pins: z.number().default(4),\n w: z.string().default(\"8.50mm\"),\n h: z.string().default(\"6.90mm\"),\n pl: z.string().default(\"2mm\"),\n pw: z.string().default(\"1.5mm\"),\n p: z.string().default(\"2.30mm\"),\n string: z.string().optional(),\n})\n\nexport const sot223 = (\n raw_params: z.input<typeof sot223_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const match = raw_params.string?.match(/^sot223_(\\d+)/)\n const numPins = match ? Number.parseInt(match[1]!, 10) : 4\n\n if (numPins === 8) {\n const parameters = sot223_8_def.parse({\n ...raw_params,\n num_pins: numPins,\n })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters: parameters,\n }\n }\n\n const parameters = sot223_def.parse({\n ...raw_params,\n num_pins: numPins,\n })\n\n if (parameters.num_pins === 4) {\n return {\n circuitJson: sot223_4(parameters),\n parameters: parameters,\n }\n }\n if (parameters.num_pins === 5) {\n return {\n circuitJson: sot223_5(parameters),\n parameters: parameters,\n }\n }\n if (parameters.num_pins === 6) {\n return {\n circuitJson: sot223_6(parameters),\n parameters: parameters,\n }\n }\n throw new Error(\"Invalid number of pins\")\n}\nexport const get2CcwSot223Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n p: number\n}) => {\n const { pn, w, h, pl, p } = parameters\n\n if (pn === 1) {\n return { x: -w / 2 + 1.1, y: p }\n }\n if (pn === 2) {\n return { x: -w / 2 + 1.1, y: 0 }\n }\n if (pn === 3) {\n return { x: -w / 2 + 1.1, y: -p }\n }\n\n return { x: w / 2 - 1.1, y: 0 }\n}\n\nexport const sot223_4 = (parameters: z.infer<typeof sot223_def>) => {\n const pads: AnyCircuitElement[] = []\n\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = get2CcwSot223Coords({\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 p: Number.parseFloat(parameters.p),\n })\n\n const pinWidth = i === 3 ? 3.8 : Number.parseFloat(parameters.pw)\n\n pads.push(rectpad(i + 1, x, y, Number.parseFloat(parameters.pl), pinWidth))\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, 0, 0.3)\n\n const width = Number.parseFloat(parameters.w) / 2 - 2.4\n const height = Number.parseFloat(parameters.h) / 2\n const silkscreenPath1: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -width, y: height },\n { x: width, y: height },\n { x: width, y: height / 2 + 0.5 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n const silkscreenPath2: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_2\",\n route: [\n { x: -width, y: -height },\n { x: width, y: -height },\n { x: width, y: -height / 2 - 0.5 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n\n return [\n ...pads,\n silkscreenPath1,\n silkscreenPath2,\n silkscreenRefText as AnyCircuitElement,\n ]\n}\n\nexport const sot223_8_def = extendSoicDef({\n p: \"0.90mm\",\n w: \"2.8mm\",\n legsoutside: true,\n})\n\nexport const get2CcwSot2235Coords = (parameters: {\n h: number\n p: number\n pn: number\n w: number\n}) => {\n const { p, h, pn, w } = parameters\n if (pn === 1) {\n return { x: -w / 2 + 1.2, y: p / 2 + p }\n }\n if (pn === 2) {\n return { x: -w / 2 + 1.2, y: p / 2 }\n }\n if (pn === 3) {\n return { x: -w / 2 + 1.2, y: -p / 2 }\n }\n if (pn === 4) {\n return { x: -w / 2 + 1.2, y: -p / 2 - p }\n }\n if (pn === 5) {\n return { x: w / 2 - 1, y: 0 }\n }\n throw new Error(\"Invalid pin number\")\n}\n\nexport const sot223_5 = (parameters: z.infer<typeof sot223_def>) => {\n const pads: AnyCircuitElement[] = []\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = get2CcwSot2235Coords({\n h: Number.parseFloat(parameters.h),\n p: 1.5,\n pn: i,\n w: Number.parseFloat(parameters.w),\n })\n\n let pinWidth = Number.parseFloat(parameters.pw)\n let pinLength = Number.parseFloat(parameters.pl)\n\n if (i === 5) {\n pinWidth = 3.4\n pinLength = 1.8\n } else {\n pinWidth = 1\n pinLength = 2.2\n }\n\n pads.push(rectpad(i, x, y, pinLength, pinWidth))\n }\n\n const width = Number.parseFloat(parameters.w) / 2 - 2.4\n const height = Number.parseFloat(parameters.h) / 2\n const silkscreenPath1: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -width, y: height },\n { x: width, y: height },\n { x: width, y: height / 2 + 0.5 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n const silkscreenPath2: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_2\",\n route: [\n { x: -width, y: -height },\n { x: width, y: -height },\n { x: width, y: -height / 2 - 0.5 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, 0, 0.3)\n\n return [...pads, silkscreenPath1, silkscreenPath2, silkscreenRefText]\n}\n\nexport const get2CcwSot2236Coords = (parameters: {\n h: number\n p: number\n pn: number\n w: number\n}) => {\n const { p, h, pn, w } = parameters\n if (pn === 1) {\n return { x: -w / 2 + 1.2, y: 2 * p }\n }\n if (pn === 2) {\n return { x: -w / 2 + 1.2, y: p }\n }\n if (pn === 3) {\n return { x: -w / 2 + 1.2, y: 0 }\n }\n if (pn === 4) {\n return { x: -w / 2 + 1.2, y: -p }\n }\n if (pn === 5) {\n return { x: -w / 2 + 1.2, y: -2 * p }\n }\n if (pn === 6) {\n return { x: w / 2 - 1.175, y: 0 }\n }\n throw new Error(\"Invalid pin number\")\n}\n\nexport const sot223_6 = (parameters: z.infer<typeof sot223_def>) => {\n const pads: AnyCircuitElement[] = []\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = get2CcwSot2236Coords({\n h: Number.parseFloat(parameters.h),\n p: 1.3,\n pn: i,\n w: 8.7,\n })\n\n let pinWidth = Number.parseFloat(parameters.pw)\n let pinLength = Number.parseFloat(parameters.pl)\n\n if (i === 6) {\n pinWidth = 3.4\n pinLength = 2.15\n } else {\n pinWidth = 0.6\n pinLength = 2.2\n }\n\n pads.push(rectpad(i, x, y, pinLength, pinWidth))\n }\n\n const width = Number.parseFloat(parameters.w) / 2 - 2.4\n const height = Number.parseFloat(parameters.h) / 2\n const silkscreenPath1: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -width, y: height },\n { x: width, y: height },\n { x: width, y: height / 2 + 0.5 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n const silkscreenPath2: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_2\",\n route: [\n { x: -width, y: -height },\n { x: width, y: -height },\n { x: width, y: -height / 2 - 0.5 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, 0, 0.3)\n\n return [...pads, silkscreenPath1, silkscreenPath2, silkscreenRefText]\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sot23w_def = base_def.extend({\n fn: z.string(),\n num_pins: z.number().default(3),\n w: z.string().default(\"3.40mm\"),\n h: z.string().default(\"3.30mm\"),\n pl: z.string().default(\"1mm\"),\n pw: z.string().default(\"0.7mm\"),\n p: z.string().default(\"1.2mm\"),\n string: z.string().optional(),\n})\n\nexport const sot23w = (\n raw_params: z.input<typeof sot23w_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const match = raw_params.string?.match(/^sot23w_(\\d+)/)\n const numPins = match ? Number.parseInt(match[1]!, 3) : 3\n\n const parameters = sot23w_def.parse({\n ...raw_params,\n num_pins: numPins,\n })\n\n if (parameters.num_pins === 3) {\n return {\n circuitJson: sot23w_3(parameters),\n parameters: parameters,\n }\n }\n\n throw new Error(\"Invalid number of pins\")\n}\n\nexport const getCcwSot23wCoords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n p: number\n}) => {\n const { pn, w, h, pl, p } = parameters\n\n if (pn === 1) {\n return { x: -p, y: 0.95 }\n }\n if (pn === 2) {\n return { x: -p, y: -0.95 }\n }\n\n return { x: p, y: 0 }\n}\n\nexport const sot23w_3 = (parameters: z.infer<typeof sot23w_def>) => {\n const pads: AnyCircuitElement[] = []\n\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSot23wCoords({\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 p: Number.parseFloat(parameters.p),\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\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n Number.parseInt(parameters.h) / 2 + 1,\n 0.3,\n )\n\n const width = Number.parseFloat(parameters.w) / 2 - 1\n const height = Number.parseFloat(parameters.h) / 2\n const silkscreenPath1: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -width, y: height },\n { x: width + 0.3, y: height },\n { x: width + 0.3, y: height / 2 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n const silkscreenPath2: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_2\",\n route: [\n { x: -width, y: -height },\n { x: width + 0.3, y: -height },\n { x: width + 0.3, y: -height / 2 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n\n return [\n ...pads,\n silkscreenPath1,\n silkscreenPath2,\n silkscreenRefText as AnyCircuitElement,\n ]\n}\n","import { z } from \"zod\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const to92s_def = base_def.extend({\n fn: z.string(),\n num_pins: z.union([z.literal(3), z.literal(2)]).default(3),\n p: z.string().default(\"1.27mm\"),\n id: z.string().default(\"0.72mm\"),\n od: z.string().default(\"0.95mm\"),\n w: z.string().default(\"2.5mm\"),\n h: z.string().default(\"4.2mm\"),\n string: z.string().optional(),\n})\n\nexport const to92s_3 = (parameters: z.infer<typeof to92s_def>) => {\n const { p, id, od, w, h } = parameters\n const holeY = Number.parseFloat(h) / 2\n const padSpacing = Number.parseFloat(p)\n\n return [\n platedhole(1, -padSpacing, holeY - padSpacing, id, od),\n platedhole(2, 0, holeY - padSpacing, id, od),\n\n platedhole(3, padSpacing, holeY - padSpacing, id, od),\n ]\n}\n\nexport const to92s_2 = (parameters: z.infer<typeof to92s_def>) => {\n const { p, id, od, h } = parameters\n const holeY = Number.parseFloat(h) / 2\n const padSpacing = Number.parseFloat(p)\n\n return [\n platedhole(1, -padSpacing, holeY - padSpacing, id, od),\n platedhole(2, padSpacing, holeY - padSpacing, id, od),\n ]\n}\n\nexport const to92s = (\n raw_params: z.input<typeof to92s_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const match = raw_params.string?.match(/^to92s_(\\d+)/)\n const numPins = match ? Number.parseInt(match[1]!, 10) : 3\n\n const parameters = to92s_def.parse({\n ...raw_params,\n num_pins: numPins,\n })\n\n let platedHoles: AnyCircuitElement[] = []\n\n if (parameters.num_pins === 3) {\n platedHoles = to92s_3(parameters)\n } else if (parameters.num_pins === 2) {\n platedHoles = to92s_2(parameters)\n } else {\n throw new Error(\"Invalid number of pins for TO-92\")\n }\n\n const holeY = Number.parseFloat(parameters.h) / 2\n const padSpacing = Number.parseFloat(parameters.p)\n\n const silkscreenBody: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -holeY, y: holeY - padSpacing },\n { x: -1.9, y: 0 },\n { x: 1.9, y: 0 },\n { x: holeY, y: holeY - padSpacing },\n { x: 1.5, y: Number.parseFloat(parameters.h) / 2 + 0.5 },\n { x: -1.5, y: Number.parseFloat(parameters.h) / 2 + 0.5 },\n { x: -holeY, y: holeY - padSpacing },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, holeY + 1, 0.5)\n\n return {\n circuitJson: [\n ...platedHoles,\n silkscreenBody,\n silkscreenRefText as AnyCircuitElement,\n ],\n parameters,\n }\n}\n","import {\n length,\n type AnySoupElement,\n type PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { z } from \"zod\"\n\nimport { platedHoleWithRectPad } from \"src/helpers/platedHoleWithRectPad\"\nimport { rectpad } from \"src/helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const jst_def = base_def.extend({\n fn: z.string(),\n p: length.optional(),\n id: length.optional(),\n pw: length.optional(),\n pl: length.optional(),\n w: length.optional(),\n h: length.optional(),\n sh: z\n .union([z.boolean(), z.string(), z.number()])\n .optional()\n .transform((v) => {\n if (typeof v === \"string\") {\n const n = Number(v)\n return Number.isNaN(n) ? true : n\n }\n return v\n })\n .describe(\n 'JST SH (Surface-mount) connector family. SH stands for \"Super High-density\".',\n ),\n\n ph: z\n .boolean()\n .optional()\n .describe(\n 'JST PH (Through-hole) connector family. PH stands for \"Pin Header\".',\n ),\n\n string: z.string().optional(),\n})\n\nexport type jstDef = z.input<typeof jst_def>\n\n// Variant type\ntype JstVariant = \"ph\" | \"sh\"\n\nconst variantDefaults: Record<JstVariant, any> = {\n ph: {\n p: length.parse(\"2.2mm\"),\n id: length.parse(\"0.70mm\"),\n pw: length.parse(\"1.20mm\"),\n pl: length.parse(\"1.20mm\"),\n w: length.parse(\"6mm\"),\n h: length.parse(\"5mm\"),\n },\n sh: {\n p: length.parse(\"1mm\"),\n pw: length.parse(\"0.6mm\"),\n pl: length.parse(\"1.55mm\"),\n w: length.parse(\"5.8mm\"),\n h: length.parse(\"7.8mm\"),\n },\n}\n\nfunction getVariant(params: jstDef): JstVariant {\n if (params.sh) return \"sh\"\n if (params.ph) return \"ph\"\n return \"ph\"\n}\n\nfunction generatePads(\n variant: JstVariant,\n numPins: number,\n p: number,\n id: number,\n pw: number,\n pl: number,\n): AnySoupElement[] {\n const pads: AnySoupElement[] = []\n\n if (variant === \"ph\") {\n const half_p = p / 2\n pads.push(platedHoleWithRectPad(1, -half_p, 2, id, pw, pl))\n pads.push(platedHoleWithRectPad(2, half_p, 2, id, pw, pl))\n } else {\n const startX = -((numPins - 1) / 2) * p\n for (let i = 0; i < numPins; i++) {\n const x = startX + i * p\n console.log(\"x si\", x)\n pads.push(rectpad(i + 1, x, -1.325, pw, pl))\n }\n\n const sideOffset = ((numPins - 1) / 2) * p + 1.3\n console.log(\"offset\", sideOffset)\n pads.push(rectpad(numPins + 1, -sideOffset, 1.22, 1.2, 1.8))\n pads.push(rectpad(numPins + 2, sideOffset, 1.22, 1.2, 1.8))\n }\n\n return pads\n}\n\nfunction generateSilkscreenBody(\n variant: JstVariant,\n w: number,\n h: number,\n): PcbSilkscreenPath {\n if (variant === \"ph\") {\n return {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -3, y: 3 },\n { x: 3, y: 3 },\n { x: 3, y: -2 },\n { x: -3, y: -2 },\n { x: -3, y: 3 },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n } else {\n return {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n }\n}\n\nexport const jst = (\n raw_params: jstDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const params = jst_def.parse(raw_params)\n const variant = getVariant(params)\n const defaults = variantDefaults[variant]\n\n const p = params.p ?? defaults.p\n const id = params.id ?? defaults.id\n const pw = params.pw ?? defaults.pw\n const pl = params.pl ?? defaults.pl\n const w = params.w ?? defaults.w\n const h = params.h ?? defaults.h\n\n let numPins = variant === \"sh\" ? 4 : 2\n\n if (variant === \"sh\") {\n const str = typeof raw_params.string === \"string\" ? raw_params.string : \"\"\n const match = str.match(/sh(\\d+)/)\n if (match && match[1]) {\n const parsed = parseInt(match[1], 10)\n if (!Number.isNaN(parsed)) {\n numPins = parsed\n }\n } else if (typeof params.sh === \"number\") {\n numPins = params.sh\n }\n }\n\n const pads = generatePads(variant, numPins, p, id, pw, pl)\n const silkscreenBody = generateSilkscreenBody(variant, w, h)\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, h / 2 + 1, 0.5)\n\n return {\n circuitJson: [...pads, silkscreenBody, silkscreenRefText as AnySoupElement],\n parameters: {\n ...params,\n p,\n id,\n pw,\n pl,\n w,\n h,\n num_pins: numPins,\n sh: variant === \"sh\",\n ph: variant === \"ph\",\n },\n }\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"3.30mm\"),\n h: z.string().default(\"1.70mm\"),\n pl: z.string().default(\"0.80mm\"),\n pw: z.string().default(\"1mm\"),\n p: z.string().default(\"1.90mm\"),\n})\n\nexport const sod110 = (\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 length.parse(parameters.h) / 2 + 0.5,\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\nexport const getSodCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n }\n\n return { x: p / 2, y: 0 }\n}\n\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type {\n AnyCircuitElement,\n AnySoupElement,\n PcbFabricationNoteText,\n PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nconst getDefaultValues = (num_pins: number) => {\n switch (num_pins) {\n case 8:\n return {\n w: \"3.06mm\",\n h: \"3.14mm\",\n p: \"0.65mm\",\n pl: \"1.6mm\",\n pw: \"0.5mm\",\n }\n case 10:\n return {\n w: \"3.10mm\",\n h: \"3.33mm\",\n p: \"0.5mm\",\n pl: \"1.45mm\",\n pw: \"0.3mm\",\n }\n default:\n return {\n w: \"3.06mm\",\n h: \"3.14mm\",\n p: \"0.65mm\",\n pl: \"1.6mm\",\n pw: \"0.5mm\",\n }\n }\n}\n\nexport const vssop_def = base_def.extend({\n fn: z.string(),\n num_pins: z.union([z.literal(8), z.literal(10)]).default(8),\n w: z.string().optional(),\n h: z.string().optional(),\n p: z.string().optional(),\n pl: z.string().optional(),\n pw: z.string().optional(),\n string: z.string().optional(),\n})\n\nexport const vssop = (\n raw_params: z.input<typeof vssop_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = vssop_def.parse(raw_params)\n const defaults = getDefaultValues(parameters.num_pins)\n\n const w = length.parse(parameters.w || defaults.w)\n const h = length.parse(parameters.h || defaults.h)\n const p = length.parse(parameters.p || defaults.p)\n const pl = length.parse(parameters.pl || defaults.pl)\n const pw = length.parse(parameters.pw || defaults.pw)\n\n const pads: AnyCircuitElement[] = []\n const half = parameters.num_pins / 2\n\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getVssopPadCoord(parameters.num_pins, i + 1, w, p)\n const logical_pn = i < half ? i + 1 : parameters.num_pins - (i - half)\n pads.push(rectpad(logical_pn, x, y, pl, pw))\n }\n\n const silkscreenBoxWidth = w\n const silkscreenBoxHeight = h\n\n const silkscreenTopLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -silkscreenBoxWidth / 2, y: silkscreenBoxHeight / 2 },\n { x: silkscreenBoxWidth / 2, y: silkscreenBoxHeight / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenBottomLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -silkscreenBoxWidth / 2, y: -silkscreenBoxHeight / 2 },\n { x: silkscreenBoxWidth / 2, y: -silkscreenBoxHeight / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const pin1Position = getVssopPadCoord(\n parameters.num_pins,\n 1,\n silkscreenBoxWidth,\n p,\n )\n\n const pin1MarkerPosition = {\n x: pin1Position.x - 0.8,\n y: pin1Position.y,\n }\n\n const pin1Marking: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"pin_marker_1\",\n route: [\n { x: pin1MarkerPosition.x - 0.4, y: pin1MarkerPosition.y },\n { x: pin1MarkerPosition.x - 0.7, y: pin1MarkerPosition.y + 0.3 },\n { x: pin1MarkerPosition.x - 0.7, y: pin1MarkerPosition.y - 0.3 },\n { x: pin1MarkerPosition.x - 0.4, y: pin1MarkerPosition.y },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"pin_marker_1\",\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n silkscreenBoxHeight / 2 + 0.5,\n 0.3,\n )\n\n return {\n circuitJson: [\n ...pads,\n silkscreenTopLine,\n silkscreenBottomLine,\n silkscreenRefText,\n pin1Marking,\n ],\n parameters,\n }\n}\n\n// Get coordinates for VSSOP pads\nconst getVssopPadCoord = (\n pinCount: number,\n pn: number,\n w: number,\n p: number,\n) => {\n const half = pinCount / 2\n const rowIndex = (pn - 1) % half\n const col = pn <= half ? -1 : 1\n const row = (half - 1) / 2 - rowIndex\n\n return {\n x: col * length.parse(pinCount === 8 ? \"1.8mm\" : \"2.2mm\"),\n y: row * p,\n }\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nconst getDefaultValues = (num_pins: number) => {\n switch (num_pins) {\n case 10:\n return {\n w: \"3.10mm\",\n h: \"3.32mm\",\n p: \"0.5mm\",\n pl: \"1.63mm\",\n pw: \"0.33mm\",\n }\n case 12:\n return {\n w: \"3mm\",\n h: \"4mm\",\n p: \"0.65mm\",\n pl: \"0.88mm\",\n pw: \"0.4mm\",\n }\n case 16:\n return {\n w: \"3.10mm\",\n h: \"4mm\",\n p: \"0.5mm\",\n pl: \"0.88mm\",\n pw: \"0.3mm\",\n }\n default:\n return {\n w: \"3.10mm\",\n h: \"3.32mm\",\n p: \"0.65mm\",\n pl: \"1.63mm\",\n pw: \"0.4mm\",\n }\n }\n}\n\nexport const msop_def = base_def.extend({\n fn: z.string(),\n num_pins: z\n .union([z.literal(8), z.literal(10), z.literal(12), z.literal(16)])\n .default(8),\n w: z.string().optional(),\n h: z.string().optional(),\n p: z.string().optional(),\n pl: z.string().optional(),\n pw: z.string().optional(),\n string: z.string().optional(),\n})\n\nconst getMsopCoords = (pinCount: number, pn: number, w: number, p: number) => {\n const half = pinCount / 2\n const rowIndex = (pn - 1) % half\n const col = pn <= half ? -1 : 1\n const row = (half - 1) / 2 - rowIndex\n\n return {\n x: col * length.parse(\"2mm\"),\n y: row * p,\n }\n}\n\nexport const msop = (\n raw_params: z.input<typeof msop_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = msop_def.parse(raw_params)\n const defaults = getDefaultValues(parameters.num_pins)\n\n const w = length.parse(parameters.w || defaults.w)\n const h = length.parse(parameters.h || defaults.h)\n const p = length.parse(parameters.p || defaults.p)\n const pl = length.parse(parameters.pl || defaults.pl)\n const pw = length.parse(parameters.pw || defaults.pw)\n\n const pads: AnyCircuitElement[] = []\n\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getMsopCoords(parameters.num_pins, i + 1, w, p)\n pads.push(rectpad(i + 1, x, y, pl, pw))\n }\n\n const silkscreenBoxWidth = w\n const silkscreenBoxHeight = h\n\n const silkscreenTopLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -silkscreenBoxWidth / 2, y: silkscreenBoxHeight / 2 },\n { x: silkscreenBoxWidth / 2, y: silkscreenBoxHeight / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenBottomLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -silkscreenBoxWidth / 2, y: -silkscreenBoxHeight / 2 },\n { x: silkscreenBoxWidth / 2, y: -silkscreenBoxHeight / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const pin1Position = getMsopCoords(\n parameters.num_pins,\n 1,\n silkscreenBoxWidth,\n p,\n )\n\n const pin1MarkerPosition = {\n x: pin1Position.x - 0.8,\n y: pin1Position.y,\n }\n\n const pin1Marking: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"pin_marker_1\",\n route: [\n { x: pin1MarkerPosition.x - 0.4, y: pin1MarkerPosition.y },\n { x: pin1MarkerPosition.x - 0.7, y: pin1MarkerPosition.y + 0.3 },\n { x: pin1MarkerPosition.x - 0.7, y: pin1MarkerPosition.y - 0.3 },\n { x: pin1MarkerPosition.x - 0.4, y: pin1MarkerPosition.y },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"pin_marker_1\",\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n silkscreenBoxHeight / 2 + 0.5,\n 0.3,\n )\n\n return {\n circuitJson: [\n ...pads,\n silkscreenTopLine,\n silkscreenBottomLine,\n silkscreenRefText,\n pin1Marking,\n ],\n parameters,\n }\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod323w_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"3.8mm\"),\n h: z.string().default(\"1.65mm\"),\n pl: z.string().default(\"1.2mm\"),\n pw: z.string().default(\"1.2mm\"),\n pad_spacing: z.string().default(\"2.6mm\"),\n})\n\nexport const sod323w = (\n raw_params: z.input<typeof sod323w_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod323w_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h),\n 0.3,\n )\n\n // Define silkscreen path that goes till half of the second pad\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.pad_spacing) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.pad_spacing) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\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\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod323w_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n pad_spacing: Number.parseFloat(parameters.pad_spacing),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod323FL_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"3.20mm\"),\n h: z.string().default(\"1.65mm\"),\n pl: z.string().default(\"0.8mm\"),\n pw: z.string().default(\"0.9mm\"),\n pad_spacing: z.string().default(\"2.1mm\"),\n})\n\nexport const sod323fl = (\n raw_params: z.input<typeof sod323FL_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod323FL_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h),\n 0.3,\n )\n\n // Define silkscreen path that goes till half of the second pad\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.pad_spacing) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.pad_spacing) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\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\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod323FL_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n pad_spacing: Number.parseFloat(parameters.pad_spacing),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const son_def = base_def.extend({\n fn: z.string(),\n num_pins: z.union([z.literal(6), z.literal(8)]).default(8),\n w: z.string().default(\"3mm\"),\n h: z.string().default(\"3mm\"),\n p: z.string().default(\"0.5mm\"),\n pl: z.string().default(\"0.52mm\"),\n pw: z.string().default(\"0.35mm\"),\n epw: z.string().default(\"1.40mm\"),\n eph: z.string().default(\"1.60mm\"),\n string: z.string().optional(),\n ep: z.boolean().default(false),\n})\n\nexport const son = (\n raw_params: z.input<typeof son_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n if (raw_params.string && raw_params.string.includes(\"_ep\")) {\n raw_params.ep = true\n }\n\n const match = raw_params.string?.match(/^son_(\\d+)/)\n const numPins = match\n ? Number.parseInt(match[1]!, 10)\n : raw_params.num_pins || 8\n\n const parameters = son_def.parse({\n ...raw_params,\n num_pins: numPins as 6 | 8,\n })\n\n const w = length.parse(parameters.w)\n const h = length.parse(parameters.h)\n const p = length.parse(parameters.p)\n const pl = length.parse(parameters.pl)\n const pw = length.parse(parameters.pw)\n const epw = length.parse(parameters.epw)\n const eph = length.parse(parameters.eph)\n\n const pads: AnyCircuitElement[] = []\n\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getSonPadCoord(parameters.num_pins, i + 1, w, p)\n pads.push(rectpad(i + 1, x, y, pl, pw))\n }\n\n if (parameters.ep) {\n pads.push(rectpad(parameters.num_pins + 1, 0, 0, epw, eph))\n }\n\n const silkscreenBoxWidth = w\n const silkscreenBoxHeight = h\n\n const silkscreenTopLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -silkscreenBoxWidth / 2, y: silkscreenBoxHeight / 2 },\n { x: silkscreenBoxWidth / 2, y: silkscreenBoxHeight / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenBottomLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -silkscreenBoxWidth / 2, y: -silkscreenBoxHeight / 2 },\n { x: silkscreenBoxWidth / 2, y: -silkscreenBoxHeight / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const pin1Position = getSonPadCoord(\n parameters.num_pins,\n 1,\n silkscreenBoxWidth,\n p,\n )\n\n const pin1MarkerPosition = {\n x: pin1Position.x - 0.4,\n y: pin1Position.y,\n }\n\n const pin1Marking: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"pin_marker_1\",\n route: [\n { x: pin1MarkerPosition.x - 0.4, y: pin1MarkerPosition.y },\n { x: pin1MarkerPosition.x - 0.7, y: pin1MarkerPosition.y + 0.3 },\n { x: pin1MarkerPosition.x - 0.7, y: pin1MarkerPosition.y - 0.3 },\n { x: pin1MarkerPosition.x - 0.4, y: pin1MarkerPosition.y },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"pin_marker_1\",\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n silkscreenBoxHeight / 2 + 0.5,\n 0.3,\n )\n\n return {\n circuitJson: [\n ...pads,\n silkscreenTopLine,\n silkscreenBottomLine,\n silkscreenRefText,\n pin1Marking,\n ],\n parameters,\n }\n}\n\nexport const getSonPadCoord = (\n num_pins: number,\n pn: number,\n w: number,\n p: number,\n) => {\n const half = num_pins / 2\n const rowIndex = (pn - 1) % half\n const col = pn <= half ? -1 : 1\n const row = (half - 1) / 2 - rowIndex\n\n return {\n x: col * length.parse(\"1.4mm\"),\n y: row * p,\n }\n}\n","import { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef } from \"../helpers/silkscreenRef\"\nimport type { AnyCircuitElement } from \"circuit-json\"\nimport { length } from \"circuit-json\"\n\n/**\n * Solderjumper footprint generator\n * @param params { num_pins: 2 | 3, bridged?: string, p?: number, pw?: number, ph?: number }\n * - num_pins: 2 or 3\n * - bridged: e.g. \"12\" or \"123\" (which pins are connected)\n * - p: pad pitch (default 2.54)\n * - pw: pad width (default 1.5)\n * - ph: pad height (default 1.5)\n *\n * Examples:\n * solderjumper({ num_pins: 2 }) // no pads connected\n * solderjumper({ num_pins: 3, bridged: \"12\" }) // pads 1 and 2 connected\n * solderjumper({ num_pins: 3, bridged: \"123\" }) // all pads connected\n * solderjumper({ num_pins: 3, p: 3.0 }) // custom pitch\n * solderjumper({ num_pins: 3, pw: 2.0, ph: 1.0 }) // custom pad size\n */\nexport const solderjumper = (params: {\n num_pins: 2 | 3\n bridged?: string\n p?: number\n pw?: number\n ph?: number\n}) => {\n const { num_pins, bridged, p = 2.54, pw = 1.5, ph = 1.5 } = params\n const padSpacing = length.parse(p)\n const padWidth = length.parse(pw)\n const padHeight = length.parse(ph)\n const traceWidth = Math.min(padHeight / 4, 0.5)\n const pads: AnyCircuitElement[] = []\n for (let i = 0; i < num_pins; i++) {\n pads.push(rectpad(i + 1, i * padSpacing, 0, padWidth, padHeight))\n }\n let traces: AnyCircuitElement[] = []\n if (bridged) {\n const pins = bridged.split(\"\").map(Number)\n if (pins.length > 1) {\n for (let i = 0; i < pins.length - 1; i++) {\n const from = pins[i]\n const to = pins[i + 1]\n if (\n typeof from === \"number\" &&\n typeof to === \"number\" &&\n !isNaN(from) &&\n !isNaN(to)\n ) {\n const xCenterFrom = (from - 1) * padSpacing\n const xCenterTo = (to - 1) * padSpacing\n\n const directionMult = Math.sign(xCenterTo - xCenterFrom)\n\n const x1 = xCenterFrom + directionMult * (padWidth / 2)\n const x2 = xCenterTo - directionMult * (padWidth / 2)\n\n traces.push({\n type: \"pcb_trace\",\n pcb_trace_id: \"\",\n route: [\n {\n start_pcb_port_id: `{PIN${from}}`,\n x: x1,\n y: 0,\n width: traceWidth,\n layer: \"top\",\n route_type: \"wire\",\n },\n {\n end_pcb_port_id: `{PIN${to}}`,\n x: x2,\n y: 0,\n width: traceWidth,\n layer: \"top\",\n route_type: \"wire\",\n },\n ],\n })\n }\n }\n }\n }\n const outlineWidth = (num_pins - 1) * padSpacing + padWidth + 0.7\n const outlineHeight = padHeight + 1.0\n const outlineCenterX = ((num_pins - 1) * padSpacing) / 2\n const outlineCenterY = 0\n\n const silkscreenRect = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"outline\",\n route: [\n {\n x: outlineCenterX - outlineWidth / 2,\n y: outlineCenterY - outlineHeight / 2,\n },\n {\n x: outlineCenterX + outlineWidth / 2,\n y: outlineCenterY - outlineHeight / 2,\n },\n {\n x: outlineCenterX + outlineWidth / 2,\n y: outlineCenterY + outlineHeight / 2,\n },\n {\n x: outlineCenterX - outlineWidth / 2,\n y: outlineCenterY + outlineHeight / 2,\n },\n {\n x: outlineCenterX - outlineWidth / 2,\n y: outlineCenterY - outlineHeight / 2,\n },\n ],\n stroke_width: 0.15,\n }\n\n const refOffset = 0.6\n const refY = outlineCenterY + outlineHeight / 2 + refOffset\n const silk = silkscreenRef(outlineCenterX, refY, 0.4)\n\n return {\n circuitJson: [...pads, ...traces, silkscreenRect, silk],\n parameters: params,\n }\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { pillpad } from \"../helpers/pillpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nimport { base_def } from \"src/helpers/zod/base_def\"\n\n// Common schema properties for both SOT-457 configurations\nconst commonSchema = {\n fn: z.literal(\"sot457\"),\n num_pins: z.literal(6).default(6),\n pillh: z.string().default(\"0.45mm\"),\n pillw: z.string().default(\"1.45mm\"),\n pl: z.string(),\n pw: z.string(),\n p: z.string(),\n wave: z.boolean().optional(),\n reflow: z.boolean().optional(),\n}\n\n// Default SOT-457 schema\nconst sot457DefSchema = base_def.extend({\n ...commonSchema,\n h: z.string().default(\"2.5mm\"),\n w: z.string().default(\"2.7mm\"),\n pl: z.string().default(\"0.8mm\"),\n pw: z.string().default(\"0.55mm\"),\n p: z.string().default(\"0.95mm\"),\n})\n\n// Wave soldering SOT-457 schema with transform for wave/reflow defaults\nconst sot457WaveSchema = base_def\n .extend({\n ...commonSchema,\n h: z.string().default(\"3mm\"),\n w: z.string().default(\"4mm\"),\n pillr: z.string().default(\"0.225mm\"),\n pl: z.string().default(\"1.45mm\"),\n pw: z.string().default(\"1.5mm\"),\n p: z.string().default(\"1.475mm\"),\n })\n .transform((data) => ({\n ...data,\n wave: data.wave ?? (data.reflow === undefined ? true : !data.reflow),\n reflow: data.reflow ?? (data.wave === undefined ? false : !data.wave),\n }))\n\n// Type definitions\ntype Sot457Params = z.infer<typeof sot457DefSchema>\ntype Sot457WaveParams = z.infer<typeof sot457WaveSchema>\n\n// Helper function to parse dimension strings to numbers\nconst parseDimension = (value: string): number => {\n return Number.parseFloat(value.replace(\"mm\", \"\"))\n}\n\n// Get pin coordinates for counter-clockwise arrangement\nconst getCcwSot457Coords = ({\n pitch,\n width,\n pinNumber,\n}: {\n pitch: number\n width: number\n pinNumber: number\n}): { x: number; y: number } => {\n const offset = 0.1\n const coords: Record<number, { x: number; y: number }> = {\n 1: { x: -width / 2 - offset, y: pitch },\n 2: { x: -width / 2 - offset, y: 0 },\n 3: { x: -width / 2 - offset, y: -pitch },\n 4: { x: width / 2 + offset, y: -pitch },\n 5: { x: width / 2 + offset, y: 0 },\n 6: { x: width / 2 + offset, y: pitch },\n }\n\n const coord = coords[pinNumber]\n if (!coord) {\n throw new Error(`Invalid pin number: ${pinNumber}`)\n }\n return coord\n}\n\n// Generate circuit elements for SOT-457 package\nconst generateSot457Elements = (\n params: Sot457Params | Sot457WaveParams,\n): AnyCircuitElement[] => {\n const pads: AnyCircuitElement[] = []\n const pitch = parseDimension(params.p)\n const padLength = parseDimension(params.pl)\n const padWidth = parseDimension(params.pw)\n const width = parseDimension(params.w)\n const height = parseDimension(params.h)\n\n if (params.wave) {\n const pinConfigs: Record<\n number,\n (args: { padWidth: number; padHeight: number }) => AnyCircuitElement\n > = {\n 1: ({ padWidth, padHeight }) =>\n rectpad(1, -pitch, pitch, padHeight, padWidth),\n 2: ({ padWidth, padHeight }) =>\n rectpad(2, -pitch, -pitch, padHeight, padWidth),\n 3: ({ padWidth, padHeight }) =>\n pillpad(\n 3,\n -pitch,\n 0,\n parseDimension(params.pillw),\n parseDimension(params.pillh),\n ),\n 4: ({ padWidth, padHeight }) =>\n pillpad(\n 4,\n pitch,\n 0,\n parseDimension(params.pillw),\n parseDimension(params.pillh),\n ),\n 5: ({ padWidth, padHeight }) =>\n rectpad(5, pitch, pitch, padHeight, padWidth),\n 6: ({ padWidth, padHeight }) =>\n rectpad(6, pitch, -pitch, padHeight, padWidth),\n }\n\n for (let i = 1; i <= params.num_pins; i++) {\n const config = pinConfigs[i]\n if (config) {\n pads.push(config({ padWidth: padLength, padHeight: padWidth }))\n }\n }\n } else {\n for (let i = 1; i <= params.num_pins; i++) {\n const { x, y } = getCcwSot457Coords({ pitch, width, pinNumber: i })\n pads.push(rectpad(i, x, y, padLength, padWidth))\n }\n }\n\n // Silkscreen paths\n const silkscreenPath1: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -width / 3, y: height / 2 + pitch / 1.3 },\n { x: width / 3, y: height / 2 + pitch / 1.3 },\n ],\n stroke_width: 0.05,\n }\n\n const silkscreenPath2: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_2\",\n route: [\n { x: -width / 3, y: -height / 2 - pitch / 1.3 },\n { x: width / 3, y: -height / 2 - pitch / 1.3 },\n ],\n stroke_width: 0.05,\n }\n\n // Silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, height + 0.5, 0.3)\n\n // Pin 1 indicator triangle\n const pin1Position = getCcwSot457Coords({ pitch, width, pinNumber: 1 })\n const triangleHeight = params.wave ? 1 : 0.5\n const triangleWidth = params.wave ? 0.7 : 0.3\n pin1Position.x -= params.wave ? padWidth : padWidth * 1.7\n\n const pin1Indicator: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"pin1_indicator\",\n route: [\n { x: pin1Position.x + triangleHeight / 2, y: pin1Position.y },\n {\n x: pin1Position.x - triangleHeight / 2,\n y: pin1Position.y + triangleWidth / 2,\n },\n {\n x: pin1Position.x - triangleHeight / 2,\n y: pin1Position.y - triangleWidth / 2,\n },\n { x: pin1Position.x + triangleHeight / 2, y: pin1Position.y },\n ],\n stroke_width: 0.05,\n }\n\n return [\n silkscreenRefText,\n silkscreenPath1,\n silkscreenPath2,\n pin1Indicator,\n ...pads,\n ]\n}\n\n// Main SOT-457 function\nexport const sot457 = (\n rawParams: z.input<typeof sot457DefSchema>,\n): {\n circuitJson: AnyCircuitElement[]\n parameters: Sot457Params | Sot457WaveParams\n} => {\n if (rawParams.wave) {\n const parameters = sot457WaveSchema.parse({ ...rawParams, fn: \"sot457\" })\n return {\n circuitJson: generateSot457Elements(parameters),\n parameters,\n }\n }\n\n const parameters = sot457DefSchema.parse(rawParams)\n return {\n circuitJson: generateSot457Elements(parameters),\n parameters,\n }\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sot963_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(6).default(6),\n w: z.string().default(\"1.1mm\"),\n h: z.string().default(\"1.45mm\"),\n p: z.string().default(\"0.35mm\"),\n pl: z.string().default(\"0.2mm\"),\n pw: z.string().default(\"0.2mm\"),\n string: z.string().optional(),\n})\n\nexport const sot963 = (\n raw_params: z.input<typeof sot963_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = sot963_def.parse({ ...raw_params, fn: \"sot963\" })\n\n const w = length.parse(parameters.w)\n const h = length.parse(parameters.h)\n const p = length.parse(parameters.p)\n const pl = length.parse(parameters.pl)\n const pw = length.parse(parameters.pw)\n\n const pads: AnyCircuitElement[] = []\n for (let i = 0; i < 6; i++) {\n const { x, y } = getSot963PadCoord(i + 1, w, p, pl)\n pads.push(rectpad(i + 1, x, y, pl, pw))\n }\n\n const silkscreenTopLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -w / 2, y: h / 2 },\n { x: w / 2, y: h / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenBottomLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -w / 2, y: -h / 2 },\n { x: w / 2, y: -h / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const pin1Position = getSot963PadCoord(1, w, p, pl)\n const pin1Marking: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"pin_marker_1\",\n route: [\n { x: pin1Position.x - pl / 2 - 0.3, y: pin1Position.y },\n { x: pin1Position.x - pl / 2 - 0.45, y: pin1Position.y + 0.15 },\n { x: pin1Position.x - pl / 2 - 0.45, y: pin1Position.y - 0.15 },\n { x: pin1Position.x - pl / 2 - 0.3, y: pin1Position.y },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"pin_marker_1\",\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, h / 2 + 0.4, 0.25)\n\n return {\n circuitJson: [\n ...pads,\n silkscreenTopLine,\n silkscreenBottomLine,\n silkscreenRefText,\n pin1Marking,\n ],\n parameters,\n }\n}\n\nexport const getSot963PadCoord = (\n pn: number,\n w: number,\n p: number,\n pl: number,\n) => {\n const padCenterOffset = w / 2 - pl / 2\n if (pn <= 3) {\n return { x: -padCenterOffset, y: p - (pn - 1) * p }\n }\n return { x: padCenterOffset, y: -p + (pn - 4) * p }\n}\n","import { string, z } from \"zod\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const potentiometer_def = base_def.extend({\n fn: z.string(),\n num_pins: z.union([z.literal(3), z.literal(2)]).default(3),\n p: z.string().default(\"3.8mm\"),\n id: z.string().default(\"1.25mm\"),\n od: z.string().default(\"2.35mm\"),\n ca: z\n .string()\n .default(\"14mm\")\n .describe(\n \"Caliper axis (width or diameter of the potentiometer body or adjustment knob)\",\n ),\n w: z.string().default(\"5.35mm\"),\n h: z.string().default(\"4mm\"),\n string: z.string().optional(),\n})\n\nexport const potentiometer_acp = (\n parameters: z.infer<typeof potentiometer_def>,\n) => {\n const { p, id, od, h, ca } = parameters\n const y = Number.parseFloat(h)\n const caliper = Number.parseFloat(ca)\n return [\n platedhole(1, 0, caliper / 4 + 0.3, id, od),\n platedhole(2, y, 0, id, od),\n platedhole(3, 0, -caliper / 4 - 0.3, id, od),\n ]\n}\nexport const potentiometer = (\n raw_params: z.input<typeof potentiometer_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const match = raw_params.string?.match(/^potentiometer_(\\d+)/)\n const numPins = match ? Number.parseInt(match[1]!, 10) : 3\n const parameters = potentiometer_def.parse({\n ...raw_params,\n num_pins: numPins,\n })\n\n let platedHoles: AnyCircuitElement[] = []\n\n if (parameters.num_pins === 3) {\n platedHoles = potentiometer_acp(parameters)\n }\n\n const y = Number.parseFloat(parameters.ca) / 2 + 0.15\n const x = Number.parseFloat(parameters.w)\n const od = Number.parseFloat(parameters.od) / 2 + 0.35\n const silkscreenBody: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: 0, y: y - 1.75 },\n { x: 0, y: y },\n { x: x, y: y },\n { x: x, y: od },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n const silkscreenBody2: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: x, y: -od },\n { x: x, y: -y },\n { x: 0, y: -y },\n { x: 0, y: -y + 1.75 },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n const W = Number.parseFloat(parameters.w) / 2\n const silkscreenRefText: SilkscreenRef = silkscreenRef(W, y + 1, 0.5)\n\n return {\n circuitJson: [\n ...platedHoles,\n silkscreenBody,\n silkscreenBody2,\n silkscreenRefText as AnyCircuitElement,\n ],\n parameters,\n }\n}\n","import {\n length,\n type AnySoupElement,\n type PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { z } from \"zod\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nconst electrolytic_def = base_def.extend({\n fn: z.string(),\n p: length.optional().default(\"7.5mm\"),\n id: length.optional().default(\"1mm\"),\n od: length.optional().default(\"2mm\"),\n d: length.optional().default(\"10.5mm\"),\n})\n\nexport default electrolytic_def\nexport type ElectrolyticDef = z.input<typeof electrolytic_def>\n\nconst generate_circle_arcs = (\n centerX: number,\n centerY: number,\n radius: number,\n cut: number,\n cutHeight: number,\n): {\n topArc: { x: number; y: number }[]\n bottomArc: { x: number; y: number }[]\n} => {\n const topArc: { x: number; y: number }[] = []\n const bottomArc: { x: number; y: number }[] = []\n\n for (let i = 0; i <= 50; i++) {\n const theta = (i / 50) * Math.PI\n const x = centerX + Math.cos(theta) * radius\n const y = centerY + Math.sin(theta) * radius\n\n if (\n x < centerX - cut &&\n y >= centerY - cutHeight / 2 &&\n y <= centerY + cutHeight / 2\n ) {\n continue\n }\n topArc.push({ x, y })\n }\n\n for (let i = 0; i <= 50; i++) {\n const theta = Math.PI + (i / 50) * Math.PI\n const x = centerX + Math.cos(theta) * radius\n const y = centerY + Math.sin(theta) * radius\n\n if (\n x < centerX - cut &&\n y >= centerY - cutHeight / 2 &&\n y <= centerY + cutHeight / 2\n ) {\n continue\n }\n bottomArc.push({ x, y })\n }\n\n return { topArc, bottomArc }\n}\n\nexport const electrolytic = (\n raw_params: ElectrolyticDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = electrolytic_def.parse(raw_params)\n\n const { p, id, od, d } = 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 { topArc, bottomArc } = generate_circle_arcs(\n 0,\n 0,\n d / 2 + 0.1,\n od / 2,\n od,\n )\n\n const silkscreenBody2: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: topArc,\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenBody3: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: bottomArc,\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenBody: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: 0, y: d / 2 + 0.1 },\n { x: 0, y: -(d / 2 + 0.1) },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n const X = -(d / 2 + 0.5)\n const plusY = od / 2 + 1.5\n const Size = 0.5\n\n const silkscreenpath: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: X - Size, y: plusY },\n { x: X + Size, y: plusY },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenline: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: X, y: plusY - Size },\n { x: X, y: plusY + Size },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, d / 2 + 1, 0.5)\n\n return {\n circuitJson: [\n ...plated_holes,\n silkscreenBody2,\n silkscreenBody3,\n silkscreenBody,\n silkscreenpath,\n silkscreenline,\n silkscreenRefText as AnySoupElement,\n ],\n parameters,\n }\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const smbf_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"6.5mm\"),\n h: z.string().default(\"3mm\"),\n pl: z.string().default(\"1.75mm\"),\n pw: z.string().default(\"2.40mm\"),\n p: z.string().default(\"4.75mm\"),\n})\n\nexport const smbf = (\n raw_params: z.input<typeof smbf_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = smbf_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) - 0.5,\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.3,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.3,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: smbfWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for smbf pads\nexport const getSmbfCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n }\n return { x: p / 2, y: 0 }\n}\n\n// Function to generate smbf pads\nexport const smbfWithoutParsing = (parameters: z.infer<typeof smbf_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSmbfCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sot323_def = base_def.extend({\n fn: z.string(),\n num_pins: z.number().default(3),\n w: z.string().default(\"2.45mm\"),\n h: z.string().default(\"2.40mm\"),\n pl: z.string().default(\"1.225mm\"),\n pw: z.string().default(\"0.5mm\"),\n p: z.string().default(\"0.95mm\"),\n string: z.string().optional(),\n})\n\nexport const sot323 = (\n raw_params: z.input<typeof sot323_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const match = raw_params.string?.match(/^sot323_(\\d+)/)\n const numPins = match ? Number.parseInt(match[1]!, 3) : 3\n\n const parameters = sot323_def.parse({\n ...raw_params,\n num_pins: numPins,\n })\n\n if (parameters.num_pins === 3) {\n return {\n circuitJson: sot323_3(parameters),\n parameters: parameters,\n }\n }\n\n throw new Error(\"Invalid number of pins\")\n}\n\nexport const getCcwSot323Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n p: number\n}) => {\n const { pn, w, h, pl, p } = parameters\n\n if (pn === 1) {\n return { x: -p, y: 0.65 }\n }\n if (pn === 2) {\n return { x: -p, y: -0.65 }\n }\n\n return { x: p, y: 0 }\n}\n\nexport const sot323_3 = (parameters: z.infer<typeof sot323_def>) => {\n const pads: AnyCircuitElement[] = []\n\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSot323Coords({\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 p: Number.parseFloat(parameters.p),\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\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n Number.parseInt(parameters.h) / 2 + 1,\n 0.3,\n )\n\n const width =\n Number.parseFloat(parameters.w) / 2 - Number.parseFloat(parameters.pl)\n const height = Number.parseFloat(parameters.h) / 2\n const silkscreenPath1: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -width, y: height + 0.3 },\n { x: width, y: height + 0.3 },\n { x: width, y: height / 2 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n const silkscreenPath2: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_2\",\n route: [\n { x: -width, y: -height - 0.3 },\n { x: width, y: -height - 0.3 },\n { x: width, y: -height / 2 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n\n return [\n ...pads,\n silkscreenPath1,\n silkscreenPath2,\n silkscreenRefText as AnyCircuitElement,\n ]\n}\n","import { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { circlepad } from \"../helpers/circlepad\"\nimport { pillpad } from \"../helpers/pillpad\"\nimport { silkscreenRef } from \"../helpers/silkscreenRef\"\nimport type { AnyCircuitElement } from \"circuit-json\"\nimport { mm } from \"@tscircuit/mm\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const smtpad_def = base_def\n .extend({\n fn: z.string(),\n circle: z.boolean().optional(),\n rect: z.boolean().optional(),\n square: z.boolean().optional(),\n pill: z.boolean().optional(),\n d: length.optional(),\n pd: length.optional(),\n diameter: length.optional(),\n r: length.optional(),\n pr: length.optional(),\n radius: length.optional(),\n w: length.optional(),\n pw: length.optional(),\n width: length.optional(),\n h: length.optional(),\n ph: length.optional(),\n height: length.optional(),\n s: length.optional(),\n size: length.optional(),\n string: z.string().optional(),\n })\n .transform((v) => {\n let shape: \"circle\" | \"rect\" | \"square\" | \"pill\" = \"rect\"\n if (v.circle) shape = \"circle\"\n if (v.square) shape = \"square\"\n if (v.rect) shape = \"rect\"\n if (v.pill) shape = \"pill\"\n\n let radius: number | undefined\n let width: number | undefined\n let height: number | undefined\n\n if (shape === \"circle\") {\n if (v.r !== undefined) radius = mm(v.r)\n else if (v.pr !== undefined) radius = mm(v.pr)\n else if (v.radius !== undefined) radius = mm(v.radius)\n else if (v.d !== undefined) radius = mm(v.d) / 2\n else if (v.pd !== undefined) radius = mm(v.pd) / 2\n else if (v.diameter !== undefined) radius = mm(v.diameter) / 2\n else radius = mm(\"1mm\") / 2\n } else {\n // For rect, square, and pill shapes\n if (v.w !== undefined) width = mm(v.w)\n else if (v.pw !== undefined) width = mm(v.pw)\n else if (v.width !== undefined) width = mm(v.width)\n else if (v.s !== undefined) width = mm(v.s)\n else if (v.size !== undefined) width = mm(v.size)\n else width = mm(\"1mm\")\n\n if (v.h !== undefined) height = mm(v.h)\n else if (v.ph !== undefined) height = mm(v.ph)\n else if (v.height !== undefined) height = mm(v.height)\n else if (shape === \"square\") height = width\n else if (shape === \"rect\")\n height = width // rect defaults to square when only width specified\n else height = mm(\"1mm\") // pill default\n }\n\n return {\n fn: v.fn,\n shape,\n radius,\n width,\n height,\n }\n })\n\nexport type SmtPadDef = z.input<typeof smtpad_def>\n\nexport const smtpad = (\n raw_params: SmtPadDef,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const params = smtpad_def.parse(raw_params)\n const { shape, radius, width, height } = params\n\n let pad: AnyCircuitElement\n let silkscreenOffset: number\n\n if (shape === \"circle\") {\n pad = circlepad(1, { x: 0, y: 0, radius: radius! }) as AnyCircuitElement\n silkscreenOffset = radius! + 0.5\n } else if (shape === \"pill\") {\n pad = pillpad(1, 0, 0, width!, height!) as AnyCircuitElement\n silkscreenOffset = Math.max(width!, height!) / 2 + 0.5\n } else {\n // rect or square\n pad = rectpad(1, 0, 0, width!, height!) as AnyCircuitElement\n silkscreenOffset = height! / 2 + 0.5\n }\n\n return {\n circuitJson: [\n pad,\n silkscreenRef(0, silkscreenOffset, 0.2) as AnyCircuitElement,\n ],\n parameters: params,\n }\n}\n","import { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport type { AnyCircuitElement } from \"circuit-json\"\nimport { platedhole as makePlatedHole } from \"../helpers/platedhole\"\nimport { platedHoleWithRectPad } from \"../helpers/platedHoleWithRectPad\"\nimport { silkscreenRef } from \"../helpers/silkscreenRef\"\nimport { mm } from \"@tscircuit/mm\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const platedhole_def = base_def\n .extend({\n fn: z.string(),\n d: length.optional(),\n hd: length.optional(),\n r: length.optional(),\n hr: length.optional(),\n pd: length.optional(),\n pr: length.optional(),\n squarepad: z.boolean().optional().default(false),\n })\n .transform((v) => {\n let holeD: number | undefined\n if (v.d !== undefined) holeD = mm(v.d)\n else if (v.hd !== undefined) holeD = mm(v.hd)\n else if (v.r !== undefined) holeD = mm(v.r) * 2\n else if (v.hr !== undefined) holeD = mm(v.hr) * 2\n else holeD = mm(\"1mm\")\n\n let padD: number | undefined\n if (v.pd !== undefined) padD = mm(v.pd)\n else if (v.pr !== undefined) padD = mm(v.pr) * 2\n else padD = holeD * (1.5 / 1.0)\n\n return {\n fn: v.fn,\n d: holeD,\n pd: padD,\n squarepad: v.squarepad ?? false,\n }\n })\n\nexport type PlatedholeDef = z.input<typeof platedhole_def>\n\nexport const platedhole = (\n raw_params: PlatedholeDef,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const params = platedhole_def.parse(raw_params)\n const { d, pd, squarepad } = params\n\n return {\n circuitJson: [\n squarepad\n ? (platedHoleWithRectPad(1, 0, 0, d, pd, pd) as AnyCircuitElement)\n : (makePlatedHole(1, 0, 0, d, pd) as AnyCircuitElement),\n silkscreenRef(0, pd / 2 + 0.5, 0.2) as AnyCircuitElement,\n ],\n parameters: params,\n }\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sot_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(6).default(6),\n h: z.string().default(\"1.6mm\"),\n pl: z.string().default(\"1mm\"),\n pw: z.string().default(\"0.7mm\"),\n p: z.string().default(\"0.95mm\"),\n})\n\nexport const sot = (\n raw_params: z.input<typeof sot_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = sot_def.parse(raw_params)\n return {\n circuitJson: sotWithoutParsing(parameters),\n parameters: parameters,\n }\n}\n\nexport const getCcwSotCoords = (parameters: {\n h: number\n p: number\n pn: number\n}) => {\n const { p, h, pn } = parameters\n if (pn === 1) {\n return { x: -h / 2 - 0.5, y: p }\n }\n if (pn === 2) {\n return { x: -h / 2 - 0.5, y: 0 }\n }\n if (pn === 3) {\n return { x: -h / 2 - 0.5, y: -p }\n }\n if (pn === 4) {\n return { x: h / 2 + 0.5, y: -p }\n }\n if (pn === 5) {\n return { x: h / 2 + 0.5, y: 0 }\n }\n if (pn === 6) {\n return { x: h / 2 + 0.5, y: p }\n }\n throw new Error(\"Invalid pin number\")\n}\n\nexport const sotWithoutParsing = (parameters: z.infer<typeof sot_def>) => {\n const pads: AnyCircuitElement[] = []\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getCcwSotCoords({\n h: Number.parseFloat(parameters.h),\n p: Number.parseFloat(parameters.p),\n pn: i,\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n\n const width = (parameters.num_pins / 2) * Number.parseFloat(parameters.p)\n const height = Number.parseFloat(parameters.h)\n const silkscreenPath1: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -width / 3, y: height / 2 + Number.parseFloat(parameters.p) / 1.3 },\n { x: width / 3, y: height / 2 + Number.parseFloat(parameters.p) / 1.3 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.05,\n }\n const silkscreenPath2: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_2\",\n route: [\n { x: -width / 3, y: -height / 2 - Number.parseFloat(parameters.p) / 1.3 },\n { x: width / 3, y: -height / 2 - Number.parseFloat(parameters.p) / 1.3 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.05,\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, height + 0.3, 0.3)\n const pin1Position = getCcwSotCoords({\n h: Number.parseFloat(parameters.h),\n p: Number.parseFloat(parameters.p),\n pn: 1,\n })\n pin1Position.x = pin1Position.x - Number.parseFloat(parameters.pw) * 1.5\n const triangleHeight = 0.7\n const triangleWidth = 0.3\n const pin1Indicator: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"pin1_indicator\",\n route: [\n {\n x: pin1Position.x + triangleHeight / 2,\n y: pin1Position.y,\n },\n {\n x: pin1Position.x - triangleHeight / 2,\n y: pin1Position.y + triangleWidth / 2,\n },\n {\n x: pin1Position.x - triangleHeight / 2,\n y: pin1Position.y - triangleWidth / 2,\n },\n {\n x: pin1Position.x + triangleHeight / 2,\n y: pin1Position.y,\n },\n ],\n stroke_width: 0.05,\n }\n\n return [\n ...pads,\n silkscreenRefText,\n silkscreenPath1,\n silkscreenPath2,\n pin1Indicator as AnyCircuitElement,\n ]\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sot343_def = base_def.extend({\n fn: z.string(),\n num_pins: z.number().default(4),\n w: z.string().default(\"3.2mm\"),\n h: z.string().default(\"2.6mm\"),\n pl: z.string().default(\"1.35mm\"),\n pw: z.string().default(\"0.50mm\"),\n p: z.string().default(\"0.6mm\"),\n string: z.string().optional(),\n})\n\nexport const sot343 = (\n raw_params: z.input<typeof sot343_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const match = raw_params.string?.match(/^sot343_(\\d+)/)\n const numPins = match ? Number.parseInt(match[1]!, 4) : 4\n\n const parameters = sot343_def.parse({\n ...raw_params,\n num_pins: numPins,\n })\n\n if (parameters.num_pins === 4) {\n return {\n circuitJson: sot343_4(parameters),\n parameters: parameters,\n }\n }\n\n throw new Error(\"Invalid number of pins\")\n}\n\nexport const getCcwSot343Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n p: number\n}) => {\n const { pn, p } = parameters\n if (pn === 1) return { x: -p * 1.92, y: -0.65 }\n if (pn === 2) return { x: -p * 1.92, y: 0.65 }\n if (pn === 3) return { x: p, y: 0.65 }\n if (pn === 4) return { x: p, y: -0.65 }\n return { x: 0, y: 0 }\n}\n\nexport const sot343_4 = (parameters: z.infer<typeof sot343_def>) => {\n const pads: AnyCircuitElement[] = []\n\n const w = Number.parseFloat(parameters.w)\n const h = Number.parseFloat(parameters.h)\n const pl = Number.parseFloat(parameters.pl)\n const pw = Number.parseFloat(parameters.pw)\n const p = Number.parseFloat(parameters.p)\n\n let minX = Infinity\n let maxX = -Infinity\n let minY = Infinity\n let maxY = -Infinity\n\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSot343Coords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w,\n h,\n pl,\n p,\n })\n pads.push(rectpad(i + 1, x, y, pl, pw))\n\n if (x < minX) minX = x\n if (x > maxX) maxX = x\n if (y < minY) minY = y\n if (y > maxY) maxY = y\n }\n\n const silkscreenXOffset = (minX + maxX) / 2\n const padVerticalDistance = maxY - minY\n const silkscreenMargin = h * 0.3\n const offsetY = padVerticalDistance / 2 + silkscreenMargin\n\n let silkscreenLineLength = w * 0.8\n if (h <= 2.6) {\n silkscreenLineLength /= 2\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n silkscreenXOffset,\n offsetY + 0.5,\n 0.3,\n )\n\n const silkscreenPathTop: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_top\",\n route: [\n { x: silkscreenXOffset - silkscreenLineLength / 2, y: offsetY },\n { x: silkscreenXOffset + silkscreenLineLength / 2, y: offsetY },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n\n const silkscreenPathBottom: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_bottom\",\n route: [\n { x: silkscreenXOffset - silkscreenLineLength / 2, y: -offsetY },\n { x: silkscreenXOffset + silkscreenLineLength / 2, y: -offsetY },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n\n return [\n ...pads,\n silkscreenPathTop,\n silkscreenPathBottom,\n silkscreenRefText as AnyCircuitElement,\n ]\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nimport { z } from \"zod\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const m2host_def = base_def.extend({\n fn: z.string(),\n})\n\nexport const m2host = (\n raw_params: z.input<typeof m2host_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = m2host_def.parse(raw_params)\n\n const pads: AnyCircuitElement[] = []\n const padWidth = 0.5 - 0.15\n const padLength = 1.5\n const pitch = 0.5\n const halfPitch = pitch / 2\n const rowOffset = 0.5\n const numPads = 75\n\n const startY = -((numPads - 1) * pitch) / 2\n\n for (let i = 0; i < numPads; i++) {\n const pn = i + 1\n if (pn >= 24 && pn <= 31) continue\n const y = startY - i * halfPitch\n\n const isBottomLayer = pn % 2 === 0\n const padLengthWithOffset = padLength + (isBottomLayer ? 0.25 : 0)\n const rightEdgeOffset = 0.5\n const x = rightEdgeOffset - padLengthWithOffset / 2\n const pad = rectpad(pn, x, y, padLengthWithOffset, padWidth)\n pad.layer = isBottomLayer ? \"bottom\" : \"top\"\n pads.push(pad)\n }\n\n const cutoutWidth = 46 * 0.0254\n const cutoutDepth = 137 * 0.0254\n const cutoutOffsetFromPin1 = 261 * 0.0254\n const cutout = {\n type: \"pcb_cutout\",\n pcb_cutout_id: \"\",\n shape: \"rect\" as const,\n center: {\n x: -cutoutDepth / 2 + padLength / 2,\n y: startY - cutoutOffsetFromPin1,\n },\n width: cutoutDepth,\n height: cutoutWidth,\n }\n\n const pin1MarkerPosition = {\n x: -0.5,\n y: startY,\n }\n\n const pin1Marker: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"pin_marker_1\",\n route: [\n { x: pin1MarkerPosition.x - 0.4, y: pin1MarkerPosition.y },\n { x: pin1MarkerPosition.x - 0.7, y: pin1MarkerPosition.y + 0.3 },\n { x: pin1MarkerPosition.x - 0.7, y: pin1MarkerPosition.y - 0.3 },\n { x: pin1MarkerPosition.x - 0.4, y: pin1MarkerPosition.y },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"pin_marker_1\",\n }\n\n // const silkscreenRefText: SilkscreenRef = silkscreenRef(0, padLength, 0.5)\n\n // --- center footprint around (0,0) ---\n let minX = Infinity\n let maxX = -Infinity\n let minY = Infinity\n let maxY = -Infinity\n\n const updateBounds = (x: number, y: number, w = 0, h = 0) => {\n minX = Math.min(minX, x - w / 2)\n maxX = Math.max(maxX, x + w / 2)\n minY = Math.min(minY, y - h / 2)\n maxY = Math.max(maxY, y + h / 2)\n }\n\n for (const pad of pads) {\n updateBounds(pad.x, pad.y, pad.width, pad.height)\n }\n updateBounds(cutout.center.x, cutout.center.y, cutout.width, cutout.height)\n for (const point of pin1Marker.route) {\n updateBounds(point.x, point.y)\n }\n\n const centerX = (minX + maxX) / 2\n const centerY = (minY + maxY) / 2\n\n const translate = (el: any) => {\n if (typeof el.x === \"number\") el.x -= centerX\n if (typeof el.y === \"number\") el.y -= centerY\n if (el.center) {\n el.center.x -= centerX\n el.center.y -= centerY\n }\n if (Array.isArray(el.route)) {\n el.route = el.route.map((p: { x: number; y: number }) => ({\n x: p.x - centerX,\n y: p.y - centerY,\n }))\n }\n }\n\n for (const pad of pads) translate(pad)\n translate(cutout)\n translate(pin1Marker)\n\n return {\n circuitJson: [\n ...pads,\n cutout,\n // silkscreenRefText,\n pin1Marker,\n ],\n parameters,\n }\n}\n","import { z } from \"zod\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { platedHoleWithRectPad } from \"src/helpers/platedHoleWithRectPad\"\nimport { platedHolePill } from \"src/helpers/platedHolePill\"\nimport type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { base_def } from \"src/helpers/zod/base_def\"\n\nexport const to92l_def = base_def.extend({\n fn: z.string(),\n num_pins: z.number().default(3),\n inline: z.boolean().default(false),\n p: z.string().default(\"1.27mm\"),\n id: z.string().default(\"0.75mm\"),\n od: z.string().default(\"1.3mm\"),\n w: z.string().default(\"4.8mm\"),\n h: z.string().default(\"4.0mm\"),\n})\n\nexport const to92l = (\n raw_params: z.input<typeof to92l_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = to92l_def.parse(raw_params)\n\n const p = Number.parseFloat(parameters.p)\n const w = Number.parseFloat(parameters.w)\n const h = Number.parseFloat(parameters.h)\n\n const od = parameters.inline ? 1.05 : Number.parseFloat(parameters.od)\n const padH = parameters.inline ? 1.5 : od\n\n const holes = [\n platedHoleWithRectPad(1, 0, 0, parameters.id, od, padH, 0, 0),\n parameters.inline\n ? platedHolePill(2, p, 0, parameters.id, od, padH)\n : platedhole(2, p, p, parameters.id, od),\n parameters.inline\n ? platedHolePill(3, p * 2, 0, parameters.id, od, padH)\n : platedhole(3, p * 2, 0, parameters.id, od),\n ]\n\n const radius = w / 2\n const cx = parameters.inline ? p - 0.09 : p\n const cy = 0.2\n const y_bottom = cy + radius - h\n\n const semicircle = Array.from({ length: 32 }, (_, i) => {\n const angle = (Math.PI * i) / 31\n return {\n x: cx + radius * Math.cos(angle),\n y: cy + radius * Math.sin(angle),\n }\n })\n\n const silkBody: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"\",\n stroke_width: 0.12,\n route: [\n ...semicircle,\n { x: cx - radius, y: y_bottom },\n { x: cx + radius, y: y_bottom },\n semicircle[0],\n ],\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n cx,\n cy + radius + 1,\n 0.5,\n )\n\n return {\n circuitJson: [...holes, silkBody, silkscreenRefText as AnyCircuitElement],\n parameters,\n }\n}\n","export function isNotNull<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined\n}\n","export type OriginMode =\n | \"center\"\n | \"bottomleft\"\n | \"pin1\"\n | \"bottomcenter\"\n | \"centerbottom\"\n | \"topcenter\"\n | \"centertop\"\n | \"leftcenter\"\n | \"centerleft\"\n | \"rightcenter\"\n | \"centerright\"\n\nimport type { AnySoupElement } from \"circuit-json\"\n\nexport const applyOrigin = (\n elements: AnySoupElement[],\n origin: OriginMode | undefined,\n): AnySoupElement[] => {\n if (!origin) return elements\n\n const pads = elements.filter(\n (el) =>\n el.type === \"pcb_smtpad\" ||\n el.type === \"pcb_plated_hole\" ||\n el.type === \"pcb_thtpad\",\n ) as Array<any>\n\n if (pads.length === 0) return elements\n\n let minX = Infinity\n let maxX = -Infinity\n let minY = Infinity\n let maxY = -Infinity\n\n const updateBounds = (x: number, y: number, w = 0, h = 0) => {\n const left = x - w / 2\n const right = x + w / 2\n const bottom = y - h / 2\n const top = y + h / 2\n minX = Math.min(minX, left)\n maxX = Math.max(maxX, right)\n minY = Math.min(minY, bottom)\n maxY = Math.max(maxY, top)\n }\n\n for (const pad of pads) {\n if (pad.type === \"pcb_smtpad\") {\n const w = pad.shape === \"circle\" ? pad.radius * 2 : pad.width\n const h = pad.shape === \"circle\" ? pad.radius * 2 : pad.height\n updateBounds(pad.x, pad.y, w, h)\n } else if (pad.type === \"pcb_plated_hole\") {\n const d = pad.outer_diameter ?? pad.hole_diameter\n updateBounds(pad.x, pad.y, d, d)\n } else if (pad.type === \"pcb_thtpad\") {\n const d = pad.diameter\n updateBounds(pad.x, pad.y, d, d)\n }\n }\n\n let dx = 0\n let dy = 0\n switch (origin) {\n case \"center\":\n dx = (minX + maxX) / 2\n dy = (minY + maxY) / 2\n break\n case \"bottomleft\":\n dx = minX\n dy = minY\n break\n case \"bottomcenter\":\n case \"centerbottom\":\n dx = (minX + maxX) / 2\n dy = minY\n break\n case \"topcenter\":\n case \"centertop\":\n dx = (minX + maxX) / 2\n dy = maxY\n break\n case \"leftcenter\":\n case \"centerleft\":\n dx = minX\n dy = (minY + maxY) / 2\n break\n case \"rightcenter\":\n case \"centerright\":\n dx = maxX\n dy = (minY + maxY) / 2\n break\n case \"pin1\":\n const pin1 = pads.find((p) => p.port_hints?.[0] === \"1\") || pads[0]\n dx = pin1.x\n dy = pin1.y\n break\n }\n\n if (dx === 0 && dy === 0) return elements\n\n for (const el of elements as Array<any>) {\n if (typeof el.x === \"number\") el.x -= dx\n if (typeof el.y === \"number\") el.y -= dy\n\n if (el.center && typeof el.center.x === \"number\") {\n el.center.x -= dx\n el.center.y -= dy\n }\n\n if (el.type === \"pcb_silkscreen_path\") {\n for (const pt of el.route) {\n pt.x -= dx\n pt.y -= dy\n }\n }\n\n if (el.type === \"pcb_silkscreen_text\" && el.anchor_position) {\n el.anchor_position.x -= dx\n el.anchor_position.y -= dy\n }\n }\n\n return elements\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\n\nexport const applyNoRefDes = (\n elements: AnyCircuitElement[],\n parameters: any,\n): AnyCircuitElement[] => {\n const refs = elements.filter(\n (el) => el.type === \"pcb_silkscreen_text\",\n ) as Array<any>\n\n if (refs.length === 0) return elements\n\n for (const ref of refs) {\n if (parameters.norefdes) {\n ref.text = \"\"\n }\n }\n\n return elements\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\n\nexport const applyNoSilkscreen = (\n elements: AnyCircuitElement[],\n parameters: any,\n): AnyCircuitElement[] => {\n if (!parameters.nosilkscreen) return elements\n\n return elements.filter((element) => {\n return (\n element.type !== \"pcb_silkscreen_path\" &&\n element.type !== \"pcb_silkscreen_text\"\n )\n })\n}\n","import * as FOOTPRINT_FN from \"./fn\"\nimport type { AnySoupElement } from \"circuit-json\"\nimport type { AnyCircuitElement } from \"circuit-json\"\nimport type { AnyFootprinterDefinitionOutput } from \"./helpers/zod/AnyFootprinterDefinitionOutput\"\nimport { isNotNull } from \"./helpers/is-not-null\"\nimport { footprintSizes } from \"./helpers/passive-fn\"\nimport { applyOrigin } from \"./helpers/apply-origin\"\nimport { applyNoRefDes } from \"./helpers/apply-norefdes\"\nimport { applyNoSilkscreen } from \"./helpers/apply-nosilkscreen\"\n\ntype BaseOptionKey =\n | \"origin\"\n | \"norefdes\"\n | \"invert\"\n | \"faceup\"\n | \"nosilkscreen\"\n\nexport type FootprinterParamsBuilder<K extends string> = {\n [P in K | BaseOptionKey | \"params\" | \"soup\" | \"circuitJson\"]: P extends\n | \"params\"\n | \"soup\"\n | \"circuitJson\"\n ? Footprinter[P]\n : (v?: number | string | boolean) => FootprinterParamsBuilder<K>\n}\n\ntype CommonPassiveOptionKey =\n | \"metric\"\n | \"imperial\"\n | \"tht\"\n | \"p\"\n | \"pw\"\n | \"ph\"\n | \"w\"\n | \"h\"\n | \"textbottom\"\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\"\n | \"p\"\n | \"w\"\n | \"h\"\n | \"ball\"\n | \"pad\"\n | \"missing\"\n | \"tlorigin\"\n | \"blorigin\"\n | \"trorigin\"\n | \"brorigin\"\n | \"circularpads\"\n >\n qfn: (num_pins?: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\">\n tqfp: (num_pins?: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\">\n soic: (\n num_pins?: number,\n ) => FootprinterParamsBuilder<\n \"w\" | \"p\" | \"pw\" | \"pl\" | \"id\" | \"od\" | \"pillpads\"\n >\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: (\n num_pins?: number,\n ) => FootprinterParamsBuilder<\n | \"p\"\n | \"id\"\n | \"od\"\n | \"male\"\n | \"female\"\n | \"rows\"\n | \"smd\"\n | \"surfacemount\"\n | \"rightangle\"\n | \"pw\"\n | \"pl\"\n | \"pinlabeltextalignleft\"\n | \"pinlabeltextaligncenter\"\n | \"pinlabeltextalignright\"\n | \"pinlabelverticallyinverted\"\n | \"pinlabelorthogonal\"\n | \"nosquareplating\"\n | \"nopinlabels\"\n | \"doublesidedpinlabel\"\n | \"bottomsidepinlabel\"\n >\n axial: () => FootprinterParamsBuilder<\"p\" | \"id\" | \"od\">\n radial: () => FootprinterParamsBuilder<\n \"p\" | \"id\" | \"od\" | \"ceramic\" | \"electrolytic\" | \"polarized\"\n >\n hc49: () => FootprinterParamsBuilder<\"p\" | \"id\" | \"od\" | \"w\" | \"h\">\n to220: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"id\" | \"od\">\n sot363: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sot886: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sot457: () => FootprinterParamsBuilder<\n | \"w\"\n | \"p\"\n | \"h\"\n | \"pl\"\n | \"pw\"\n | \"wave\"\n | \"reflow\"\n | \"pillr\"\n | \"pillh\"\n | \"pillw\"\n >\n sot563: () => FootprinterParamsBuilder<\"w\" | \"p\" | \"pl\" | \"pw\">\n sot723: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"pl\" | \"pw\" | \"p\">\n sot23: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"pl\" | \"pw\">\n sot25: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"pl\" | \"pw\">\n sot: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sot323: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sot89: () => FootprinterParamsBuilder<\"w\" | \"p\" | \"pl\" | \"pw\" | \"h\">\n sot343: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod323w: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n smc: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pw\" | \"pl\">\n minimelf: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pw\" | \"pl\">\n melf: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pw\" | \"pl\">\n jst: () => FootprinterParamsBuilder<\n \"w\" | \"h\" | \"p\" | \"id\" | \"pw\" | \"pl\" | \"ph\" | \"sh\"\n >\n micromelf: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pw\" | \"pl\">\n ms013: () => FootprinterParamsBuilder<\"w\" | \"p\">\n ms012: () => FootprinterParamsBuilder<\"w\" | \"p\">\n lqfp: (num_pins?: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"pl\" | \"pw\">\n sma: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n smf: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n smb: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n smbf: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n potentiometer: () => FootprinterParamsBuilder<\n \"w\" | \"h\" | \"p\" | \"id\" | \"od\" | \"pw\" | \"ca\"\n >\n electrolytic: () => FootprinterParamsBuilder<\"d\" | \"p\" | \"id\" | \"od\">\n sod923: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod323: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod80: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod882: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod882d: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod723: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod523: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod323f: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod323fl: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod128: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod123f: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod123fl: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod123: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod123w: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod110: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n to92: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"id\" | \"od\" | \"inline\">\n to92s: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"id\" | \"od\">\n to92l: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"id\" | \"od\">\n sot223: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n m2host: () => FootprinterParamsBuilder<never>\n son: (\n num_pins?: number,\n ) => FootprinterParamsBuilder<\n \"w\" | \"h\" | \"p\" | \"pl\" | \"pw\" | \"epw\" | \"eph\" | \"ep\"\n >\n vssop: (\n num_pins?: number,\n ) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n msop: (\n num_pins?: number,\n ) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sot23w: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n pushbutton: () => FootprinterParamsBuilder<\n \"tllabel\" | \"trlabel\" | \"bllabel\" | \"brlabel\"\n >\n stampboard: () => FootprinterParamsBuilder<\n | \"w\"\n | \"h\"\n | \"left\"\n | \"right\"\n | \"top\"\n | \"bottom\"\n | \"p\"\n | \"pw\"\n | \"pl\"\n | \"innerhole\"\n | \"innerholeedgedistance\"\n | \"silkscreenlabels\"\n | \"silkscreenlabelmargin\"\n >\n stampreceiver: () => FootprinterParamsBuilder<\n | \"w\"\n | \"h\"\n | \"left\"\n | \"right\"\n | \"top\"\n | \"bottom\"\n | \"p\"\n | \"pw\"\n | \"pl\"\n | \"innerhole\"\n | \"innerholeedgedistance\"\n >\n breakoutheaders: () => FootprinterParamsBuilder<\n \"w\" | \"h\" | \"left\" | \"right\" | \"top\" | \"bottom\" | \"p\" | \"id\" | \"od\"\n >\n smtpad: () => FootprinterParamsBuilder<\n | \"circle\"\n | \"rect\"\n | \"square\"\n | \"pill\"\n | \"d\"\n | \"pd\"\n | \"diameter\"\n | \"r\"\n | \"pr\"\n | \"radius\"\n | \"w\"\n | \"pw\"\n | \"width\"\n | \"h\"\n | \"ph\"\n | \"height\"\n | \"s\"\n | \"size\"\n > & {\n params: () => any\n soup: () => AnySoupElement[]\n circuitJson: () => AnyCircuitElement[]\n }\n platedhole: () => FootprinterParamsBuilder<\n \"d\" | \"hd\" | \"r\" | \"hr\" | \"pd\" | \"pr\"\n >\n pad: () => FootprinterParamsBuilder<\"w\" | \"h\"> & {\n params: () => any\n soup: () => AnySoupElement[]\n circuitJson: () => AnyCircuitElement[]\n }\n solderjumper: (\n num_pins?: number,\n ) => FootprinterParamsBuilder<\"bridged\" | \"p\" | \"pw\" | \"ph\">\n\n params: () => any\n /** @deprecated use circuitJson() instead */\n soup: () => AnySoupElement[]\n circuitJson: () => AnyCircuitElement[]\n json: () => AnyFootprinterDefinitionOutput[]\n getFootprintNames: () => string[]\n}\n\nexport const string = (def: string): Footprinter => {\n let fp = footprinter()\n\n // The regex below automatically inserts a \"res\" prefix so forms like\n // \"0603_pw1.0_ph1.1\" are understood without typing \"res0603\".\n const modifiedDef = def.replace(/^((?:\\d{4}|\\d{5}))(?=$|_)/, \"res$1\")\n\n const def_parts = modifiedDef\n .split(/_(?!metric)/) // split on '_' not followed by 'metric'\n .map((s) => {\n const m = s.match(/([a-zA-Z]+)([\\(\\d\\.\\+\\?].*)?/)\n if (!m) return null\n const [, rawFn, v] = m\n if (!rawFn) return null\n const fn = rawFn.toLowerCase()\n if (v?.includes(\"?\")) return null\n return { fn, v }\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 getFootprintNames = (): string[] => {\n return Object.keys(FOOTPRINT_FN)\n}\n\nexport const getFootprintSizes = (): typeof footprintSizes => {\n return footprintSizes\n}\n\nexport const getFootprintNamesByType = (): {\n passiveFootprintNames: string[]\n normalFootprintNames: string[]\n} => {\n const allFootprintNames = Object.keys(FOOTPRINT_FN)\n\n const passiveFootprintNames = allFootprintNames.filter((name) => {\n const fn = FOOTPRINT_FN[name]\n\n return fn.toString().includes(\"passive(\")\n })\n\n return {\n passiveFootprintNames,\n normalFootprintNames: allFootprintNames.filter(\n (name) => !passiveFootprintNames.includes(name),\n ),\n }\n}\n\nexport const footprinter = (): Footprinter & {\n string: typeof string\n getFootprintNames: string[]\n setString: (string) => void\n} => {\n const proxy = new Proxy(\n {},\n {\n get: (target: any, prop: string) => {\n if (prop === \"soup\" || prop === \"circuitJson\") {\n if (\"fn\" in target && FOOTPRINT_FN[target.fn]) {\n return () => {\n const { circuitJson } = FOOTPRINT_FN[target.fn](target)\n const circuitWithoutSilkscreen = applyNoSilkscreen(\n circuitJson,\n target,\n )\n const circuitWithoutRefDes = applyNoRefDes(\n circuitWithoutSilkscreen,\n target,\n )\n return applyOrigin(circuitWithoutRefDes, target.origin)\n }\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 === \"getFootprintNames\") {\n return () => Object.keys(FOOTPRINT_FN)\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 if (typeof v === \"string\" && v.includes(\"_metric\")) {\n target.metric = v.split(\"_metric\")[0]\n } else {\n target.imperial = v // e.g., res0402, cap0603 etc.\n }\n }\n } else {\n target.num_pins = Number.isNaN(Number.parseFloat(v))\n ? undefined\n : 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\nfootprinter.getFootprintNames = getFootprintNames\n\nexport const fp = footprinter\n"],"mappings":"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","names":["platedhole","z","mm","z","mm","z","z","mm","padSpacing","padWidth","padHeight","padPitch","padSpacing","padWidth","padHeight","padPitch","padSpacing","padWidth","padHeight","padPitch","padSpacing","padWidth","padHeight","padPitch","z","length","distance","z","z","z","distance","length","pad","z","length","z","length","z","length","z","z","length","z","length","z","length","z","z","parameters","z","length","z","length","od","z","length","z","length","length","z","z","pad","length","z","length","z","length","length","z","z","length","length","z","z","length","length","z","z","length","length","z","z","length","length","z","z","length","getHeight","getTriangleDir","length","z","z","length","getHeight","length","z","z","length","length","mm","length","mm","z","mm","z","padSpacing","padWidth","padHeight","z","length","sod_def","z","length","sodWithoutParsing","getSodCoords","z","length","z","length","z","length","sod_def","z","length","sodWithoutParsing","getSodCoords","z","length","sod_def","z","length","sodWithoutParsing","getSodCoords","z","length","sod_def","z","length","sodWithoutParsing","getSodCoords","z","length","sod_def","z","length","sodWithoutParsing","getSodCoords","z","length","sod_def","z","length","sodWithoutParsing","getSodCoords","z","length","sod_def","z","length","sodWithoutParsing","getSodCoords","z","length","z","length","sodWithoutParsing","getSodCoords","z","length","sod_def","z","length","sodWithoutParsing","getSodCoords","z","length","sod_def","z","length","sodWithoutParsing","getSodCoords","z","z","padWidth","length","padHeight","length","z","z","length","string","z","length","z","length","z","length","sod_def","z","length","sodWithoutParsing","getSodCoords","z","length","z","length","z","length","z","length","z","length","z","length","z","length","z","length","z","length","z","length","z","length","z","length","z","z","parameters","z","z","z","z","padSpacing","length","z","z","length","z","length","sod_def","z","length","sodWithoutParsing","getSodCoords","z","length","z","length","z","length","getDefaultValues","z","length","z","length","z","length","sodWithoutParsing","getSodCoords","z","length","z","length","sodWithoutParsing","getSodCoords","z","length","z","length","length","padSpacing","padWidth","padHeight","z","z","padWidth","padHeight","parameters","z","length","z","length","z","z","length","z","z","length","silkscreenpath","z","length","z","length","z","z","z","length","mm","z","length","mm","pad","z","length","mm","z","length","mm","platedhole","z","z","z","z","z","z","padWidth","pad","z","z","pad","string","fp"]}
|
|
1
|
+
{"version":3,"sources":["../src/fn/index.ts","../src/helpers/silkscreenRef.ts","../src/helpers/zod/base_def.ts","../src/fn/dip.ts","../src/helpers/platedhole.ts","../src/helpers/platedHoleWithRectPad.ts","../src/helpers/u-curve.ts","../src/helpers/rectpad.ts","../src/helpers/passive-fn.ts","../src/fn/diode.ts","../src/fn/cap.ts","../src/fn/led.ts","../src/helpers/chipArray.ts","../src/helpers/res0402-array2.ts","../src/helpers/res0402-array4.ts","../src/helpers/res0603-array2.ts","../src/helpers/res0603-array4.ts","../src/helpers/res0606-array2.ts","../src/helpers/res1206-array4.ts","../src/fn/res.ts","../src/helpers/circlepad.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/helpers/pillpad.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/tqfp.ts","../src/fn/qfp.ts","../src/fn/mlp.ts","../src/fn/ssop.ts","../src/fn/tssop.ts","../src/fn/sot363.ts","../src/fn/sot886.ts","../src/fn/sot23.ts","../src/fn/sot25.ts","../src/fn/dfn.ts","../src/helpers/corner.ts","../src/fn/pinrow.ts","../src/helpers/silkscreenPin.ts","../src/helpers/determine-pin-label-anchor-side.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/radial.ts","../src/helpers/generateCircleArcs.ts","../src/fn/pushbutton.ts","../src/helpers/silkscreenpath.ts","../src/fn/stampboard.ts","../src/fn/stampreceiver.ts","../src/fn/lqfp.ts","../src/fn/breakoutheaders.ts","../src/fn/hc49.ts","../src/fn/pad.ts","../src/fn/to92.ts","../src/helpers/platedHolePill.ts","../src/fn/sod523.ts","../src/fn/sop8.ts","../src/fn/sod80.ts","../src/fn/sod123w.ts","../src/fn/sod323.ts","../src/fn/sod923.ts","../src/fn/sod882.ts","../src/fn/sod323f.ts","../src/fn/sod123f.ts","../src/fn/sod123fl.ts","../src/fn/sod723.ts","../src/fn/sod128.ts","../src/fn/sot89.ts","../src/fn/to220.ts","../src/fn/minimelf.ts","../src/fn/sod882d.ts","../src/fn/melf.ts","../src/fn/micromelf.ts","../src/fn/sma.ts","../src/fn/smf.ts","../src/fn/smb.ts","../src/fn/smc.ts","../src/fn/sot223.ts","../src/fn/sot23w.ts","../src/fn/to92s.ts","../src/fn/jst.ts","../src/fn/sod110.ts","../src/fn/vssop.ts","../src/fn/msop.ts","../src/fn/sod323w.ts","../src/fn/sod323fl.ts","../src/fn/son.ts","../src/fn/solderjumper.ts","../src/fn/sot457.ts","../src/fn/sot963.ts","../src/fn/potentiometer.ts","../src/fn/electrolytic.ts","../src/fn/smbf.ts","../src/fn/sot323.ts","../src/fn/smtpad.ts","../src/fn/platedhole.ts","../src/fn/sot.ts","../src/fn/sot343.ts","../src/fn/m2host.ts","../src/fn/to92l.ts","../src/helpers/is-not-null.ts","../src/helpers/apply-origin.ts","../src/helpers/apply-norefdes.ts","../src/helpers/apply-nosilkscreen.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 { tqfp } from \"./tqfp\"\nexport { qfp } from \"./qfp\"\nexport { mlp } from \"./mlp\"\nexport { ssop } from \"./ssop\"\nexport { tssop } from \"./tssop\"\nexport { sot363 } from \"./sot363\"\nexport { sot886 } from \"./sot886\"\nexport { sot23 } from \"./sot23\"\nexport { sot25 } from \"./sot25\"\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 { radial } from \"./radial\"\nexport { pushbutton } from \"./pushbutton\"\nexport { stampboard } from \"./stampboard\"\nexport { stampreceiver } from \"./stampreceiver\"\nexport { lqfp } from \"./lqfp\"\nexport { breakoutheaders } from \"./breakoutheaders\"\nexport { hc49 } from \"./hc49\"\nexport { pad } from \"./pad\"\nexport { to92 } from \"./to92\"\nexport { sod523 } from \"./sod523\"\nexport { sop8 } from \"./sop8\"\nexport { sod80 } from \"./sod80\"\nexport { sod123w } from \"./sod123w\"\nexport { sod323 } from \"./sod323\"\nexport { sod923 } from \"./sod923\"\nexport { sod882 } from \"./sod882\"\nexport { sod323f } from \"./sod323f\"\nexport { sod123f } from \"./sod123f\"\nexport { sod123fl } from \"./sod123fl\"\nexport { sod723 } from \"./sod723\"\nexport { sod128 } from \"./sod128\"\nexport { sot89 } from \"./sot89\"\nexport { to220 } from \"./to220\"\nexport { minimelf } from \"./minimelf\"\nexport { sod882d } from \"./sod882d\"\nexport { melf } from \"./melf\"\nexport { micromelf } from \"./micromelf\"\nexport { sma } from \"./sma\"\nexport { smf } from \"./smf\"\nexport { smb } from \"./smb\"\nexport { smc } from \"./smc\"\nexport { sot223 } from \"./sot223\"\nexport { sot23w } from \"./sot23w\"\nexport { to92s } from \"./to92s\"\nexport { jst } from \"./jst\"\nexport { sod110 } from \"./sod110\"\nexport { vssop } from \"./vssop\"\nexport { msop } from \"./msop\"\nexport { sod323w } from \"./sod323w\"\nexport { sod323fl } from \"./sod323fl\"\nexport { son } from \"./son\"\nexport { solderjumper } from \"./solderjumper\"\nexport { sot457 } from \"./sot457\"\nexport { sot963 } from \"./sot963\"\nexport { potentiometer } from \"./potentiometer\"\nexport { electrolytic } from \"./electrolytic\"\nexport { smbf } from \"./smbf\"\nexport { sot323 } from \"./sot323\"\nexport { smtpad } from \"./smtpad\"\nexport { platedhole } from \"./platedhole\"\nexport { sot } from \"./sot\"\nexport { sot343 } from \"./sot343\"\nexport { m2host } from \"./m2host\"\nexport { to92l } from \"./to92l\"\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 { z } from \"zod\"\n\nexport const base_def = z.object({\n norefdes: z\n .boolean()\n .optional()\n .describe(\"disable reference designator label\"),\n invert: z\n .boolean()\n .optional()\n .describe(\"hint to invert the orientation of the 3D model\"),\n faceup: z\n .boolean()\n .optional()\n .describe(\"The male pin header should face upwards, out of the top layer\"),\n nosilkscreen: z\n .boolean()\n .optional()\n .describe(\"omit all silkscreen elements from the footprint\"),\n})\n","import type {\n AnyCircuitElement,\n PcbFabricationNoteText,\n PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nimport { z } from \"zod\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { platedHoleWithRectPad } from \"../helpers/platedHoleWithRectPad\"\n\nimport { u_curve } from \"../helpers/u-curve\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\n\nfunction convertMilToMm(value: string | number): number {\n if (typeof value === \"string\") {\n if (value.trim().toLowerCase().endsWith(\"mil\")) {\n return parseFloat(value) * 0.0254\n }\n return parseFloat(value)\n }\n return Number(value)\n}\n\nconst lengthInMm = z\n .union([z.string(), z.number()])\n .transform((val) => convertMilToMm(val))\n\nexport const extendDipDef = (newDefaults: { w?: string; p?: string }) =>\n base_def\n .extend({\n fn: z.string(),\n num_pins: z.number().optional().default(6),\n wide: z.boolean().optional(),\n narrow: z.boolean().optional(),\n w: lengthInMm.optional(),\n p: lengthInMm.default(newDefaults.p ?? \"2.54mm\"),\n id: lengthInMm.optional(),\n od: lengthInMm.optional(),\n nosquareplating: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"do not use rectangular pad for pin 1\"),\n })\n .transform((v) => {\n if (!v.id && !v.od) {\n if (Math.abs(v.p - 1.27) < 0.01) {\n v.id = convertMilToMm(\"0.55mm\")\n v.od = convertMilToMm(\"0.95mm\")\n } else {\n v.id = convertMilToMm(\"0.8mm\")\n v.od = convertMilToMm(\"1.6mm\")\n }\n } else if (!v.id) {\n v.id = v.od! * (1.0 / 1.5)\n } else if (!v.od) {\n v.od = v.id! * (1.5 / 1.0)\n }\n\n if (!v.w) {\n if (v.wide) {\n v.w = convertMilToMm(\"600mil\")\n } else if (v.narrow) {\n v.w = convertMilToMm(\"300mil\")\n } else {\n v.w = convertMilToMm(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 nosquareplating: boolean,\n) => {\n const ph = pinCount / 2\n const isLeft = pn <= ph\n const leftPinGaps = ph - 1\n const gs = p\n const h = gs * leftPinGaps\n\n if (isLeft) {\n return { x: -w / 2, y: h / 2 - (pn - 1) * gs }\n }\n return { x: w / 2, y: -h / 2 + (pn - ph - 1) * gs }\n}\n\n/**\n * DIP footprint with silk line **outside** the holes and pads.\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\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 parameters.nosquareplating,\n )\n if (i === 0 && !parameters.nosquareplating) {\n platedHoles.push(\n platedHoleWithRectPad(\n i + 1,\n x,\n y,\n parameters.id ?? \"0.8mm\",\n parameters.od ?? \"1mm\",\n parameters.od ?? \"1mm\",\n ),\n )\n continue\n }\n platedHoles.push(\n platedhole(i + 1, x, y, parameters.id ?? \"0.8mm\", parameters.od ?? \"1mm\"),\n )\n }\n\n const padEdgeHeight =\n (parameters.num_pins / 2 - 1) * parameters.p + parameters.od\n\n // Gap between rows (inner edge to inner edge)\n const innerGap = parameters.w - parameters.od\n // Silk width (small box between rows)\n const sw = innerGap - 1 // clearance\n\n // Silk height still spans the whole row length\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.od + 0.4\n\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 // U-notch curve outside the pads\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\n /** Pin labels placed just outside silk line */\n const silkscreenPins: PcbFabricationNoteText[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const isLeft = i < parameters.num_pins / 2\n // Place fabrication text outside the outer edge of the holes/pads\n // Hole centers are at ±w/2; outer pad edge is at ±(w/2 + od/2)\n // Add a small clearance margin to keep text away from holes\n const clearance = 0.6\n // Use CCW pin coordinates for correct top-left origin for pin1\n const { y: pinCenterY } = getCcwDipCoords(\n parameters.num_pins,\n i + 1,\n parameters.w,\n parameters.p ?? 2.54,\n parameters.nosquareplating,\n )\n const pinLabelX = isLeft\n ? -parameters.w / 2 - parameters.od / 2 - clearance\n : parameters.w / 2 + parameters.od / 2 + clearance\n // Align label vertically with the actual pin center to preserve CCW order\n const pinLabelY = pinCenterY\n silkscreenPins.push({\n type: \"pcb_fabrication_note_text\",\n pcb_fabrication_note_text_id: `pin_${i + 1}`,\n layer: \"top\",\n pcb_component_id: `pin_${i + 1}`,\n text: `{pin${i + 1}}`,\n anchor_position: { x: pinLabelX, y: pinLabelY },\n font_size: 0.3,\n font: \"tscircuit2024\",\n anchor_alignment: \"top_left\",\n })\n }\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 { 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 pcb_plated_hole_id: \"\",\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 { mm } from \"@tscircuit/mm\"\nimport type { PcbHoleCircularWithRectPad } from \"circuit-json\"\n\nexport const platedHoleWithRectPad = (\n pn: number,\n x: number,\n y: number,\n holeDiameter: number | string,\n rectPadWidth: number | string,\n rectPadHeight: number | string,\n holeOffsetX: number,\n holeOffsetY: number,\n): PcbHoleCircularWithRectPad => {\n return {\n pcb_plated_hole_id: \"\",\n type: \"pcb_plated_hole\",\n shape: \"circular_hole_with_rect_pad\",\n x,\n y,\n hole_diameter: mm(holeDiameter),\n hole_shape: \"circle\",\n pad_shape: \"rect\",\n rect_pad_width: mm(rectPadWidth),\n rect_pad_height: mm(rectPadHeight),\n pcb_port_id: \"\",\n layers: [\"top\", \"bottom\"],\n port_hints: [pn.toString()],\n hole_offset_x: holeOffsetX,\n hole_offset_y: holeOffsetY,\n }\n}\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 { PCBSMTPad } from \"circuit-json\"\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 { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\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\"\nimport { base_def } from \"./zod/base_def\"\n\ntype StandardSize = {\n imperial: string\n metric: string\n p_mm_min: number // pad-to-pad spacing\n ph_mm_min: number // pad height\n pw_mm_min: number // pad width\n h_mm_min: number // body height\n w_mm_min: number // body width\n}\n\n// Updated footprint sizes\nexport const footprintSizes: StandardSize[] = [\n {\n imperial: \"01005\",\n metric: \"0402\",\n p_mm_min: 0.5,\n pw_mm_min: 0.4,\n ph_mm_min: 0.3,\n w_mm_min: 0.58,\n h_mm_min: 0.21,\n },\n {\n imperial: \"0504\",\n metric: \"1310\",\n p_mm_min: 1.1,\n pw_mm_min: 0.65,\n ph_mm_min: 1.3,\n w_mm_min: 0.58,\n h_mm_min: 0.21,\n },\n {\n imperial: \"1812\",\n metric: \"4532\",\n p_mm_min: 4.275,\n pw_mm_min: 1.125,\n ph_mm_min: 3.4,\n w_mm_min: 5.4,\n h_mm_min: 3.4,\n },\n {\n imperial: \"0201\",\n metric: \"0603\",\n p_mm_min: 0.66,\n pw_mm_min: 0.46,\n ph_mm_min: 0.4,\n w_mm_min: 0.9,\n h_mm_min: 0.3,\n },\n {\n imperial: \"0402\",\n metric: \"1005\",\n p_mm_min: 1.02,\n pw_mm_min: 0.54,\n ph_mm_min: 0.64,\n w_mm_min: 1.56,\n h_mm_min: 0.64,\n },\n {\n imperial: \"0603\",\n metric: \"1608\",\n p_mm_min: 1.65,\n pw_mm_min: 0.8,\n ph_mm_min: 0.95,\n w_mm_min: 2.45,\n h_mm_min: 0.95,\n },\n {\n imperial: \"0805\",\n metric: \"2012\",\n p_mm_min: 1.825,\n pw_mm_min: 1.025,\n ph_mm_min: 1.4,\n w_mm_min: 2.8499999999999996,\n h_mm_min: 1.4,\n },\n {\n imperial: \"1206\",\n metric: \"3216\",\n p_mm_min: 2.925,\n pw_mm_min: 1.125,\n ph_mm_min: 1.75,\n w_mm_min: 4.05,\n h_mm_min: 1.75,\n },\n {\n imperial: \"1210\",\n metric: \"3225\",\n p_mm_min: 2.925,\n pw_mm_min: 1.125,\n ph_mm_min: 2.65,\n w_mm_min: 4.05,\n h_mm_min: 2.65,\n },\n {\n imperial: \"2010\",\n metric: \"5025\",\n p_mm_min: 4.625,\n pw_mm_min: 1.225,\n ph_mm_min: 2.65,\n w_mm_min: 5.85,\n h_mm_min: 2.65,\n },\n {\n imperial: \"2512\",\n metric: \"6332\",\n p_mm_min: 5.925,\n pw_mm_min: 1.225,\n ph_mm_min: 3.35,\n w_mm_min: 7.15,\n h_mm_min: 3.35,\n },\n]\n\nconst metricMap = Object.fromEntries(footprintSizes.map((s) => [s.metric, s]))\nconst imperialMap = Object.fromEntries(\n footprintSizes.map((s) => [s.imperial, s]),\n)\n\nexport const passive_def = base_def.extend({\n tht: z.boolean(),\n p: length.optional(),\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 textbottom: z.boolean().optional(),\n})\n\nexport type PassiveDef = z.input<typeof passive_def>\n\nexport const passive = (params: PassiveDef): AnyCircuitElement[] => {\n let { tht, p, pw, ph, metric, imperial, w, h, textbottom } = 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 !== undefined && w !== undefined && h > w) {\n throw new Error(\n \"height cannot be greater than width (rotated footprint not yet implemented)\",\n )\n }\n\n let sz: StandardSize | undefined\n if (metric) sz = metricMap[metric]\n if (imperial) sz = imperialMap[imperial]\n\n if (sz) {\n w = sz.w_mm_min\n h = sz.h_mm_min\n p = sz.p_mm_min\n pw = sz.pw_mm_min\n ph = sz.ph_mm_min\n }\n\n if (p === undefined || pw === undefined || ph === undefined) {\n throw new Error(\"Could not determine required pad dimensions (p, pw, ph)\")\n }\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: p / 2, y: ph / 2 + 0.4 },\n { x: -p / 2 - pw / 2 - 0.2, y: ph / 2 + 0.4 },\n { x: -p / 2 - pw / 2 - 0.2, y: -ph / 2 - 0.4 },\n { x: p / 2, y: -ph / 2 - 0.4 },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n const textY = textbottom ? -ph / 2 - 0.9 : ph / 2 + 0.9\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, textY, 0.2)\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 silkscreenLine,\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 silkscreenLine,\n silkscreenRefText,\n ]\n }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { passive, type PassiveDef } from \"src/helpers/passive-fn\"\n\nexport const diode = (parameters: {\n tht: boolean\n p: number\n}): { circuitJson: AnySoupElement[]; parameters: PassiveDef } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { type PassiveDef, passive } from \"../helpers/passive-fn\"\n\nexport const cap = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: PassiveDef } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { type PassiveDef, passive } from \"../helpers/passive-fn\"\n\nexport const led = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: PassiveDef } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { rectpad } from \"./rectpad\"\nimport { type SilkscreenRef, silkscreenRef } from \"./silkscreenRef\"\n\nexport interface ChipArrayParams {\n padSpacing: number // Horizontal spacing between left and right columns\n padWidth: number\n padHeight: number\n padPitch: number // Vertical spacing between pads\n numRows: number // Number of rows (2 for 0402_x2, 4 for 0402_x4)\n textbottom?: boolean\n}\n\n/**\n * Common function for generating chip array footprints (e.g., resistor arrays).\n * Creates pads in a 2-column layout with pin numbering going down the left column\n * then up the right column.\n *\n * @param params Configuration parameters for the array\n * @returns Array of circuit elements (pads, silkscreen, pin1 marker, ref text)\n */\nexport const chipArray = (params: ChipArrayParams): AnyCircuitElement[] => {\n const { padSpacing, padWidth, padHeight, padPitch, numRows, textbottom } =\n params\n\n // Calculate Y positions for pads (centered around origin)\n const yPositions: number[] = []\n const halfRange = (numRows - 1) * (padPitch / 2)\n for (let i = 0; i < numRows; i++) {\n yPositions.push(halfRange - i * padPitch)\n }\n\n const pads: AnyCircuitElement[] = []\n\n // Left column: pins 1 to numRows\n yPositions.forEach((y, index) => {\n pads.push(rectpad(index + 1, -padSpacing / 2, y, padWidth, padHeight))\n })\n\n // Right column: pins numRows+1 to 2*numRows (reverse order)\n yPositions\n .slice()\n .reverse()\n .forEach((y, index) => {\n pads.push(\n rectpad(index + numRows + 1, padSpacing / 2, y, padWidth, padHeight),\n )\n })\n\n // Calculate silkscreen boundaries - match KiCad style (two horizontal lines)\n const top = Math.max(...yPositions) + padHeight / 2 + 0.4\n const bottom = Math.min(...yPositions) - padHeight / 2 - 0.4\n const left = -padSpacing / 2 - padWidth / 2 - 0.4\n const right = padSpacing / 2 + padWidth / 2 + 0.4\n\n // Silkscreen: two horizontal lines (matching KiCad style)\n const silkscreenTop: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: right * 0.5, y: top },\n { x: left * 0.5, y: top },\n ],\n stroke_width: 0.12,\n pcb_silkscreen_path_id: \"silkscreen_top\",\n }\n\n const silkscreenBottom: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: right * 0.5, y: bottom },\n { x: left * 0.5, y: bottom },\n ],\n stroke_width: 0.12,\n pcb_silkscreen_path_id: \"silkscreen_bottom\",\n }\n\n // Pin 1 marker: corner indicator at top-left (where pin1 pad is located)\n // Match KiCad style - small L-shaped corner marker\n const pin1X = -padSpacing / 2\n const pin1Y = Math.max(...yPositions)\n const pin1MarkerSize = 0.2\n const pin1Left = pin1X - padWidth / 2 - 0.1\n const pin1Top = pin1Y + padHeight / 2 + 0.1\n const pin1Marker: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"pin1_marker\",\n route: [\n { x: pin1Left, y: pin1Top },\n { x: pin1Left - pin1MarkerSize, y: pin1Top },\n { x: pin1Left, y: pin1Top + pin1MarkerSize },\n { x: pin1Left, y: pin1Top },\n ],\n stroke_width: 0.1,\n }\n\n // Reference text\n const textY = textbottom ? bottom - 0.9 : top + 0.9\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, textY, 0.2)\n\n return [\n ...pads,\n silkscreenTop,\n silkscreenBottom,\n pin1Marker,\n silkscreenRefText,\n ]\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { chipArray } from \"./chipArray\"\n\nconst padSpacing = 1.0 // Horizontal spacing between columns (KiCad: 1.0mm)\nconst padWidth = 0.5 // Pad width (KiCad: 0.5mm)\nconst padHeight = 0.4 // Pad height (KiCad: 0.4mm)\nconst padPitch = 0.7 // Vertical pitch between pads (KiCad: 0.7mm)\n\nexport const res0402Array2 = (params: {\n textbottom?: boolean\n}): AnyCircuitElement[] => {\n return chipArray({\n padSpacing,\n padWidth,\n padHeight,\n padPitch,\n numRows: 2,\n textbottom: params.textbottom,\n })\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { chipArray } from \"./chipArray\"\n\nconst padSpacing = 1.0 // Horizontal spacing between columns (KiCad: 1.0mm)\nconst padWidth = 0.5 // Pad width (KiCad: 0.5mm)\nconst padHeight = 0.32 // Pad height (KiCad: 0.32mm)\nconst padPitch = 0.5 // Vertical pitch between pads (KiCad: 0.5mm)\n\nexport const res0402Array4 = (params: {\n textbottom?: boolean\n}): AnyCircuitElement[] => {\n return chipArray({\n padSpacing,\n padWidth,\n padHeight,\n padPitch,\n numRows: 4,\n textbottom: params.textbottom,\n })\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { chipArray } from \"./chipArray\"\n\nconst padSpacing = 1.7 // Horizontal spacing between columns (KiCad: 1.7mm)\nconst padWidth = 0.9 // Pad width (KiCad: 0.9mm)\nconst padHeight = 0.4 // Pad height (KiCad: 0.4mm)\nconst padPitch = 0.8 // Vertical pitch between pads (KiCad: 0.8mm)\n\nexport const res0603Array2 = (params: {\n textbottom?: boolean\n}): AnyCircuitElement[] => {\n return chipArray({\n padSpacing,\n padWidth,\n padHeight,\n padPitch,\n numRows: 2,\n textbottom: params.textbottom,\n })\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { chipArray } from \"./chipArray\"\n\nconst padSpacing = 1.7 // Horizontal spacing between columns (KiCad: 1.7mm)\nconst padWidth = 0.9 // Pad width (KiCad: 0.9mm)\nconst padHeight = 0.4 // Pad height (KiCad: 0.4mm)\nconst padPitch = 0.8 // Vertical pitch between pads (KiCad: 0.8mm)\n\nexport const res0603Array4 = (params: {\n textbottom?: boolean\n}): AnyCircuitElement[] => {\n return chipArray({\n padSpacing,\n padWidth,\n padHeight,\n padPitch,\n numRows: 4,\n textbottom: params.textbottom,\n })\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { chipArray } from \"./chipArray\"\n\nconst padSpacing = 1.4 // Horizontal spacing between columns (KiCad: 1.4mm)\nconst padWidth = 0.7 // Pad width (KiCad: 0.7mm)\nconst padHeight = 0.64 // Pad height (KiCad: 0.64mm)\nconst padPitch = 0.94 // Vertical pitch between pads (KiCad: 0.94mm)\n\nexport const res0606Array2 = (params: {\n textbottom?: boolean\n}): AnyCircuitElement[] => {\n return chipArray({\n padSpacing,\n padWidth,\n padHeight,\n padPitch,\n numRows: 2,\n textbottom: params.textbottom,\n })\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { chipArray } from \"./chipArray\"\n\nconst padSpacing = 3.0 // Horizontal spacing between columns (KiCad: 3.0mm)\nconst padWidth = 0.9 // Pad width (KiCad: 0.9mm)\nconst padHeight = 0.9 // Pad height (KiCad: 0.9mm)\nconst padPitch = 1.34 // Vertical pitch between pads (KiCad: 1.34mm)\n\nexport const res1206Array4 = (params: {\n textbottom?: boolean\n}): AnyCircuitElement[] => {\n return chipArray({\n padSpacing,\n padWidth,\n padHeight,\n padPitch,\n numRows: 4,\n textbottom: params.textbottom,\n })\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { passive, type PassiveDef } from \"../helpers/passive-fn\"\nimport { res0402Array2 } from \"../helpers/res0402-array2\"\nimport { res0402Array4 } from \"../helpers/res0402-array4\"\nimport { res0603Array2 } from \"../helpers/res0603-array2\"\nimport { res0603Array4 } from \"../helpers/res0603-array4\"\nimport { res0606Array2 } from \"../helpers/res0606-array2\"\nimport { res1206Array4 } from \"../helpers/res1206-array4\"\n\ntype ResArrayParams = PassiveDef & {\n array?: number | string\n x?: number | string\n}\n\nconst getArrayCount = (parameters: ResArrayParams): number | undefined => {\n const arrayValue = parameters.array ?? parameters.x\n if (typeof arrayValue === \"number\") {\n return Number.isNaN(arrayValue) ? undefined : arrayValue\n }\n if (typeof arrayValue === \"string\") {\n const parsed = Number.parseInt(arrayValue, 10)\n return Number.isNaN(parsed) ? undefined : parsed\n }\n\n if (typeof parameters.imperial === \"string\") {\n const match = parameters.imperial.match(/(?:array|x)(2|4)$/)\n const count = match?.[1]\n if (count) {\n return Number.parseInt(count, 10)\n }\n }\n\n return undefined\n}\n\nconst getImperialBase = (imperial?: string | number): string | undefined => {\n if (!imperial) return undefined\n const imperialString = typeof imperial === \"number\" ? `${imperial}` : imperial\n return imperialString.split(\"_\")[0]\n}\n\nexport const res = (\n rawParameters: ResArrayParams,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const arrayCount = getArrayCount(rawParameters)\n const imperialBase = getImperialBase(rawParameters.imperial)\n\n if (arrayCount === 2 && imperialBase === \"0402\") {\n return {\n circuitJson: res0402Array2(rawParameters),\n parameters: rawParameters,\n }\n }\n\n if (arrayCount === 4 && imperialBase === \"0402\") {\n return {\n circuitJson: res0402Array4(rawParameters),\n parameters: rawParameters,\n }\n }\n\n if (arrayCount === 2 && imperialBase === \"0603\") {\n return {\n circuitJson: res0603Array2(rawParameters),\n parameters: rawParameters,\n }\n }\n\n if (arrayCount === 4 && imperialBase === \"0603\") {\n return {\n circuitJson: res0603Array4(rawParameters),\n parameters: rawParameters,\n }\n }\n\n if (arrayCount === 2 && imperialBase === \"0606\") {\n return {\n circuitJson: res0606Array2(rawParameters),\n parameters: rawParameters,\n }\n }\n\n if (arrayCount === 4 && imperialBase === \"1206\") {\n return {\n circuitJson: res1206Array4(rawParameters),\n parameters: rawParameters,\n }\n }\n\n return { circuitJson: passive(rawParameters), parameters: rawParameters }\n}\n","import type { PcbSmtPad } from \"circuit-json\"\n\nexport const circlepad = (\n pn: number | Array<string | number>,\n { x, y, radius }: { x: number; y: number; radius: number },\n): PcbSmtPad => {\n return {\n type: \"pcb_smtpad\",\n x,\n y,\n radius,\n layer: \"top\",\n shape: \"circle\",\n pcb_smtpad_id: \"\",\n port_hints: Array.isArray(pn)\n ? pn.map((item) => item.toString())\n : [pn.toString()],\n }\n}\n","export const ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n","import type { AnySoupElement, PCBSMTPad } from \"circuit-json\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { circlepad } from \"../helpers/circlepad\"\nimport { ALPHABET } from \"../helpers/zod/ALPHABET\"\nimport { z } from \"zod\"\nimport { base_def } from \"../helpers/zod/base_def\"\nimport { length, distance } from \"circuit-json\"\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\"\nimport { type PcbSilkscreenPath } from \"circuit-json\"\n\nexport const bga_def = base_def\n .extend({\n fn: z.string(),\n num_pins: z.number().optional().default(64),\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 circularpads: z.boolean().optional().describe(\"use circular pads\"),\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 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 // Calculate physical pad position (always centered around origin)\n const pad_x = (x - (grid.x - 1) / 2) * p\n const pad_y = (y - (grid.y - 1) / 2) * p\n\n // Calculate pin number based on origin\n let pin_x = x\n let pin_y = y\n switch (parameters.origin) {\n case \"bl\":\n pin_x = x\n pin_y = grid.y - 1 - y\n break\n case \"br\":\n pin_x = grid.x - 1 - x\n pin_y = grid.y - 1 - y\n break\n case \"tr\":\n pin_x = grid.x - 1 - x\n pin_y = y\n break\n case \"tl\":\n default:\n // Keep original x,y for pin numbering\n break\n }\n\n let pin_num = pin_y * grid.x + pin_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 // TODO handle >26 rows\n const portHints = [pin_num, `${ALPHABET[pin_y]}${pin_x + 1}`]\n pads.push(\n parameters.circularpads\n ? circlepad(portHints, {\n x: pad_x,\n y: pad_y,\n radius: pad / 2,\n })\n : rectpad(portHints, 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 // Add pin 1 marker\n const pin1MarkerSize = p / 6 // Make marker smaller, more proportional\n\n // Calculate marker position and route based on origin\n let markerRoute: Array<{ x: number; y: number }>\n const edgeX = (grid.x * p) / 2\n const edgeY = (grid.y * p) / 2\n\n switch (parameters.origin) {\n case \"bl\":\n markerRoute = [\n { x: -edgeX, y: -edgeY }, // Start at corner\n { x: -edgeX, y: -edgeY - pin1MarkerSize }, // Up\n { x: -edgeX - pin1MarkerSize, y: -edgeY }, // Left\n { x: -edgeX, y: -edgeY }, // Back to start\n ]\n break\n case \"br\":\n markerRoute = [\n { x: edgeX, y: -edgeY }, // Start at corner\n { x: edgeX, y: -edgeY - pin1MarkerSize }, // Up\n { x: edgeX + pin1MarkerSize, y: -edgeY }, // Right\n { x: edgeX, y: -edgeY }, // Back to start\n ]\n break\n case \"tr\":\n markerRoute = [\n { x: edgeX, y: edgeY }, // Start at corner\n { x: edgeX, y: edgeY + pin1MarkerSize }, // Down\n { x: edgeX + pin1MarkerSize, y: edgeY }, // Right\n { x: edgeX, y: edgeY }, // Back to start\n ]\n break\n case \"tl\":\n default:\n markerRoute = [\n { x: -edgeX, y: edgeY }, // Start at corner\n { x: -edgeX, y: edgeY + pin1MarkerSize }, // Down\n { x: -edgeX - pin1MarkerSize, y: edgeY }, // Left\n { x: -edgeX, y: edgeY }, // Back to start\n ]\n break\n }\n\n const pin1Marker: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"pin1_marker\",\n route: markerRoute,\n stroke_width: 0.05,\n }\n\n return {\n circuitJson: [...pads, silkscreenRefText, pin1Marker 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 \"circuit-json\"\nimport { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { u_curve } from \"../helpers/u-curve\"\nimport { rectpad } from \"src/helpers/rectpad\"\nimport { pillpad } from \"src/helpers/pillpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const extendSoicDef = (newDefaults: {\n w?: string\n p?: string\n pw?: string\n pl?: string\n num_pins?: number\n legsoutside?: boolean\n pillpads?: boolean\n}) =>\n base_def\n .extend({\n fn: z.string(),\n num_pins: z.number().optional().default(8),\n w: length.default(length.parse(newDefaults.w ?? \"5.3mm\")),\n p: length.default(length.parse(newDefaults.p ?? \"1.27mm\")),\n pw: length.default(length.parse(newDefaults.pw ?? \"0.6mm\")),\n pl: length.default(length.parse(newDefaults.pl ?? \"1.0mm\")),\n legsoutside: z\n .boolean()\n .optional()\n .default(newDefaults.legsoutside ?? false),\n pillpads: z\n .boolean()\n .optional()\n .default(newDefaults.pillpads ?? false),\n silkscreen_stroke_width: z.number().optional().default(0.1),\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<\n typeof v,\n \"w\" | \"p\" | \"pw\" | \"pl\" | \"pillpads\" | \"silkscreen_stroke_width\"\n >\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 }\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 * 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: SoicInput } => {\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,\n pl: parameters.pl,\n legsoutside: parameters.legsoutside,\n })\n if (parameters.pillpads) {\n pads.push(pillpad(i + 1, x, y, parameters.pl, parameters.pw))\n } else {\n pads.push(rectpad(i + 1, x, y, parameters.pl, parameters.pw))\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: parameters.silkscreen_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 { PCBSMTPad } from \"circuit-json\"\n\nexport const pillpad = (\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 radius: h / 2,\n layer: \"top\",\n shape: \"pill\",\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, PcbSilkscreenPath } from \"circuit-json\"\nimport { optional, z } from \"zod\"\nimport { length } from \"circuit-json\"\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\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const base_quad_def = base_def.extend({\n fn: z.string(),\n cc: z.boolean().default(true).optional(),\n ccw: z.boolean().default(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().optional().default(64),\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().default(false),\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 + 0.1, y: ibh / 2 - pos * p, o: \"vert\" }\n case \"bottom\":\n return { x: -ibw / 2 + pos * p, y: -h / 2 - pcdfe + 0.1, o: \"horz\" }\n case \"right\":\n return { x: w / 2 + pcdfe - 0.1, y: -ibh / 2 + pos * p, o: \"vert\" }\n case \"top\":\n return { x: ibw / 2 - pos * p, y: h / 2 + pcdfe - 0.1, 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 \"circuit-json\"\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 if (!parameters.pl) {\n parameters.pl = 0.875\n }\n if (!parameters.pw) {\n parameters.pw = 0.25\n }\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 tqfp_def = quad_def\n\n// TQFP (Thin Quad Flat Package) with intelligent defaults\nexport const tqfp = (\n raw_params: z.input<typeof quad_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n raw_params.legsoutside = true\n\n // Apply pitch defaults based on pin count if not specified\n if (!raw_params.p) {\n switch (raw_params.num_pins) {\n case 32:\n raw_params.p = 0.8\n break\n case 44:\n case 48:\n raw_params.p = 0.5\n break\n case 64:\n case 80:\n case 100:\n raw_params.p = 0.5\n break\n case 144:\n raw_params.p = 0.5\n break\n }\n }\n\n // Apply pad length defaults if not specified\n // Based on KiCad footprint library standards\n if (!raw_params.pl) {\n switch (raw_params.num_pins) {\n case 32:\n case 44:\n case 48:\n case 64:\n case 80:\n case 100:\n raw_params.pl = 1.475\n break\n case 144:\n raw_params.pl = 1.6\n break\n }\n }\n\n // Apply pad width defaults if not specified\n // Based on KiCad footprint library standards\n if (!raw_params.pw) {\n switch (raw_params.num_pins) {\n case 32:\n raw_params.pw = 0.55\n break\n case 44:\n case 48:\n case 64:\n case 80:\n case 100:\n raw_params.pw = 0.3\n break\n case 144:\n raw_params.pw = 0.25\n break\n }\n }\n\n return quad(raw_params)\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 \"circuit-json\"\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 \"circuit-json\"\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 \"circuit-json\"\nimport { extendSoicDef, soicWithoutParsing, type SoicInput } from \"./soic\"\n\nexport const tssop_def = extendSoicDef({\n w: \"7.1mm\",\n p: \"0.65mm\",\n pl: \"1.35mm\",\n pw: \"0.40mm\",\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 \"circuit-json\"\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: 2.56,\n p: 0.65,\n pw: 0.4,\n pl: 0.65,\n legoutside: true,\n })\n\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sot886_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(6).default(6),\n w: z.string().default(\"1.01mm\"),\n h: z.string().default(\"1.45mm\"),\n p: z.string().default(\"0.5mm\"),\n pl: z.string().default(\"0.33mm\"),\n pw: z.string().default(\"0.27mm\"),\n string: z.string().optional(),\n})\n\nexport const sot886 = (\n raw_params: z.input<typeof sot886_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = sot886_def.parse({ fn: \"sot886\", ...raw_params })\n\n const w = length.parse(parameters.w)\n const h = length.parse(parameters.h)\n const p = length.parse(parameters.p)\n const pl = length.parse(parameters.pl)\n const pw = length.parse(parameters.pw)\n\n const pads: AnyCircuitElement[] = []\n for (let i = 0; i < 6; i++) {\n const { x, y } = getSot886PadCoord(i + 1, w, p, pl)\n pads.push(rectpad(i + 1, x, y, pl, pw))\n }\n\n const silkscreenTopLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -w / 2, y: h / 2 },\n { x: w / 2, y: h / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenBottomLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -w / 2, y: -h / 2 },\n { x: w / 2, y: -h / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const pin1Position = getSot886PadCoord(1, w, p, pl)\n const pin1Marking: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"pin_marker_1\",\n route: [\n { x: pin1Position.x - pl / 2 - 0.3, y: pin1Position.y },\n { x: pin1Position.x - pl / 2 - 0.45, y: pin1Position.y + 0.15 },\n { x: pin1Position.x - pl / 2 - 0.45, y: pin1Position.y - 0.15 },\n { x: pin1Position.x - pl / 2 - 0.3, y: pin1Position.y },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"pin_marker_1\",\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, h / 2 + 0.4, 0.25)\n\n return {\n circuitJson: [\n ...pads,\n silkscreenTopLine,\n silkscreenBottomLine,\n silkscreenRefText,\n pin1Marking,\n ],\n parameters,\n }\n}\n\nexport const getSot886PadCoord = (\n pn: number,\n w: number,\n p: number,\n pl: number,\n) => {\n const padCenterOffset = w / 2 - pl / 2\n if (pn <= 3) {\n return { x: -padCenterOffset, y: p - (pn - 1) * p }\n }\n return { x: padCenterOffset, y: -p + (pn - 4) * p }\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sot23_def = base_def.extend({\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(\"1.32mm\"),\n pw: z.string().default(\"0.6mm\"),\n p: z.string().default(\"0.95mm\"),\n string: z.string().optional(),\n})\n\nexport const sot23_6_or_8_def = extendSoicDef({\n p: \"0.95mm\",\n w: \"1.6mm\",\n legsoutside: true,\n})\n\nexport const sot23 = (\n raw_params: z.input<typeof sot23_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const match = raw_params.string?.match(/^sot23_(\\d+)/)\n const numPins = match ? Number.parseInt(match[1]!, 10) : 3\n\n if (numPins === 6 || numPins === 8) {\n const parameters = sot23_6_or_8_def.parse({\n ...raw_params,\n num_pins: numPins,\n })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters: parameters,\n }\n }\n\n const parameters = sot23_def.parse({\n ...raw_params,\n num_pins: numPins,\n })\n\n if (parameters.num_pins === 3) {\n return {\n circuitJson: sot23_3(parameters),\n parameters: parameters,\n }\n }\n if (parameters.num_pins === 5) {\n return {\n circuitJson: sot23_5(parameters),\n parameters: parameters,\n }\n }\n throw new Error(\"Invalid number of pins\")\n}\nexport const getCcwSot23Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n p: number\n}) => {\n const { pn, w, h, pl, p } = parameters\n\n if (pn === 1) {\n return { x: -1.155, y: p }\n }\n if (pn === 2) {\n return { x: -1.155, y: -p }\n }\n\n return { x: 1.15, y: 0 }\n}\n\nexport const sot23_3 = (parameters: z.infer<typeof sot23_def>) => {\n const pads: AnyCircuitElement[] = []\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 p: Number.parseFloat(parameters.p),\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.parseInt(parameters.h),\n 0.3,\n )\n return [...pads, silkscreenRefText as AnyCircuitElement]\n}\n\nexport const getCcwSot235Coords = (parameters: {\n h: number\n p: number\n pn: number\n}) => {\n const { p, h, pn } = parameters\n if (pn === 1) {\n return { x: -h / 2 - 0.5, y: p }\n }\n if (pn === 2) {\n return { x: -h / 2 - 0.5, y: 0 }\n }\n if (pn === 3) {\n return { x: -h / 2 - 0.5, y: -p }\n }\n if (pn === 4) {\n return { x: h / 2 + 0.5, y: -p }\n }\n if (pn === 5) {\n return { x: h / 2 + 0.5, y: p }\n }\n throw new Error(\"Invalid pin number\")\n}\n\nexport const sot23_5 = (parameters: z.infer<typeof sot23_def>) => {\n const pads: AnyCircuitElement[] = []\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getCcwSot235Coords({\n h: Number.parseFloat(parameters.h),\n p: Number.parseFloat(parameters.p),\n pn: i,\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n\n const width =\n ((parameters.num_pins + 1) / 2) * Number.parseFloat(parameters.p)\n const height = Number.parseFloat(parameters.h)\n const silkscreenPath1: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -width / 3, y: height / 2 + Number.parseFloat(parameters.p) / 1.3 },\n { x: width / 3, y: height / 2 + Number.parseFloat(parameters.p) / 1.3 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.05,\n }\n const silkscreenPath2: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_2\",\n route: [\n { x: -width / 3, y: -height / 2 - Number.parseFloat(parameters.p) / 1.3 },\n { x: width / 3, y: -height / 2 - Number.parseFloat(parameters.p) / 1.3 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.05,\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, height + 0.3, 0.3)\n const pin1Position = getCcwSot235Coords({\n h: Number.parseFloat(parameters.h),\n p: Number.parseFloat(parameters.p),\n pn: 1,\n })\n pin1Position.x = pin1Position.x - Number.parseFloat(parameters.pw) * 1.5\n const triangleHeight = 0.3 // Adjust triangle size as needed\n const triangleWidth = 0.4 // Adjust triangle width as needed\n const pin1Indicator: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"pin1_indicator\",\n route: [\n {\n x: pin1Position.x + triangleHeight / 2,\n y: pin1Position.y,\n }, // Tip of the triangle (pointing right)\n {\n x: pin1Position.x - triangleHeight / 2,\n y: pin1Position.y + triangleWidth / 2,\n }, // Bottom corner of the base\n {\n x: pin1Position.x - triangleHeight / 2,\n y: pin1Position.y - triangleWidth / 2,\n }, // Top corner of the base\n {\n x: pin1Position.x + triangleHeight / 2,\n y: pin1Position.y,\n }, // Close the path at the tip\n ],\n stroke_width: 0.05,\n }\n\n return [\n ...pads,\n silkscreenRefText,\n silkscreenPath1,\n silkscreenPath2,\n pin1Indicator as AnyCircuitElement,\n ]\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { sot23_def, sot23_5 } from \"./sot23\"\n\nexport const sot25_def = sot23_def.extend({})\n\nexport const sot25 = (\n raw_params: z.input<typeof sot25_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = sot25_def.parse({\n ...raw_params,\n num_pins: 5,\n })\n return {\n circuitJson: sot23_5(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\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, rotation, type AnySoupElement } from \"circuit-json\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { platedHoleWithRectPad } from \"../helpers/platedHoleWithRectPad\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { silkscreenPin } from \"src/helpers/silkscreenPin\"\nimport { mm } from \"@tscircuit/mm\"\nimport { determinePinlabelAnchorSide } from \"src/helpers/determine-pin-label-anchor-side\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const pinrow_def = base_def\n .extend({\n fn: z.string(),\n num_pins: z.number().optional().default(6),\n rows: z\n .union([z.string(), z.number()])\n .transform((val) => Number(val))\n .optional()\n .default(1)\n .describe(\"number of rows\"),\n p: length.default(\"0.1in\").describe(\"pitch\"),\n id: length.default(\"1.0mm\").describe(\"inner diameter\"),\n od: length.default(\"1.5mm\").describe(\"outer diameter\"),\n male: z.boolean().optional().describe(\"for male pin headers\"),\n female: z.boolean().optional().describe(\"for female pin headers\"),\n smd: z.boolean().optional().describe(\"surface mount device\"),\n surfacemount: z\n .boolean()\n .optional()\n .describe(\"surface mount device (verbose)\"),\n rightangle: z.boolean().optional().describe(\"right angle\"),\n pw: length.optional().default(\"1.0mm\").describe(\"pad width for SMD\"),\n pl: length.optional().default(\"2.0mm\").describe(\"pad length for SMD\"),\n pinlabeltextalignleft: z.boolean().optional().default(false),\n pinlabeltextaligncenter: z.boolean().optional().default(false),\n pinlabeltextalignright: z.boolean().optional().default(false),\n pinlabelverticallyinverted: z.boolean().optional().default(false),\n pinlabelorthogonal: z.boolean().optional().default(false),\n nosquareplating: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"do not use rectangular pad for pin 1\"),\n nopinlabels: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"omit silkscreen pin labels\"),\n doublesidedpinlabel: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"add silkscreen pins in top and bottom layers\"),\n bottomsidepinlabel: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n \"place the silkscreen reference text on the bottom layer instead of top\",\n ),\n })\n .transform((data) => {\n const pinlabelAnchorSide = determinePinlabelAnchorSide(data)\n return {\n ...data,\n pinlabelAnchorSide,\n male: data.male ?? !data.female,\n female: data.female ?? false,\n smd: data.smd ?? data.surfacemount ?? false,\n rightangle: data.rightangle ?? false,\n }\n })\n .superRefine((data, ctx) => {\n if (data.male && data.female) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"'male' and 'female' cannot both be true; it should be male or female.\",\n path: [\"male\", \"female\"],\n })\n }\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 {\n p,\n id,\n od,\n rows,\n num_pins,\n pinlabelAnchorSide,\n pinlabelverticallyinverted,\n pinlabelorthogonal,\n pinlabeltextalignleft,\n pinlabeltextalignright,\n nopinlabels,\n doublesidedpinlabel,\n bottomsidepinlabel,\n } = parameters\n let pinlabelTextAlign: \"center\" | \"left\" | \"right\" = \"center\"\n if (pinlabeltextalignleft) pinlabelTextAlign = \"left\"\n else if (pinlabeltextalignright) pinlabelTextAlign = \"right\"\n\n const holes: AnySoupElement[] = []\n const numPinsPerRow = Math.ceil(num_pins / rows)\n const ySpacing = -p\n\n const calculateAnchorPosition = ({\n xoff,\n yoff,\n od,\n anchorSide,\n smd,\n pw,\n pl,\n }: {\n xoff: number\n yoff: number\n od: number\n anchorSide: \"top\" | \"bottom\" | \"left\" | \"right\"\n smd: boolean\n pw: number\n pl: number\n }): { anchor_x: number; anchor_y: number } => {\n let dx = 0\n let dy = 0\n if (smd) {\n const offset = od / 5\n switch (anchorSide) {\n case \"right\":\n dx = pw / 2 + offset\n break\n case \"top\":\n dy = pl / 2 + offset\n break\n case \"bottom\":\n dy = -(pl / 2 + offset)\n break\n case \"left\":\n dx = -(pw / 2 + offset)\n break\n }\n } else {\n const offset = od * 0.75\n switch (anchorSide) {\n case \"right\":\n dx = offset\n break\n case \"top\":\n dy = offset\n break\n case \"bottom\":\n dy = -offset\n break\n case \"left\":\n dx = -offset\n break\n }\n }\n return { anchor_x: xoff + dx, anchor_y: yoff + dy }\n }\n\n // Helper to add plated hole and silkscreen label\n const addPin = (pinNumber: number, xoff: number, yoff: number) => {\n if (parameters.smd) {\n // SMD pads\n holes.push(rectpad(pinNumber, xoff, yoff, parameters.pw, parameters.pl))\n } else {\n // Through-hole\n if (pinNumber === 1 && !parameters.nosquareplating) {\n // Always use square plating for pin 1 (no need to check nosquareplating anymore)\n holes.push(\n platedHoleWithRectPad(pinNumber, xoff, yoff, id, od, od, 0, 0),\n )\n } else {\n // Other pins with standard circular pad\n holes.push(platedhole(pinNumber, xoff, yoff, id, od))\n }\n }\n const { anchor_x, anchor_y } = calculateAnchorPosition({\n xoff,\n yoff,\n od,\n anchorSide: pinlabelAnchorSide,\n smd: parameters.smd,\n pw: parameters.pw,\n pl: parameters.pl,\n })\n if (!nopinlabels) {\n if (!bottomsidepinlabel) {\n holes.push(\n silkscreenPin({\n fs: od / 5,\n pn: pinNumber,\n anchor_x,\n anchor_y,\n anchorplacement: pinlabelAnchorSide,\n textalign: pinlabelTextAlign,\n orthogonal: pinlabelorthogonal,\n verticallyinverted: pinlabelverticallyinverted,\n layer: \"top\",\n }),\n )\n } else {\n holes.push(\n silkscreenPin({\n fs: od / 5,\n pn: pinNumber,\n anchor_x,\n anchor_y,\n anchorplacement: pinlabelAnchorSide,\n textalign: pinlabelTextAlign,\n orthogonal: pinlabelorthogonal,\n verticallyinverted: pinlabelverticallyinverted,\n layer: \"bottom\",\n }),\n )\n }\n if (doublesidedpinlabel) {\n holes.push(\n silkscreenPin({\n fs: od / 5,\n pn: pinNumber,\n anchor_x,\n anchor_y,\n anchorplacement: pinlabelAnchorSide,\n textalign: pinlabelTextAlign,\n orthogonal: pinlabelorthogonal,\n verticallyinverted: pinlabelverticallyinverted,\n layer: \"bottom\",\n }),\n )\n }\n }\n }\n\n // Track used positions to prevent overlaps\n const usedPositions = new Set<string>()\n\n // Check if BGA-style numbering should be used\n const useBGAStyle = rows > 2 && numPinsPerRow > 2\n\n if (rows === 1) {\n // Single row: left to right, pin 1 to num_pins\n const xStart = -((num_pins - 1) / 2) * p\n for (let i = 0; i < num_pins; i++) {\n const pinNumber = i + 1\n const xoff = xStart + i * p\n const posKey = `${xoff},${0}`\n if (usedPositions.has(posKey)) throw new Error(`Overlap at ${posKey}`)\n usedPositions.add(posKey)\n addPin(pinNumber, xoff, 0)\n }\n } else if (useBGAStyle) {\n // BGA-style: row-major numbering (left to right, top to bottom)\n const xStart = -((numPinsPerRow - 1) / 2) * p\n let currentPin = 1\n for (let row = 0; row < rows && currentPin <= num_pins; row++) {\n for (let col = 0; col < numPinsPerRow && currentPin <= num_pins; col++) {\n const xoff = xStart + col * p\n const yoff = row * ySpacing\n const posKey = `${xoff},${yoff}`\n if (usedPositions.has(posKey)) throw new Error(`Overlap at ${posKey}`)\n usedPositions.add(posKey)\n addPin(currentPin++, xoff, yoff)\n }\n }\n } else {\n // Multi-row: counterclockwise spiral traversal\n const xStart = -((numPinsPerRow - 1) / 2) * p\n let currentPin = 1\n let top = 0\n let bottom = rows - 1\n let left = 0\n let right = numPinsPerRow - 1\n\n while (currentPin <= num_pins && top <= bottom && left <= right) {\n // Left column: top to bottom\n for (let row = top; row <= bottom && currentPin <= num_pins; row++) {\n const xoff = xStart + left * p\n const yoff = row * ySpacing\n const posKey = `${xoff},${yoff}`\n if (usedPositions.has(posKey)) throw new Error(`Overlap at ${posKey}`)\n usedPositions.add(posKey)\n addPin(currentPin++, xoff, yoff)\n }\n left++\n\n // Bottom row: left to right\n for (let col = left; col <= right && currentPin <= num_pins; col++) {\n const xoff = xStart + col * p\n const yoff = bottom * ySpacing\n const posKey = `${xoff},${yoff}`\n if (usedPositions.has(posKey)) throw new Error(`Overlap at ${posKey}`)\n usedPositions.add(posKey)\n addPin(currentPin++, xoff, yoff)\n }\n bottom--\n\n if (left <= right) {\n // Right column: bottom to top\n for (let row = bottom; row >= top && currentPin <= num_pins; row--) {\n const xoff = xStart + right * p\n const yoff = row * ySpacing\n const posKey = `${xoff},${yoff}`\n if (usedPositions.has(posKey)) throw new Error(`Overlap at ${posKey}`)\n usedPositions.add(posKey)\n addPin(currentPin++, xoff, yoff)\n }\n right--\n }\n\n if (top <= bottom) {\n // Top row: right to left\n for (let col = right; col >= left && currentPin <= num_pins; col--) {\n const xoff = xStart + col * p\n const yoff = top * ySpacing\n const posKey = `${xoff},${yoff}`\n if (usedPositions.has(posKey)) throw new Error(`Overlap at ${posKey}`)\n usedPositions.add(posKey)\n addPin(currentPin++, xoff, yoff)\n }\n top++\n }\n }\n\n // Verify all pins were assigned\n if (currentPin - 1 < num_pins) {\n throw new Error(\n `Missing pins: assigned ${currentPin - 1}, expected ${num_pins}`,\n )\n }\n }\n\n // Add centered silkscreen reference text\n const refText: SilkscreenRef = silkscreenRef(0, p, 0.5)\n\n return {\n circuitJson: [...holes, refText],\n parameters,\n }\n}\n","import type { LayerRef, PcbSilkscreenText } from \"circuit-json\"\n\ntype TextAlignType = \"left\" | \"center\" | \"right\"\ntype AnchorPlacementType = \"top\" | \"bottom\" | \"left\" | \"right\"\ntype RotationType = 0 | 90 | 180 | 270\n\n// fs is font size // pn is pin number\nexport const silkscreenPin = ({\n fs,\n pn,\n anchor_x,\n anchor_y,\n textalign = \"center\",\n orthogonal = false,\n verticallyinverted = false,\n layer = \"top\",\n}: {\n fs: number\n pn: number\n anchor_x: number\n anchor_y: number\n textalign?: TextAlignType\n anchorplacement?: AnchorPlacementType\n orthogonal?: boolean\n verticallyinverted?: boolean\n layer?: LayerRef\n}): PcbSilkscreenText => {\n let ccw_rotation: RotationType = 0\n if (orthogonal && verticallyinverted) {\n ccw_rotation = 270\n } else if (verticallyinverted) {\n ccw_rotation = 180\n } else if (orthogonal) {\n ccw_rotation = 90\n } else {\n ccw_rotation = 0\n }\n\n let anchor_alignment: PcbSilkscreenText[\"anchor_alignment\"] = \"center\"\n if (textalign === \"left\") {\n if (verticallyinverted) anchor_alignment = \"center_right\"\n else anchor_alignment = \"center_left\"\n }\n if (textalign === \"right\") {\n if (verticallyinverted) anchor_alignment = \"center_left\"\n else anchor_alignment = \"center_right\"\n }\n\n if (layer === \"bottom\") {\n if (anchor_alignment === \"center_left\") {\n anchor_alignment = \"center_right\"\n } else if (anchor_alignment === \"center_right\") {\n anchor_alignment = \"center_left\"\n }\n }\n\n return {\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: \"silkscreen_text_1\",\n font: \"tscircuit2024\",\n font_size: fs,\n pcb_component_id: \"pcb_component_1\",\n text: `{PIN${pn}}`,\n layer: layer,\n anchor_position: { x: anchor_x, y: anchor_y },\n anchor_alignment: anchor_alignment,\n ccw_rotation: ccw_rotation,\n }\n}\n","type PinlabelAnchorSideParams = {\n pinlabeltextalignleft: boolean\n pinlabeltextalignright: boolean\n pinlabelverticallyinverted: boolean\n pinlabelorthogonal: boolean\n}\n\nexport function determinePinlabelAnchorSide({\n pinlabeltextalignleft,\n pinlabeltextalignright,\n pinlabelorthogonal,\n}: PinlabelAnchorSideParams): \"top\" | \"bottom\" | \"left\" | \"right\" {\n let pinlabelAnchorSide: \"top\" | \"bottom\" | \"left\" | \"right\" = \"top\"\n // Default to center if no alignment specified\n if (pinlabelorthogonal) {\n pinlabelAnchorSide = \"left\"\n } else {\n pinlabelAnchorSide = \"top\"\n }\n if (pinlabeltextalignleft) {\n if (pinlabelorthogonal) {\n pinlabelAnchorSide = \"bottom\"\n } else {\n pinlabelAnchorSide = \"right\"\n }\n }\n if (pinlabeltextalignright) {\n if (pinlabelorthogonal) {\n pinlabelAnchorSide = \"top\"\n } else {\n pinlabelAnchorSide = \"left\"\n }\n }\n return pinlabelAnchorSide\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sot563_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(6).default(6),\n w: z.string().default(\"2.1mm\"),\n h: z.string().default(\"2.45mm\"),\n p: z.string().default(\"0.5mm\"),\n pl: z.string().default(\"0.675mm\"),\n pw: z.string().default(\"0.35mm\"),\n string: z.string().optional(),\n})\n\nexport const sot563 = (\n raw_params: z.input<typeof sot563_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = sot563_def.parse({ ...raw_params, fn: \"sot563\" })\n\n const w = length.parse(parameters.w)\n const h = length.parse(parameters.h)\n const p = length.parse(parameters.p)\n const pl = length.parse(parameters.pl)\n const pw = length.parse(parameters.pw)\n\n const pads: AnyCircuitElement[] = []\n for (let i = 0; i < 6; i++) {\n const { x, y } = getSot563PadCoord(i + 1, w, p, pl)\n pads.push(rectpad(i + 1, x, y, pl, pw))\n }\n\n const silkscreenTopLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -w / 2, y: h / 2 },\n { x: w / 2, y: h / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenBottomLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -w / 2, y: -h / 2 },\n { x: w / 2, y: -h / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const pin1Position = getSot563PadCoord(1, w, p, pl)\n const pin1Marking: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"pin_marker_1\",\n route: [\n { x: pin1Position.x - pl / 2 - 0.3, y: pin1Position.y },\n { x: pin1Position.x - pl / 2 - 0.45, y: pin1Position.y + 0.15 },\n { x: pin1Position.x - pl / 2 - 0.45, y: pin1Position.y - 0.15 },\n { x: pin1Position.x - pl / 2 - 0.3, y: pin1Position.y },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"pin_marker_1\",\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, h / 2 + 0.4, 0.25)\n\n return {\n circuitJson: [\n ...pads,\n silkscreenTopLine,\n silkscreenBottomLine,\n silkscreenRefText,\n pin1Marking,\n ],\n parameters,\n }\n}\n\nexport const getSot563PadCoord = (\n pn: number,\n w: number,\n p: number,\n pl: number,\n) => {\n const padCenterOffset = w / 2 - pl / 2\n if (pn <= 3) {\n return { x: -padCenterOffset, y: p - (pn - 1) * p }\n }\n return { x: padCenterOffset, y: -p + (pn - 4) * p }\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\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: AnyCircuitElement[]; 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 \"circuit-json\"\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 { length, type AnySoupElement } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sot723_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(3).default(3),\n w: z.string().default(\"1.2mm\"),\n h: z.string().default(\"1.2mm\"),\n pw: z.string().default(\"0.40mm\"),\n pl: z.string().default(\"0.45mm\"),\n p: z.string().default(\"0.575mm\"),\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 length.parse(parameters.h),\n 0.2,\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 p: number\n}) => {\n const { pn, w, h, pl, p } = parameters\n\n if (pn === 1) {\n return { x: p, y: 0 }\n }\n if (pn === 2) {\n return { x: -p, y: -0.4 }\n }\n return { x: -p, y: 0.4 }\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 p: Number.parseFloat(parameters.p),\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\n return pads\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\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(\"1.2mm\"),\n p: z.string().default(\"3.30mm\"),\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 length.parse(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 p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\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 \"circuit-json\"\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\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const axial_def = base_def.extend({\n fn: z.string(),\n p: length.optional().default(\"2.54mm\"),\n id: length.optional().default(\"0.7mm\"),\n od: length.optional().default(\"1.4mm\"),\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, 1.5, 0.5)\n return {\n circuitJson: [\n ...plated_holes,\n silkscreenLine,\n silkscreenRefText as AnySoupElement,\n ],\n parameters,\n }\n}\n","import {\n length,\n type AnySoupElement,\n type PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { z } from \"zod\"\nimport { generateCircleArcs } from \"../helpers/generateCircleArcs\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const radial_def = base_def.extend({\n fn: z.string(),\n\n p: length.optional().default(\"5mm\"),\n id: length.optional().default(\"0.8mm\"),\n od: length.optional().default(\"1.6mm\"),\n\n ceramic: z.boolean().optional(),\n electrolytic: z.boolean().optional(),\n polarized: z.boolean().optional(),\n})\n\nexport type RadialDef = z.input<typeof radial_def>\n\nexport const radial = (\n raw_params: RadialDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = radial_def.parse(raw_params)\n\n const { p, id, od } = parameters\n\n if (id === 0.8 && od === 1.6) {\n parameters.id = p === 5 ? 0.8 : p * 0.25\n parameters.od = p === 5 ? 1.6 : p * 0.5\n }\n\n const plated_holes = [\n platedhole(1, -p / 2, 0, parameters.id, parameters.od),\n platedhole(2, p / 2, 0, parameters.id, parameters.od),\n ]\n\n const bodyR = p + 0.1\n\n const { topArc, bottomArc } = generateCircleArcs(\n 0,\n 0,\n bodyR,\n parameters.od / 2,\n parameters.od,\n )\n\n const strokeWidth = 0.02 * p\n\n const silkscreenBodyTop: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: topArc,\n stroke_width: strokeWidth,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenBodyBottom: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: bottomArc,\n stroke_width: strokeWidth,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenCenterLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: 0, y: bodyR },\n { x: 0, y: -bodyR },\n ],\n stroke_width: strokeWidth,\n pcb_silkscreen_path_id: \"\",\n }\n\n const plusSize = 0.1 * p\n const plusX = -(p + plusSize + 0.04 * p)\n const plusY = bodyR - plusSize - 0.08 * p\n\n const plusHoriz: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: plusX - plusSize, y: plusY },\n { x: plusX + plusSize, y: plusY },\n ],\n stroke_width: strokeWidth,\n pcb_silkscreen_path_id: \"\",\n }\n\n const plusVert: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: plusX, y: plusY - plusSize },\n { x: plusX, y: plusY + plusSize },\n ],\n stroke_width: strokeWidth,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n bodyR + 0.12 * p,\n 0.1 * p,\n )\n\n const circuitJson: AnySoupElement[] = [\n ...plated_holes,\n silkscreenBodyTop,\n silkscreenBodyBottom,\n silkscreenCenterLine,\n silkscreenRefText as AnySoupElement,\n ]\n\n const hasPolarity =\n parameters.electrolytic === true || parameters.polarized === true\n if (hasPolarity) {\n circuitJson.push(plusHoriz, plusVert)\n }\n\n return {\n circuitJson,\n parameters,\n }\n}\n","export type CircleArcPoint = { x: number; y: number }\n\nexport const generateCircleArcs = (\n centerX: number,\n centerY: number,\n radius: number,\n cut: number,\n cutHeight: number,\n segmentLength = 0.1,\n): {\n topArc: CircleArcPoint[]\n bottomArc: CircleArcPoint[]\n} => {\n const topArc: CircleArcPoint[] = []\n const bottomArc: CircleArcPoint[] = []\n\n // choose angular step so the arc length between points is ~segmentLength\n const segments = Math.max(1, Math.ceil((Math.PI * radius) / segmentLength))\n const thetaStep = Math.PI / segments\n\n for (let i = 0; i <= segments; i++) {\n const theta = i * thetaStep\n const x = centerX + Math.cos(theta) * radius\n const y = centerY + Math.sin(theta) * radius\n\n if (\n x < centerX - cut &&\n y >= centerY - cutHeight / 2 &&\n y <= centerY + cutHeight / 2\n ) {\n continue\n }\n topArc.push({ x, y })\n }\n\n for (let i = 0; i <= segments; i++) {\n const theta = Math.PI + i * thetaStep\n const x = centerX + Math.cos(theta) * radius\n const y = centerY + Math.sin(theta) * radius\n\n if (\n x < centerX - cut &&\n y >= centerY - cutHeight / 2 &&\n y <= centerY + cutHeight / 2\n ) {\n continue\n }\n bottomArc.push({ x, y })\n }\n\n return { topArc, bottomArc }\n}\n","import { length, 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\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const pushbutton_def = base_def.extend({\n fn: z.literal(\"pushbutton\"),\n w: length.default(4.5),\n h: length.default(6.5),\n id: length.default(1),\n od: length.default(1.2),\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 = parameters.w\n const height = parameters.h\n const holeDiameter = parameters.id\n\n const holes: AnyCircuitElement[] = [\n platedhole(1, -width / 2, height / 2, holeDiameter, holeDiameter * 1.5),\n platedhole(2, -width / 2, -height / 2, holeDiameter, holeDiameter * 1.5),\n platedhole(3, width / 2, -height / 2, holeDiameter, holeDiameter * 1.5),\n platedhole(4, width / 2, height / 2, holeDiameter, holeDiameter * 1.5),\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 type PcbSilkscreenText,\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\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const stampboard_def = base_def.extend({\n fn: z.string(),\n w: length.default(\"22.58mm\"),\n h: length.optional(),\n left: length.optional().default(20),\n right: length.optional().default(20),\n top: length.optional().default(2),\n bottom: length.optional().default(2),\n p: length.default(length.parse(\"2.54mm\")),\n pw: length.default(length.parse(\"1.6mm\")),\n pl: length.default(length.parse(\"2.4mm\")),\n innerhole: z.boolean().default(false),\n innerholeedgedistance: length.default(length.parse(\"1.61mm\")),\n silkscreenlabels: z.boolean().default(false),\n silkscreenlabelmargin: length.default(length.parse(\"0.1mm\")),\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}\nconst getTriangleDir = (x: number, y: number, side: string) => {\n let routes: { x: number; y: number }[] = []\n const triangleHeight = 1 // Adjust triangle size as needed\n const triangleWidth = 0.6 // Adjust triangle width as needed\n if (side === \"right\") {\n routes = [\n {\n x: x + triangleHeight / 2,\n y: y,\n }, // Tip of the triangle (pointing right)\n {\n x: x - triangleHeight / 2,\n y: y + triangleWidth / 2,\n }, // Bottom corner of the base\n {\n x: x - triangleHeight / 2,\n y: y - triangleWidth / 2,\n }, // Top corner of the base\n {\n x: x + triangleHeight / 2,\n y: y,\n }, // Close the path at the tip\n ]\n }\n if (side === \"left\") {\n routes = [\n {\n x: x - triangleHeight / 2,\n y: y,\n }, // Tip of the triangle (pointing left)\n {\n x: x + triangleHeight / 2,\n y: y + triangleWidth / 2,\n }, // Top corner of the base\n {\n x: x + triangleHeight / 2,\n y: y - triangleWidth / 2,\n }, // Bottom corner of the base\n {\n x: x - triangleHeight / 2,\n y: y,\n }, // Close the path at the tip\n ]\n }\n if (side === \"top\") {\n routes = [\n {\n x: x,\n y: y + triangleHeight / 2,\n }, // Tip of the triangle (pointing up)\n {\n x: x - triangleWidth / 2,\n y: y - triangleHeight / 2,\n }, // Left corner of the base\n {\n x: x + triangleWidth / 2,\n y: y - triangleHeight / 2,\n }, // Right corner of the base\n {\n x: x,\n y: y + triangleHeight / 2,\n }, // Close the path at the tip\n ]\n }\n if (side === \"bottom\") {\n routes = [\n {\n x: x,\n y: y - triangleHeight / 2,\n }, // Tip of the triangle (pointing down)\n {\n x: x - triangleWidth / 2,\n y: y + triangleHeight / 2,\n }, // Left corner of the base\n {\n x: x + triangleWidth / 2,\n y: y + triangleHeight / 2,\n }, // Right corner of the base\n {\n x: x,\n y: y - triangleHeight / 2,\n }, // Close the path at the tip\n ]\n }\n return routes\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 height = params.h ?? getHeight(params)\n const rectpads: AnyCircuitElement[] = []\n const holes: PcbPlatedHole[] = []\n const pinLabels: PcbSilkscreenText[] = []\n let routes: { x: number; y: number }[] = []\n const innerDiameter = 1\n const outerDiameter = innerDiameter\n const totalPadsNumber =\n params.left + params.right + (params.bottom ?? 0) + (params.top ?? 0)\n const maxLabelLength = `pin${totalPadsNumber}`.length\n const textHalf = (maxLabelLength * 0.7) / 2\n if (params.right) {\n const yoff = -((params.right - 1) / 2) * params.p\n for (let i = 0; i < params.right; i++) {\n if (\n i === 0 &&\n !params.left &&\n !params.bottom &&\n !params.silkscreenlabels\n ) {\n routes = getTriangleDir(\n params.w / 2 - params.pl * 1.4,\n yoff + i * params.p,\n \"right\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1 + params.left + (params.bottom ?? 0),\n params.w / 2 - params.pl / 2,\n yoff + i * params.p,\n params.pl,\n params.pw,\n ),\n )\n if (params.silkscreenlabels) {\n const padIndex = i + 1 + params.left + (params.bottom ?? 0)\n const label = `pin${padIndex}`\n pinLabels.push({\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: `pin_${padIndex}`,\n pcb_component_id: \"1\",\n layer: \"top\",\n anchor_position: {\n x:\n params.w / 2 -\n params.pl -\n (textHalf + params.silkscreenlabelmargin),\n y: yoff + i * params.p,\n },\n text: label,\n font_size: 0.7,\n font: \"tscircuit2024\",\n anchor_alignment: \"center\",\n })\n }\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1 + params.left + (params.bottom ?? 0) + totalPadsNumber,\n params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1 + params.left + (params.bottom ?? 0) + totalPadsNumber * 2,\n params.w / 2 - params.innerholeedgedistance,\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 === 0 && !params.silkscreenlabels) {\n routes = getTriangleDir(\n -params.w / 2 + params.pl * 1.4,\n yoff - i * params.p,\n \"left\",\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.silkscreenlabels) {\n const padIndex = i + 1\n const label = `pin${padIndex}`\n pinLabels.push({\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: `pin_${padIndex}`,\n pcb_component_id: \"1\",\n layer: \"top\",\n anchor_position: {\n x:\n -params.w / 2 +\n params.pl +\n (textHalf + params.silkscreenlabelmargin),\n y: yoff - i * params.p,\n },\n text: label,\n font_size: 0.7,\n font: \"tscircuit2024\",\n anchor_alignment: \"center\",\n })\n }\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1 + totalPadsNumber,\n -params.w / 2,\n yoff - i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1 + totalPadsNumber * 2,\n -params.w / 2 + params.innerholeedgedistance,\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 === 0 &&\n !params.left &&\n !params.bottom &&\n !params.right &&\n !params.silkscreenlabels\n ) {\n routes = getTriangleDir(\n xoff - i * params.p,\n height / 2 - params.pl * 1.4,\n \"top\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1 + params.left + params.right + (params.bottom ?? 0),\n xoff - i * params.p,\n height / 2 - params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n if (params.silkscreenlabels) {\n const padIndex =\n i + 1 + params.left + params.right + (params.bottom ?? 0)\n const label = `pin${padIndex}`\n pinLabels.push({\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: `pin_${padIndex}`,\n pcb_component_id: \"1\",\n layer: \"top\",\n anchor_position: {\n x: xoff - i * params.p,\n y:\n height / 2 -\n params.pl -\n (textHalf + params.silkscreenlabelmargin),\n },\n text: label,\n font_size: 0.7,\n font: \"tscircuit2024\",\n anchor_alignment: \"center\",\n ccw_rotation: 270,\n })\n }\n if (params.innerhole) {\n holes.push(\n platedhole(\n i +\n 1 +\n params.left +\n params.right +\n (params.bottom ?? 0) +\n totalPadsNumber,\n xoff - i * params.p,\n height / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i +\n 1 +\n params.left +\n params.right +\n (params.bottom ?? 0) +\n totalPadsNumber * 2,\n xoff - i * params.p,\n height / 2 - params.innerholeedgedistance,\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 && !params.silkscreenlabels) {\n routes = getTriangleDir(\n xoff + i * params.p,\n -height / 2 + params.pl * 1.4,\n \"bottom\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1 + params.left,\n xoff + i * params.p,\n -height / 2 + params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n if (params.silkscreenlabels) {\n const padIndex = i + 1 + params.left\n const label = `pin${padIndex}`\n pinLabels.push({\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: `pin_${padIndex}`,\n pcb_component_id: \"1\",\n layer: \"top\",\n anchor_position: {\n x: xoff + i * params.p,\n y:\n -height / 2 +\n params.pl +\n (textHalf + params.silkscreenlabelmargin),\n },\n text: label,\n font_size: 0.7,\n font: \"tscircuit2024\",\n anchor_alignment: \"center\",\n ccw_rotation: 90,\n })\n }\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1 + params.left + totalPadsNumber,\n xoff + i * params.p,\n -height / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1 + params.left + totalPadsNumber * 2,\n xoff + i * params.p,\n -height / 2 + params.innerholeedgedistance,\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: height / 2 },\n { x: params.w / 2, y: height / 2 },\n { x: params.w / 2, y: -height / 2 },\n { x: -params.w / 2, y: -height / 2 },\n { x: -params.w / 2, y: height / 2 },\n ],\n stroke_width: 0.1,\n layer: \"top\",\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n height / 1.8,\n height / 25,\n )\n return {\n circuitJson: [\n ...rectpads,\n ...holes,\n ...pinLabels,\n silkscreenPath,\n ...(params.silkscreenlabels ? [] : [silkscreenTriangle]),\n silkscreenRefText,\n ],\n parameters: params,\n }\n}\n","import {\n length,\n type AnyCircuitElement,\n type PcbPlatedHole,\n type PcbSilkscreenPath,\n type PcbSilkscreenText,\n} from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const stampreceiver_def = base_def.extend({\n fn: z.string(),\n w: length.default(\"22.58mm\"),\n h: length.optional(),\n left: length.optional().default(20),\n right: length.optional().default(20),\n top: length.optional().default(2),\n bottom: length.optional().default(2),\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 innerholeedgedistance: length.default(length.parse(\"1.61mm\")),\n})\n\nexport type Stampreceiver_def = z.input<typeof stampreceiver_def>\n\nconst getHeight = (parameters: Stampreceiver_def): number => {\n const params = stampreceiver_def.parse(parameters)\n\n // Calculate height based on the presence of left and right parameters\n if (params.left && params.right) {\n return Math.max(params.left, params.right) * params.p\n }\n\n if (params.left) {\n return params.left * params.p\n }\n\n if (params.right) {\n return params.right * params.p\n }\n\n // Return default height if neither left nor right is provided\n return 51\n}\ntype Point = { x: number; y: number }\ntype Direction = \"left\" | \"right\" | \"top\" | \"bottom\"\n\nconst getTriangleDir = (\n x: number,\n y: number,\n side: Direction,\n triangleHeight = 1,\n triangleWidth = 0.6,\n): Point[] => {\n const halfHeight = triangleHeight / 2\n const halfWidth = triangleWidth / 2\n\n const routes: Record<Direction, Point[]> = {\n left: [\n { x: x + halfHeight, y }, // Tip\n { x: x - halfHeight, y: y + halfWidth }, // Bottom corner\n { x: x - halfHeight, y: y - halfWidth }, // Top corner\n { x: x + halfHeight, y }, // Close path\n ],\n right: [\n { x: x - halfHeight, y }, // Tip\n { x: x + halfHeight, y: y + halfWidth }, // Top corner\n { x: x + halfHeight, y: y - halfWidth }, // Bottom corner\n { x: x - halfHeight, y }, // Close path\n ],\n top: [\n { x, y: y - halfHeight }, // Tip\n { x: x - halfWidth, y: y + halfHeight }, // Left corner\n { x: x + halfWidth, y: y + halfHeight }, // Right corner\n { x, y: y - halfHeight }, // Close path\n ],\n bottom: [\n { x, y: y + halfHeight }, // Tip\n { x: x - halfWidth, y: y - halfHeight }, // Left corner\n { x: x + halfWidth, y: y - halfHeight }, // Right corner\n { x, y: y + halfHeight }, // Close path\n ],\n }\n\n return routes[side]\n}\nexport const stampreceiver = (\n raw_params: Stampreceiver_def,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const params = stampreceiver_def.parse(raw_params)\n const height = params.h ?? getHeight(params)\n const rectpads: AnyCircuitElement[] = []\n const pinLabels: PcbSilkscreenText[] = []\n const holes: PcbPlatedHole[] = []\n const innerDiameter = 1\n const outerDiameter = 1.2\n const totalPadsNumber =\n params.left + params.right + (params.bottom ?? 0) + (params.top ?? 0)\n let routes: { x: number; y: number }[] = []\n let padIndex = 1\n\n // Process Left Pads (top to bottom)\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 === 0) {\n routes = getTriangleDir(\n -params.w / 2 - params.pl / 2,\n yoff - i * params.p,\n \"left\",\n )\n }\n rectpads.push(\n rectpad(\n padIndex,\n -params.w / 2 + params.pl / 2,\n yoff - i * params.p,\n params.pl,\n params.pw,\n ),\n )\n pinLabels.push({\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: `pin_${padIndex}`,\n pcb_component_id: \"1\",\n layer: \"top\",\n anchor_position: {\n x: -params.w / 2 + params.pl / 2 - 4.5,\n y: yoff - i * params.p,\n },\n text: `pin${padIndex}`,\n font_size: 0.7,\n font: \"tscircuit2024\",\n anchor_alignment: \"center\",\n })\n padIndex++\n params.innerhole &&\n holes.push(\n platedhole(\n padIndex + totalPadsNumber,\n -params.w / 2 + params.innerholeedgedistance,\n yoff - i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n\n // Process Bottom Pads (right to left)\n if (params.bottom) {\n const xoff = ((params.bottom - 1) / 2) * params.p\n for (let i = params.bottom - 1; i >= 0; i--) {\n rectpads.push(\n rectpad(\n padIndex,\n xoff - i * params.p,\n -height / 2 + params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n pinLabels.push({\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: `pin_${padIndex}`,\n pcb_component_id: \"1\",\n layer: \"top\",\n anchor_position: {\n x: xoff - i * params.p,\n y: -height / 2 + params.pl / 2 - 3.2,\n },\n text: `pin${padIndex}`,\n font_size: 0.7,\n font: \"tscircuit2024\",\n anchor_alignment: \"center\",\n })\n padIndex++\n params.innerhole &&\n holes.push(\n platedhole(\n padIndex + totalPadsNumber,\n xoff - i * params.p,\n -height / 2 + params.innerholeedgedistance,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n\n // Process Right Pads (bottom to top)\n if (params.right) {\n const yoff = -((params.right - 1) / 2) * params.p\n for (let i = 0; i < params.right; i++) {\n rectpads.push(\n rectpad(\n padIndex,\n params.w / 2 - params.pl / 2,\n yoff + i * params.p,\n params.pl,\n params.pw,\n ),\n )\n pinLabels.push({\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: `pin_${padIndex}`,\n pcb_component_id: \"1\",\n layer: \"top\",\n anchor_position: {\n x: params.w / 2 - params.pl / 2 + 3.7,\n y: yoff + i * params.p,\n },\n text: `pin${padIndex}`,\n font_size: 0.7,\n font: \"tscircuit2024\",\n anchor_alignment: \"center\",\n })\n padIndex++\n params.innerhole &&\n holes.push(\n platedhole(\n padIndex + totalPadsNumber,\n params.w / 2 - params.innerholeedgedistance,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n\n // Process Top Pads (left to right)\n if (params.top) {\n const xoff = -((params.top - 1) / 2) * params.p\n for (let i = params.top - 1; i >= 0; i--) {\n rectpads.push(\n rectpad(\n padIndex,\n xoff + i * params.p,\n height / 2 - params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n pinLabels.push({\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: `pin_${padIndex}`,\n pcb_component_id: \"1\",\n layer: \"top\",\n anchor_position: {\n x: xoff + i * params.p,\n y: height / 2 - params.pl / 2 + 3.2,\n },\n text: `pin${padIndex}`,\n font_size: 0.7,\n font: \"tscircuit2024\",\n anchor_alignment: \"center\",\n })\n padIndex++\n params.innerhole &&\n holes.push(\n platedhole(\n padIndex + totalPadsNumber,\n xoff + i * params.p,\n height / 2 - params.innerholeedgedistance,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n\n const silkscreenTriangle: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"1\",\n pcb_component_id: \"1\",\n layer: \"top\",\n route: routes,\n stroke_width: 0.1,\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 {\n x: -params.w / 2 - params.pl / 3,\n y: height / 2 + params.pl / 3,\n },\n {\n x: params.w / 2 + params.pl / 3,\n y: height / 2 + params.pl / 3,\n },\n {\n x: params.w / 2 + params.pl / 3,\n y: -height / 2 - params.pl / 3,\n },\n {\n x: -params.w / 2 - params.pl / 3,\n y: -height / 2 - params.pl / 3,\n },\n {\n x: -params.w / 2 - params.pl / 3,\n y: height / 2 + params.pl / 3,\n },\n ],\n stroke_width: 0.1,\n layer: \"top\",\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n height / 1.8,\n height / 25,\n )\n return {\n circuitJson: [\n ...holes,\n ...rectpads,\n ...pinLabels,\n silkscreenPath,\n silkscreenTriangle,\n silkscreenRefText,\n ],\n parameters: params,\n }\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { quad, quad_def } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const lqfp_def = quad_def\n\nexport const lqfp = (\n parameters: z.input<typeof lqfp_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n parameters.legsoutside = true\n if (!parameters.pl) {\n parameters.pl = 1.5\n }\n if (!parameters.pw) {\n parameters.pw = 0.3\n }\n return quad(parameters)\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 { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const breakoutheaders_def = base_def.extend({\n fn: z.string(),\n w: length.default(\"10mm\"),\n h: length.optional(),\n left: length.optional().default(20),\n right: length.optional().default(20),\n top: length.optional().default(0),\n bottom: length.optional().default(0),\n p: length.default(length.parse(\"2.54mm\")),\n id: length.optional().default(length.parse(\"1mm\")),\n od: length.optional().default(length.parse(\"1.5mm\")),\n})\n\nexport type breakoutheaders_def = z.input<typeof breakoutheaders_def>\n\nconst getHeight = (parameters: breakoutheaders_def): number => {\n const params = breakoutheaders_def.parse(parameters)\n\n // Calculate height based on the presence of left and right parameters\n if (params.left && params.right) {\n return Math.max(params.left, params.right) * params.p\n }\n\n if (params.left) {\n return params.left * params.p\n }\n\n if (params.right) {\n return params.right * params.p\n }\n\n return 51\n}\n\ntype Point = { x: number; y: number }\ntype Direction = \"left\" | \"right\" | \"top\" | \"bottom\"\n\nconst getTrianglePath = (\n x: number,\n y: number,\n side: Direction,\n triangleHeight = 1,\n triangleWidth = 0.6,\n): Point[] => {\n const halfHeight = triangleHeight / 2\n const halfWidth = triangleWidth / 2\n\n const silkscreenTriangleRoutes: Record<Direction, Point[]> = {\n left: [\n { x: x + halfHeight, y },\n { x: x - halfHeight, y: y + halfWidth },\n { x: x - halfHeight, y: y - halfWidth },\n { x: x + halfHeight, y },\n ],\n right: [\n { x: x - halfHeight, y },\n { x: x + halfHeight, y: y + halfWidth },\n { x: x + halfHeight, y: y - halfWidth },\n { x: x - halfHeight, y },\n ],\n top: [\n { x, y: y - halfHeight },\n { x: x - halfWidth, y: y + halfHeight },\n { x: x + halfWidth, y: y + halfHeight },\n { x, y: y - halfHeight },\n ],\n bottom: [\n { x, y: y + halfHeight },\n { x: x - halfWidth, y: y - halfHeight },\n { x: x + halfWidth, y: y - halfHeight },\n { x, y: y + halfHeight },\n ],\n }\n\n return silkscreenTriangleRoutes[side]\n}\nexport const breakoutheaders = (\n raw_params: breakoutheaders_def,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const params = breakoutheaders_def.parse(raw_params)\n const height = params.h ?? getHeight(params)\n const holes: PcbPlatedHole[] = []\n const innerDiameter = params.id\n const outerDiameter = params.od\n let silkscreenTriangleRoutes: { x: number; y: number }[] = []\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 silkscreenTriangleRoutes = getTrianglePath(\n params.w / 2 + outerDiameter * 1.4,\n yoff + i * params.p,\n \"right\",\n )\n }\n holes.push(\n platedhole(\n i + 1 + params.left + (params.bottom ?? 0),\n params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\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 silkscreenTriangleRoutes = getTrianglePath(\n -params.w / 2 - outerDiameter * 1.4,\n yoff + i * params.p,\n \"left\",\n )\n }\n holes.push(\n platedhole(\n i + 1,\n -params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\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 silkscreenTriangleRoutes = getTrianglePath(\n xoff + i * params.p,\n height / 2 + outerDiameter * 1.4,\n \"top\",\n )\n }\n holes.push(\n platedhole(\n i + 1 + params.right + (params.bottom ?? 0) + params.left,\n xoff + i * params.p,\n height / 2,\n innerDiameter,\n outerDiameter,\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 silkscreenTriangleRoutes = getTrianglePath(\n xoff + i * params.p,\n -height / 2 - outerDiameter * 1.4,\n \"bottom\",\n )\n }\n holes.push(\n platedhole(\n i + 1 + params.left,\n xoff + i * params.p,\n -height / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n\n const silkscreenTriangle: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"1\",\n pcb_component_id: \"1\",\n layer: \"top\",\n route: silkscreenTriangleRoutes,\n stroke_width: 0.1,\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 {\n x: -params.w / 2 - outerDiameter,\n y: height / 2 + outerDiameter,\n },\n {\n x: params.w / 2 + outerDiameter,\n y: height / 2 + outerDiameter,\n },\n {\n x: params.w / 2 + outerDiameter,\n y: -height / 2 - outerDiameter,\n },\n {\n x: -params.w / 2 - outerDiameter,\n y: -height / 2 - outerDiameter,\n },\n {\n x: -params.w / 2 - outerDiameter,\n y: height / 2 + outerDiameter,\n },\n ],\n stroke_width: 0.1,\n layer: \"top\",\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n height / 1.7,\n height / 25,\n )\n return {\n circuitJson: [\n ...holes,\n silkscreenPath,\n silkscreenRefText,\n silkscreenTriangle,\n ],\n parameters: params,\n }\n}\n","import {\n length,\n type AnySoupElement,\n type PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { z } from \"zod\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nconst generate_u_curve = (\n centerX: number,\n centerY: number,\n radius: number,\n direction: \"left\" | \"right\",\n) => {\n return Array.from({ length: 25 }, (_, i) => {\n const theta = (i / 24) * Math.PI - Math.PI / 2\n return {\n x: centerX + (direction === \"right\" ? 1 : -1) * Math.cos(theta) * radius,\n y: centerY + Math.sin(theta) * radius,\n }\n })\n}\n\nexport const hc49_def = base_def.extend({\n fn: z.string(),\n p: length.optional().default(\"4.88mm\"),\n id: length.optional().default(\"0.8mm\"),\n od: length.optional().default(\"1.5mm\"),\n w: length.optional().default(\"5.6mm\"),\n h: length.optional().default(\"3.5mm\"),\n})\n\nexport type Hc49Def = z.input<typeof hc49_def>\n\nexport const hc49 = (\n raw_params: Hc49Def,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = hc49_def.parse(raw_params)\n\n const { p, id, od, w, h } = parameters\n const radius = h / 2\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 leftCurve = generate_u_curve(-w / 2, 0, radius, \"left\")\n const rightCurve = generate_u_curve(w / 2, 0, radius, \"right\")\n\n const silkscreenBody: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n ...leftCurve,\n ...leftCurve.slice(1).reverse(),\n { x: -w / 2, y: -h / 2 },\n { x: w / 2, y: -h / 2 },\n ...rightCurve,\n { x: w / 2, y: h / 2 },\n { x: -w / 2, y: h / 2 },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, p / 4, 0.5)\n\n return {\n circuitJson: [\n ...plated_holes,\n silkscreenBody,\n silkscreenRefText as AnySoupElement,\n ],\n parameters,\n }\n}\n","import { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef } from \"../helpers/silkscreenRef\"\nimport type { AnySoupElement } from \"circuit-json\"\nimport { length } from \"circuit-json\"\nimport { mm } from \"@tscircuit/mm\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const pad_def = base_def.extend({\n w: length,\n h: length,\n})\n\nexport type PadDef = z.input<typeof pad_def>\n\nexport const pad = (\n params: PadDef,\n): { circuitJson: AnySoupElement[]; parameters: PadDef } => {\n const { w, h } = params\n const width = mm(w)\n const height = mm(h)\n\n return {\n circuitJson: [\n rectpad(1, 0, 0, width, height),\n silkscreenRef(0, height / 2 + 0.5, 0.2),\n ],\n parameters: params,\n }\n}\n","import { z } from \"zod\"\nimport { mm } from \"@tscircuit/mm\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { platedHoleWithRectPad } from \"src/helpers/platedHoleWithRectPad\"\nimport { platedHolePill } from \"src/helpers/platedHolePill\"\nimport type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const to92_def = base_def.extend({\n fn: z.string(),\n num_pins: z.union([z.literal(3), z.literal(2)]).default(3),\n p: z.string().default(\"1.27mm\"),\n id: z.string().default(\"0.72mm\"),\n od: z.string().default(\"0.95mm\"),\n w: z.string().default(\"4.5mm\"),\n h: z.string().default(\"4.5mm\"),\n inline: z.boolean().default(false),\n string: z.string().optional(),\n})\n\nconst generateSemicircle = (\n centerX: number,\n centerY: number,\n radius: number,\n): { x: number; y: number }[] => {\n return Array.from({ length: 25 }, (_, i) => {\n const theta = (i / 24) * Math.PI\n return {\n x: centerX + Math.cos(theta) * radius,\n y: centerY + Math.sin(theta) * radius,\n }\n })\n}\n\nexport const to92_2 = (parameters: z.infer<typeof to92_def>) => {\n const { p, id, od, h } = parameters\n const holeY = Number.parseFloat(h) / 2\n const padSpacing = Number.parseFloat(p)\n\n return [\n platedHoleWithRectPad(1, -padSpacing, holeY - padSpacing, id, od, od, 0, 0),\n platedhole(2, padSpacing, holeY - padSpacing, id, od),\n ]\n}\n\nexport const to92 = (\n raw_params: z.input<typeof to92_def>,\n): {\n circuitJson: AnyCircuitElement[]\n parameters: z.infer<typeof to92_def>\n} => {\n const match = raw_params.string?.match(/^to92_(\\d+)/)\n const numPins = match ? Number.parseInt(match[1]!, 10) : 3\n\n const parameters = to92_def.parse({\n ...raw_params,\n num_pins: numPins,\n })\n\n const { p, id, od, w, h, inline } = parameters\n const holeY = Number.parseFloat(h) / 2\n const padSpacing = Number.parseFloat(p)\n const holeDia = Number.parseFloat(id)\n const padDia = Number.parseFloat(od)\n\n const padWidth = padDia\n const padHeight = padDia * (1.5 / 1.05)\n\n let platedHoles: AnyCircuitElement[] = []\n\n if (parameters.num_pins === 3) {\n if (inline) {\n platedHoles = [\n platedHoleWithRectPad(\n 1,\n -padSpacing,\n holeY - padSpacing,\n holeDia,\n padDia,\n padHeight,\n 0,\n 0,\n ),\n platedHolePill(2, 0, holeY - padSpacing, holeDia, padWidth, padHeight),\n platedHolePill(\n 3,\n padSpacing,\n holeY - padSpacing,\n holeDia,\n padWidth,\n padHeight,\n ),\n ]\n } else {\n platedHoles = [\n platedHoleWithRectPad(\n 1,\n -padSpacing,\n holeY - padSpacing,\n holeDia,\n padDia,\n padDia,\n 0,\n 0,\n ),\n platedhole(2, 0, holeY, holeDia, padDia),\n platedhole(3, padSpacing, holeY - padSpacing, holeDia, padDia),\n ]\n }\n } else if (parameters.num_pins === 2) {\n platedHoles = [\n platedHoleWithRectPad(\n 1,\n -padSpacing,\n holeY - padSpacing,\n holeDia,\n padWidth,\n padHeight,\n 0,\n 0,\n ),\n platedHolePill(\n 2,\n padSpacing,\n holeY - padSpacing,\n holeDia,\n padWidth,\n padHeight,\n ),\n ]\n } else {\n throw new Error(\"Invalid number of pins for TO-92\")\n }\n\n const radius = Number.parseFloat(w) / 2\n const semicircle = generateSemicircle(0, holeY, radius)\n\n const silkscreenBody: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n ...semicircle,\n { x: -radius, y: 0 },\n { x: radius, y: 0 },\n semicircle[0],\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, holeY + 1, 0.5)\n\n return {\n circuitJson: [\n ...platedHoles,\n silkscreenBody,\n silkscreenRefText as AnyCircuitElement,\n ],\n parameters,\n }\n}\n","import { mm } from \"@tscircuit/mm\"\nimport type { AnyCircuitElement } from \"circuit-json\"\n\nexport const platedHolePill = (\n pn: number,\n x: number,\n y: number,\n holeDiameter: number,\n outerWidth: number,\n outerHeight: number,\n): AnyCircuitElement => {\n return {\n pcb_plated_hole_id: \"\",\n type: \"pcb_plated_hole\",\n shape: \"pill\",\n x,\n y,\n outer_width: mm(outerWidth),\n outer_height: mm(outerHeight),\n hole_width: mm(holeDiameter),\n hole_height: mm(holeDiameter),\n pcb_port_id: \"\",\n layers: [\"top\", \"bottom\"],\n port_hints: [pn.toString()],\n ccw_rotation: 0,\n }\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"2.15mm\"),\n h: z.string().default(\"1.20mm\"),\n pl: z.string().default(\"0.5mm\"),\n pw: z.string().default(\"0.6mm\"),\n p: z.string().default(\"1.4mm\"),\n})\n\nexport const sod523 = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h),\n 0.3,\n )\n\n // Define silkscreen path that goes till half of the second pad\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\nexport const getSodCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { extendSoicDef, type SoicInput, getCcwSoicCoords } from \"./soic\"\nimport { rectpad } from \"src/helpers/rectpad\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const sop8_def = extendSoicDef({})\n\nexport const sop8 = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sop8_def.parse(raw_params)\n const pads: AnySoupElement[] = []\n\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 ?? \"1.5mm\", parameters.pw ?? \"0.6mm\"),\n )\n }\n\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n sh / 2 - 0.5,\n sh / 12,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"\",\n type: \"pcb_silkscreen_path\",\n route: [\n { x: -parameters.w / 3, y: sh / 2 + 0.2 },\n { x: parameters.w / 3, y: sh / 2 + 0.2 },\n ],\n stroke_width: 0.1,\n }\n\n return {\n circuitJson: [\n ...pads,\n silkscreenRefText,\n silkscreenLine,\n ] as AnySoupElement[],\n parameters,\n }\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod80_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"5.0mm\"),\n h: z.string().default(\"2.30mm\"),\n pl: z.string().default(\"1.25mm\"),\n pw: z.string().default(\"2mm\"),\n p: z.string().default(\"3.75mm\"),\n})\n\nexport const sod80 = (\n raw_params: z.input<typeof sod80_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod80_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) / 2 + 1,\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2 + 0.5,\n y: length.parse(parameters.h) / 2 + 0.5,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.5,\n y: length.parse(parameters.h) / 2 + 0.5,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.5,\n y: -length.parse(parameters.h) / 2 - 0.5,\n },\n {\n x: length.parse(parameters.p) / 2 + 0.5,\n y: -length.parse(parameters.h) / 2 - 0.5,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sod80WithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\nexport const getsod80Coords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n return pn === 1 ? { x: -p / 2, y: 0 } : { x: p / 2, y: 0 }\n}\n\nexport const sod80WithoutParsing = (parameters: z.infer<typeof sod80_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getsod80Coords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"4.4mm\"),\n h: z.string().default(\"2.1mm\"),\n pl: z.string().default(\"1.2mm\"),\n pw: z.string().default(\"1.2mm\"),\n p: z.string().default(\"2.9mm\"),\n})\n\nexport const sod123w = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) - 0.5,\n 0.3,\n )\n\n // Define silkscreen path that goes till half of the second pad\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\nexport const getSodCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n }\n return { x: p / 2, y: 0 }\n}\n\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"3.30mm\"),\n h: z.string().default(\"1.80mm\"),\n pl: z.string().default(\"0.60mm\"),\n pw: z.string().default(\"0.45mm\"),\n p: z.string().default(\"2.1mm\"),\n})\n\nexport const sod323 = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) - 0.5,\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\nexport const getSodCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n }\n return { x: p / 2, y: 0 }\n}\n\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"1.4mm\"),\n h: z.string().default(\"0.9mm\"),\n pl: z.string().default(\"0.36mm\"),\n pw: z.string().default(\"0.25mm\"),\n p: z.string().default(\"0.85mm\"),\n})\n\nexport const sod923 = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h),\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2 + 0.15,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.15,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.15,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2 + 0.15,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\nexport const getSodCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"1.3mm\"),\n h: z.string().default(\"0.9mm\"),\n pl: z.string().default(\"0.4mm\"),\n pw: z.string().default(\"0.7mm\"),\n p: z.string().default(\"0.7mm\"),\n})\n\nexport const sod882 = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) + 0.1,\n 0.3,\n )\n\n // Define silkscreen path that goes till half of the second pad\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2 + 0.2,\n y: length.parse(parameters.h) / 2 + 0.2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: length.parse(parameters.h) / 2 + 0.2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: -length.parse(parameters.h) / 2 - 0.2,\n },\n {\n x: length.parse(parameters.p) / 2 + 0.2,\n y: -length.parse(parameters.h) / 2 - 0.2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\nexport const getSodCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"3,05mm\"),\n h: z.string().default(\"1.65mm\"),\n pl: z.string().default(\"0.6mm\"),\n pw: z.string().default(\"0.6mm\"),\n pad_spacing: z.string().default(\"2.2mm\"),\n})\n\nexport const sod323f = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h),\n 0.3,\n )\n\n // Define silkscreen path that goes till half of the second pad\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.pad_spacing) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.pad_spacing) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\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\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n pad_spacing: Number.parseFloat(parameters.pad_spacing),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"4.4mm\"),\n h: z.string().default(\"2.1mm\"),\n pl: z.string().default(\"1.2mm\"),\n pw: z.string().default(\"1.2mm\"),\n p: z.string().default(\"2.9mm\"),\n})\n\nexport const sod123f = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h),\n 0.3,\n )\n\n // Define silkscreen path that goes till half of the second pad\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\nexport const getSodCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod123FL_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"4.4mm\"),\n h: z.string().default(\"2.1mm\"),\n pl: z.string().default(\"0.91mm\"),\n pw: z.string().default(\"1.22mm\"),\n p: z.string().default(\"3.146mm\"),\n})\n\nexport const sod123fl = (\n raw_params: z.input<typeof sod123FL_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod123FL_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h),\n 0.3,\n )\n\n // Define silkscreen path that goes till half of the second pad\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\nexport const getSodCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod123FL_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"1.80mm\"),\n h: z.string().default(\"1.00mm\"),\n pl: z.string().default(\"0.66mm\"),\n pw: z.string().default(\"0.5mm\"),\n p: z.string().default(\"0.8mm\"),\n})\n\nexport const sod723 = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h),\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.1,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.1,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\nexport const getSodCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"6.2mm\"),\n h: z.string().default(\"3.4mm\"),\n pl: z.string().default(\"1.4mm\"),\n pw: z.string().default(\"2.1mm\"),\n p: z.string().default(\"4.4mm\"),\n})\n\nexport const sod128 = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) / 2 + 0.4,\n 0.3,\n )\n\n // Define silkscreen path that goes till half of the second pad\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\nexport const getSodCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sot89_def = base_def.extend({\n fn: z.string(),\n num_pins: z.union([z.literal(3), z.literal(5)]).default(3),\n w: z.string().default(\"4.20mm\"),\n h: z.string().default(\"4.80mm\"),\n pl: z.string().default(\"1.3mm\"),\n pw: z.string().default(\"0.9mm\"),\n p: z.string().default(\"1.5mm\"),\n string: z.string().optional(),\n})\n\nexport const sot89_3 = (parameters: z.infer<typeof sot89_def>) => {\n const pads: AnyCircuitElement[] = []\n\n const padGap = Number.parseFloat(parameters.p)\n const padWidth = Number.parseFloat(parameters.pw)\n const length = Number.parseFloat(parameters.w)\n const padHeight = Number.parseFloat(parameters.pl)\n const centerExtra = 0.175\n const outerPadXShift = (padHeight - (padHeight + centerExtra)) / 2\n\n pads.push(\n rectpad(1, -length / 2 + outerPadXShift, padGap, padHeight, padWidth),\n rectpad(2, -length / 2, 0, padHeight + centerExtra, padWidth),\n rectpad(3, -length / 2 + outerPadXShift, -padGap, padHeight, padWidth),\n )\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, 0, 0.3)\n\n const width = Number.parseFloat(parameters.w) / 2 - 1\n const height = Number.parseFloat(parameters.h) / 2\n const silkscreenPath1: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -width, y: height },\n { x: width, y: height },\n { x: width, y: height / 2 + 0.5 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n const silkscreenPath2: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_2\",\n route: [\n { x: -width, y: -height },\n { x: width, y: -height },\n { x: width, y: -height / 2 - 0.5 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n\n return [\n ...pads,\n silkscreenPath1,\n silkscreenPath2,\n silkscreenRefText as AnyCircuitElement,\n ]\n}\n\nexport const sot89_5 = (parameters: z.infer<typeof sot89_def>) => {\n const pads: AnyCircuitElement[] = []\n\n const padGap = Number.parseFloat(parameters.p)\n const padWidth = Number.parseFloat(parameters.pw)\n const length = Number.parseFloat(parameters.w)\n\n pads.push(\n rectpad(1, -1.85, -1.5, 1.5, 0.7),\n rectpad(2, -1.85, 1.5, 1.5, 0.7),\n rectpad(3, 0, 0, 0.8, 2),\n rectpad(4, 1.85, -1.5, 1.5, 0.7),\n rectpad(5, 1.85, 1.5, 1.5, 0.7),\n )\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n Number.parseFloat(parameters.h) / 2 + 0.5,\n 0.3,\n )\n\n const width = Number.parseFloat(parameters.w) / 2 - 1\n const height = Number.parseFloat(parameters.h) / 2\n const silkscreenPath1: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -width, y: height },\n { x: width, y: height },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n const silkscreenPath2: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_2\",\n route: [\n { x: -width, y: -height },\n { x: width, y: -height },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n\n return [\n ...pads,\n silkscreenPath1,\n silkscreenPath2,\n silkscreenRefText as AnyCircuitElement,\n ]\n}\n\nexport const sot89 = (\n raw_params: z.input<typeof sot89_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const match = raw_params.string?.match(/^sot89_(\\d+)/)\n const numPins = match ? Number.parseInt(match[1]!, 10) : 3\n\n const parameters = sot89_def.parse({\n ...raw_params,\n num_pins: numPins,\n })\n\n if (parameters.num_pins === 3) {\n return {\n circuitJson: sot89_3(parameters),\n parameters: parameters,\n }\n }\n\n if (parameters.num_pins === 5) {\n return {\n circuitJson: sot89_5(parameters),\n parameters: parameters,\n }\n }\n\n throw new Error(\"Invalid number of pins for SOT89\")\n}\n","import {\n type AnyCircuitElement,\n type PcbSilkscreenPath,\n length,\n} from \"circuit-json\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { z } from \"zod\"\nimport { type SilkscreenRef, silkscreenRef } from \"../helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const to220_def = base_def.extend({\n fn: z.string(),\n p: length.optional().default(\"5.0mm\"),\n id: length.optional().default(\"1.0mm\"),\n od: length.optional().default(\"1.9mm\"),\n w: length.optional().default(\"13mm\"),\n h: length.optional().default(\"7mm\"),\n num_pins: z.number().optional(),\n string: z.string().optional(),\n})\n\nexport type To220Def = z.input<typeof to220_def>\n\nexport const to220 = (\n raw_params: To220Def,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = to220_def.parse(raw_params)\n const { fn, id, od, w, h, string } = parameters\n\n const numPins = Number.parseInt(string?.split(\"_\")[1] ?? \"3\")\n\n const holeY = -1\n const halfWidth = w / 2\n const halfHeight = h / 2\n\n const minPitch = 2.5\n const maxHoleWidth = w * 0.4\n const computedPitch = Math.max(minPitch, maxHoleWidth / (numPins - 1))\n\n const plated_holes = Array.from({ length: numPins }, (_, i) => {\n const x =\n numPins % 2 === 0\n ? (i - numPins / 2 + 0.5) * computedPitch\n : (i - Math.floor(numPins / 2)) * computedPitch\n return platedhole(i + 1, x, holeY, id, od)\n })\n\n const silkscreenBody: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -halfWidth, y: -halfHeight },\n { x: halfWidth, y: -halfHeight },\n { x: halfWidth, y: halfHeight },\n { x: -halfWidth, y: halfHeight },\n { x: -halfWidth, y: -halfHeight },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n const yLine = -halfHeight + (2 * h) / 3\n const horizontalLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -halfWidth, y: yLine },\n { x: halfWidth, y: yLine },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n const verticalLines: PcbSilkscreenPath[] = [\n {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -w / 6, y: yLine },\n { x: -w / 6, y: halfHeight },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n },\n {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: w / 6, y: yLine },\n { x: w / 6, y: halfHeight },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n },\n ]\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, h / 2 + 0.6, 0.5)\n\n return {\n circuitJson: [\n ...plated_holes,\n silkscreenBody,\n horizontalLine,\n ...verticalLines,\n silkscreenRefText as AnyCircuitElement,\n ],\n parameters: { ...parameters, p: computedPitch },\n }\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const minimelf_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"5.40mm\"),\n h: z.string().default(\"2.30mm\"),\n pl: z.string().default(\"1.30mm\"),\n pw: z.string().default(\"1.70mm\"),\n p: z.string().default(\"3.5mm\"),\n})\n\nexport const minimelf = (\n raw_params: z.input<typeof minimelf_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = minimelf_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) / 2 + 0.4,\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: miniMelfWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\nexport const getMiniMelfCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n return pn === 1 ? { x: -p / 2, y: 0 } : { x: p / 2, y: 0 }\n}\n\nexport const miniMelfWithoutParsing = (\n parameters: z.infer<typeof minimelf_def>,\n) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getMiniMelfCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"1.90mm\"),\n h: z.string().default(\"1.33mm\"),\n pl: z.string().default(\"0.5mm\"),\n pw: z.string().default(\"0.7mm\"),\n p: z.string().default(\"0.8mm\"),\n})\n\nexport const sod882d = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) + 0.1,\n 0.3,\n )\n\n // Define silkscreen path that goes till half of the second pad\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2 + 0.1,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2 + 0.1,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\nexport const getSodCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const melf_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"7.0mm\"),\n h: z.string().default(\"3.35mm\"),\n pl: z.string().default(\"1.50mm\"),\n pw: z.string().default(\"2.70mm\"),\n p: z.string().default(\"4.8mm\"),\n})\n\nexport const melf = (\n raw_params: z.input<typeof melf_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = melf_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h),\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: melfWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\nexport const getMelfCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\nexport const melfWithoutParsing = (parameters: z.infer<typeof melf_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getMelfCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const micromelf_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"3.0mm\"),\n h: z.string().default(\"1.80mm\"),\n pl: z.string().default(\"0.80mm\"),\n pw: z.string().default(\"1.20mm\"),\n p: z.string().default(\"1.6mm\"),\n})\n\nexport const micromelf = (\n raw_params: z.input<typeof micromelf_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = micromelf_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h),\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.1,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.1,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: microMelfWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\nexport const getMicroMelfCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\nexport const microMelfWithoutParsing = (\n parameters: z.infer<typeof micromelf_def>,\n) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getMicroMelfCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sma_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"7.10mm\"),\n h: z.string().default(\"3.40mm\"),\n pl: z.string().default(\"2.45mm\"),\n pw: z.string().default(\"1.80mm\"),\n p: z.string().default(\"4.05mm\"),\n})\n\nexport const sma = (\n raw_params: z.input<typeof sma_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sma_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) / 2 + 0.5,\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.5,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.5,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: smaWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for sma pads\nexport const getSmaCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n }\n return { x: p / 2, y: 0 }\n}\n\n// Function to generate sma pads\nexport const smaWithoutParsing = (parameters: z.infer<typeof sma_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSmaCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const smf_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"4.80mm\"),\n h: z.string().default(\"2.10mm\"),\n pl: z.string().default(\"1.30mm\"),\n pw: z.string().default(\"1.40mm\"),\n p: z.string().default(\"2.9mm\"),\n})\n\nexport const smf = (\n raw_params: z.input<typeof smf_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = smf_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) - 0.5,\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: smfWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for smf pads\nexport const getSmfCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\n// Function to generate smf pads\nexport const smfWithoutParsing = (parameters: z.infer<typeof smf_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSmfCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const smb_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"7.30mm\"),\n h: z.string().default(\"4.40mm\"),\n pl: z.string().default(\"2.50mm\"),\n pw: z.string().default(\"2.30mm\"),\n p: z.string().default(\"4.30mm\"),\n})\n\nexport const smb = (\n raw_params: z.input<typeof smb_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = smb_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) / 2 + 0.5,\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.1,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.1,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: smbWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for smb pads\nexport const getSmbCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: p / 2, y: 0 }\n }\n}\n\n// Function to generate smb pads\nexport const smbWithoutParsing = (parameters: z.infer<typeof smb_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSmbCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const smc_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"10.70mm\"),\n h: z.string().default(\"6.60mm\"),\n pl: z.string().default(\"3.30mm\"),\n pw: z.string().default(\"2.50mm\"),\n p: z.string().default(\"6.80mm\"),\n})\n\nexport const smc = (\n raw_params: z.input<typeof smc_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = smc_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, 3, 0.3)\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2 - 0.8,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.8,\n y: length.parse(parameters.h) / 2 - 0.8,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.8,\n y: -length.parse(parameters.h) / 2 + 0.8,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2 + 0.8,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: smcWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for smc pads\nexport const getSmcCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n }\n return { x: p / 2, y: 0 }\n}\n\n// Function to generate smc pads\nexport const smcWithoutParsing = (parameters: z.infer<typeof smc_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSmcCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sot223_def = base_def.extend({\n fn: z.string(),\n num_pins: z.number().default(4),\n w: z.string().default(\"8.50mm\"),\n h: z.string().default(\"6.90mm\"),\n pl: z.string().default(\"2mm\"),\n pw: z.string().default(\"1.5mm\"),\n p: z.string().default(\"2.30mm\"),\n string: z.string().optional(),\n})\n\nexport const sot223 = (\n raw_params: z.input<typeof sot223_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const match = raw_params.string?.match(/^sot223_(\\d+)/)\n const numPins = match ? Number.parseInt(match[1]!, 10) : 4\n\n if (numPins === 8) {\n const parameters = sot223_8_def.parse({\n ...raw_params,\n num_pins: numPins,\n })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters: parameters,\n }\n }\n\n const parameters = sot223_def.parse({\n ...raw_params,\n num_pins: numPins,\n })\n\n if (parameters.num_pins === 4) {\n return {\n circuitJson: sot223_4(parameters),\n parameters: parameters,\n }\n }\n if (parameters.num_pins === 5) {\n return {\n circuitJson: sot223_5(parameters),\n parameters: parameters,\n }\n }\n if (parameters.num_pins === 6) {\n return {\n circuitJson: sot223_6(parameters),\n parameters: parameters,\n }\n }\n throw new Error(\"Invalid number of pins\")\n}\nexport const get2CcwSot223Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n p: number\n}) => {\n const { pn, w, h, pl, p } = parameters\n\n if (pn === 1) {\n return { x: -w / 2 + 1.1, y: p }\n }\n if (pn === 2) {\n return { x: -w / 2 + 1.1, y: 0 }\n }\n if (pn === 3) {\n return { x: -w / 2 + 1.1, y: -p }\n }\n\n return { x: w / 2 - 1.1, y: 0 }\n}\n\nexport const sot223_4 = (parameters: z.infer<typeof sot223_def>) => {\n const pads: AnyCircuitElement[] = []\n\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = get2CcwSot223Coords({\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 p: Number.parseFloat(parameters.p),\n })\n\n const pinWidth = i === 3 ? 3.8 : Number.parseFloat(parameters.pw)\n\n pads.push(rectpad(i + 1, x, y, Number.parseFloat(parameters.pl), pinWidth))\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, 0, 0.3)\n\n const width = Number.parseFloat(parameters.w) / 2 - 2.4\n const height = Number.parseFloat(parameters.h) / 2\n const silkscreenPath1: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -width, y: height },\n { x: width, y: height },\n { x: width, y: height / 2 + 0.5 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n const silkscreenPath2: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_2\",\n route: [\n { x: -width, y: -height },\n { x: width, y: -height },\n { x: width, y: -height / 2 - 0.5 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n\n return [\n ...pads,\n silkscreenPath1,\n silkscreenPath2,\n silkscreenRefText as AnyCircuitElement,\n ]\n}\n\nexport const sot223_8_def = extendSoicDef({\n p: \"0.90mm\",\n w: \"2.8mm\",\n legsoutside: true,\n})\n\nexport const get2CcwSot2235Coords = (parameters: {\n h: number\n p: number\n pn: number\n w: number\n}) => {\n const { p, h, pn, w } = parameters\n if (pn === 1) {\n return { x: -w / 2 + 1.2, y: p / 2 + p }\n }\n if (pn === 2) {\n return { x: -w / 2 + 1.2, y: p / 2 }\n }\n if (pn === 3) {\n return { x: -w / 2 + 1.2, y: -p / 2 }\n }\n if (pn === 4) {\n return { x: -w / 2 + 1.2, y: -p / 2 - p }\n }\n if (pn === 5) {\n return { x: w / 2 - 1, y: 0 }\n }\n throw new Error(\"Invalid pin number\")\n}\n\nexport const sot223_5 = (parameters: z.infer<typeof sot223_def>) => {\n const pads: AnyCircuitElement[] = []\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = get2CcwSot2235Coords({\n h: Number.parseFloat(parameters.h),\n p: 1.5,\n pn: i,\n w: Number.parseFloat(parameters.w),\n })\n\n let pinWidth = Number.parseFloat(parameters.pw)\n let pinLength = Number.parseFloat(parameters.pl)\n\n if (i === 5) {\n pinWidth = 3.4\n pinLength = 1.8\n } else {\n pinWidth = 1\n pinLength = 2.2\n }\n\n pads.push(rectpad(i, x, y, pinLength, pinWidth))\n }\n\n const width = Number.parseFloat(parameters.w) / 2 - 2.4\n const height = Number.parseFloat(parameters.h) / 2\n const silkscreenPath1: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -width, y: height },\n { x: width, y: height },\n { x: width, y: height / 2 + 0.5 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n const silkscreenPath2: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_2\",\n route: [\n { x: -width, y: -height },\n { x: width, y: -height },\n { x: width, y: -height / 2 - 0.5 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, 0, 0.3)\n\n return [...pads, silkscreenPath1, silkscreenPath2, silkscreenRefText]\n}\n\nexport const get2CcwSot2236Coords = (parameters: {\n h: number\n p: number\n pn: number\n w: number\n}) => {\n const { p, h, pn, w } = parameters\n if (pn === 1) {\n return { x: -w / 2 + 1.2, y: 2 * p }\n }\n if (pn === 2) {\n return { x: -w / 2 + 1.2, y: p }\n }\n if (pn === 3) {\n return { x: -w / 2 + 1.2, y: 0 }\n }\n if (pn === 4) {\n return { x: -w / 2 + 1.2, y: -p }\n }\n if (pn === 5) {\n return { x: -w / 2 + 1.2, y: -2 * p }\n }\n if (pn === 6) {\n return { x: w / 2 - 1.175, y: 0 }\n }\n throw new Error(\"Invalid pin number\")\n}\n\nexport const sot223_6 = (parameters: z.infer<typeof sot223_def>) => {\n const pads: AnyCircuitElement[] = []\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = get2CcwSot2236Coords({\n h: Number.parseFloat(parameters.h),\n p: 1.3,\n pn: i,\n w: 8.7,\n })\n\n let pinWidth = Number.parseFloat(parameters.pw)\n let pinLength = Number.parseFloat(parameters.pl)\n\n if (i === 6) {\n pinWidth = 3.4\n pinLength = 2.15\n } else {\n pinWidth = 0.6\n pinLength = 2.2\n }\n\n pads.push(rectpad(i, x, y, pinLength, pinWidth))\n }\n\n const width = Number.parseFloat(parameters.w) / 2 - 2.4\n const height = Number.parseFloat(parameters.h) / 2\n const silkscreenPath1: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -width, y: height },\n { x: width, y: height },\n { x: width, y: height / 2 + 0.5 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n const silkscreenPath2: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_2\",\n route: [\n { x: -width, y: -height },\n { x: width, y: -height },\n { x: width, y: -height / 2 - 0.5 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, 0, 0.3)\n\n return [...pads, silkscreenPath1, silkscreenPath2, silkscreenRefText]\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sot23w_def = base_def.extend({\n fn: z.string(),\n num_pins: z.number().default(3),\n w: z.string().default(\"3.40mm\"),\n h: z.string().default(\"3.30mm\"),\n pl: z.string().default(\"1mm\"),\n pw: z.string().default(\"0.7mm\"),\n p: z.string().default(\"1.2mm\"),\n string: z.string().optional(),\n})\n\nexport const sot23w = (\n raw_params: z.input<typeof sot23w_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const match = raw_params.string?.match(/^sot23w_(\\d+)/)\n const numPins = match ? Number.parseInt(match[1]!, 3) : 3\n\n const parameters = sot23w_def.parse({\n ...raw_params,\n num_pins: numPins,\n })\n\n if (parameters.num_pins === 3) {\n return {\n circuitJson: sot23w_3(parameters),\n parameters: parameters,\n }\n }\n\n throw new Error(\"Invalid number of pins\")\n}\n\nexport const getCcwSot23wCoords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n p: number\n}) => {\n const { pn, w, h, pl, p } = parameters\n\n if (pn === 1) {\n return { x: -p, y: 0.95 }\n }\n if (pn === 2) {\n return { x: -p, y: -0.95 }\n }\n\n return { x: p, y: 0 }\n}\n\nexport const sot23w_3 = (parameters: z.infer<typeof sot23w_def>) => {\n const pads: AnyCircuitElement[] = []\n\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSot23wCoords({\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 p: Number.parseFloat(parameters.p),\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\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n Number.parseInt(parameters.h) / 2 + 1,\n 0.3,\n )\n\n const width = Number.parseFloat(parameters.w) / 2 - 1\n const height = Number.parseFloat(parameters.h) / 2\n const silkscreenPath1: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -width, y: height },\n { x: width + 0.3, y: height },\n { x: width + 0.3, y: height / 2 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n const silkscreenPath2: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_2\",\n route: [\n { x: -width, y: -height },\n { x: width + 0.3, y: -height },\n { x: width + 0.3, y: -height / 2 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n\n return [\n ...pads,\n silkscreenPath1,\n silkscreenPath2,\n silkscreenRefText as AnyCircuitElement,\n ]\n}\n","import { z } from \"zod\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const to92s_def = base_def.extend({\n fn: z.string(),\n num_pins: z.union([z.literal(3), z.literal(2)]).default(3),\n p: z.string().default(\"1.27mm\"),\n id: z.string().default(\"0.72mm\"),\n od: z.string().default(\"0.95mm\"),\n w: z.string().default(\"2.5mm\"),\n h: z.string().default(\"4.2mm\"),\n string: z.string().optional(),\n})\n\nexport const to92s_3 = (parameters: z.infer<typeof to92s_def>) => {\n const { p, id, od, w, h } = parameters\n const holeY = Number.parseFloat(h) / 2\n const padSpacing = Number.parseFloat(p)\n\n return [\n platedhole(1, -padSpacing, holeY - padSpacing, id, od),\n platedhole(2, 0, holeY - padSpacing, id, od),\n\n platedhole(3, padSpacing, holeY - padSpacing, id, od),\n ]\n}\n\nexport const to92s_2 = (parameters: z.infer<typeof to92s_def>) => {\n const { p, id, od, h } = parameters\n const holeY = Number.parseFloat(h) / 2\n const padSpacing = Number.parseFloat(p)\n\n return [\n platedhole(1, -padSpacing, holeY - padSpacing, id, od),\n platedhole(2, padSpacing, holeY - padSpacing, id, od),\n ]\n}\n\nexport const to92s = (\n raw_params: z.input<typeof to92s_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const match = raw_params.string?.match(/^to92s_(\\d+)/)\n const numPins = match ? Number.parseInt(match[1]!, 10) : 3\n\n const parameters = to92s_def.parse({\n ...raw_params,\n num_pins: numPins,\n })\n\n let platedHoles: AnyCircuitElement[] = []\n\n if (parameters.num_pins === 3) {\n platedHoles = to92s_3(parameters)\n } else if (parameters.num_pins === 2) {\n platedHoles = to92s_2(parameters)\n } else {\n throw new Error(\"Invalid number of pins for TO-92\")\n }\n\n const holeY = Number.parseFloat(parameters.h) / 2\n const padSpacing = Number.parseFloat(parameters.p)\n\n const silkscreenBody: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -holeY, y: holeY - padSpacing },\n { x: -1.9, y: 0 },\n { x: 1.9, y: 0 },\n { x: holeY, y: holeY - padSpacing },\n { x: 1.5, y: Number.parseFloat(parameters.h) / 2 + 0.5 },\n { x: -1.5, y: Number.parseFloat(parameters.h) / 2 + 0.5 },\n { x: -holeY, y: holeY - padSpacing },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, holeY + 1, 0.5)\n\n return {\n circuitJson: [\n ...platedHoles,\n silkscreenBody,\n silkscreenRefText as AnyCircuitElement,\n ],\n parameters,\n }\n}\n","import {\n length,\n type AnySoupElement,\n type PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { z } from \"zod\"\n\nimport { platedHoleWithRectPad } from \"src/helpers/platedHoleWithRectPad\"\nimport { rectpad } from \"src/helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const jst_def = base_def.extend({\n fn: z.string(),\n p: length.optional(),\n id: length.optional(),\n pw: length.optional(),\n pl: length.optional(),\n w: length.optional(),\n h: length.optional(),\n sh: z\n .union([z.boolean(), z.string(), z.number()])\n .optional()\n .transform((v) => {\n if (typeof v === \"string\") {\n const n = Number(v)\n return Number.isNaN(n) ? true : n\n }\n return v\n })\n .describe(\n 'JST SH (Surface-mount) connector family. SH stands for \"Super High-density\".',\n ),\n\n ph: z\n .boolean()\n .optional()\n .describe(\n 'JST PH (Through-hole) connector family. PH stands for \"Pin Header\".',\n ),\n\n string: z.string().optional(),\n})\n\nexport type jstDef = z.input<typeof jst_def>\n\n// Variant type\ntype JstVariant = \"ph\" | \"sh\"\n\nconst variantDefaults: Record<JstVariant, any> = {\n ph: {\n p: length.parse(\"2.2mm\"),\n id: length.parse(\"0.70mm\"),\n pw: length.parse(\"1.20mm\"),\n pl: length.parse(\"1.20mm\"),\n w: length.parse(\"6mm\"),\n h: length.parse(\"5mm\"),\n },\n sh: {\n p: length.parse(\"1mm\"),\n pw: length.parse(\"0.6mm\"),\n pl: length.parse(\"1.55mm\"),\n w: length.parse(\"5.8mm\"),\n h: length.parse(\"7.8mm\"),\n },\n}\n\nfunction getVariant(params: jstDef): JstVariant {\n if (params.sh) return \"sh\"\n if (params.ph) return \"ph\"\n return \"ph\"\n}\n\nfunction generatePads(\n variant: JstVariant,\n numPins: number,\n p: number,\n id: number,\n pw: number,\n pl: number,\n): AnySoupElement[] {\n const pads: AnySoupElement[] = []\n\n if (variant === \"ph\") {\n const half_p = p / 2\n pads.push(platedHoleWithRectPad(1, -half_p, 2, id, pw, pl))\n pads.push(platedHoleWithRectPad(2, half_p, 2, id, pw, pl))\n } else {\n const startX = -((numPins - 1) / 2) * p\n for (let i = 0; i < numPins; i++) {\n const x = startX + i * p\n console.log(\"x si\", x)\n pads.push(rectpad(i + 1, x, -1.325, pw, pl))\n }\n\n const sideOffset = ((numPins - 1) / 2) * p + 1.3\n console.log(\"offset\", sideOffset)\n pads.push(rectpad(numPins + 1, -sideOffset, 1.22, 1.2, 1.8))\n pads.push(rectpad(numPins + 2, sideOffset, 1.22, 1.2, 1.8))\n }\n\n return pads\n}\n\nfunction generateSilkscreenBody(\n variant: JstVariant,\n w: number,\n h: number,\n): PcbSilkscreenPath {\n if (variant === \"ph\") {\n return {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -3, y: 3 },\n { x: 3, y: 3 },\n { x: 3, y: -2 },\n { x: -3, y: -2 },\n { x: -3, y: 3 },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n } else {\n return {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n }\n}\n\nexport const jst = (\n raw_params: jstDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const params = jst_def.parse(raw_params)\n const variant = getVariant(params)\n const defaults = variantDefaults[variant]\n\n const p = params.p ?? defaults.p\n const id = params.id ?? defaults.id\n const pw = params.pw ?? defaults.pw\n const pl = params.pl ?? defaults.pl\n const w = params.w ?? defaults.w\n const h = params.h ?? defaults.h\n\n let numPins = variant === \"sh\" ? 4 : 2\n\n if (variant === \"sh\") {\n const str = typeof raw_params.string === \"string\" ? raw_params.string : \"\"\n const match = str.match(/sh(\\d+)/)\n if (match && match[1]) {\n const parsed = parseInt(match[1], 10)\n if (!Number.isNaN(parsed)) {\n numPins = parsed\n }\n } else if (typeof params.sh === \"number\") {\n numPins = params.sh\n }\n }\n\n const pads = generatePads(variant, numPins, p, id, pw, pl)\n const silkscreenBody = generateSilkscreenBody(variant, w, h)\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, h / 2 + 1, 0.5)\n\n return {\n circuitJson: [...pads, silkscreenBody, silkscreenRefText as AnySoupElement],\n parameters: {\n ...params,\n p,\n id,\n pw,\n pl,\n w,\n h,\n num_pins: numPins,\n sh: variant === \"sh\",\n ph: variant === \"ph\",\n },\n }\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"3.30mm\"),\n h: z.string().default(\"1.70mm\"),\n pl: z.string().default(\"0.80mm\"),\n pw: z.string().default(\"1mm\"),\n p: z.string().default(\"1.90mm\"),\n})\n\nexport const sod110 = (\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 length.parse(parameters.h) / 2 + 0.5,\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\nexport const getSodCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n }\n\n return { x: p / 2, y: 0 }\n}\n\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type {\n AnyCircuitElement,\n AnySoupElement,\n PcbFabricationNoteText,\n PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nconst getDefaultValues = (num_pins: number) => {\n switch (num_pins) {\n case 8:\n return {\n w: \"3.06mm\",\n h: \"3.14mm\",\n p: \"0.65mm\",\n pl: \"1.6mm\",\n pw: \"0.5mm\",\n }\n case 10:\n return {\n w: \"3.10mm\",\n h: \"3.33mm\",\n p: \"0.5mm\",\n pl: \"1.45mm\",\n pw: \"0.3mm\",\n }\n default:\n return {\n w: \"3.06mm\",\n h: \"3.14mm\",\n p: \"0.65mm\",\n pl: \"1.6mm\",\n pw: \"0.5mm\",\n }\n }\n}\n\nexport const vssop_def = base_def.extend({\n fn: z.string(),\n num_pins: z.union([z.literal(8), z.literal(10)]).default(8),\n w: z.string().optional(),\n h: z.string().optional(),\n p: z.string().optional(),\n pl: z.string().optional(),\n pw: z.string().optional(),\n string: z.string().optional(),\n})\n\nexport const vssop = (\n raw_params: z.input<typeof vssop_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = vssop_def.parse(raw_params)\n const defaults = getDefaultValues(parameters.num_pins)\n\n const w = length.parse(parameters.w || defaults.w)\n const h = length.parse(parameters.h || defaults.h)\n const p = length.parse(parameters.p || defaults.p)\n const pl = length.parse(parameters.pl || defaults.pl)\n const pw = length.parse(parameters.pw || defaults.pw)\n\n const pads: AnyCircuitElement[] = []\n const half = parameters.num_pins / 2\n\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getVssopPadCoord(parameters.num_pins, i + 1, w, p)\n const logical_pn = i < half ? i + 1 : parameters.num_pins - (i - half)\n pads.push(rectpad(logical_pn, x, y, pl, pw))\n }\n\n const silkscreenBoxWidth = w\n const silkscreenBoxHeight = h\n\n const silkscreenTopLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -silkscreenBoxWidth / 2, y: silkscreenBoxHeight / 2 },\n { x: silkscreenBoxWidth / 2, y: silkscreenBoxHeight / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenBottomLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -silkscreenBoxWidth / 2, y: -silkscreenBoxHeight / 2 },\n { x: silkscreenBoxWidth / 2, y: -silkscreenBoxHeight / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const pin1Position = getVssopPadCoord(\n parameters.num_pins,\n 1,\n silkscreenBoxWidth,\n p,\n )\n\n const pin1MarkerPosition = {\n x: pin1Position.x - 0.8,\n y: pin1Position.y,\n }\n\n const pin1Marking: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"pin_marker_1\",\n route: [\n { x: pin1MarkerPosition.x - 0.4, y: pin1MarkerPosition.y },\n { x: pin1MarkerPosition.x - 0.7, y: pin1MarkerPosition.y + 0.3 },\n { x: pin1MarkerPosition.x - 0.7, y: pin1MarkerPosition.y - 0.3 },\n { x: pin1MarkerPosition.x - 0.4, y: pin1MarkerPosition.y },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"pin_marker_1\",\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n silkscreenBoxHeight / 2 + 0.5,\n 0.3,\n )\n\n return {\n circuitJson: [\n ...pads,\n silkscreenTopLine,\n silkscreenBottomLine,\n silkscreenRefText,\n pin1Marking,\n ],\n parameters,\n }\n}\n\n// Get coordinates for VSSOP pads\nconst getVssopPadCoord = (\n pinCount: number,\n pn: number,\n w: number,\n p: number,\n) => {\n const half = pinCount / 2\n const rowIndex = (pn - 1) % half\n const col = pn <= half ? -1 : 1\n const row = (half - 1) / 2 - rowIndex\n\n return {\n x: col * length.parse(pinCount === 8 ? \"1.8mm\" : \"2.2mm\"),\n y: row * p,\n }\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nconst getDefaultValues = (num_pins: number) => {\n switch (num_pins) {\n case 10:\n return {\n w: \"3.10mm\",\n h: \"3.32mm\",\n p: \"0.5mm\",\n pl: \"1.63mm\",\n pw: \"0.33mm\",\n }\n case 12:\n return {\n w: \"3mm\",\n h: \"4mm\",\n p: \"0.65mm\",\n pl: \"0.88mm\",\n pw: \"0.4mm\",\n }\n case 16:\n return {\n w: \"3.10mm\",\n h: \"4mm\",\n p: \"0.5mm\",\n pl: \"0.88mm\",\n pw: \"0.3mm\",\n }\n default:\n return {\n w: \"3.10mm\",\n h: \"3.32mm\",\n p: \"0.65mm\",\n pl: \"1.63mm\",\n pw: \"0.4mm\",\n }\n }\n}\n\nexport const msop_def = base_def.extend({\n fn: z.string(),\n num_pins: z\n .union([z.literal(8), z.literal(10), z.literal(12), z.literal(16)])\n .default(8),\n w: z.string().optional(),\n h: z.string().optional(),\n p: z.string().optional(),\n pl: z.string().optional(),\n pw: z.string().optional(),\n string: z.string().optional(),\n})\n\nconst getMsopCoords = (pinCount: number, pn: number, w: number, p: number) => {\n const half = pinCount / 2\n const rowIndex = (pn - 1) % half\n const col = pn <= half ? -1 : 1\n const row = (half - 1) / 2 - rowIndex\n\n return {\n x: col * length.parse(\"2mm\"),\n y: row * p,\n }\n}\n\nexport const msop = (\n raw_params: z.input<typeof msop_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = msop_def.parse(raw_params)\n const defaults = getDefaultValues(parameters.num_pins)\n\n const w = length.parse(parameters.w || defaults.w)\n const h = length.parse(parameters.h || defaults.h)\n const p = length.parse(parameters.p || defaults.p)\n const pl = length.parse(parameters.pl || defaults.pl)\n const pw = length.parse(parameters.pw || defaults.pw)\n\n const pads: AnyCircuitElement[] = []\n\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getMsopCoords(parameters.num_pins, i + 1, w, p)\n pads.push(rectpad(i + 1, x, y, pl, pw))\n }\n\n const silkscreenBoxWidth = w\n const silkscreenBoxHeight = h\n\n const silkscreenTopLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -silkscreenBoxWidth / 2, y: silkscreenBoxHeight / 2 },\n { x: silkscreenBoxWidth / 2, y: silkscreenBoxHeight / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenBottomLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -silkscreenBoxWidth / 2, y: -silkscreenBoxHeight / 2 },\n { x: silkscreenBoxWidth / 2, y: -silkscreenBoxHeight / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const pin1Position = getMsopCoords(\n parameters.num_pins,\n 1,\n silkscreenBoxWidth,\n p,\n )\n\n const pin1MarkerPosition = {\n x: pin1Position.x - 0.8,\n y: pin1Position.y,\n }\n\n const pin1Marking: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"pin_marker_1\",\n route: [\n { x: pin1MarkerPosition.x - 0.4, y: pin1MarkerPosition.y },\n { x: pin1MarkerPosition.x - 0.7, y: pin1MarkerPosition.y + 0.3 },\n { x: pin1MarkerPosition.x - 0.7, y: pin1MarkerPosition.y - 0.3 },\n { x: pin1MarkerPosition.x - 0.4, y: pin1MarkerPosition.y },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"pin_marker_1\",\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n silkscreenBoxHeight / 2 + 0.5,\n 0.3,\n )\n\n return {\n circuitJson: [\n ...pads,\n silkscreenTopLine,\n silkscreenBottomLine,\n silkscreenRefText,\n pin1Marking,\n ],\n parameters,\n }\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod323w_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"3.8mm\"),\n h: z.string().default(\"1.65mm\"),\n pl: z.string().default(\"1.2mm\"),\n pw: z.string().default(\"1.2mm\"),\n pad_spacing: z.string().default(\"2.6mm\"),\n})\n\nexport const sod323w = (\n raw_params: z.input<typeof sod323w_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod323w_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h),\n 0.3,\n )\n\n // Define silkscreen path that goes till half of the second pad\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.pad_spacing) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.pad_spacing) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\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\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod323w_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n pad_spacing: Number.parseFloat(parameters.pad_spacing),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sod323FL_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"3.20mm\"),\n h: z.string().default(\"1.65mm\"),\n pl: z.string().default(\"0.8mm\"),\n pw: z.string().default(\"0.9mm\"),\n pad_spacing: z.string().default(\"2.1mm\"),\n})\n\nexport const sod323fl = (\n raw_params: z.input<typeof sod323FL_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod323FL_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h),\n 0.3,\n )\n\n // Define silkscreen path that goes till half of the second pad\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.pad_spacing) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.2,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.pad_spacing) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for SOD pads\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\n// Function to generate SOD pads\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod323FL_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n pad_spacing: Number.parseFloat(parameters.pad_spacing),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const son_def = base_def.extend({\n fn: z.string(),\n num_pins: z.union([z.literal(6), z.literal(8)]).default(8),\n w: z.string().default(\"3mm\"),\n h: z.string().default(\"3mm\"),\n p: z.string().default(\"0.5mm\"),\n pl: z.string().default(\"0.52mm\"),\n pw: z.string().default(\"0.35mm\"),\n epw: z.string().default(\"1.40mm\"),\n eph: z.string().default(\"1.60mm\"),\n string: z.string().optional(),\n ep: z.boolean().default(false),\n})\n\nexport const son = (\n raw_params: z.input<typeof son_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n if (raw_params.string && raw_params.string.includes(\"_ep\")) {\n raw_params.ep = true\n }\n\n const match = raw_params.string?.match(/^son_(\\d+)/)\n const numPins = match\n ? Number.parseInt(match[1]!, 10)\n : raw_params.num_pins || 8\n\n const parameters = son_def.parse({\n ...raw_params,\n num_pins: numPins as 6 | 8,\n })\n\n const w = length.parse(parameters.w)\n const h = length.parse(parameters.h)\n const p = length.parse(parameters.p)\n const pl = length.parse(parameters.pl)\n const pw = length.parse(parameters.pw)\n const epw = length.parse(parameters.epw)\n const eph = length.parse(parameters.eph)\n\n const pads: AnyCircuitElement[] = []\n\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getSonPadCoord(parameters.num_pins, i + 1, w, p)\n pads.push(rectpad(i + 1, x, y, pl, pw))\n }\n\n if (parameters.ep) {\n pads.push(rectpad(parameters.num_pins + 1, 0, 0, epw, eph))\n }\n\n const silkscreenBoxWidth = w\n const silkscreenBoxHeight = h\n\n const silkscreenTopLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -silkscreenBoxWidth / 2, y: silkscreenBoxHeight / 2 },\n { x: silkscreenBoxWidth / 2, y: silkscreenBoxHeight / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenBottomLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -silkscreenBoxWidth / 2, y: -silkscreenBoxHeight / 2 },\n { x: silkscreenBoxWidth / 2, y: -silkscreenBoxHeight / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const pin1Position = getSonPadCoord(\n parameters.num_pins,\n 1,\n silkscreenBoxWidth,\n p,\n )\n\n const pin1MarkerPosition = {\n x: pin1Position.x - 0.4,\n y: pin1Position.y,\n }\n\n const pin1Marking: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"pin_marker_1\",\n route: [\n { x: pin1MarkerPosition.x - 0.4, y: pin1MarkerPosition.y },\n { x: pin1MarkerPosition.x - 0.7, y: pin1MarkerPosition.y + 0.3 },\n { x: pin1MarkerPosition.x - 0.7, y: pin1MarkerPosition.y - 0.3 },\n { x: pin1MarkerPosition.x - 0.4, y: pin1MarkerPosition.y },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"pin_marker_1\",\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n silkscreenBoxHeight / 2 + 0.5,\n 0.3,\n )\n\n return {\n circuitJson: [\n ...pads,\n silkscreenTopLine,\n silkscreenBottomLine,\n silkscreenRefText,\n pin1Marking,\n ],\n parameters,\n }\n}\n\nexport const getSonPadCoord = (\n num_pins: number,\n pn: number,\n w: number,\n p: number,\n) => {\n const half = num_pins / 2\n const rowIndex = (pn - 1) % half\n const col = pn <= half ? -1 : 1\n const row = (half - 1) / 2 - rowIndex\n\n return {\n x: col * length.parse(\"1.4mm\"),\n y: row * p,\n }\n}\n","import { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef } from \"../helpers/silkscreenRef\"\nimport type { AnyCircuitElement } from \"circuit-json\"\nimport { length } from \"circuit-json\"\n\n/**\n * Solderjumper footprint generator\n * @param params { num_pins: 2 | 3, bridged?: string, p?: number, pw?: number, ph?: number }\n * - num_pins: 2 or 3\n * - bridged: e.g. \"12\" or \"123\" (which pins are connected)\n * - p: pad pitch (default 2.54)\n * - pw: pad width (default 1.5)\n * - ph: pad height (default 1.5)\n *\n * Examples:\n * solderjumper({ num_pins: 2 }) // no pads connected\n * solderjumper({ num_pins: 3, bridged: \"12\" }) // pads 1 and 2 connected\n * solderjumper({ num_pins: 3, bridged: \"123\" }) // all pads connected\n * solderjumper({ num_pins: 3, p: 3.0 }) // custom pitch\n * solderjumper({ num_pins: 3, pw: 2.0, ph: 1.0 }) // custom pad size\n */\nexport const solderjumper = (params: {\n num_pins: 2 | 3\n bridged?: string\n p?: number\n pw?: number\n ph?: number\n}) => {\n const { num_pins, bridged, p = 2.54, pw = 1.5, ph = 1.5 } = params\n const padSpacing = length.parse(p)\n const padWidth = length.parse(pw)\n const padHeight = length.parse(ph)\n const traceWidth = Math.min(padHeight / 4, 0.5)\n const pads: AnyCircuitElement[] = []\n for (let i = 0; i < num_pins; i++) {\n pads.push(rectpad(i + 1, i * padSpacing, 0, padWidth, padHeight))\n }\n let traces: AnyCircuitElement[] = []\n if (bridged) {\n const pins = bridged.split(\"\").map(Number)\n if (pins.length > 1) {\n for (let i = 0; i < pins.length - 1; i++) {\n const from = pins[i]\n const to = pins[i + 1]\n if (\n typeof from === \"number\" &&\n typeof to === \"number\" &&\n !isNaN(from) &&\n !isNaN(to)\n ) {\n const xCenterFrom = (from - 1) * padSpacing\n const xCenterTo = (to - 1) * padSpacing\n\n const directionMult = Math.sign(xCenterTo - xCenterFrom)\n\n const x1 = xCenterFrom + directionMult * (padWidth / 2)\n const x2 = xCenterTo - directionMult * (padWidth / 2)\n\n traces.push({\n type: \"pcb_trace\",\n pcb_trace_id: \"\",\n route: [\n {\n start_pcb_port_id: `{PIN${from}}`,\n x: x1,\n y: 0,\n width: traceWidth,\n layer: \"top\",\n route_type: \"wire\",\n },\n {\n end_pcb_port_id: `{PIN${to}}`,\n x: x2,\n y: 0,\n width: traceWidth,\n layer: \"top\",\n route_type: \"wire\",\n },\n ],\n })\n }\n }\n }\n }\n const outlineWidth = (num_pins - 1) * padSpacing + padWidth + 0.7\n const outlineHeight = padHeight + 1.0\n const outlineCenterX = ((num_pins - 1) * padSpacing) / 2\n const outlineCenterY = 0\n\n const silkscreenRect = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"outline\",\n route: [\n {\n x: outlineCenterX - outlineWidth / 2,\n y: outlineCenterY - outlineHeight / 2,\n },\n {\n x: outlineCenterX + outlineWidth / 2,\n y: outlineCenterY - outlineHeight / 2,\n },\n {\n x: outlineCenterX + outlineWidth / 2,\n y: outlineCenterY + outlineHeight / 2,\n },\n {\n x: outlineCenterX - outlineWidth / 2,\n y: outlineCenterY + outlineHeight / 2,\n },\n {\n x: outlineCenterX - outlineWidth / 2,\n y: outlineCenterY - outlineHeight / 2,\n },\n ],\n stroke_width: 0.15,\n }\n\n const refOffset = 0.6\n const refY = outlineCenterY + outlineHeight / 2 + refOffset\n const silk = silkscreenRef(outlineCenterX, refY, 0.4)\n\n return {\n circuitJson: [...pads, ...traces, silkscreenRect, silk],\n parameters: params,\n }\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { pillpad } from \"../helpers/pillpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nimport { base_def } from \"src/helpers/zod/base_def\"\n\n// Common schema properties for both SOT-457 configurations\nconst commonSchema = {\n fn: z.literal(\"sot457\"),\n num_pins: z.literal(6).default(6),\n pillh: z.string().default(\"0.45mm\"),\n pillw: z.string().default(\"1.45mm\"),\n pl: z.string(),\n pw: z.string(),\n p: z.string(),\n wave: z.boolean().optional(),\n reflow: z.boolean().optional(),\n}\n\n// Default SOT-457 schema\nconst sot457DefSchema = base_def.extend({\n ...commonSchema,\n h: z.string().default(\"2.5mm\"),\n w: z.string().default(\"2.7mm\"),\n pl: z.string().default(\"0.8mm\"),\n pw: z.string().default(\"0.55mm\"),\n p: z.string().default(\"0.95mm\"),\n})\n\n// Wave soldering SOT-457 schema with transform for wave/reflow defaults\nconst sot457WaveSchema = base_def\n .extend({\n ...commonSchema,\n h: z.string().default(\"3mm\"),\n w: z.string().default(\"4mm\"),\n pillr: z.string().default(\"0.225mm\"),\n pl: z.string().default(\"1.45mm\"),\n pw: z.string().default(\"1.5mm\"),\n p: z.string().default(\"1.475mm\"),\n })\n .transform((data) => ({\n ...data,\n wave: data.wave ?? (data.reflow === undefined ? true : !data.reflow),\n reflow: data.reflow ?? (data.wave === undefined ? false : !data.wave),\n }))\n\n// Type definitions\ntype Sot457Params = z.infer<typeof sot457DefSchema>\ntype Sot457WaveParams = z.infer<typeof sot457WaveSchema>\n\n// Helper function to parse dimension strings to numbers\nconst parseDimension = (value: string): number => {\n return Number.parseFloat(value.replace(\"mm\", \"\"))\n}\n\n// Get pin coordinates for counter-clockwise arrangement\nconst getCcwSot457Coords = ({\n pitch,\n width,\n pinNumber,\n}: {\n pitch: number\n width: number\n pinNumber: number\n}): { x: number; y: number } => {\n const offset = 0.1\n const coords: Record<number, { x: number; y: number }> = {\n 1: { x: -width / 2 - offset, y: pitch },\n 2: { x: -width / 2 - offset, y: 0 },\n 3: { x: -width / 2 - offset, y: -pitch },\n 4: { x: width / 2 + offset, y: -pitch },\n 5: { x: width / 2 + offset, y: 0 },\n 6: { x: width / 2 + offset, y: pitch },\n }\n\n const coord = coords[pinNumber]\n if (!coord) {\n throw new Error(`Invalid pin number: ${pinNumber}`)\n }\n return coord\n}\n\n// Generate circuit elements for SOT-457 package\nconst generateSot457Elements = (\n params: Sot457Params | Sot457WaveParams,\n): AnyCircuitElement[] => {\n const pads: AnyCircuitElement[] = []\n const pitch = parseDimension(params.p)\n const padLength = parseDimension(params.pl)\n const padWidth = parseDimension(params.pw)\n const width = parseDimension(params.w)\n const height = parseDimension(params.h)\n\n if (params.wave) {\n const pinConfigs: Record<\n number,\n (args: { padWidth: number; padHeight: number }) => AnyCircuitElement\n > = {\n 1: ({ padWidth, padHeight }) =>\n rectpad(1, -pitch, pitch, padHeight, padWidth),\n 2: ({ padWidth, padHeight }) =>\n rectpad(2, -pitch, -pitch, padHeight, padWidth),\n 3: ({ padWidth, padHeight }) =>\n pillpad(\n 3,\n -pitch,\n 0,\n parseDimension(params.pillw),\n parseDimension(params.pillh),\n ),\n 4: ({ padWidth, padHeight }) =>\n pillpad(\n 4,\n pitch,\n 0,\n parseDimension(params.pillw),\n parseDimension(params.pillh),\n ),\n 5: ({ padWidth, padHeight }) =>\n rectpad(5, pitch, pitch, padHeight, padWidth),\n 6: ({ padWidth, padHeight }) =>\n rectpad(6, pitch, -pitch, padHeight, padWidth),\n }\n\n for (let i = 1; i <= params.num_pins; i++) {\n const config = pinConfigs[i]\n if (config) {\n pads.push(config({ padWidth: padLength, padHeight: padWidth }))\n }\n }\n } else {\n for (let i = 1; i <= params.num_pins; i++) {\n const { x, y } = getCcwSot457Coords({ pitch, width, pinNumber: i })\n pads.push(rectpad(i, x, y, padLength, padWidth))\n }\n }\n\n // Silkscreen paths\n const silkscreenPath1: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -width / 3, y: height / 2 + pitch / 1.3 },\n { x: width / 3, y: height / 2 + pitch / 1.3 },\n ],\n stroke_width: 0.05,\n }\n\n const silkscreenPath2: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_2\",\n route: [\n { x: -width / 3, y: -height / 2 - pitch / 1.3 },\n { x: width / 3, y: -height / 2 - pitch / 1.3 },\n ],\n stroke_width: 0.05,\n }\n\n // Silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, height + 0.5, 0.3)\n\n // Pin 1 indicator triangle\n const pin1Position = getCcwSot457Coords({ pitch, width, pinNumber: 1 })\n const triangleHeight = params.wave ? 1 : 0.5\n const triangleWidth = params.wave ? 0.7 : 0.3\n pin1Position.x -= params.wave ? padWidth : padWidth * 1.7\n\n const pin1Indicator: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"pin1_indicator\",\n route: [\n { x: pin1Position.x + triangleHeight / 2, y: pin1Position.y },\n {\n x: pin1Position.x - triangleHeight / 2,\n y: pin1Position.y + triangleWidth / 2,\n },\n {\n x: pin1Position.x - triangleHeight / 2,\n y: pin1Position.y - triangleWidth / 2,\n },\n { x: pin1Position.x + triangleHeight / 2, y: pin1Position.y },\n ],\n stroke_width: 0.05,\n }\n\n return [\n silkscreenRefText,\n silkscreenPath1,\n silkscreenPath2,\n pin1Indicator,\n ...pads,\n ]\n}\n\n// Main SOT-457 function\nexport const sot457 = (\n rawParams: z.input<typeof sot457DefSchema>,\n): {\n circuitJson: AnyCircuitElement[]\n parameters: Sot457Params | Sot457WaveParams\n} => {\n if (rawParams.wave) {\n const parameters = sot457WaveSchema.parse({ ...rawParams, fn: \"sot457\" })\n return {\n circuitJson: generateSot457Elements(parameters),\n parameters,\n }\n }\n\n const parameters = sot457DefSchema.parse(rawParams)\n return {\n circuitJson: generateSot457Elements(parameters),\n parameters,\n }\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sot963_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(6).default(6),\n w: z.string().default(\"1.1mm\"),\n h: z.string().default(\"1.45mm\"),\n p: z.string().default(\"0.35mm\"),\n pl: z.string().default(\"0.2mm\"),\n pw: z.string().default(\"0.2mm\"),\n string: z.string().optional(),\n})\n\nexport const sot963 = (\n raw_params: z.input<typeof sot963_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = sot963_def.parse({ ...raw_params, fn: \"sot963\" })\n\n const w = length.parse(parameters.w)\n const h = length.parse(parameters.h)\n const p = length.parse(parameters.p)\n const pl = length.parse(parameters.pl)\n const pw = length.parse(parameters.pw)\n\n const pads: AnyCircuitElement[] = []\n for (let i = 0; i < 6; i++) {\n const { x, y } = getSot963PadCoord(i + 1, w, p, pl)\n pads.push(rectpad(i + 1, x, y, pl, pw))\n }\n\n const silkscreenTopLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -w / 2, y: h / 2 },\n { x: w / 2, y: h / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenBottomLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -w / 2, y: -h / 2 },\n { x: w / 2, y: -h / 2 },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"\",\n }\n\n const pin1Position = getSot963PadCoord(1, w, p, pl)\n const pin1Marking: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"pin_marker_1\",\n route: [\n { x: pin1Position.x - pl / 2 - 0.3, y: pin1Position.y },\n { x: pin1Position.x - pl / 2 - 0.45, y: pin1Position.y + 0.15 },\n { x: pin1Position.x - pl / 2 - 0.45, y: pin1Position.y - 0.15 },\n { x: pin1Position.x - pl / 2 - 0.3, y: pin1Position.y },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"pin_marker_1\",\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, h / 2 + 0.4, 0.25)\n\n return {\n circuitJson: [\n ...pads,\n silkscreenTopLine,\n silkscreenBottomLine,\n silkscreenRefText,\n pin1Marking,\n ],\n parameters,\n }\n}\n\nexport const getSot963PadCoord = (\n pn: number,\n w: number,\n p: number,\n pl: number,\n) => {\n const padCenterOffset = w / 2 - pl / 2\n if (pn <= 3) {\n return { x: -padCenterOffset, y: p - (pn - 1) * p }\n }\n return { x: padCenterOffset, y: -p + (pn - 4) * p }\n}\n","import { string, z } from \"zod\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const potentiometer_def = base_def.extend({\n fn: z.string(),\n num_pins: z.union([z.literal(3), z.literal(2)]).default(3),\n p: z.string().default(\"3.8mm\"),\n id: z.string().default(\"1.25mm\"),\n od: z.string().default(\"2.35mm\"),\n ca: z\n .string()\n .default(\"14mm\")\n .describe(\n \"Caliper axis (width or diameter of the potentiometer body or adjustment knob)\",\n ),\n w: z.string().default(\"5.35mm\"),\n h: z.string().default(\"4mm\"),\n string: z.string().optional(),\n})\n\nexport const potentiometer_acp = (\n parameters: z.infer<typeof potentiometer_def>,\n) => {\n const { p, id, od, h, ca } = parameters\n const y = Number.parseFloat(h)\n const caliper = Number.parseFloat(ca)\n return [\n platedhole(1, 0, caliper / 4 + 0.3, id, od),\n platedhole(2, y, 0, id, od),\n platedhole(3, 0, -caliper / 4 - 0.3, id, od),\n ]\n}\nexport const potentiometer = (\n raw_params: z.input<typeof potentiometer_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const match = raw_params.string?.match(/^potentiometer_(\\d+)/)\n const numPins = match ? Number.parseInt(match[1]!, 10) : 3\n const parameters = potentiometer_def.parse({\n ...raw_params,\n num_pins: numPins,\n })\n\n let platedHoles: AnyCircuitElement[] = []\n\n if (parameters.num_pins === 3) {\n platedHoles = potentiometer_acp(parameters)\n }\n\n const y = Number.parseFloat(parameters.ca) / 2 + 0.15\n const x = Number.parseFloat(parameters.w)\n const od = Number.parseFloat(parameters.od) / 2 + 0.35\n const silkscreenBody: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: 0, y: y - 1.75 },\n { x: 0, y: y },\n { x: x, y: y },\n { x: x, y: od },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n const silkscreenBody2: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: x, y: -od },\n { x: x, y: -y },\n { x: 0, y: -y },\n { x: 0, y: -y + 1.75 },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n const W = Number.parseFloat(parameters.w) / 2\n const silkscreenRefText: SilkscreenRef = silkscreenRef(W, y + 1, 0.5)\n\n return {\n circuitJson: [\n ...platedHoles,\n silkscreenBody,\n silkscreenBody2,\n silkscreenRefText as AnyCircuitElement,\n ],\n parameters,\n }\n}\n","import {\n length,\n type AnySoupElement,\n type PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { z } from \"zod\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nconst electrolytic_def = base_def.extend({\n fn: z.string(),\n p: length.optional().default(\"7.5mm\"),\n id: length.optional().default(\"1mm\"),\n od: length.optional().default(\"2mm\"),\n d: length.optional().default(\"10.5mm\"),\n})\n\nexport default electrolytic_def\nexport type ElectrolyticDef = z.input<typeof electrolytic_def>\n\nconst generate_circle_arcs = (\n centerX: number,\n centerY: number,\n radius: number,\n cut: number,\n cutHeight: number,\n): {\n topArc: { x: number; y: number }[]\n bottomArc: { x: number; y: number }[]\n} => {\n const topArc: { x: number; y: number }[] = []\n const bottomArc: { x: number; y: number }[] = []\n\n for (let i = 0; i <= 50; i++) {\n const theta = (i / 50) * Math.PI\n const x = centerX + Math.cos(theta) * radius\n const y = centerY + Math.sin(theta) * radius\n\n if (\n x < centerX - cut &&\n y >= centerY - cutHeight / 2 &&\n y <= centerY + cutHeight / 2\n ) {\n continue\n }\n topArc.push({ x, y })\n }\n\n for (let i = 0; i <= 50; i++) {\n const theta = Math.PI + (i / 50) * Math.PI\n const x = centerX + Math.cos(theta) * radius\n const y = centerY + Math.sin(theta) * radius\n\n if (\n x < centerX - cut &&\n y >= centerY - cutHeight / 2 &&\n y <= centerY + cutHeight / 2\n ) {\n continue\n }\n bottomArc.push({ x, y })\n }\n\n return { topArc, bottomArc }\n}\n\nexport const electrolytic = (\n raw_params: ElectrolyticDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = electrolytic_def.parse(raw_params)\n\n const { p, id, od, d } = 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 { topArc, bottomArc } = generate_circle_arcs(\n 0,\n 0,\n d / 2 + 0.1,\n od / 2,\n od,\n )\n\n const silkscreenBody2: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: topArc,\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenBody3: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: bottomArc,\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenBody: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: 0, y: d / 2 + 0.1 },\n { x: 0, y: -(d / 2 + 0.1) },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n const X = -(d / 2 + 0.5)\n const plusY = od / 2 + 1.5\n const Size = 0.5\n\n const silkscreenpath: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: X - Size, y: plusY },\n { x: X + Size, y: plusY },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenline: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: X, y: plusY - Size },\n { x: X, y: plusY + Size },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, d / 2 + 1, 0.5)\n\n return {\n circuitJson: [\n ...plated_holes,\n silkscreenBody2,\n silkscreenBody3,\n silkscreenBody,\n silkscreenpath,\n silkscreenline,\n silkscreenRefText as AnySoupElement,\n ],\n parameters,\n }\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const smbf_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"6.5mm\"),\n h: z.string().default(\"3mm\"),\n pl: z.string().default(\"1.75mm\"),\n pw: z.string().default(\"2.40mm\"),\n p: z.string().default(\"4.75mm\"),\n})\n\nexport const smbf = (\n raw_params: z.input<typeof smbf_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = smbf_def.parse(raw_params)\n\n // Define silkscreen reference text\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) - 0.5,\n 0.3,\n )\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n {\n x: length.parse(parameters.p) / 2,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.3,\n y: length.parse(parameters.h) / 2,\n },\n {\n x: -length.parse(parameters.w) / 2 - 0.3,\n y: -length.parse(parameters.h) / 2,\n },\n {\n x: length.parse(parameters.p) / 2,\n y: -length.parse(parameters.h) / 2,\n },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return {\n circuitJson: smbfWithoutParsing(parameters).concat(\n silkscreenLine as AnySoupElement,\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\n// Get coordinates for smbf pads\nexport const getSmbfCoords = (parameters: {\n pn: number\n p: number\n}) => {\n const { pn, p } = parameters\n\n if (pn === 1) {\n return { x: -p / 2, y: 0 }\n }\n return { x: p / 2, y: 0 }\n}\n\n// Function to generate smbf pads\nexport const smbfWithoutParsing = (parameters: z.infer<typeof smbf_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSmbfCoords({\n pn: i,\n p: Number.parseFloat(parameters.p),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sot323_def = base_def.extend({\n fn: z.string(),\n num_pins: z.number().default(3),\n w: z.string().default(\"2.45mm\"),\n h: z.string().default(\"2.40mm\"),\n pl: z.string().default(\"1.225mm\"),\n pw: z.string().default(\"0.5mm\"),\n p: z.string().default(\"0.95mm\"),\n string: z.string().optional(),\n})\n\nexport const sot323 = (\n raw_params: z.input<typeof sot323_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const match = raw_params.string?.match(/^sot323_(\\d+)/)\n const numPins = match ? Number.parseInt(match[1]!, 3) : 3\n\n const parameters = sot323_def.parse({\n ...raw_params,\n num_pins: numPins,\n })\n\n if (parameters.num_pins === 3) {\n return {\n circuitJson: sot323_3(parameters),\n parameters: parameters,\n }\n }\n\n throw new Error(\"Invalid number of pins\")\n}\n\nexport const getCcwSot323Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n p: number\n}) => {\n const { pn, w, h, pl, p } = parameters\n\n if (pn === 1) {\n return { x: -p, y: 0.65 }\n }\n if (pn === 2) {\n return { x: -p, y: -0.65 }\n }\n\n return { x: p, y: 0 }\n}\n\nexport const sot323_3 = (parameters: z.infer<typeof sot323_def>) => {\n const pads: AnyCircuitElement[] = []\n\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSot323Coords({\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 p: Number.parseFloat(parameters.p),\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\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n Number.parseInt(parameters.h) / 2 + 1,\n 0.3,\n )\n\n const width =\n Number.parseFloat(parameters.w) / 2 - Number.parseFloat(parameters.pl)\n const height = Number.parseFloat(parameters.h) / 2\n const silkscreenPath1: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -width, y: height + 0.3 },\n { x: width, y: height + 0.3 },\n { x: width, y: height / 2 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n const silkscreenPath2: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_2\",\n route: [\n { x: -width, y: -height - 0.3 },\n { x: width, y: -height - 0.3 },\n { x: width, y: -height / 2 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n\n return [\n ...pads,\n silkscreenPath1,\n silkscreenPath2,\n silkscreenRefText as AnyCircuitElement,\n ]\n}\n","import { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { circlepad } from \"../helpers/circlepad\"\nimport { pillpad } from \"../helpers/pillpad\"\nimport { silkscreenRef } from \"../helpers/silkscreenRef\"\nimport type { AnyCircuitElement } from \"circuit-json\"\nimport { mm } from \"@tscircuit/mm\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const smtpad_def = base_def\n .extend({\n fn: z.string(),\n circle: z.boolean().optional(),\n rect: z.boolean().optional(),\n square: z.boolean().optional(),\n pill: z.boolean().optional(),\n d: length.optional(),\n pd: length.optional(),\n diameter: length.optional(),\n r: length.optional(),\n pr: length.optional(),\n radius: length.optional(),\n w: length.optional(),\n pw: length.optional(),\n width: length.optional(),\n h: length.optional(),\n ph: length.optional(),\n height: length.optional(),\n s: length.optional(),\n size: length.optional(),\n string: z.string().optional(),\n })\n .transform((v) => {\n let shape: \"circle\" | \"rect\" | \"square\" | \"pill\" = \"rect\"\n if (v.circle) shape = \"circle\"\n if (v.square) shape = \"square\"\n if (v.rect) shape = \"rect\"\n if (v.pill) shape = \"pill\"\n\n let radius: number | undefined\n let width: number | undefined\n let height: number | undefined\n\n if (shape === \"circle\") {\n if (v.r !== undefined) radius = mm(v.r)\n else if (v.pr !== undefined) radius = mm(v.pr)\n else if (v.radius !== undefined) radius = mm(v.radius)\n else if (v.d !== undefined) radius = mm(v.d) / 2\n else if (v.pd !== undefined) radius = mm(v.pd) / 2\n else if (v.diameter !== undefined) radius = mm(v.diameter) / 2\n else radius = mm(\"1mm\") / 2\n } else {\n // For rect, square, and pill shapes\n if (v.w !== undefined) width = mm(v.w)\n else if (v.pw !== undefined) width = mm(v.pw)\n else if (v.width !== undefined) width = mm(v.width)\n else if (v.s !== undefined) width = mm(v.s)\n else if (v.size !== undefined) width = mm(v.size)\n else width = mm(\"1mm\")\n\n if (v.h !== undefined) height = mm(v.h)\n else if (v.ph !== undefined) height = mm(v.ph)\n else if (v.height !== undefined) height = mm(v.height)\n else if (shape === \"square\") height = width\n else if (shape === \"rect\")\n height = width // rect defaults to square when only width specified\n else height = mm(\"1mm\") // pill default\n }\n\n return {\n fn: v.fn,\n shape,\n radius,\n width,\n height,\n }\n })\n\nexport type SmtPadDef = z.input<typeof smtpad_def>\n\nexport const smtpad = (\n raw_params: SmtPadDef,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const params = smtpad_def.parse(raw_params)\n const { shape, radius, width, height } = params\n\n let pad: AnyCircuitElement\n let silkscreenOffset: number\n\n if (shape === \"circle\") {\n pad = circlepad(1, { x: 0, y: 0, radius: radius! }) as AnyCircuitElement\n silkscreenOffset = radius! + 0.5\n } else if (shape === \"pill\") {\n pad = pillpad(1, 0, 0, width!, height!) as AnyCircuitElement\n silkscreenOffset = Math.max(width!, height!) / 2 + 0.5\n } else {\n // rect or square\n pad = rectpad(1, 0, 0, width!, height!) as AnyCircuitElement\n silkscreenOffset = height! / 2 + 0.5\n }\n\n return {\n circuitJson: [\n pad,\n silkscreenRef(0, silkscreenOffset, 0.2) as AnyCircuitElement,\n ],\n parameters: params,\n }\n}\n","import { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport type { AnyCircuitElement } from \"circuit-json\"\nimport { platedhole as makePlatedHole } from \"../helpers/platedhole\"\nimport { platedHoleWithRectPad } from \"../helpers/platedHoleWithRectPad\"\nimport { silkscreenRef } from \"../helpers/silkscreenRef\"\nimport { mm } from \"@tscircuit/mm\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const platedhole_def = base_def\n .extend({\n fn: z.string(),\n d: length.optional(),\n hd: length.optional(),\n r: length.optional(),\n hr: length.optional(),\n pd: length.optional(),\n pr: length.optional(),\n squarepad: z.boolean().optional().default(false),\n })\n .transform((v) => {\n let holeD: number | undefined\n if (v.d !== undefined) holeD = mm(v.d)\n else if (v.hd !== undefined) holeD = mm(v.hd)\n else if (v.r !== undefined) holeD = mm(v.r) * 2\n else if (v.hr !== undefined) holeD = mm(v.hr) * 2\n else holeD = mm(\"1mm\")\n\n let padD: number | undefined\n if (v.pd !== undefined) padD = mm(v.pd)\n else if (v.pr !== undefined) padD = mm(v.pr) * 2\n else padD = holeD * (1.5 / 1.0)\n\n return {\n fn: v.fn,\n d: holeD,\n pd: padD,\n squarepad: v.squarepad ?? false,\n }\n })\n\nexport type PlatedholeDef = z.input<typeof platedhole_def>\n\nexport const platedhole = (\n raw_params: PlatedholeDef,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const params = platedhole_def.parse(raw_params)\n const { d, pd, squarepad } = params\n\n return {\n circuitJson: [\n squarepad\n ? (platedHoleWithRectPad(1, 0, 0, d, pd, pd) as AnyCircuitElement)\n : (makePlatedHole(1, 0, 0, d, pd) as AnyCircuitElement),\n silkscreenRef(0, pd / 2 + 0.5, 0.2) as AnyCircuitElement,\n ],\n parameters: params,\n }\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sot_def = base_def.extend({\n fn: z.string(),\n num_pins: z.literal(6).default(6),\n h: z.string().default(\"1.6mm\"),\n pl: z.string().default(\"1mm\"),\n pw: z.string().default(\"0.7mm\"),\n p: z.string().default(\"0.95mm\"),\n})\n\nexport const sot = (\n raw_params: z.input<typeof sot_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = sot_def.parse(raw_params)\n return {\n circuitJson: sotWithoutParsing(parameters),\n parameters: parameters,\n }\n}\n\nexport const getCcwSotCoords = (parameters: {\n h: number\n p: number\n pn: number\n}) => {\n const { p, h, pn } = parameters\n if (pn === 1) {\n return { x: -h / 2 - 0.5, y: p }\n }\n if (pn === 2) {\n return { x: -h / 2 - 0.5, y: 0 }\n }\n if (pn === 3) {\n return { x: -h / 2 - 0.5, y: -p }\n }\n if (pn === 4) {\n return { x: h / 2 + 0.5, y: -p }\n }\n if (pn === 5) {\n return { x: h / 2 + 0.5, y: 0 }\n }\n if (pn === 6) {\n return { x: h / 2 + 0.5, y: p }\n }\n throw new Error(\"Invalid pin number\")\n}\n\nexport const sotWithoutParsing = (parameters: z.infer<typeof sot_def>) => {\n const pads: AnyCircuitElement[] = []\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getCcwSotCoords({\n h: Number.parseFloat(parameters.h),\n p: Number.parseFloat(parameters.p),\n pn: i,\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n\n const width = (parameters.num_pins / 2) * Number.parseFloat(parameters.p)\n const height = Number.parseFloat(parameters.h)\n const silkscreenPath1: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -width / 3, y: height / 2 + Number.parseFloat(parameters.p) / 1.3 },\n { x: width / 3, y: height / 2 + Number.parseFloat(parameters.p) / 1.3 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.05,\n }\n const silkscreenPath2: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_2\",\n route: [\n { x: -width / 3, y: -height / 2 - Number.parseFloat(parameters.p) / 1.3 },\n { x: width / 3, y: -height / 2 - Number.parseFloat(parameters.p) / 1.3 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.05,\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, height + 0.3, 0.3)\n const pin1Position = getCcwSotCoords({\n h: Number.parseFloat(parameters.h),\n p: Number.parseFloat(parameters.p),\n pn: 1,\n })\n pin1Position.x = pin1Position.x - Number.parseFloat(parameters.pw) * 1.5\n const triangleHeight = 0.7\n const triangleWidth = 0.3\n const pin1Indicator: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"pin1_indicator\",\n route: [\n {\n x: pin1Position.x + triangleHeight / 2,\n y: pin1Position.y,\n },\n {\n x: pin1Position.x - triangleHeight / 2,\n y: pin1Position.y + triangleWidth / 2,\n },\n {\n x: pin1Position.x - triangleHeight / 2,\n y: pin1Position.y - triangleWidth / 2,\n },\n {\n x: pin1Position.x + triangleHeight / 2,\n y: pin1Position.y,\n },\n ],\n stroke_width: 0.05,\n }\n\n return [\n ...pads,\n silkscreenRefText,\n silkscreenPath1,\n silkscreenPath2,\n pin1Indicator as AnyCircuitElement,\n ]\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const sot343_def = base_def.extend({\n fn: z.string(),\n num_pins: z.number().default(4),\n w: z.string().default(\"3.2mm\"),\n h: z.string().default(\"2.6mm\"),\n pl: z.string().default(\"1.35mm\"),\n pw: z.string().default(\"0.50mm\"),\n p: z.string().default(\"0.6mm\"),\n string: z.string().optional(),\n})\n\nexport const sot343 = (\n raw_params: z.input<typeof sot343_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const match = raw_params.string?.match(/^sot343_(\\d+)/)\n const numPins = match ? Number.parseInt(match[1]!, 4) : 4\n\n const parameters = sot343_def.parse({\n ...raw_params,\n num_pins: numPins,\n })\n\n if (parameters.num_pins === 4) {\n return {\n circuitJson: sot343_4(parameters),\n parameters: parameters,\n }\n }\n\n throw new Error(\"Invalid number of pins\")\n}\n\nexport const getCcwSot343Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n p: number\n}) => {\n const { pn, p } = parameters\n if (pn === 1) return { x: -p * 1.92, y: -0.65 }\n if (pn === 2) return { x: -p * 1.92, y: 0.65 }\n if (pn === 3) return { x: p, y: 0.65 }\n if (pn === 4) return { x: p, y: -0.65 }\n return { x: 0, y: 0 }\n}\n\nexport const sot343_4 = (parameters: z.infer<typeof sot343_def>) => {\n const pads: AnyCircuitElement[] = []\n\n const w = Number.parseFloat(parameters.w)\n const h = Number.parseFloat(parameters.h)\n const pl = Number.parseFloat(parameters.pl)\n const pw = Number.parseFloat(parameters.pw)\n const p = Number.parseFloat(parameters.p)\n\n let minX = Infinity\n let maxX = -Infinity\n let minY = Infinity\n let maxY = -Infinity\n\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSot343Coords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w,\n h,\n pl,\n p,\n })\n pads.push(rectpad(i + 1, x, y, pl, pw))\n\n if (x < minX) minX = x\n if (x > maxX) maxX = x\n if (y < minY) minY = y\n if (y > maxY) maxY = y\n }\n\n const silkscreenXOffset = (minX + maxX) / 2\n const padVerticalDistance = maxY - minY\n const silkscreenMargin = h * 0.3\n const offsetY = padVerticalDistance / 2 + silkscreenMargin\n\n let silkscreenLineLength = w * 0.8\n if (h <= 2.6) {\n silkscreenLineLength /= 2\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n silkscreenXOffset,\n offsetY + 0.5,\n 0.3,\n )\n\n const silkscreenPathTop: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_top\",\n route: [\n { x: silkscreenXOffset - silkscreenLineLength / 2, y: offsetY },\n { x: silkscreenXOffset + silkscreenLineLength / 2, y: offsetY },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n\n const silkscreenPathBottom: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_bottom\",\n route: [\n { x: silkscreenXOffset - silkscreenLineLength / 2, y: -offsetY },\n { x: silkscreenXOffset + silkscreenLineLength / 2, y: -offsetY },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n\n return [\n ...pads,\n silkscreenPathTop,\n silkscreenPathBottom,\n silkscreenRefText as AnyCircuitElement,\n ]\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nimport { z } from \"zod\"\nimport { base_def } from \"../helpers/zod/base_def\"\n\nexport const m2host_def = base_def.extend({\n fn: z.string(),\n})\n\nexport const m2host = (\n raw_params: z.input<typeof m2host_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = m2host_def.parse(raw_params)\n\n const pads: AnyCircuitElement[] = []\n const padWidth = 0.5 - 0.15\n const padLength = 1.5\n const pitch = 0.5\n const halfPitch = pitch / 2\n const rowOffset = 0.5\n const numPads = 75\n\n const startY = -((numPads - 1) * pitch) / 2\n\n for (let i = 0; i < numPads; i++) {\n const pn = i + 1\n if (pn >= 24 && pn <= 31) continue\n const y = startY - i * halfPitch\n\n const isBottomLayer = pn % 2 === 0\n const padLengthWithOffset = padLength + (isBottomLayer ? 0.25 : 0)\n const rightEdgeOffset = 0.5\n const x = rightEdgeOffset - padLengthWithOffset / 2\n const pad = rectpad(pn, x, y, padLengthWithOffset, padWidth)\n pad.layer = isBottomLayer ? \"bottom\" : \"top\"\n pads.push(pad)\n }\n\n const cutoutWidth = 46 * 0.0254\n const cutoutDepth = 137 * 0.0254\n const cutoutOffsetFromPin1 = 261 * 0.0254\n const cutout = {\n type: \"pcb_cutout\",\n pcb_cutout_id: \"\",\n shape: \"rect\" as const,\n center: {\n x: -cutoutDepth / 2 + padLength / 2,\n y: startY - cutoutOffsetFromPin1,\n },\n width: cutoutDepth,\n height: cutoutWidth,\n }\n\n const pin1MarkerPosition = {\n x: -0.5,\n y: startY,\n }\n\n const pin1Marker: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"pin_marker_1\",\n route: [\n { x: pin1MarkerPosition.x - 0.4, y: pin1MarkerPosition.y },\n { x: pin1MarkerPosition.x - 0.7, y: pin1MarkerPosition.y + 0.3 },\n { x: pin1MarkerPosition.x - 0.7, y: pin1MarkerPosition.y - 0.3 },\n { x: pin1MarkerPosition.x - 0.4, y: pin1MarkerPosition.y },\n ],\n stroke_width: 0.05,\n pcb_silkscreen_path_id: \"pin_marker_1\",\n }\n\n // const silkscreenRefText: SilkscreenRef = silkscreenRef(0, padLength, 0.5)\n\n // --- center footprint around (0,0) ---\n let minX = Infinity\n let maxX = -Infinity\n let minY = Infinity\n let maxY = -Infinity\n\n const updateBounds = (x: number, y: number, w = 0, h = 0) => {\n minX = Math.min(minX, x - w / 2)\n maxX = Math.max(maxX, x + w / 2)\n minY = Math.min(minY, y - h / 2)\n maxY = Math.max(maxY, y + h / 2)\n }\n\n for (const pad of pads) {\n updateBounds(pad.x, pad.y, pad.width, pad.height)\n }\n updateBounds(cutout.center.x, cutout.center.y, cutout.width, cutout.height)\n for (const point of pin1Marker.route) {\n updateBounds(point.x, point.y)\n }\n\n const centerX = (minX + maxX) / 2\n const centerY = (minY + maxY) / 2\n\n const translate = (el: any) => {\n if (typeof el.x === \"number\") el.x -= centerX\n if (typeof el.y === \"number\") el.y -= centerY\n if (el.center) {\n el.center.x -= centerX\n el.center.y -= centerY\n }\n if (Array.isArray(el.route)) {\n el.route = el.route.map((p: { x: number; y: number }) => ({\n x: p.x - centerX,\n y: p.y - centerY,\n }))\n }\n }\n\n for (const pad of pads) translate(pad)\n translate(cutout)\n translate(pin1Marker)\n\n return {\n circuitJson: [\n ...pads,\n cutout,\n // silkscreenRefText,\n pin1Marker,\n ],\n parameters,\n }\n}\n","import { z } from \"zod\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { platedHoleWithRectPad } from \"src/helpers/platedHoleWithRectPad\"\nimport { platedHolePill } from \"src/helpers/platedHolePill\"\nimport type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { base_def } from \"src/helpers/zod/base_def\"\n\nexport const to92l_def = base_def.extend({\n fn: z.string(),\n num_pins: z.number().default(3),\n inline: z.boolean().default(false),\n p: z.string().default(\"1.27mm\"),\n id: z.string().default(\"0.75mm\"),\n od: z.string().default(\"1.3mm\"),\n w: z.string().default(\"4.8mm\"),\n h: z.string().default(\"4.0mm\"),\n})\n\nexport const to92l = (\n raw_params: z.input<typeof to92l_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = to92l_def.parse(raw_params)\n\n const p = Number.parseFloat(parameters.p)\n const w = Number.parseFloat(parameters.w)\n const h = Number.parseFloat(parameters.h)\n\n const od = parameters.inline ? 1.05 : Number.parseFloat(parameters.od)\n const padH = parameters.inline ? 1.5 : od\n\n const holes = [\n platedHoleWithRectPad(1, 0, 0, parameters.id, od, padH, 0, 0),\n parameters.inline\n ? platedHolePill(2, p, 0, parameters.id, od, padH)\n : platedhole(2, p, p, parameters.id, od),\n parameters.inline\n ? platedHolePill(3, p * 2, 0, parameters.id, od, padH)\n : platedhole(3, p * 2, 0, parameters.id, od),\n ]\n\n const radius = w / 2\n const cx = parameters.inline ? p - 0.09 : p\n const cy = 0.2\n const y_bottom = cy + radius - h\n\n const semicircle = Array.from({ length: 32 }, (_, i) => {\n const angle = (Math.PI * i) / 31\n return {\n x: cx + radius * Math.cos(angle),\n y: cy + radius * Math.sin(angle),\n }\n })\n\n const silkBody: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"\",\n stroke_width: 0.12,\n route: [\n ...semicircle,\n { x: cx - radius, y: y_bottom },\n { x: cx + radius, y: y_bottom },\n semicircle[0],\n ],\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n cx,\n cy + radius + 1,\n 0.5,\n )\n\n return {\n circuitJson: [...holes, silkBody, silkscreenRefText as AnyCircuitElement],\n parameters,\n }\n}\n","export function isNotNull<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined\n}\n","export type OriginMode =\n | \"center\"\n | \"bottomleft\"\n | \"pin1\"\n | \"bottomcenter\"\n | \"centerbottom\"\n | \"topcenter\"\n | \"centertop\"\n | \"leftcenter\"\n | \"centerleft\"\n | \"rightcenter\"\n | \"centerright\"\n\nimport type { AnySoupElement } from \"circuit-json\"\n\nexport const applyOrigin = (\n elements: AnySoupElement[],\n origin: OriginMode | undefined,\n): AnySoupElement[] => {\n if (!origin) return elements\n\n const pads = elements.filter(\n (el) =>\n el.type === \"pcb_smtpad\" ||\n el.type === \"pcb_plated_hole\" ||\n el.type === \"pcb_thtpad\",\n ) as Array<any>\n\n if (pads.length === 0) return elements\n\n let minX = Infinity\n let maxX = -Infinity\n let minY = Infinity\n let maxY = -Infinity\n\n const updateBounds = (x: number, y: number, w = 0, h = 0) => {\n const left = x - w / 2\n const right = x + w / 2\n const bottom = y - h / 2\n const top = y + h / 2\n minX = Math.min(minX, left)\n maxX = Math.max(maxX, right)\n minY = Math.min(minY, bottom)\n maxY = Math.max(maxY, top)\n }\n\n for (const pad of pads) {\n if (pad.type === \"pcb_smtpad\") {\n const w = pad.shape === \"circle\" ? pad.radius * 2 : pad.width\n const h = pad.shape === \"circle\" ? pad.radius * 2 : pad.height\n updateBounds(pad.x, pad.y, w, h)\n } else if (pad.type === \"pcb_plated_hole\") {\n const d = pad.outer_diameter ?? pad.hole_diameter\n updateBounds(pad.x, pad.y, d, d)\n } else if (pad.type === \"pcb_thtpad\") {\n const d = pad.diameter\n updateBounds(pad.x, pad.y, d, d)\n }\n }\n\n let dx = 0\n let dy = 0\n switch (origin) {\n case \"center\":\n dx = (minX + maxX) / 2\n dy = (minY + maxY) / 2\n break\n case \"bottomleft\":\n dx = minX\n dy = minY\n break\n case \"bottomcenter\":\n case \"centerbottom\":\n dx = (minX + maxX) / 2\n dy = minY\n break\n case \"topcenter\":\n case \"centertop\":\n dx = (minX + maxX) / 2\n dy = maxY\n break\n case \"leftcenter\":\n case \"centerleft\":\n dx = minX\n dy = (minY + maxY) / 2\n break\n case \"rightcenter\":\n case \"centerright\":\n dx = maxX\n dy = (minY + maxY) / 2\n break\n case \"pin1\":\n const pin1 = pads.find((p) => p.port_hints?.[0] === \"1\") || pads[0]\n dx = pin1.x\n dy = pin1.y\n break\n }\n\n if (dx === 0 && dy === 0) return elements\n\n for (const el of elements as Array<any>) {\n if (typeof el.x === \"number\") el.x -= dx\n if (typeof el.y === \"number\") el.y -= dy\n\n if (el.center && typeof el.center.x === \"number\") {\n el.center.x -= dx\n el.center.y -= dy\n }\n\n if (el.type === \"pcb_silkscreen_path\") {\n for (const pt of el.route) {\n pt.x -= dx\n pt.y -= dy\n }\n }\n\n if (el.type === \"pcb_silkscreen_text\" && el.anchor_position) {\n el.anchor_position.x -= dx\n el.anchor_position.y -= dy\n }\n }\n\n return elements\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\n\nexport const applyNoRefDes = (\n elements: AnyCircuitElement[],\n parameters: any,\n): AnyCircuitElement[] => {\n const refs = elements.filter(\n (el) => el.type === \"pcb_silkscreen_text\",\n ) as Array<any>\n\n if (refs.length === 0) return elements\n\n for (const ref of refs) {\n if (parameters.norefdes) {\n ref.text = \"\"\n }\n }\n\n return elements\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\n\nexport const applyNoSilkscreen = (\n elements: AnyCircuitElement[],\n parameters: any,\n): AnyCircuitElement[] => {\n if (!parameters.nosilkscreen) return elements\n\n return elements.filter((element) => {\n return (\n element.type !== \"pcb_silkscreen_path\" &&\n element.type !== \"pcb_silkscreen_text\"\n )\n })\n}\n","import * as FOOTPRINT_FN from \"./fn\"\nimport type { AnySoupElement } from \"circuit-json\"\nimport type { AnyCircuitElement } from \"circuit-json\"\nimport type { AnyFootprinterDefinitionOutput } from \"./helpers/zod/AnyFootprinterDefinitionOutput\"\nimport { isNotNull } from \"./helpers/is-not-null\"\nimport { footprintSizes } from \"./helpers/passive-fn\"\nimport { applyOrigin } from \"./helpers/apply-origin\"\nimport { applyNoRefDes } from \"./helpers/apply-norefdes\"\nimport { applyNoSilkscreen } from \"./helpers/apply-nosilkscreen\"\n\ntype BaseOptionKey =\n | \"origin\"\n | \"norefdes\"\n | \"invert\"\n | \"faceup\"\n | \"nosilkscreen\"\n\nexport type FootprinterParamsBuilder<K extends string> = {\n [P in K | BaseOptionKey | \"params\" | \"soup\" | \"circuitJson\"]: P extends\n | \"params\"\n | \"soup\"\n | \"circuitJson\"\n ? Footprinter[P]\n : (v?: number | string | boolean) => FootprinterParamsBuilder<K>\n}\n\ntype CommonPassiveOptionKey =\n | \"metric\"\n | \"imperial\"\n | \"tht\"\n | \"p\"\n | \"pw\"\n | \"ph\"\n | \"w\"\n | \"h\"\n | \"textbottom\"\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\"\n | \"p\"\n | \"w\"\n | \"h\"\n | \"ball\"\n | \"pad\"\n | \"missing\"\n | \"tlorigin\"\n | \"blorigin\"\n | \"trorigin\"\n | \"brorigin\"\n | \"circularpads\"\n >\n qfn: (num_pins?: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\">\n tqfp: (num_pins?: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\">\n soic: (\n num_pins?: number,\n ) => FootprinterParamsBuilder<\n \"w\" | \"p\" | \"pw\" | \"pl\" | \"id\" | \"od\" | \"pillpads\"\n >\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: (\n num_pins?: number,\n ) => FootprinterParamsBuilder<\n | \"p\"\n | \"id\"\n | \"od\"\n | \"male\"\n | \"female\"\n | \"rows\"\n | \"smd\"\n | \"surfacemount\"\n | \"rightangle\"\n | \"pw\"\n | \"pl\"\n | \"pinlabeltextalignleft\"\n | \"pinlabeltextaligncenter\"\n | \"pinlabeltextalignright\"\n | \"pinlabelverticallyinverted\"\n | \"pinlabelorthogonal\"\n | \"nosquareplating\"\n | \"nopinlabels\"\n | \"doublesidedpinlabel\"\n | \"bottomsidepinlabel\"\n >\n axial: () => FootprinterParamsBuilder<\"p\" | \"id\" | \"od\">\n radial: () => FootprinterParamsBuilder<\n \"p\" | \"id\" | \"od\" | \"ceramic\" | \"electrolytic\" | \"polarized\"\n >\n hc49: () => FootprinterParamsBuilder<\"p\" | \"id\" | \"od\" | \"w\" | \"h\">\n to220: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"id\" | \"od\">\n sot363: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sot886: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sot457: () => FootprinterParamsBuilder<\n | \"w\"\n | \"p\"\n | \"h\"\n | \"pl\"\n | \"pw\"\n | \"wave\"\n | \"reflow\"\n | \"pillr\"\n | \"pillh\"\n | \"pillw\"\n >\n sot563: () => FootprinterParamsBuilder<\"w\" | \"p\" | \"pl\" | \"pw\">\n sot723: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"pl\" | \"pw\" | \"p\">\n sot23: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"pl\" | \"pw\">\n sot25: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"pl\" | \"pw\">\n sot: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sot323: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sot89: () => FootprinterParamsBuilder<\"w\" | \"p\" | \"pl\" | \"pw\" | \"h\">\n sot343: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod323w: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n smc: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pw\" | \"pl\">\n minimelf: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pw\" | \"pl\">\n melf: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pw\" | \"pl\">\n jst: () => FootprinterParamsBuilder<\n \"w\" | \"h\" | \"p\" | \"id\" | \"pw\" | \"pl\" | \"ph\" | \"sh\"\n >\n micromelf: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pw\" | \"pl\">\n ms013: () => FootprinterParamsBuilder<\"w\" | \"p\">\n ms012: () => FootprinterParamsBuilder<\"w\" | \"p\">\n lqfp: (num_pins?: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"pl\" | \"pw\">\n sma: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n smf: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n smb: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n smbf: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n potentiometer: () => FootprinterParamsBuilder<\n \"w\" | \"h\" | \"p\" | \"id\" | \"od\" | \"pw\" | \"ca\"\n >\n electrolytic: () => FootprinterParamsBuilder<\"d\" | \"p\" | \"id\" | \"od\">\n sod923: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod323: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod80: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod882: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod882d: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod723: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod523: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod323f: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod323fl: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod128: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod123f: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod123fl: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod123: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod123w: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sod110: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n to92: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"id\" | \"od\" | \"inline\">\n to92s: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"id\" | \"od\">\n to92l: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"id\" | \"od\">\n sot223: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n m2host: () => FootprinterParamsBuilder<never>\n son: (\n num_pins?: number,\n ) => FootprinterParamsBuilder<\n \"w\" | \"h\" | \"p\" | \"pl\" | \"pw\" | \"epw\" | \"eph\" | \"ep\"\n >\n vssop: (\n num_pins?: number,\n ) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n msop: (\n num_pins?: number,\n ) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n sot23w: () => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\" | \"pl\" | \"pw\">\n pushbutton: () => FootprinterParamsBuilder<\n \"tllabel\" | \"trlabel\" | \"bllabel\" | \"brlabel\"\n >\n stampboard: () => FootprinterParamsBuilder<\n | \"w\"\n | \"h\"\n | \"left\"\n | \"right\"\n | \"top\"\n | \"bottom\"\n | \"p\"\n | \"pw\"\n | \"pl\"\n | \"innerhole\"\n | \"innerholeedgedistance\"\n | \"silkscreenlabels\"\n | \"silkscreenlabelmargin\"\n >\n stampreceiver: () => FootprinterParamsBuilder<\n | \"w\"\n | \"h\"\n | \"left\"\n | \"right\"\n | \"top\"\n | \"bottom\"\n | \"p\"\n | \"pw\"\n | \"pl\"\n | \"innerhole\"\n | \"innerholeedgedistance\"\n >\n breakoutheaders: () => FootprinterParamsBuilder<\n \"w\" | \"h\" | \"left\" | \"right\" | \"top\" | \"bottom\" | \"p\" | \"id\" | \"od\"\n >\n smtpad: () => FootprinterParamsBuilder<\n | \"circle\"\n | \"rect\"\n | \"square\"\n | \"pill\"\n | \"d\"\n | \"pd\"\n | \"diameter\"\n | \"r\"\n | \"pr\"\n | \"radius\"\n | \"w\"\n | \"pw\"\n | \"width\"\n | \"h\"\n | \"ph\"\n | \"height\"\n | \"s\"\n | \"size\"\n > & {\n params: () => any\n soup: () => AnySoupElement[]\n circuitJson: () => AnyCircuitElement[]\n }\n platedhole: () => FootprinterParamsBuilder<\n \"d\" | \"hd\" | \"r\" | \"hr\" | \"pd\" | \"pr\"\n >\n pad: () => FootprinterParamsBuilder<\"w\" | \"h\"> & {\n params: () => any\n soup: () => AnySoupElement[]\n circuitJson: () => AnyCircuitElement[]\n }\n solderjumper: (\n num_pins?: number,\n ) => FootprinterParamsBuilder<\"bridged\" | \"p\" | \"pw\" | \"ph\">\n\n params: () => any\n /** @deprecated use circuitJson() instead */\n soup: () => AnySoupElement[]\n circuitJson: () => AnyCircuitElement[]\n json: () => AnyFootprinterDefinitionOutput[]\n getFootprintNames: () => string[]\n}\n\nexport const string = (def: string): Footprinter => {\n let fp = footprinter()\n\n // The regex below automatically inserts a \"res\" prefix so forms like\n // \"0603_pw1.0_ph1.1\" are understood without typing \"res0603\".\n const modifiedDef = def.replace(/^((?:\\d{4}|\\d{5}))(?=$|_)/, \"res$1\")\n\n const def_parts = modifiedDef\n .split(/_(?!metric)/) // split on '_' not followed by 'metric'\n .map((s) => {\n const m = s.match(/([a-zA-Z]+)([\\(\\d\\.\\+\\?].*)?/)\n if (!m) return null\n const [, rawFn, v] = m\n if (!rawFn) return null\n const fn = rawFn.toLowerCase()\n if (v?.includes(\"?\")) return null\n return { fn, v }\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 getFootprintNames = (): string[] => {\n return Object.keys(FOOTPRINT_FN)\n}\n\nexport const getFootprintSizes = (): typeof footprintSizes => {\n return footprintSizes\n}\n\nexport const getFootprintNamesByType = (): {\n passiveFootprintNames: string[]\n normalFootprintNames: string[]\n} => {\n const allFootprintNames = Object.keys(FOOTPRINT_FN)\n\n const passiveFootprintNames = allFootprintNames.filter((name) => {\n const fn = FOOTPRINT_FN[name]\n\n return fn.toString().includes(\"passive(\")\n })\n\n return {\n passiveFootprintNames,\n normalFootprintNames: allFootprintNames.filter(\n (name) => !passiveFootprintNames.includes(name),\n ),\n }\n}\n\nexport const footprinter = (): Footprinter & {\n string: typeof string\n getFootprintNames: string[]\n setString: (string) => void\n} => {\n const proxy = new Proxy(\n {},\n {\n get: (target: any, prop: string) => {\n if (prop === \"soup\" || prop === \"circuitJson\") {\n if (\"fn\" in target && FOOTPRINT_FN[target.fn]) {\n return () => {\n const { circuitJson } = FOOTPRINT_FN[target.fn](target)\n const circuitWithoutSilkscreen = applyNoSilkscreen(\n circuitJson,\n target,\n )\n const circuitWithoutRefDes = applyNoRefDes(\n circuitWithoutSilkscreen,\n target,\n )\n return applyOrigin(circuitWithoutRefDes, target.origin)\n }\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 === \"getFootprintNames\") {\n return () => Object.keys(FOOTPRINT_FN)\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 if (typeof v === \"string\" && v.includes(\"_metric\")) {\n target.metric = v.split(\"_metric\")[0]\n } else {\n target.imperial = v // e.g., res0402, cap0603 etc.\n }\n }\n } else {\n target.num_pins = Number.isNaN(Number.parseFloat(v))\n ? undefined\n : 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\nfootprinter.getFootprintNames = getFootprintNames\n\nexport const fp = footprinter\n"],"mappings":"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","names":["platedhole","z","mm","z","mm","z","z","mm","padSpacing","padWidth","padHeight","padPitch","padSpacing","padWidth","padHeight","padPitch","padSpacing","padWidth","padHeight","padPitch","padSpacing","padWidth","padHeight","padPitch","padSpacing","padWidth","padHeight","padPitch","padSpacing","padWidth","padHeight","padPitch","z","length","distance","z","z","z","distance","length","pad","z","length","z","length","z","length","z","z","length","z","length","z","length","z","z","parameters","z","length","z","length","od","z","length","z","length","length","z","z","pad","length","z","length","z","length","length","z","z","length","length","z","z","length","length","z","z","length","length","z","z","length","length","z","z","length","getHeight","getTriangleDir","length","z","z","length","getHeight","length","z","z","length","length","mm","length","mm","z","mm","z","padSpacing","padWidth","padHeight","z","length","sod_def","z","length","sodWithoutParsing","getSodCoords","z","length","z","length","z","length","sod_def","z","length","sodWithoutParsing","getSodCoords","z","length","sod_def","z","length","sodWithoutParsing","getSodCoords","z","length","sod_def","z","length","sodWithoutParsing","getSodCoords","z","length","sod_def","z","length","sodWithoutParsing","getSodCoords","z","length","sod_def","z","length","sodWithoutParsing","getSodCoords","z","length","sod_def","z","length","sodWithoutParsing","getSodCoords","z","length","z","length","sodWithoutParsing","getSodCoords","z","length","sod_def","z","length","sodWithoutParsing","getSodCoords","z","length","sod_def","z","length","sodWithoutParsing","getSodCoords","z","z","padWidth","length","padHeight","length","z","z","length","string","z","length","z","length","z","length","sod_def","z","length","sodWithoutParsing","getSodCoords","z","length","z","length","z","length","z","length","z","length","z","length","z","length","z","length","z","length","z","length","z","length","z","length","z","z","parameters","z","z","z","z","padSpacing","length","z","z","length","z","length","sod_def","z","length","sodWithoutParsing","getSodCoords","z","length","z","length","z","length","getDefaultValues","z","length","z","length","z","length","sodWithoutParsing","getSodCoords","z","length","z","length","sodWithoutParsing","getSodCoords","z","length","z","length","length","padSpacing","padWidth","padHeight","z","z","padWidth","padHeight","parameters","z","length","z","length","z","z","length","z","z","length","silkscreenpath","z","length","z","length","z","z","z","length","mm","z","length","mm","pad","z","length","mm","z","length","mm","platedhole","z","z","z","z","z","z","padWidth","pad","z","z","pad","string","fp"]}
|