@tscircuit/footprinter 0.0.79 → 0.0.81

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.d.ts CHANGED
@@ -987,7 +987,8 @@ type Footprinter = {
987
987
  pinrow: (num_pins: number) => FootprinterParamsBuilder<"p" | "id" | "od">;
988
988
  axial: () => FootprinterParamsBuilder<"p" | "id" | "od">;
989
989
  pushbutton: () => FootprinterParamsBuilder<"tllabel" | "trlabel" | "bllabel" | "brlabel">;
990
- stampboard: () => FootprinterParamsBuilder<"w" | "left" | "right" | "top" | "bottom" | "p" | "pw" | "pl" | "innerhole">;
990
+ stampboard: () => FootprinterParamsBuilder<"w" | "left" | "right" | "top" | "bottom" | "p" | "pw" | "pl" | "innerhole" | "innerholeedgedistance">;
991
+ stampreceiver: () => FootprinterParamsBuilder<"w" | "left" | "right" | "top" | "bottom" | "p" | "pw" | "pl" | "innerhole" | "innerholeedgedistance">;
991
992
  params: () => any;
992
993
  /** @deprecated use circuitJson() instead */
993
994
  soup: () => AnySoupElement[];
package/dist/index.js CHANGED
@@ -32,6 +32,7 @@ __export(fn_exports, {
32
32
  sot723: () => sot723,
33
33
  ssop: () => ssop,
34
34
  stampboard: () => stampboard,
35
+ stampreceiver: () => stampreceiver,
35
36
  tssop: () => tssop
36
37
  });
37
38
 
@@ -1543,8 +1544,9 @@ var stampboard_def = z16.object({
1543
1544
  bottom: length9.optional(),
1544
1545
  p: length9.default(length9.parse("2.54mm")),
1545
1546
  pw: length9.default(length9.parse("1.6mm")),
1546
- pl: length9.default(length9.parse("3.2mm")),
1547
- innerhole: z16.boolean().default(false)
1547
+ pl: length9.default(length9.parse("2.4mm")),
1548
+ innerhole: z16.boolean().default(false),
1549
+ innerholeedgedistance: length9.default(length9.parse("1.61mm"))
1548
1550
  });
1549
1551
  var getHeight = (parameters) => {
1550
1552
  const params = stampboard_def.parse(parameters);
@@ -1559,46 +1561,124 @@ var getHeight = (parameters) => {
1559
1561
  }
1560
1562
  return 51;
1561
1563
  };
1564
+ var getTriangleDir = (x, y, side) => {
1565
+ let routes = [];
1566
+ const triangleHeight = 1;
1567
+ const triangleWidth = 0.6;
1568
+ if (side === "right") {
1569
+ routes = [
1570
+ {
1571
+ x: x + triangleHeight / 2,
1572
+ y
1573
+ },
1574
+ // Tip of the triangle (pointing right)
1575
+ {
1576
+ x: x - triangleHeight / 2,
1577
+ y: y + triangleWidth / 2
1578
+ },
1579
+ // Bottom corner of the base
1580
+ {
1581
+ x: x - triangleHeight / 2,
1582
+ y: y - triangleWidth / 2
1583
+ },
1584
+ // Top corner of the base
1585
+ {
1586
+ x: x + triangleHeight / 2,
1587
+ y
1588
+ }
1589
+ // Close the path at the tip
1590
+ ];
1591
+ }
1592
+ if (side === "left") {
1593
+ routes = [
1594
+ {
1595
+ x: x - triangleHeight / 2,
1596
+ y
1597
+ },
1598
+ // Tip of the triangle (pointing left)
1599
+ {
1600
+ x: x + triangleHeight / 2,
1601
+ y: y + triangleWidth / 2
1602
+ },
1603
+ // Top corner of the base
1604
+ {
1605
+ x: x + triangleHeight / 2,
1606
+ y: y - triangleWidth / 2
1607
+ },
1608
+ // Bottom corner of the base
1609
+ {
1610
+ x: x - triangleHeight / 2,
1611
+ y
1612
+ }
1613
+ // Close the path at the tip
1614
+ ];
1615
+ }
1616
+ if (side === "top") {
1617
+ routes = [
1618
+ {
1619
+ x,
1620
+ y: y + triangleHeight / 2
1621
+ },
1622
+ // Tip of the triangle (pointing up)
1623
+ {
1624
+ x: x - triangleWidth / 2,
1625
+ y: y - triangleHeight / 2
1626
+ },
1627
+ // Left corner of the base
1628
+ {
1629
+ x: x + triangleWidth / 2,
1630
+ y: y - triangleHeight / 2
1631
+ },
1632
+ // Right corner of the base
1633
+ {
1634
+ x,
1635
+ y: y + triangleHeight / 2
1636
+ }
1637
+ // Close the path at the tip
1638
+ ];
1639
+ }
1640
+ if (side === "bottom") {
1641
+ routes = [
1642
+ {
1643
+ x,
1644
+ y: y - triangleHeight / 2
1645
+ },
1646
+ // Tip of the triangle (pointing down)
1647
+ {
1648
+ x: x - triangleWidth / 2,
1649
+ y: y + triangleHeight / 2
1650
+ },
1651
+ // Left corner of the base
1652
+ {
1653
+ x: x + triangleWidth / 2,
1654
+ y: y + triangleHeight / 2
1655
+ },
1656
+ // Right corner of the base
1657
+ {
1658
+ x,
1659
+ y: y - triangleHeight / 2
1660
+ }
1661
+ // Close the path at the tip
1662
+ ];
1663
+ }
1664
+ return routes;
1665
+ };
1562
1666
  var stampboard = (raw_params) => {
1563
1667
  const params = stampboard_def.parse(raw_params);
1564
1668
  const rectpads = [];
1565
1669
  const holes = [];
1566
- let firstPinLocation = { x: 0, y: 0 };
1567
1670
  let routes = [];
1568
1671
  const innerDiameter = 1;
1569
1672
  const outerDiameter = 1.2;
1570
- const triangleHeight = 1;
1571
- const triangleWidth = 0.6;
1572
1673
  if (params.right) {
1573
1674
  const yoff = -((params.right - 1) / 2) * params.p;
1574
1675
  for (let i = 0; i < params.right; i++) {
1575
1676
  if (i === 0 && !params.left && !params.bottom) {
1576
- firstPinLocation = {
1577
- x: params.w / 2 - params.pl * 1.4,
1578
- y: yoff + i * params.p
1579
- };
1580
- routes = [
1581
- {
1582
- x: firstPinLocation.x + triangleHeight / 2,
1583
- y: firstPinLocation.y
1584
- },
1585
- // Tip of the triangle (pointing right)
1586
- {
1587
- x: firstPinLocation.x - triangleHeight / 2,
1588
- y: firstPinLocation.y + triangleWidth / 2
1589
- },
1590
- // Bottom corner of the base
1591
- {
1592
- x: firstPinLocation.x - triangleHeight / 2,
1593
- y: firstPinLocation.y - triangleWidth / 2
1594
- },
1595
- // Top corner of the base
1596
- {
1597
- x: firstPinLocation.x + triangleHeight / 2,
1598
- y: firstPinLocation.y
1599
- }
1600
- // Close the path at the tip
1601
- ];
1677
+ routes = getTriangleDir(
1678
+ params.w / 2 - params.pl * 1.4,
1679
+ yoff + i * params.p,
1680
+ "right"
1681
+ );
1602
1682
  }
1603
1683
  rectpads.push(
1604
1684
  rectpad(
@@ -1622,7 +1702,7 @@ var stampboard = (raw_params) => {
1622
1702
  holes.push(
1623
1703
  platedhole(
1624
1704
  i + 1,
1625
- params.w / 2 - params.pl + outerDiameter / 2,
1705
+ params.w / 2 - params.innerholeedgedistance,
1626
1706
  yoff + i * params.p,
1627
1707
  innerDiameter,
1628
1708
  outerDiameter
@@ -1635,32 +1715,11 @@ var stampboard = (raw_params) => {
1635
1715
  const yoff = -((params.left - 1) / 2) * params.p;
1636
1716
  for (let i = 0; i < params.left; i++) {
1637
1717
  if (i === params.left - 1) {
1638
- firstPinLocation = {
1639
- x: -params.w / 2 + params.pl * 1.4,
1640
- y: yoff + i * params.p
1641
- };
1642
- routes = [
1643
- {
1644
- x: firstPinLocation.x - triangleHeight / 2,
1645
- y: firstPinLocation.y
1646
- },
1647
- // Tip of the triangle (pointing left)
1648
- {
1649
- x: firstPinLocation.x + triangleHeight / 2,
1650
- y: firstPinLocation.y + triangleWidth / 2
1651
- },
1652
- // Top corner of the base
1653
- {
1654
- x: firstPinLocation.x + triangleHeight / 2,
1655
- y: firstPinLocation.y - triangleWidth / 2
1656
- },
1657
- // Bottom corner of the base
1658
- {
1659
- x: firstPinLocation.x - triangleHeight / 2,
1660
- y: firstPinLocation.y
1661
- }
1662
- // Close the path at the tip
1663
- ];
1718
+ routes = getTriangleDir(
1719
+ -params.w / 2 + params.pl * 1.4,
1720
+ yoff + i * params.p,
1721
+ "left"
1722
+ );
1664
1723
  }
1665
1724
  rectpads.push(
1666
1725
  rectpad(
@@ -1684,7 +1743,7 @@ var stampboard = (raw_params) => {
1684
1743
  holes.push(
1685
1744
  platedhole(
1686
1745
  i + 1,
1687
- -params.w / 2 + params.pl - outerDiameter / 2,
1746
+ -params.w / 2 + params.innerholeedgedistance,
1688
1747
  yoff + i * params.p,
1689
1748
  innerDiameter,
1690
1749
  outerDiameter
@@ -1697,32 +1756,11 @@ var stampboard = (raw_params) => {
1697
1756
  const xoff = -((params.top - 1) / 2) * params.p;
1698
1757
  for (let i = 0; i < params.top; i++) {
1699
1758
  if (i === params.top - 1 && !params.left && !params.bottom && !params.right) {
1700
- firstPinLocation = {
1701
- x: xoff + i * params.p,
1702
- y: getHeight(params) / 2 - params.pl * 1.4
1703
- };
1704
- routes = [
1705
- {
1706
- x: firstPinLocation.x,
1707
- y: firstPinLocation.y + triangleHeight / 2
1708
- },
1709
- // Tip of the triangle (pointing up)
1710
- {
1711
- x: firstPinLocation.x - triangleWidth / 2,
1712
- y: firstPinLocation.y - triangleHeight / 2
1713
- },
1714
- // Left corner of the base
1715
- {
1716
- x: firstPinLocation.x + triangleWidth / 2,
1717
- y: firstPinLocation.y - triangleHeight / 2
1718
- },
1719
- // Right corner of the base
1720
- {
1721
- x: firstPinLocation.x,
1722
- y: firstPinLocation.y + triangleHeight / 2
1723
- }
1724
- // Close the path at the tip
1725
- ];
1759
+ routes = getTriangleDir(
1760
+ xoff + i * params.p,
1761
+ getHeight(params) / 2 - params.pl * 1.4,
1762
+ "top"
1763
+ );
1726
1764
  }
1727
1765
  rectpads.push(
1728
1766
  rectpad(
@@ -1747,7 +1785,7 @@ var stampboard = (raw_params) => {
1747
1785
  platedhole(
1748
1786
  i + 1,
1749
1787
  xoff + i * params.p,
1750
- getHeight(params) / 2 - params.pl + outerDiameter / 2,
1788
+ getHeight(params) / 2 - params.innerholeedgedistance,
1751
1789
  innerDiameter,
1752
1790
  outerDiameter
1753
1791
  )
@@ -1759,32 +1797,11 @@ var stampboard = (raw_params) => {
1759
1797
  const xoff = -((params.bottom - 1) / 2) * params.p;
1760
1798
  for (let i = 0; i < params.bottom; i++) {
1761
1799
  if (i === 0 && !params.left) {
1762
- firstPinLocation = {
1763
- x: xoff + i * params.p,
1764
- y: -getHeight(params) / 2 + params.pl * 1.4
1765
- };
1766
- routes = [
1767
- {
1768
- x: firstPinLocation.x,
1769
- y: firstPinLocation.y - triangleHeight / 2
1770
- },
1771
- // Tip of the triangle (pointing down)
1772
- {
1773
- x: firstPinLocation.x - triangleWidth / 2,
1774
- y: firstPinLocation.y + triangleHeight / 2
1775
- },
1776
- // Left corner of the base
1777
- {
1778
- x: firstPinLocation.x + triangleWidth / 2,
1779
- y: firstPinLocation.y + triangleHeight / 2
1780
- },
1781
- // Right corner of the base
1782
- {
1783
- x: firstPinLocation.x,
1784
- y: firstPinLocation.y - triangleHeight / 2
1785
- }
1786
- // Close the path at the tip
1787
- ];
1800
+ routes = getTriangleDir(
1801
+ xoff + i * params.p,
1802
+ -getHeight(params) / 2 + params.pl * 1.4,
1803
+ "bottom"
1804
+ );
1788
1805
  }
1789
1806
  rectpads.push(
1790
1807
  rectpad(
@@ -1809,7 +1826,7 @@ var stampboard = (raw_params) => {
1809
1826
  platedhole(
1810
1827
  i + 1,
1811
1828
  xoff + i * params.p,
1812
- -getHeight(params) / 2 + params.pl - outerDiameter / 2,
1829
+ -getHeight(params) / 2 + params.innerholeedgedistance,
1813
1830
  innerDiameter,
1814
1831
  outerDiameter
1815
1832
  )
@@ -1841,7 +1858,7 @@ var stampboard = (raw_params) => {
1841
1858
  };
1842
1859
  const silkscreenRefText = silkscreenRef(
1843
1860
  0,
1844
- getHeight(params) / 2 + 0.5,
1861
+ getHeight(params) / 1.8,
1845
1862
  getHeight(params) / 25
1846
1863
  );
1847
1864
  return {
@@ -1856,6 +1873,320 @@ var stampboard = (raw_params) => {
1856
1873
  };
1857
1874
  };
1858
1875
 
1876
+ // src/fn/stampreceiver.ts
1877
+ import {
1878
+ length as length10
1879
+ } from "circuit-json";
1880
+ import { z as z17 } from "zod";
1881
+ var stampreceiver_def = z17.object({
1882
+ fn: z17.string(),
1883
+ w: length10.default("22.58mm"),
1884
+ left: length10.optional(),
1885
+ right: length10.optional(),
1886
+ top: length10.optional(),
1887
+ bottom: length10.optional(),
1888
+ p: length10.default(length10.parse("2.54mm")),
1889
+ pw: length10.default(length10.parse("1.6mm")),
1890
+ pl: length10.default(length10.parse("3.2mm")),
1891
+ innerhole: z17.boolean().default(false),
1892
+ innerholeedgedistance: length10.default(length10.parse("1.61mm"))
1893
+ });
1894
+ var getHeight2 = (parameters) => {
1895
+ const params = stampreceiver_def.parse(parameters);
1896
+ if (params.left && params.right) {
1897
+ return Math.max(params.left, params.right) * params.p;
1898
+ }
1899
+ if (params.left) {
1900
+ return params.left * params.p;
1901
+ }
1902
+ if (params.right) {
1903
+ return params.right * params.p;
1904
+ }
1905
+ return 51;
1906
+ };
1907
+ var getTriangleDir2 = (x, y, side) => {
1908
+ let routes = [];
1909
+ const triangleHeight = 1;
1910
+ const triangleWidth = 0.6;
1911
+ if (side === "left") {
1912
+ routes = [
1913
+ {
1914
+ x: x + triangleHeight / 2,
1915
+ y
1916
+ },
1917
+ // Tip of the triangle (pointing right)
1918
+ {
1919
+ x: x - triangleHeight / 2,
1920
+ y: y + triangleWidth / 2
1921
+ },
1922
+ // Bottom corner of the base
1923
+ {
1924
+ x: x - triangleHeight / 2,
1925
+ y: y - triangleWidth / 2
1926
+ },
1927
+ // Top corner of the base
1928
+ {
1929
+ x: x + triangleHeight / 2,
1930
+ y
1931
+ }
1932
+ // Close the path at the tip
1933
+ ];
1934
+ }
1935
+ if (side === "right") {
1936
+ routes = [
1937
+ {
1938
+ x: x - triangleHeight / 2,
1939
+ y
1940
+ },
1941
+ // Tip of the triangle (pointing left)
1942
+ {
1943
+ x: x + triangleHeight / 2,
1944
+ y: y + triangleWidth / 2
1945
+ },
1946
+ // Top corner of the base
1947
+ {
1948
+ x: x + triangleHeight / 2,
1949
+ y: y - triangleWidth / 2
1950
+ },
1951
+ // Bottom corner of the base
1952
+ {
1953
+ x: x - triangleHeight / 2,
1954
+ y
1955
+ }
1956
+ // Close the path at the tip
1957
+ ];
1958
+ }
1959
+ if (side === "bottom") {
1960
+ routes = [
1961
+ {
1962
+ x,
1963
+ y: y + triangleHeight / 2
1964
+ },
1965
+ // Tip of the triangle (pointing up)
1966
+ {
1967
+ x: x - triangleWidth / 2,
1968
+ y: y - triangleHeight / 2
1969
+ },
1970
+ // Left corner of the base
1971
+ {
1972
+ x: x + triangleWidth / 2,
1973
+ y: y - triangleHeight / 2
1974
+ },
1975
+ // Right corner of the base
1976
+ {
1977
+ x,
1978
+ y: y + triangleHeight / 2
1979
+ }
1980
+ // Close the path at the tip
1981
+ ];
1982
+ }
1983
+ if (side === "top") {
1984
+ routes = [
1985
+ {
1986
+ x,
1987
+ y: y - triangleHeight / 2
1988
+ },
1989
+ // Tip of the triangle (pointing down)
1990
+ {
1991
+ x: x - triangleWidth / 2,
1992
+ y: y + triangleHeight / 2
1993
+ },
1994
+ // Left corner of the base
1995
+ {
1996
+ x: x + triangleWidth / 2,
1997
+ y: y + triangleHeight / 2
1998
+ },
1999
+ // Right corner of the base
2000
+ {
2001
+ x,
2002
+ y: y - triangleHeight / 2
2003
+ }
2004
+ // Close the path at the tip
2005
+ ];
2006
+ }
2007
+ return routes;
2008
+ };
2009
+ var stampreceiver = (raw_params) => {
2010
+ const params = stampreceiver_def.parse(raw_params);
2011
+ const rectpads = [];
2012
+ const holes = [];
2013
+ const innerDiameter = 1;
2014
+ const outerDiameter = 1.2;
2015
+ let routes = [];
2016
+ if (params.right) {
2017
+ const yoff = -((params.right - 1) / 2) * params.p;
2018
+ for (let i = 0; i < params.right; i++) {
2019
+ if (i === 0 && !params.left && !params.bottom) {
2020
+ routes = getTriangleDir2(
2021
+ params.w / 2 + params.pl * 1.4,
2022
+ yoff + i * params.p,
2023
+ "right"
2024
+ );
2025
+ }
2026
+ rectpads.push(
2027
+ rectpad(
2028
+ i + 1,
2029
+ params.w / 2 - params.pl / 2,
2030
+ yoff + i * params.p,
2031
+ params.pl,
2032
+ params.pw
2033
+ )
2034
+ );
2035
+ params.innerhole && holes.push(
2036
+ platedhole(
2037
+ i + 1,
2038
+ params.w / 2 - params.innerholeedgedistance,
2039
+ yoff + i * params.p,
2040
+ innerDiameter,
2041
+ outerDiameter
2042
+ )
2043
+ );
2044
+ }
2045
+ }
2046
+ if (params.left) {
2047
+ const yoff = -((params.left - 1) / 2) * params.p;
2048
+ for (let i = 0; i < params.left; i++) {
2049
+ if (i === params.left - 1) {
2050
+ routes = getTriangleDir2(
2051
+ -params.w / 2 - params.pl / 3,
2052
+ yoff + i * params.p,
2053
+ "left"
2054
+ );
2055
+ }
2056
+ rectpads.push(
2057
+ rectpad(
2058
+ i + 1,
2059
+ -params.w / 2 + params.pl / 2,
2060
+ yoff + i * params.p,
2061
+ params.pl,
2062
+ params.pw
2063
+ )
2064
+ );
2065
+ params.innerhole && holes.push(
2066
+ platedhole(
2067
+ i + 1,
2068
+ -params.w / 2 + params.innerholeedgedistance,
2069
+ yoff + i * params.p,
2070
+ innerDiameter,
2071
+ outerDiameter
2072
+ )
2073
+ );
2074
+ }
2075
+ }
2076
+ if (params.top) {
2077
+ const xoff = -((params.top - 1) / 2) * params.p;
2078
+ for (let i = 0; i < params.top; i++) {
2079
+ if (i === params.top - 1 && !params.left && !params.bottom && !params.right) {
2080
+ routes = getTriangleDir2(
2081
+ xoff + i * params.p,
2082
+ getHeight2(params) / 2 + params.pl * 1.4,
2083
+ "top"
2084
+ );
2085
+ }
2086
+ rectpads.push(
2087
+ rectpad(
2088
+ i + 1,
2089
+ xoff + i * params.p,
2090
+ getHeight2(params) / 2 - params.pl / 2,
2091
+ params.pw,
2092
+ params.pl
2093
+ )
2094
+ );
2095
+ params.innerhole && holes.push(
2096
+ platedhole(
2097
+ i + 1,
2098
+ xoff + i * params.p,
2099
+ getHeight2(params) / 2 - params.innerholeedgedistance,
2100
+ innerDiameter,
2101
+ outerDiameter
2102
+ )
2103
+ );
2104
+ }
2105
+ }
2106
+ if (params.bottom) {
2107
+ const xoff = -((params.bottom - 1) / 2) * params.p;
2108
+ for (let i = 0; i < params.bottom; i++) {
2109
+ if (i === 0 && !params.left) {
2110
+ routes = getTriangleDir2(
2111
+ xoff + i * params.p,
2112
+ -getHeight2(params) / 2 - params.pl * 1.4,
2113
+ "bottom"
2114
+ );
2115
+ }
2116
+ rectpads.push(
2117
+ rectpad(
2118
+ i + 1,
2119
+ xoff + i * params.p,
2120
+ -getHeight2(params) / 2 + params.pl / 2,
2121
+ params.pw,
2122
+ params.pl
2123
+ )
2124
+ );
2125
+ params.innerhole && holes.push(
2126
+ platedhole(
2127
+ i + 1,
2128
+ xoff + i * params.p,
2129
+ -getHeight2(params) / 2 + params.innerholeedgedistance,
2130
+ innerDiameter,
2131
+ outerDiameter
2132
+ )
2133
+ );
2134
+ }
2135
+ }
2136
+ const silkscreenTriangle = {
2137
+ type: "pcb_silkscreen_path",
2138
+ pcb_silkscreen_path_id: "1",
2139
+ pcb_component_id: "1",
2140
+ layer: "top",
2141
+ route: routes,
2142
+ stroke_width: 0.1
2143
+ };
2144
+ const silkscreenPath = {
2145
+ type: "pcb_silkscreen_path",
2146
+ pcb_silkscreen_path_id: "pcb_silkscreen_path_1",
2147
+ pcb_component_id: "1",
2148
+ route: [
2149
+ {
2150
+ x: -params.w / 2 - params.pl / 3,
2151
+ y: getHeight2(params) / 2 + params.pl / 3
2152
+ },
2153
+ {
2154
+ x: params.w / 2 + params.pl / 3,
2155
+ y: getHeight2(params) / 2 + params.pl / 3
2156
+ },
2157
+ {
2158
+ x: params.w / 2 + params.pl / 3,
2159
+ y: -getHeight2(params) / 2 - params.pl / 3
2160
+ },
2161
+ {
2162
+ x: -params.w / 2 - params.pl / 3,
2163
+ y: -getHeight2(params) / 2 - params.pl / 3
2164
+ },
2165
+ {
2166
+ x: -params.w / 2 - params.pl / 3,
2167
+ y: getHeight2(params) / 2 + params.pl / 3
2168
+ }
2169
+ ],
2170
+ stroke_width: 0.1,
2171
+ layer: "top"
2172
+ };
2173
+ const silkscreenRefText = silkscreenRef(
2174
+ 0,
2175
+ getHeight2(params) / 1.8,
2176
+ getHeight2(params) / 25
2177
+ );
2178
+ return {
2179
+ circuitJson: [
2180
+ ...holes,
2181
+ ...rectpads,
2182
+ silkscreenPath,
2183
+ silkscreenTriangle,
2184
+ silkscreenRefText
2185
+ ],
2186
+ parameters: params
2187
+ };
2188
+ };
2189
+
1859
2190
  // src/helpers/is-not-null.ts
1860
2191
  function isNotNull(value) {
1861
2192
  return value !== null;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/fn/index.ts","../src/helpers/u-curve.ts","../src/helpers/platedhole.ts","../src/fn/dip.ts","../src/helpers/silkscreenRef.ts","../src/helpers/rectpad.ts","../src/helpers/passive-fn.ts","../src/fn/diode.ts","../src/fn/cap.ts","../src/fn/led.ts","../src/fn/res.ts","../src/helpers/zod/ALPHABET.ts","../src/fn/bga.ts","../src/helpers/zod/dim-2d.ts","../src/helpers/zod/function-call.ts","../src/fn/soic.ts","../src/fn/quad.ts","../src/helpers/zod/pin-order-specifier.ts","../src/helpers/get-quad-pin-map.ts","../src/fn/qfn.ts","../src/fn/qfp.ts","../src/fn/mlp.ts","../src/fn/ssop.ts","../src/fn/tssop.ts","../src/fn/sot236.ts","../src/fn/sot363.ts","../src/fn/sot23.ts","../src/fn/dfn.ts","../src/helpers/corner.ts","../src/fn/pinrow.ts","../src/fn/sot563.ts","../src/fn/ms012.ts","../src/fn/ms013.ts","../src/fn/sot723.ts","../src/fn/sod123.ts","../src/fn/axial.ts","../src/fn/pushbutton.ts","../src/helpers/silkscreenpath.ts","../src/fn/stampboard.ts","../src/helpers/is-not-null.ts","../src/footprinter.ts"],"sourcesContent":["export { dip } from \"./dip\"\nexport { diode } from \"./diode\"\nexport { cap } from \"./cap\"\nexport { led } from \"./led\"\nexport { res } from \"./res\"\nexport { bga } from \"./bga\"\nexport { soic } from \"./soic\"\nexport { quad } from \"./quad\"\nexport { qfn } from \"./qfn\"\nexport { qfp } from \"./qfp\"\nexport { mlp } from \"./mlp\"\nexport { ssop } from \"./ssop\"\nexport { tssop } from \"./tssop\"\nexport { sot236 } from \"./sot236\"\nexport { sot363 } from \"./sot363\"\nexport { sot23 } from \"./sot23\"\nexport { dfn } from \"./dfn\"\nexport { pinrow } from \"./pinrow\"\nexport { sot563 } from \"./sot563\"\nexport { ms012 } from \"./ms012\"\nexport { ms013 } from \"./ms013\"\nexport { sot723 } from \"./sot723\"\nexport { sod123 } from \"./sod123\"\nexport { axial } from \"./axial\"\nexport { pushbutton } from \"./pushbutton\"\nexport { stampboard } from \"./stampboard\"\n","export const u_curve = Array.from({ length: 9 }, (_, i) =>\n Math.cos((i / 8) * Math.PI - Math.PI),\n).map((x) => ({\n x,\n y: -Math.sqrt(1 - x ** 2),\n}))\n","import type { PcbPlatedHole } from \"circuit-json\"\nimport { mm } from \"@tscircuit/mm\"\n\nexport const platedhole = (\n pn: number,\n x: number,\n y: number,\n id: number | string,\n od: number | string,\n): PcbPlatedHole => {\n return {\n type: \"pcb_plated_hole\",\n shape: \"circle\",\n x,\n y,\n hole_diameter: mm(id),\n outer_diameter: mm(od),\n pcb_port_id: \"\",\n layers: [\"top\", \"bottom\"],\n port_hints: [pn.toString()],\n }\n}\n","import type {\n AnyCircuitElement,\n PcbFabricationNoteText,\n PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { u_curve } from \"../helpers/u-curve\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const extendDipDef = (newDefaults: { w?: string; p?: string }) =>\n z\n .object({\n fn: z.string(),\n dip: z.literal(true),\n num_pins: z.number(),\n wide: z.boolean().optional(),\n narrow: z.boolean().optional(),\n w: length.optional(),\n p: length.default(length.parse(newDefaults.p ?? \"2.54mm\")),\n id: length.optional(),\n od: length.optional(),\n })\n .transform((v) => {\n // Default inner diameter and outer diameter\n if (!v.id && !v.od) {\n v.id = length.parse(\"1.0mm\")\n v.od = length.parse(\"1.2mm\")\n } else if (!v.id) {\n v.id = v.od! * (1.0 / 1.2)\n } else if (!v.od) {\n v.od = v.id! * (1.2 / 1.0)\n }\n\n // Default width (TODO high pin counts should probably be wide?)\n if (!v.w) {\n if (v.wide) {\n v.w = length.parse(\"600mil\")\n } else if (v.narrow) {\n v.w = length.parse(\"300mil\")\n } else {\n v.w = length.parse(newDefaults.w ?? \"300mil\")\n }\n }\n return v as NowDefined<typeof v, \"w\" | \"p\" | \"id\" | \"od\">\n })\n\nexport const dip_def = extendDipDef({})\n\nexport const getCcwDipCoords = (\n pinCount: number,\n pn: number,\n w: number,\n p: number,\n) => {\n /** pin height */\n const ph = pinCount / 2\n const isLeft = pn <= ph\n\n /** Number of gaps between pins on each side, e.g. 4 pins = 3 spaces */\n const leftPinGaps = ph - 1\n\n /** gap size (pitch) */\n const gs = p\n\n const h = gs * leftPinGaps\n\n if (isLeft) {\n // The y position starts at h/2, then goes down by gap size\n // for each pin\n return { x: -w / 2, y: h / 2 - (pn - 1) * gs }\n } else {\n // The y position starts at -h/2, then goes up by gap size\n return { x: w / 2, y: -h / 2 + (pn - ph - 1) * gs }\n }\n}\n\n/**\n * Returns the plated holes for a DIP package.\n */\nexport const dip = (raw_params: {\n dip: true\n num_pins: number\n w: number\n p?: number\n id?: string | number\n od?: string | number\n}): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = dip_def.parse(raw_params)\n const platedHoles: AnyCircuitElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwDipCoords(\n parameters.num_pins,\n i + 1,\n parameters.w,\n parameters.p ?? 2.54,\n )\n platedHoles.push(\n platedhole(i + 1, x, y, parameters.id ?? \"0.8mm\", parameters.od ?? \"1mm\"),\n )\n }\n /** silkscreen width */\n const sw = parameters.w - parameters.od - 0.4\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.od + 0.4\n const silkscreenBorder: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: sh / 2 },\n // Little U shape at the top\n ...u_curve.map(({ x, y }) => ({\n x: (x * sw) / 6,\n y: (y * sw) / 6 + sh / 2,\n })),\n { x: sw / 2, y: sh / 2 },\n { x: sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: -sh / 2 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n const silkscreenPins: PcbFabricationNoteText[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const isLeft = i < parameters.num_pins / 2\n const pinLabelX = isLeft\n ? -parameters.w / 2 - parameters.p / 2 - 0.2\n : parameters.p / 2 + parameters.w / 2 + 0.2\n const pinLabelY = isLeft\n ? (-sh + 1.6) / 2 + i * parameters.p\n : (-sh + 1.6) / 2 + (i - parameters.num_pins / 2) * parameters.p\n const silkscreenPin = {\n type: \"pcb_fabrication_note_text\",\n layer: \"top\",\n pcb_component_id: `pin_${i + 1}`,\n pcb_silkscreen_text_id: `pin_${i + 1}`,\n text: `{pin${i + 1}}`,\n anchor_position: {\n x: pinLabelX,\n y: pinLabelY,\n },\n font_size: 0.3,\n font_color: \"red\",\n font: \"tscircuit2024\",\n anchor_alignment: \"top-left\",\n }\n\n silkscreenPins.push(silkscreenPin)\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, sh / 2 + 0.5, 0.4)\n\n return {\n circuitJson: [\n ...platedHoles,\n silkscreenBorder,\n silkscreenRefText,\n ...silkscreenPins,\n ],\n parameters,\n }\n}\n","import type { PcbSilkscreenText } from \"circuit-json\"\n\nexport const silkscreenRef: (\n x: number,\n y: number,\n font_size: number,\n) => PcbSilkscreenText = (x: number, y: number, font_size: number) => {\n return {\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: \"silkscreen_text_1\",\n font: \"tscircuit2024\",\n font_size: font_size,\n pcb_component_id: \"pcb_component_1\",\n text: \"{REF}\",\n layer: \"top\",\n anchor_position: { x: x, y: y },\n anchor_alignment: \"center\",\n }\n}\nexport type SilkscreenRef = ReturnType<typeof silkscreenRef>\n","import type { PCBSMTPad } from \"@tscircuit/soup\"\nexport const rectpad = (\n pn: number | Array<string | number>,\n x: number,\n y: number,\n w: number,\n h: number,\n): PCBSMTPad => {\n return {\n type: \"pcb_smtpad\",\n x,\n y,\n width: w,\n height: h,\n layer: \"top\",\n shape: \"rect\",\n pcb_smtpad_id: \"\",\n port_hints: Array.isArray(pn)\n ? pn.map((item) => item.toString())\n : [pn.toString()],\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport mm from \"@tscircuit/mm\"\nimport { platedhole } from \"./platedhole\"\nimport { z } from \"zod\"\nimport { length, distance } from \"circuit-json\"\nimport { type SilkscreenRef, silkscreenRef } from \"./silkscreenRef\"\n\ntype StandardSize = {\n imperial: string\n metric: string\n Z_mm_min: number\n G_mm_min: number\n X_mm_min: number\n C_mm_ref: number\n}\n\n// https://www.worthingtonassembly.com/perfect-0201-footprint\n// https://static1.squarespace.com/static/54982a02e4b02e9f5e5d9ca7/t/660c692f69a0d83a4afecdf0/1712089391915/Discrete+Component+Footprints.pdf\n// https://page.venkel.com/hubfs/Resources/Technical/Resistors%20Landing%20Pattern.pdf\nconst sizes = [\n {\n imperial: \"01005\",\n metric: \"0402\",\n Z_mm_min: 0.58,\n G_mm_min: 0.18,\n X_mm_min: 0.21,\n C_mm_ref: 0.038,\n },\n {\n imperial: \"0201\",\n metric: \"0603\",\n Z_mm_min: 0.9,\n G_mm_min: 0.3,\n X_mm_min: 0.3,\n C_mm_ref: 0.6,\n },\n {\n imperial: \"0402\",\n metric: \"1005\",\n Z_mm_min: 1.6,\n G_mm_min: 0.4,\n X_mm_min: 0.7,\n C_mm_ref: 1,\n },\n {\n imperial: \"0603\",\n metric: \"1608\",\n Z_mm_min: 2.6,\n G_mm_min: 0.6,\n X_mm_min: 1.0,\n C_mm_ref: 1.7,\n },\n {\n imperial: \"0805\",\n metric: \"2012\",\n Z_mm_min: 3.0,\n G_mm_min: 0.6,\n X_mm_min: 1.2,\n C_mm_ref: 1.9,\n },\n {\n imperial: \"1206\",\n metric: \"3216\",\n Z_mm_min: 4.2,\n G_mm_min: 1.2,\n X_mm_min: 1.4,\n C_mm_ref: 2.8,\n },\n {\n imperial: \"1210\",\n metric: \"3225\",\n Z_mm_min: 4.2,\n G_mm_min: 1.2,\n X_mm_min: 2.4,\n C_mm_ref: 2.8,\n },\n {\n imperial: \"2010\",\n metric: \"5025\",\n Z_mm_min: 6.0,\n G_mm_min: 2.6,\n X_mm_min: 2.4,\n C_mm_ref: 4.4,\n },\n {\n imperial: \"2512\",\n metric: \"6332\",\n Z_mm_min: 7.2,\n G_mm_min: 3.8,\n X_mm_min: 3.0,\n C_mm_ref: 5.6,\n },\n]\nconst metricMap: Record<string, StandardSize> = sizes.reduce((acc: any, s) => {\n acc[s.metric] = s\n return acc\n}, {})\nconst imperialMap: Record<string, StandardSize> = sizes.reduce(\n (acc: any, s) => {\n acc[s.imperial] = s\n return acc\n },\n {},\n)\n\nexport const passive_def = z.object({\n tht: z.boolean(),\n p: length,\n pw: length.optional(),\n ph: length.optional(),\n metric: distance.optional(),\n imperial: distance.optional(),\n w: length.optional(),\n h: length.optional(),\n})\n\nexport type PassiveDef = z.input<typeof passive_def>\n\nconst deriveXFromH = (h: number) => 0.079 * h ** 2 + 0.94 * h - 0.009\nconst deriveZFromW = (w: number) => 1.09 * w + 0.6\nconst deriveGFromW = (w: number) => 0.59 * w - 0.31\nconst deriveCFromW = (w: number) => -0.01 * w ** 2 + 0.94 * w + 0.03\n\nexport const passive = (params: PassiveDef): AnySoupElement[] => {\n let { tht, p, pw, ph, metric, imperial, w, h } = params\n\n if (typeof w === \"string\") w = mm(w)\n if (typeof h === \"string\") h = mm(h)\n if (typeof p === \"string\") p = mm(p)\n if (typeof pw === \"string\") pw = mm(pw)\n if (typeof ph === \"string\") ph = mm(ph)\n\n if (h! > w!) {\n throw new Error(\n \"height cannot be greater than width (rotated footprint not yet implemented)\",\n )\n }\n\n /** standard size */\n let sz: StandardSize | undefined\n if (metric) {\n sz = metricMap[metric]\n }\n\n if (imperial) {\n sz = imperialMap[imperial]\n }\n\n if (!sz && w && h && !pw && !ph) {\n sz = {\n imperial: \"custom\",\n metric: \"custom\",\n Z_mm_min: deriveZFromW(w),\n G_mm_min: deriveGFromW(w),\n X_mm_min: deriveXFromH(h),\n C_mm_ref: deriveCFromW(w),\n }\n }\n\n if (sz) {\n w = sz.Z_mm_min\n h = sz.X_mm_min\n p = sz.C_mm_ref\n pw = (sz.Z_mm_min - sz.G_mm_min) / 2\n ph = (sz.Z_mm_min - sz.G_mm_min) / 2\n }\n\n if (pw === undefined) throw new Error(\"could not infer pad width\")\n if (ph === undefined) throw new Error(\"could not infer pad width\")\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, h / 2, h / 12)\n if (tht) {\n return [\n platedhole(1, -p / 2, 0, pw, (pw * 1) / 0.8),\n platedhole(2, p / 2, 0, pw, (pw * 1) / 0.8),\n silkscreenRefText,\n ]\n } else {\n return [\n rectpad([\"1\", \"left\"], -p / 2, 0, pw, ph),\n rectpad([\"2\", \"right\"], p / 2, 0, pw, ph),\n silkscreenRefText,\n ]\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { passive } from \"src/helpers/passive-fn\"\n\nexport const diode = (parameters: {\n tht: boolean\n p: number\n}): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { type PassiveDef, passive } from \"../helpers/passive-fn\"\n\nexport const cap = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { type PassiveDef, passive } from \"../helpers/passive-fn\"\n\nexport const led = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { passive, type PassiveDef } from \"../helpers/passive-fn\"\n\nexport const res = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","export const ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n","import type { AnySoupElement, PCBSMTPad } from \"@tscircuit/soup\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { ALPHABET } from \"../helpers/zod/ALPHABET\"\nimport { z } from \"zod\"\nimport { length, distance } from \"@tscircuit/soup\"\nimport { dim2d } from \"src/helpers/zod/dim-2d\"\nimport { function_call } from \"src/helpers/zod/function-call\"\nimport type { NowDefined } from \"src/helpers/zod/now-defined\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const bga_def = z\n .object({\n fn: z.string(),\n num_pins: z.number(),\n grid: dim2d.optional(),\n p: distance.default(\"0.8mm\"),\n w: length.optional(),\n h: length.optional(),\n ball: length.optional().describe(\"ball diameter\"),\n pad: length.optional().describe(\"pad width/height\"),\n\n tlorigin: z.boolean().optional(),\n blorigin: z.boolean().optional(),\n trorigin: z.boolean().optional(),\n brorigin: z.boolean().optional(),\n\n missing: function_call.default([]),\n })\n .transform((a) => {\n let origin: \"tl\" | \"bl\" | \"tr\" | \"br\" = \"tl\"\n if (a.blorigin) origin = \"bl\"\n if (a.trorigin) origin = \"tr\"\n if (a.brorigin) origin = \"br\"\n\n if (!a.grid) {\n // find the largest square for the number of pins\n const largest_square = Math.ceil(Math.sqrt(a.num_pins))\n a.grid = { x: largest_square, y: largest_square }\n }\n\n if (a.missing) {\n a.missing = a.missing.map((s) => {\n if (typeof s === \"number\") return s\n if (s === \"center\") return \"center\"\n if (s === \"topleft\") return \"topleft\"\n const m = s.match(/([A-Z]+)(\\d+)/)\n if (!m) return s\n const Y = ALPHABET.indexOf(m[1]!)\n const X = Number.parseInt(m[2]!) - 1\n return Y * a.grid!.x + X + 1\n })\n }\n\n const new_def = { ...a, origin }\n\n return new_def as NowDefined<typeof new_def, \"w\" | \"h\" | \"grid\">\n })\n\nexport type BgaDefInput = z.input<typeof bga_def>\nexport type BgaDef = z.infer<typeof bga_def>\n\nexport const bga = (\n raw_params: BgaDefInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = bga_def.parse(raw_params)\n let { num_pins, grid, p, w, h, ball, pad, missing } = parameters\n\n ball ??= (0.75 / 1.27) * p\n\n pad ??= ball * 0.8\n\n const pads: PCBSMTPad[] = []\n\n const missing_pin_nums = (missing ?? []).filter((a) => typeof a === \"number\")\n const num_pins_missing = grid.x * grid.y - num_pins\n\n if (missing.length === 0 && num_pins_missing > 0) {\n // No missing pins specified, let's see if a squared center works\n // if num_pins_missing is a square\n if (Math.sqrt(num_pins_missing) % 1 === 0) {\n missing.push(\"center\")\n } else if (num_pins_missing === 1) {\n missing.push(\"topleft\")\n }\n }\n\n if (missing?.includes(\"center\")) {\n // Find the largest square that's square is less than\n // the number of missing pins\n const square_size = Math.floor(Math.sqrt(num_pins_missing))\n\n // Find the top left coordinate of the inner square, keep\n // in mind the full grid size is grid.x x grid.y\n const inner_square_x = Math.floor((grid.x - square_size) / 2)\n const inner_square_y = Math.floor((grid.y - square_size) / 2)\n\n // Add all the missing square pin numbers to missing_pin_nums\n for (let y = inner_square_y; y < inner_square_y + square_size; y++) {\n for (let x = inner_square_x; x < inner_square_x + square_size; x++) {\n missing_pin_nums.push(y * grid.x + x + 1)\n }\n }\n }\n\n if (missing?.includes(\"topleft\")) {\n missing_pin_nums.push(1)\n }\n\n if (num_pins_missing !== missing_pin_nums.length) {\n throw new Error(\n `not able to create bga component, unable to determine missing pins (try specifying them with \"missing+1+2+...\"\\n\\n${JSON.stringify(\n parameters,\n null,\n \" \",\n )}`,\n )\n }\n\n const missing_pin_nums_set = new Set(missing_pin_nums)\n\n let missing_pins_passed = 0\n for (let y = 0; y < grid.y; y++) {\n for (let x = 0; x < grid.x; x++) {\n let pin_num = y * grid.x + x + 1\n if (missing_pin_nums_set.has(pin_num)) {\n missing_pins_passed++\n continue\n }\n pin_num -= missing_pins_passed\n\n const pad_x = (x - (grid.x - 1) / 2) * p\n const pad_y = -(y - (grid.y - 1) / 2) * p\n\n // TODO handle >26 rows\n pads.push(\n rectpad([pin_num, `${ALPHABET[y]}${x + 1}`], pad_x, pad_y, pad, pad),\n )\n }\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n (grid.y * p) / 2,\n 0.2,\n )\n\n return {\n circuitJson: [...pads, silkscreenRefText as AnySoupElement],\n parameters,\n }\n}\n","import { z } from \"zod\"\n\nexport const dim2d = z\n .string()\n .transform((a) => {\n const [x, y] = a.split(/[x ]/)\n return {\n x: parseFloat(x),\n y: parseFloat(y),\n }\n })\n .pipe(\n z.object({\n x: z.number(),\n y: z.number(),\n }),\n )\n","import { z } from \"zod\"\n\nexport const function_call = z\n .string()\n .or(z.array(z.any()))\n .transform((a) => {\n if (Array.isArray(a)) return a\n if (a.startsWith(\"(\") && a.endsWith(\")\")) {\n a = a.slice(1, -1)\n }\n return a.split(\",\").map((v) => {\n const numVal = Number(v)\n return isNaN(numVal) ? v : numVal\n })\n })\n .pipe(z.array(z.string().or(z.number())))\n","import type { AnySoupElement, PcbSilkscreenPath } from \"@tscircuit/soup\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { z, type AnyZodObject } from \"zod\"\nimport { length } from \"@tscircuit/soup\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { u_curve } from \"../helpers/u-curve\"\nimport { rectpad } from \"src/helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nexport const extendSoicDef = (newDefaults: {\n w?: string\n p?: string\n legsoutside?: boolean\n}) =>\n z\n .object({\n fn: z.string(),\n num_pins: z.number(),\n w: length.default(length.parse(newDefaults.w ?? \"5.3mm\")),\n p: length.default(length.parse(newDefaults.p ?? \"1.27mm\")),\n pw: length.optional(),\n pl: length.optional(),\n legsoutside: z\n .boolean()\n .optional()\n .default(newDefaults.legsoutside ?? false),\n })\n .transform((v) => {\n // Default inner diameter and outer diameter\n if (!v.pw && !v.pl) {\n v.pw = length.parse(\"0.6mm\")\n v.pl = length.parse(\"1.0mm\")\n } else if (!v.pw) {\n v.pw = v.pl! * (0.6 / 1.0)\n } else if (!v.pl) {\n v.pl = v.pw! * (1.0 / 0.6)\n }\n\n return v as NowDefined<typeof v, \"w\" | \"p\" | \"pw\" | \"pl\">\n })\n\nexport const soic_def = extendSoicDef({})\nexport type SoicInput = z.infer<typeof soic_def>\n\nexport const getCcwSoicCoords = (parameters: {\n num_pins: number\n pn: number\n w: number\n p: number\n pl: number\n legsoutside?: boolean\n widthincludeslegs?: boolean\n}) => {\n if (parameters.widthincludeslegs !== undefined) {\n parameters.legsoutside = !parameters.widthincludeslegs\n }\n const { num_pins, pn, w, p, pl, legsoutside } = parameters\n /** pin height */\n const ph = num_pins / 2\n const isLeft = pn <= ph\n\n /** Number of gaps between pins on each side, e.g. 4 pins = 3 spaces */\n const leftPinGaps = ph - 1\n\n /** gap size (pitch) */\n const gs = p\n\n const h = gs * leftPinGaps\n\n const legoffset = legsoutside ? pl / 2 : -pl / 2\n\n if (isLeft) {\n // The y position starts at h/2, then goes down by gap size\n // for each pin\n return { x: -w / 2 - legoffset, y: h / 2 - (pn - 1) * gs }\n } else {\n // The y position starts at -h/2, then goes up by gap size\n return { x: w / 2 + legoffset, y: -h / 2 + (pn - ph - 1) * gs }\n }\n}\n\n/**\n * Returns the plated holes for a SOIC package.\n */\nexport const soic = (raw_params: {\n soic: true\n num_pins: number\n w: number\n p?: number\n id?: string | number\n od?: string | number\n}): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = soic_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters) as AnySoupElement[],\n parameters,\n }\n}\n\nexport const soicWithoutParsing = (parameters: z.infer<typeof soic_def>) => {\n const pads: AnySoupElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSoicCoords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n p: parameters.p ?? 1.27,\n pl: parameters.pl,\n legsoutside: parameters.legsoutside,\n })\n pads.push(\n rectpad(i + 1, x, y, parameters.pl ?? \"1mm\", parameters.pw ?? \"0.6mm\"),\n )\n }\n\n /** silkscreen width */\n const m = Math.min(1, parameters.p / 2)\n const sw =\n parameters.w - (parameters.legsoutside ? 0 : parameters.pl * 2) - 0.2\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw + m\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n sh / 2 + 0.4,\n sh / 12,\n )\n const silkscreenBorder: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n stroke_width: 0.1,\n route: [\n { x: -sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: sh / 2 },\n // Little U shape at the top\n ...u_curve.map(({ x, y }) => ({\n x: (x * sw) / 6,\n y: (y * sw) / 6 + sh / 2,\n })),\n { x: sw / 2, y: sh / 2 },\n { x: sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: -sh / 2 },\n ],\n }\n\n return [...pads, silkscreenBorder, silkscreenRefText] as AnySoupElement[]\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { length } from \"@tscircuit/soup\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { pin_order_specifier } from \"src/helpers/zod/pin-order-specifier\"\nimport { getQuadPinMap } from \"src/helpers/get-quad-pin-map\"\nimport { dim2d } from \"src/helpers/zod/dim-2d\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const base_quad_def = z.object({\n fn: z.string(),\n cc: z.literal(true).optional(),\n ccw: z.literal(true).optional(),\n startingpin: z\n .string()\n .or(z.array(pin_order_specifier))\n .transform((a) => (typeof a === \"string\" ? a.slice(1, -1).split(\",\") : a))\n .pipe(z.array(pin_order_specifier))\n .optional(),\n num_pins: z.number(),\n w: length.optional(),\n h: length.optional(),\n p: length.default(length.parse(\"0.5mm\")),\n pw: length.optional(),\n pl: length.optional(),\n thermalpad: z.union([z.literal(true), dim2d]).optional(),\n legsoutside: z.boolean().optional(),\n})\n\nexport const quadTransform = <T extends z.infer<typeof base_quad_def>>(\n v: T,\n) => {\n if (v.w && !v.h) {\n v.h = v.w\n } else if (!v.w && v.h) {\n v.w = v.h\n }\n\n const side_pin_count = v.num_pins / 4\n\n if (!v.p && !v.pw && !v.pl && v.w) {\n // HACK: This is wayyy underspecified\n const approx_pin_size_of_side = side_pin_count + 4\n v.p = v.w / approx_pin_size_of_side\n }\n\n if (!v.p && v.w && v.h && v.pw && v.pl) {\n // HACK: This is wayyy underspecified\n v.p = (v.w - v.pl * 2) / (side_pin_count - 1)\n }\n\n if (!v.w && !v.h && v.p) {\n // HACK: underspecified\n v.w = v.p * (side_pin_count + 4)\n v.h = v.w\n }\n\n if (v.p && !v.pw && !v.pl) {\n v.pw = v.p / 2\n v.pl = v.p / 2\n } else if (!v.pw) {\n v.pw = v.pl! * (0.6 / 1.0)\n } else if (!v.pl) {\n v.pl = v.pw! * (1.0 / 0.6)\n }\n\n return v as NowDefined<T, \"w\" | \"h\" | \"p\" | \"pw\" | \"pl\">\n}\n\nexport const quad_def = base_quad_def.transform(quadTransform)\n\nconst SIDES_CCW = [\"left\", \"bottom\", \"right\", \"top\"] as const\n\nexport const getQuadCoords = (params: {\n pin_count: number\n pn: number // pin number\n w: number // width of the package\n h: number // height (length) of the package\n p: number // pitch between pins\n pl: number // length of the pin\n legsoutside?: boolean\n}) => {\n const { pin_count, pn, w, h, p, pl, legsoutside } = params\n const sidePinCount = pin_count / 4\n const side = SIDES_CCW[Math.floor((pn - 1) / sidePinCount)]\n const pos = (pn - 1) % sidePinCount\n\n /** inner box width */\n const ibw = p * (sidePinCount - 1)\n /** inner box height */\n const ibh = p * (sidePinCount - 1)\n\n /** pad center distance from edge (negative is inside, positive is outside) */\n const pcdfe = legsoutside ? pl / 2 : -pl / 2\n\n switch (side) {\n case \"left\":\n return { x: -w / 2 - pcdfe, y: ibh / 2 - pos * p, o: \"vert\" }\n case \"bottom\":\n return { x: -ibw / 2 + pos * p, y: -h / 2 - pcdfe, o: \"horz\" }\n case \"right\":\n return { x: w / 2 + pcdfe, y: -ibh / 2 + pos * p, o: \"vert\" }\n case \"top\":\n return { x: ibw / 2 - pos * p, y: h / 2 + pcdfe, o: \"horz\" }\n default:\n throw new Error(\"Invalid pin number\")\n }\n}\n\nexport const quad = (\n raw_params: z.input<typeof quad_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = quad_def.parse(raw_params)\n const pads: AnySoupElement[] = []\n const pin_map = getQuadPinMap(parameters)\n /** Side pin count */\n const spc = parameters.num_pins / 4\n for (let i = 0; i < parameters.num_pins; i++) {\n const {\n x,\n y,\n o: orientation,\n } = getQuadCoords({\n pin_count: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n h: parameters.h,\n p: parameters.p ?? 0.5,\n pl: parameters.pl,\n legsoutside: parameters.legsoutside,\n })\n\n let pw = parameters.pw\n let pl = parameters.pl\n if (orientation === \"vert\") {\n ;[pw, pl] = [pl, pw]\n }\n\n const pn = pin_map[i + 1]!\n pads.push(rectpad(pn, x, y, pw, pl))\n }\n\n if (parameters.thermalpad) {\n if (typeof parameters.thermalpad === \"boolean\") {\n const ibw = parameters.p * (spc - 1) + parameters.pw\n const ibh = parameters.p * (spc - 1) + parameters.pw\n pads.push(rectpad([\"thermalpad\"], 0, 0, ibw, ibh))\n } else {\n pads.push(\n rectpad(\n [\"thermalpad\"],\n 0,\n 0,\n parameters.thermalpad.x,\n parameters.thermalpad.y,\n ),\n )\n }\n }\n\n // Silkscreen corners\n const silkscreen_corners: PcbSilkscreenPath[] = []\n for (const [corner, dx, dy] of [\n [\"top-left\", -1, 1],\n [\"bottom-left\", -1, -1],\n [\"bottom-right\", 1, -1],\n [\"top-right\", 1, 1],\n ] as const) {\n // const dx = Math.floor(corner_index / 2) * 2 - 1\n // const dy = 1 - (corner_index % 2) * 2\n const corner_x = (parameters.w / 2) * dx\n const corner_y = (parameters.h / 2) * dy\n let arrow: \"none\" | \"in1\" | \"in2\" = \"none\"\n\n let arrow_x = corner_x\n let arrow_y = corner_y\n\n /** corner size */\n const csz = parameters.pw * 2\n\n if (pin_map[1] === 1 && corner === \"top-left\") {\n arrow = \"in1\"\n } else if (pin_map[spc * 4] === 1 && corner === \"top-left\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 3 + 1] === 1 && corner === \"top-right\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 3] === 1 && corner === \"top-right\") {\n arrow = \"in1\"\n } else if (pin_map[spc] === 1 && corner === \"bottom-left\") {\n arrow = \"in1\"\n } else if (pin_map[spc + 1] === 1 && corner === \"bottom-left\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 2] === 1 && corner === \"bottom-right\") {\n arrow = \"in1\"\n } else if (pin_map[spc * 2 + 1] === 1 && corner === \"bottom-right\") {\n arrow = \"in2\"\n }\n\n const rotate_arrow = arrow === \"in1\" ? 1 : -1\n if (parameters.legsoutside) {\n const arrow_dx = arrow === \"in1\" ? parameters.pl / 2 : parameters.pw / 2\n const arrow_dy = arrow === \"in1\" ? parameters.pw / 2 : parameters.pl / 2\n arrow_x += arrow_dx * dx * rotate_arrow\n arrow_y -= arrow_dy * dy * rotate_arrow\n }\n\n // Normal Corner\n if (arrow === \"none\" || parameters.legsoutside) {\n silkscreen_corners.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}`,\n route: [\n {\n x: corner_x - csz * dx,\n y: corner_y,\n },\n {\n x: corner_x,\n y: corner_y,\n },\n {\n x: corner_x,\n y: corner_y - csz * dy,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n })\n }\n\n // Two lines nearly forming a corner, used when the arrow needs to overlap\n // the corne (QFN components where legs are inside)\n if ((arrow === \"in1\" || arrow === \"in2\") && !parameters.legsoutside) {\n silkscreen_corners.push(\n {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_1`,\n route: [\n {\n x: corner_x - csz * dx,\n y: corner_y,\n },\n {\n x: corner_x - (csz * dx) / 2,\n y: corner_y,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0,\n },\n {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_2`,\n route: [\n {\n x: corner_x,\n y: corner_y - (csz * dy) / 2,\n },\n {\n x: corner_x,\n y: corner_y - csz * dy,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n },\n )\n }\n if (arrow === \"in1\" || arrow === \"in2\") {\n silkscreen_corners.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_3`,\n route: [\n {\n x: arrow_x - 0.2 * -dx,\n y: arrow_y + 0.2 * rotate_arrow,\n },\n {\n x: arrow_x,\n y: arrow_y,\n },\n {\n x: arrow_x + 0.2 * rotate_arrow * -dx,\n y: arrow_y + 0.2,\n },\n {\n x: arrow_x - 0.2 * -dx,\n y: arrow_y + 0.2 * rotate_arrow,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n })\n }\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n parameters.h / 2 + (parameters.legsoutside ? parameters.pl * 1.2 : 0.5),\n 0.3,\n )\n return {\n circuitJson: [\n ...pads,\n ...silkscreen_corners,\n silkscreenRefText,\n ] as AnySoupElement[],\n parameters,\n }\n}\n","import { z } from \"zod\"\nexport const pin_order_specifier = z.enum([\n \"leftside\",\n \"topside\",\n \"rightside\",\n \"bottomside\",\n \"toppin\",\n \"bottompin\",\n \"leftpin\",\n \"rightpin\",\n])\n\nexport type PinOrderSpecifier = z.infer<typeof pin_order_specifier>\n","import type { PinOrderSpecifier } from \"./zod/pin-order-specifier\"\n\n/**\n * A counter-clockwise pin map is [1,2,3,4,5,6,7,8] for an 8-pin package\n *\n * 8 7\n * 1 6\n * 2 5\n * 3 4\n *\n * Given some parameters, we're returning how to map the pins in a quad package\n * with a different order. For example, if we pass in cw=true, we'll get the\n * following mapping\n *\n * 1 -> 1\n * 2 -> 8\n * 3 -> 7\n * 4 -> 6\n * 5 -> 5\n * 6 -> 4\n * 7 -> 3\n * 8 -> 2\n *\n * Which allows us to create the CW version of the package using...\n * new_pin = pin_map[normal_ccw_pin]\n *\n * 2 3\n * 1 4\n * 8 5\n * 7 6\n */\nexport const getQuadPinMap = ({\n num_pins,\n cw,\n ccw,\n startingpin,\n}: {\n num_pins: number\n cw?: boolean\n ccw?: boolean\n startingpin?: PinOrderSpecifier[]\n}): number[] => {\n const pin_map: number[] = []\n const pins_per_side = num_pins / 4\n let current_position_ccw_normal = 1\n\n /** Starting Flag Pins */\n const sfp: Record<PinOrderSpecifier, boolean> = {} as any\n for (const specifier of startingpin ?? []) {\n sfp[specifier] = true\n }\n if (!sfp.leftside && !sfp.topside && !sfp.rightside && !sfp.bottomside) {\n sfp.leftside = true\n }\n if (!sfp.bottompin && !sfp.leftpin && !sfp.rightpin && !sfp.toppin) {\n if (sfp.leftside) {\n sfp.toppin = true\n } else if (sfp.topside) {\n sfp.rightpin = true\n } else if (sfp.rightside) {\n sfp.bottompin = true\n } else if (sfp.bottomside) {\n sfp.leftpin = true\n }\n }\n\n if (sfp.leftside && sfp.toppin) {\n current_position_ccw_normal = 1\n } else if (sfp.leftside && sfp.bottompin) {\n current_position_ccw_normal = pins_per_side\n } else if (sfp.bottomside && sfp.leftpin) {\n current_position_ccw_normal = pins_per_side + 1\n } else if (sfp.bottomside && sfp.rightpin) {\n current_position_ccw_normal = pins_per_side * 2\n } else if (sfp.rightside && sfp.bottompin) {\n current_position_ccw_normal = pins_per_side * 2 + 1\n } else if (sfp.rightside && sfp.toppin) {\n current_position_ccw_normal = pins_per_side * 3\n } else if (sfp.topside && sfp.rightpin) {\n current_position_ccw_normal = pins_per_side * 3 + 1\n } else if (sfp.topside && sfp.leftpin) {\n current_position_ccw_normal = pins_per_side * 4\n }\n\n pin_map.push(-1) // the first index is meaningless\n\n // Each iteration we move the current position to the next pin, if we're\n // going CCW this means incrementing, if we're going CW this means\n // decrementing\n for (let i = 0; i < num_pins; i++) {\n pin_map[current_position_ccw_normal] = i + 1\n if (ccw || !cw) {\n current_position_ccw_normal++\n if (current_position_ccw_normal > num_pins) {\n current_position_ccw_normal = 1\n }\n } else {\n current_position_ccw_normal--\n if (current_position_ccw_normal < 1) {\n current_position_ccw_normal = num_pins\n }\n }\n }\n\n return pin_map\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { base_quad_def, quad, quad_def, quadTransform } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const qfn_def = base_quad_def.extend({}).transform(quadTransform)\n\nexport const qfn = (\n parameters: z.input<typeof qfn_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n parameters.legsoutside = false\n return quad(parameters)\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { quad, quad_def } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const qfp_def = quad_def\n\nexport const qfp = (\n raw_params: z.input<typeof quad_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n raw_params.legsoutside = true\n\n const quad_defaults = quad_def.parse(raw_params)\n if (!raw_params.p) {\n switch (raw_params.num_pins) {\n case 44:\n case 64:\n raw_params.p = 0.8\n break\n case 52:\n if (raw_params.w === 14) raw_params.p = 1\n else raw_params.p = 0.65\n break\n case 208:\n raw_params.p = 0.5\n break\n }\n }\n if (!raw_params.pl) {\n switch (raw_params.num_pins) {\n case 44:\n case 52:\n case 64:\n raw_params.pl = 2.25\n break\n case 208:\n raw_params.pl = 1.65\n break\n default:\n raw_params.pl = quad_defaults.pl * 4\n break\n }\n }\n if (!raw_params.pw) {\n switch (raw_params.num_pins) {\n case 44:\n case 64:\n raw_params.pw = 0.5\n break\n case 52:\n if (raw_params.w === 14) raw_params.pw = 0.45\n else raw_params.pw = 0.55\n break\n case 208:\n raw_params.pw = 0.3\n break\n default:\n raw_params.pw = quad_defaults.pw\n break\n }\n }\n return quad(raw_params)\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { base_quad_def, quad, quad_def, quadTransform } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const mlp_def = base_quad_def.extend({}).transform(quadTransform)\n\nexport const mlp = (\n parameters: z.input<typeof mlp_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n parameters.legsoutside = false\n if (parameters.thermalpad === undefined) {\n parameters.thermalpad = true\n }\n return quad(parameters)\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing, type SoicInput } from \"./soic\"\n\n// TODO we should accept MS-012 or MS-013\n\nexport const ssop_def = extendSoicDef({\n w: \"3.9mm\",\n p: \"1.27mm\",\n})\n\nexport const ssop = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = ssop_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing, type SoicInput } from \"./soic\"\n\nexport const tssop_def = extendSoicDef({\n w: \"6.1mm\",\n p: \"0.65mm\",\n legsoutside: true,\n})\n\nexport const tssop = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = tssop_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot236_def = extendSoicDef({\n p: \"0.95mm\",\n w: \"1.6mm\",\n legsoutside: true,\n})\n\nexport const sot236 = (\n raw_params: z.input<typeof sot236_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot236_def.parse({ ...raw_params, num_pins: 6 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot363_def = extendSoicDef({})\n\nexport const sot363 = (\n raw_params: z.input<typeof sot363_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot363_def.parse({\n fn: \"sot363\",\n num_pins: 6,\n w: 1.94,\n p: 0.65,\n pw: 0.3,\n pl: 0.7,\n legoutside: true,\n })\n\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const sot23_def = z.object({\n fn: z.string(),\n num_pins: z.number().default(3),\n w: z.string().default(\"1.92mm\"),\n h: z.string().default(\"2.74mm\"),\n pl: z.string().default(\"0.8mm\"),\n pw: z.string().default(\"0.764mm\"),\n})\n\nexport const sot23 = (\n raw_params: z.input<typeof sot23_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot23_def.parse(raw_params)\n return {\n circuitJson: sot23WithoutParsing(parameters),\n parameters: parameters,\n }\n}\n\nexport const getCcwSot23Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n}) => {\n const { pn, w, h, pl } = parameters\n\n if (pn === 1) {\n return { x: -1.7, y: 0 }\n } else if (pn === 2) {\n return { x: 1.7, y: -0.95 }\n } else {\n return { x: 1.7, y: 0.95 }\n }\n}\n\nexport const sot23WithoutParsing = (parameters: z.infer<typeof sot23_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSot23Coords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: Number.parseFloat(parameters.w),\n h: Number.parseFloat(parameters.h),\n pl: Number.parseFloat(parameters.pl),\n })\n pads.push(\n rectpad(\n i + 1,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n Number(parameters.h),\n 0.3,\n )\n return [...pads, silkscreenRefText as AnySoupElement]\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"@tscircuit/soup\"\nimport {\n extendSoicDef,\n soicWithoutParsing,\n type SoicInput,\n getCcwSoicCoords,\n} from \"./soic\"\nimport { rectpad } from \"src/helpers/rectpad\"\nimport { z } from \"zod\"\nimport { CORNERS } from \"src/helpers/corner\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const dfn_def = extendSoicDef({})\n\n/**\n * Dual Flat No-lead\n *\n * Similar to SOIC but different silkscreen\n */\nexport const dfn = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = dfn_def.parse(raw_params)\n const pads: AnySoupElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSoicCoords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n p: parameters.p ?? 1.27,\n pl: parameters.pl,\n widthincludeslegs: true,\n })\n pads.push(\n rectpad(i + 1, x, y, parameters.pl ?? \"1mm\", parameters.pw ?? \"0.6mm\"),\n )\n }\n\n // The silkscreen is 4 corners and an arrow identifier for pin1\n const m = Math.min(1, parameters.p / 2)\n const sw = parameters.w + m\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw + m\n const silkscreenPaths: PcbSilkscreenPath[] = []\n\n for (const corner of CORNERS) {\n const { dx, dy } = corner\n silkscreenPaths.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"\",\n route: [\n { x: (dx * sw) / 2 - dx * parameters.p, y: (dy * sh) / 2 },\n { x: (dx * sw) / 2, y: (dy * sh) / 2 },\n { x: (dx * sw) / 2, y: (dy * sh) / 2 - dy * parameters.p },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n })\n }\n\n // Arrow\n /** arrow size */\n const as = parameters.p / 4\n /** Arrow tip x */\n const atx = -sw / 2 - as / 2\n /** Arrow tip y */\n const aty = sh / 2 - parameters.p / 2\n\n silkscreenPaths.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"\",\n type: \"pcb_silkscreen_path\",\n route: [\n {\n x: atx,\n y: aty,\n },\n {\n x: atx - as,\n y: aty + as,\n },\n {\n x: atx - as,\n y: aty - as,\n },\n {\n x: atx,\n y: aty,\n },\n ],\n stroke_width: 0.1,\n })\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n sh / 2 + 0.4,\n sh / 12,\n )\n return {\n circuitJson: [\n ...pads,\n silkscreenRefText,\n ...silkscreenPaths,\n ] as AnySoupElement[],\n parameters,\n }\n}\n","export const CORNERS = [\n { name: \"top-left\", dx: -1, dy: 1 },\n { name: \"top-right\", dx: 1, dy: 1 },\n { name: \"bottom-left\", dx: -1, dy: -1 },\n { name: \"bottom-right\", dx: 1, dy: -1 },\n]\n","import { z } from \"zod\"\nimport { length, type AnySoupElement } from \"@tscircuit/soup\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const pinrow_def = z.object({\n fn: z.string(),\n num_pins: z.number(),\n p: length.default(\"0.1in\").describe(\"pitch\"),\n id: length.default(\"1.0mm\").describe(\"inner diameter\"),\n od: length.default(\"1.2mm\").describe(\"outer diameter\"),\n})\n\nexport const pinrow = (\n raw_params: z.input<typeof pinrow_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = pinrow_def.parse(raw_params)\n const { p, id, od } = parameters\n const holes: any[] = []\n /** num_spaces */\n const ns = parameters.num_pins - 1\n const xoff = -(ns / 2) * p\n\n for (let i = 0; i < parameters.num_pins; i++) {\n holes.push(platedhole(i + 1, xoff + i * p, 0, id, od))\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, p / 2, 0.5)\n return {\n circuitJson: [...holes, silkscreenRefText] as AnySoupElement[],\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot563_def = extendSoicDef({})\n\nexport const sot563 = (\n raw_params: z.input<typeof sot563_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot563_def.parse({\n fn: \"sot563\",\n num_pins: 6,\n w: 1.94,\n p: 0.5,\n pw: 0.3,\n pl: 0.67,\n legoutside: true,\n })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const ms012_def = extendSoicDef({\n p: \"1.27mm\",\n w: \"3.9mm\",\n legsoutside: true,\n})\n\nexport const ms012 = (\n raw_params: z.input<typeof ms012_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = ms012_def.parse({ ...raw_params, num_pins: 8 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const ms013_def = extendSoicDef({\n p: \"1.27mm\",\n w: \"7.5mm\",\n legsoutside: true,\n})\n\nexport const ms013 = (\n raw_params: z.input<typeof ms013_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = ms013_def.parse({ ...raw_params, num_pins: 16 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const sot723_def = z.object({\n fn: z.string(),\n num_pins: z.number().default(3),\n w: z.string().default(\"1.2mm\"),\n h: z.string().default(\"1.2mm\"),\n pl: z.string().default(\"0.3mm\"),\n pw: z.string().default(\"0.32mm\"),\n})\n\nexport const sot723 = (\n raw_params: z.input<typeof sot723_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot723_def.parse(raw_params)\n const pad = sot723WithoutParsing(parameters)\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n Number(parameters.h),\n 0.3,\n )\n return {\n circuitJson: [...pad, silkscreenRefText as AnySoupElement],\n parameters,\n }\n}\n\nexport const getCcwSot723Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n}) => {\n const { pn, w, h, pl } = parameters\n\n if (pn === 1) {\n return { x: 0, y: 0 }\n } else if (pn === 2) {\n return { x: 1, y: -0.4 }\n } else {\n return { x: 1, y: 0.4 }\n }\n}\n\nexport const sot723WithoutParsing = (\n parameters: z.infer<typeof sot723_def>,\n) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 0; i < 3; i++) {\n const { x, y } = getCcwSot723Coords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: Number.parseFloat(parameters.w),\n h: Number.parseFloat(parameters.h),\n pl: Number.parseFloat(parameters.pl),\n })\n pads.push(\n rectpad(\n i + 1,\n x,\n y,\n Number.parseFloat(parameters.pl),\n i !== 0 ? Number.parseFloat(parameters.pw) : 0.42,\n ),\n )\n }\n\n return pads\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\n\nexport const sod_def = z.object({\n fn: z.string(),\n w: z.string().default(\"2.36mm\"),\n h: z.string().default(\"1.22mm\"),\n pl: z.string().default(\"0.9mm\"),\n pw: z.string().default(\"0.9mm\"),\n pad_spacing: z.string().default(\"4.19mm\"),\n})\n\nexport const sod123 = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n Number(parameters.h) / 4 + 0.4,\n 0.3,\n )\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\nexport const getSodCoords = (parameters: {\n pn: number\n pad_spacing: number\n}) => {\n const { pn, pad_spacing } = parameters\n\n if (pn === 1) {\n return { x: -pad_spacing / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: pad_spacing / 2, y: 0 }\n }\n}\n\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 0; i < 2; i++) {\n const { x, y } = getSodCoords({\n pn: i + 1,\n pad_spacing: Number.parseFloat(parameters.pad_spacing),\n })\n pads.push(\n rectpad(\n i + 1,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import {\n length,\n type AnySoupElement,\n type PcbSilkscreenLine,\n type PcbSilkscreenPath,\n} from \"@tscircuit/soup\"\nimport { passive, type PassiveDef } from \"../helpers/passive-fn\"\nimport { z } from \"zod\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\n\nexport const axial_def = z.object({\n fn: z.string(),\n num_pins: z.any().transform(() => 2),\n p: length.optional().default(\"2.54mm\"),\n id: length.optional().default(\"0.7mm\"),\n od: length.optional().default(\"1mm\"),\n})\nexport type AxialDef = z.input<typeof axial_def>\n\nexport const axial = (\n raw_params: AxialDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = axial_def.parse(raw_params)\n\n const { p, id, od } = parameters\n\n const plated_holes = [\n platedhole(1, -p / 2, 0, id, od),\n platedhole(2, p / 2, 0, id, od),\n ]\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -p / 2 + od + id / 2, y: 0 },\n { x: p / 2 - od - id / 2, y: 0 },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, p / 4, 0.5)\n return {\n circuitJson: [\n ...plated_holes,\n silkscreenLine,\n silkscreenRefText as AnySoupElement,\n ],\n parameters,\n }\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { silkscreenpath } from \"../helpers/silkscreenpath\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const pushbutton_def = z.object({\n fn: z.literal(\"pushbutton\"),\n})\n\nexport const pushbutton = (\n raw_params: z.input<typeof pushbutton_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = pushbutton_def.parse(raw_params)\n\n const width = 4.5\n const height = 6.5\n const holeDiameter = 1\n\n const holes: AnyCircuitElement[] = [\n platedhole(1, -width / 2, height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(2, -width / 2, -height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(3, width / 2, -height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(4, width / 2, height / 2, holeDiameter, holeDiameter * 1.2),\n ]\n\n const silkscreenLines: AnyCircuitElement[] = [\n // Vertical lines indicating connections\n silkscreenpath([\n { x: -width / 2, y: -height / 2 },\n { x: -width / 2, y: height / 2 },\n ]),\n silkscreenpath([\n { x: width / 2, y: -height / 2 },\n { x: width / 2, y: height / 2 },\n ]),\n // Center indicating latch\n silkscreenpath([\n { x: -width / 2, y: 0 },\n { x: -width / 5, y: 0 },\n { x: ((width / 5) * 1) / Math.sqrt(2), y: height / 8 },\n ]),\n silkscreenpath([\n { x: width / 2, y: 0 },\n { x: width / 5, y: 0 },\n ]),\n ]\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n height / 2 + 0.4,\n 0.5,\n )\n return {\n circuitJson: [...holes, ...silkscreenLines, silkscreenRefText],\n parameters,\n }\n}\n","import type { PcbSilkscreenPath } from \"circuit-json\"\n\nexport const silkscreenpath = (\n route: Array<{ x: number; y: number }>,\n options: {\n stroke_width?: number\n layer?: string\n pcb_component_id?: string\n pcb_silkscreen_path_id?: string\n } = {},\n): PcbSilkscreenPath => {\n return {\n type: \"pcb_silkscreen_path\",\n layer: options.layer || \"top\",\n pcb_component_id: options.pcb_component_id || \"\",\n pcb_silkscreen_path_id: options.pcb_silkscreen_path_id || \"\",\n route,\n stroke_width: options.stroke_width || 0.1,\n }\n}\n","import {\n length,\n type AnyCircuitElement,\n type PcbPlatedHole,\n type PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const stampboard_def = z.object({\n fn: z.string(),\n w: length.default(\"22.58mm\"),\n left: length.optional(),\n right: length.optional(),\n top: length.optional(),\n bottom: length.optional(),\n p: length.default(length.parse(\"2.54mm\")),\n pw: length.default(length.parse(\"1.6mm\")),\n pl: length.default(length.parse(\"3.2mm\")),\n innerhole: z.boolean().default(false),\n})\n\nexport type Stampboard_def = z.input<typeof stampboard_def>\n\nconst getHeight = (parameters: Stampboard_def) => {\n const params = stampboard_def.parse(parameters)\n if (params.left && params.right) {\n return Math.max(params.left, params.right) * params.p\n }\n if (params.left) {\n return params.left * params.p\n }\n if (params.right) {\n return params.right * params.p\n }\n return 51 // Default height if no pins are provided\n}\n\nexport const stampboard = (\n raw_params: Stampboard_def,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const params = stampboard_def.parse(raw_params)\n const rectpads: AnyCircuitElement[] = []\n const holes: PcbPlatedHole[] = []\n let firstPinLocation: {\n x: number\n y: number\n } = { x: 0, y: 0 }\n let routes: { x: number; y: number }[] = []\n const innerDiameter = 1\n const outerDiameter = 1.2\n const triangleHeight = 1 // Adjust triangle size as needed\n const triangleWidth = 0.6 // Adjust triangle width as needed\n if (params.right) {\n const yoff = -((params.right - 1) / 2) * params.p\n for (let i = 0; i < params.right; i++) {\n if (i === 0 && !params.left && !params.bottom) {\n firstPinLocation = {\n x: params.w / 2 - params.pl * 1.4,\n y: yoff + i * params.p,\n }\n routes = [\n {\n x: firstPinLocation.x + triangleHeight / 2,\n y: firstPinLocation.y,\n }, // Tip of the triangle (pointing right)\n {\n x: firstPinLocation.x - triangleHeight / 2,\n y: firstPinLocation.y + triangleWidth / 2,\n }, // Bottom corner of the base\n {\n x: firstPinLocation.x - triangleHeight / 2,\n y: firstPinLocation.y - triangleWidth / 2,\n }, // Top corner of the base\n {\n x: firstPinLocation.x + triangleHeight / 2,\n y: firstPinLocation.y,\n }, // Close the path at the tip\n ]\n }\n rectpads.push(\n rectpad(\n i + 1,\n params.w / 2 - params.pl / 2,\n yoff + i * params.p,\n params.pl,\n params.pw,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1,\n params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1,\n params.w / 2 - params.pl + outerDiameter / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n if (params.left) {\n const yoff = -((params.left - 1) / 2) * params.p\n for (let i = 0; i < params.left; i++) {\n if (i === params.left - 1) {\n firstPinLocation = {\n x: -params.w / 2 + params.pl * 1.4,\n y: yoff + i * params.p,\n }\n routes = [\n {\n x: firstPinLocation.x - triangleHeight / 2,\n y: firstPinLocation.y,\n }, // Tip of the triangle (pointing left)\n {\n x: firstPinLocation.x + triangleHeight / 2,\n y: firstPinLocation.y + triangleWidth / 2,\n }, // Top corner of the base\n {\n x: firstPinLocation.x + triangleHeight / 2,\n y: firstPinLocation.y - triangleWidth / 2,\n }, // Bottom corner of the base\n {\n x: firstPinLocation.x - triangleHeight / 2,\n y: firstPinLocation.y,\n }, // Close the path at the tip\n ]\n }\n rectpads.push(\n rectpad(\n i + 1,\n -params.w / 2 + params.pl / 2,\n yoff + i * params.p,\n params.pl,\n params.pw,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1,\n -params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1,\n -params.w / 2 + params.pl - outerDiameter / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n if (params.top) {\n const xoff = -((params.top - 1) / 2) * params.p\n for (let i = 0; i < params.top; i++) {\n if (\n i === params.top - 1 &&\n !params.left &&\n !params.bottom &&\n !params.right\n ) {\n firstPinLocation = {\n x: xoff + i * params.p,\n y: getHeight(params) / 2 - params.pl * 1.4,\n }\n routes = [\n {\n x: firstPinLocation.x,\n y: firstPinLocation.y + triangleHeight / 2,\n }, // Tip of the triangle (pointing up)\n {\n x: firstPinLocation.x - triangleWidth / 2,\n y: firstPinLocation.y - triangleHeight / 2,\n }, // Left corner of the base\n {\n x: firstPinLocation.x + triangleWidth / 2,\n y: firstPinLocation.y - triangleHeight / 2,\n }, // Right corner of the base\n {\n x: firstPinLocation.x,\n y: firstPinLocation.y + triangleHeight / 2,\n }, // Close the path at the tip\n ]\n }\n rectpads.push(\n rectpad(\n i + 1,\n xoff + i * params.p,\n getHeight(params) / 2 - params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1,\n xoff + i * params.p,\n getHeight(params) / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1,\n xoff + i * params.p,\n getHeight(params) / 2 - params.pl + outerDiameter / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n if (params.bottom) {\n const xoff = -((params.bottom - 1) / 2) * params.p\n for (let i = 0; i < params.bottom; i++) {\n if (i === 0 && !params.left) {\n firstPinLocation = {\n x: xoff + i * params.p,\n y: -getHeight(params) / 2 + params.pl * 1.4,\n }\n routes = [\n {\n x: firstPinLocation.x,\n y: firstPinLocation.y - triangleHeight / 2,\n }, // Tip of the triangle (pointing down)\n {\n x: firstPinLocation.x - triangleWidth / 2,\n y: firstPinLocation.y + triangleHeight / 2,\n }, // Left corner of the base\n {\n x: firstPinLocation.x + triangleWidth / 2,\n y: firstPinLocation.y + triangleHeight / 2,\n }, // Right corner of the base\n {\n x: firstPinLocation.x,\n y: firstPinLocation.y - triangleHeight / 2,\n }, // Close the path at the tip\n ]\n }\n rectpads.push(\n rectpad(\n i + 1,\n xoff + i * params.p,\n -getHeight(params) / 2 + params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1,\n xoff + i * params.p,\n -getHeight(params) / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1,\n xoff + i * params.p,\n -getHeight(params) / 2 + params.pl - outerDiameter / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n\n const silkscreenTriangle: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"pcb_silkscreen_triangle_1\",\n pcb_component_id: \"2\",\n route: routes,\n stroke_width: 0.1,\n layer: \"top\",\n }\n\n const silkscreenPath: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"pcb_silkscreen_path_1\",\n pcb_component_id: \"1\",\n route: [\n { x: -params.w / 2, y: getHeight(params) / 2 },\n { x: params.w / 2, y: getHeight(params) / 2 },\n { x: params.w / 2, y: -getHeight(params) / 2 },\n { x: -params.w / 2, y: -getHeight(params) / 2 },\n { x: -params.w / 2, y: getHeight(params) / 2 },\n ],\n stroke_width: 0.1,\n layer: \"top\",\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n getHeight(params) / 2 + 0.5,\n getHeight(params) / 25,\n )\n return {\n circuitJson: [\n ...rectpads,\n ...holes,\n silkscreenPath,\n silkscreenTriangle,\n silkscreenRefText,\n ],\n parameters: params,\n }\n}\n","export function isNotNull<T>(value: T | null): value is T {\n return value !== null\n}\n","import * as FOOTPRINT_FN from \"./fn\"\nimport type { AnySoupElement } from \"@tscircuit/soup\"\nimport type { AnyCircuitElement } from \"circuit-json\"\nimport type { AnyFootprinterDefinitionOutput } from \"./helpers/zod/AnyFootprinterDefinitionOutput\"\nimport { isNotNull } from \"./helpers/is-not-null\"\n\nexport type FootprinterParamsBuilder<K extends string> = {\n [P in K | \"params\" | \"soup\"]: P extends \"params\" | \"soup\"\n ? Footprinter[P]\n : (v?: number | string) => FootprinterParamsBuilder<K>\n}\n\ntype CommonPassiveOptionKey =\n | \"metric\"\n | \"imperial\"\n | \"tht\"\n | \"p\"\n | \"pw\"\n | \"ph\"\n | \"w\"\n | \"h\"\n\nexport type Footprinter = {\n dip: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\" | \"wide\" | \"narrow\">\n cap: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n res: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n diode: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n led: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n lr: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"l\" | \"pl\" | \"pr\">\n qfp: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\" | \"wide\" | \"narrow\">\n quad: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\n \"w\" | \"l\" | \"square\" | \"pl\" | \"pr\" | \"pb\" | \"pt\" | \"p\" | \"pw\" | \"ph\"\n >\n bga: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\n \"grid\" | \"p\" | \"w\" | \"h\" | \"ball\" | \"pad\" | \"missing\"\n >\n qfn: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\">\n soic: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\">\n mlp: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\">\n ssop: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n tssop: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n dfn: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n pinrow: (num_pins: number) => FootprinterParamsBuilder<\"p\" | \"id\" | \"od\">\n axial: () => FootprinterParamsBuilder<\"p\" | \"id\" | \"od\">\n pushbutton: () => FootprinterParamsBuilder<\n \"tllabel\" | \"trlabel\" | \"bllabel\" | \"brlabel\"\n >\n stampboard: () => FootprinterParamsBuilder<\n \"w\" | \"left\" | \"right\" | \"top\" | \"bottom\" | \"p\" | \"pw\" | \"pl\" | \"innerhole\"\n >\n params: () => any\n /** @deprecated use circuitJson() instead */\n soup: () => AnySoupElement[]\n circuitJson: () => AnyCircuitElement[]\n json: () => AnyFootprinterDefinitionOutput[]\n}\n\nexport const string = (def: string): Footprinter => {\n let fp = footprinter()\n\n // special case: 0402, 0603, etc.\n if ((def.length === 4 || def.length === 5) && /^\\d+$/.test(def))\n def = `res${def}`\n\n const def_parts = def\n .split(\"_\")\n .map((s) => {\n const m = s.match(/([a-z]+)([\\(\\d\\.\\+\\?].*)?/)\n const [_, fn, v] = m ?? []\n if (v?.includes(\"?\")) return null\n return { fn: m?.[1]!, v: m?.[2]! }\n })\n .filter(isNotNull)\n\n for (const { fn, v } of def_parts) {\n fp = fp[fn](v)\n }\n\n fp.setString(def)\n\n return fp\n}\n\nexport const footprinter = (): Footprinter & {\n string: typeof string\n setString: (string) => void\n} => {\n const proxy = new Proxy(\n {},\n {\n get: (target: any, prop: string) => {\n // console.log(prop, target)\n if (prop === \"soup\" || prop === \"circuitJson\") {\n if (\"fn\" in target && FOOTPRINT_FN[target.fn]) {\n return () => FOOTPRINT_FN[target.fn](target).circuitJson\n }\n\n if (!FOOTPRINT_FN[target.fn]) {\n throw new Error(\n `Invalid footprint function, got \"${target.fn}\"${\n target.string ? `, from string \"${target.string}\"` : \"\"\n }`,\n )\n }\n\n return () => {\n // TODO improve error\n throw new Error(\n `No function found for footprinter, make sure to specify .dip, .lr, .p, etc. Got \"${prop}\"`,\n )\n }\n }\n if (prop === \"json\") {\n if (!FOOTPRINT_FN[target.fn]) {\n throw new Error(\n `Invalid footprint function, got \"${target.fn}\"${\n target.string ? `, from string \"${target.string}\"` : \"\"\n }`,\n )\n }\n return () => FOOTPRINT_FN[target.fn](target).parameters\n }\n if (prop === \"params\") {\n // TODO\n return () => target\n }\n if (prop === \"setString\") {\n return (v: string) => {\n target.string = v\n return proxy\n }\n }\n return (v: any) => {\n if (Object.keys(target).length === 0) {\n if (`${prop}${v}` in FOOTPRINT_FN) {\n target[`${prop}${v}`] = true\n target.fn = `${prop}${v}`\n } else {\n target[prop] = true\n target.fn = prop\n if (prop === \"res\" || prop === \"cap\") {\n if (v) {\n target.imperial = v // res0402, cap0603 etc.\n }\n } else {\n target.num_pins = Number.parseFloat(v)\n }\n }\n } else {\n // handle dip_w or other invalid booleans\n if (!v && [\"w\", \"h\", \"p\"].includes(prop as string)) {\n // ignore\n } else {\n target[prop] = v ?? true\n }\n }\n return proxy\n }\n },\n },\n )\n return proxy as any\n}\nfootprinter.string = string\n\nexport const fp = footprinter\n"],"mappings":"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","names":["mm","z","length","z","length","mm","z","length","distance","z","z","z","distance","length","z","length","z","length","z","length","z","z","length","z","z","z","length","z","length","z","z","z","z","length","z","z","length","z","z","length","z","z","length","fp"]}
1
+ {"version":3,"sources":["../src/fn/index.ts","../src/helpers/u-curve.ts","../src/helpers/platedhole.ts","../src/fn/dip.ts","../src/helpers/silkscreenRef.ts","../src/helpers/rectpad.ts","../src/helpers/passive-fn.ts","../src/fn/diode.ts","../src/fn/cap.ts","../src/fn/led.ts","../src/fn/res.ts","../src/helpers/zod/ALPHABET.ts","../src/fn/bga.ts","../src/helpers/zod/dim-2d.ts","../src/helpers/zod/function-call.ts","../src/fn/soic.ts","../src/fn/quad.ts","../src/helpers/zod/pin-order-specifier.ts","../src/helpers/get-quad-pin-map.ts","../src/fn/qfn.ts","../src/fn/qfp.ts","../src/fn/mlp.ts","../src/fn/ssop.ts","../src/fn/tssop.ts","../src/fn/sot236.ts","../src/fn/sot363.ts","../src/fn/sot23.ts","../src/fn/dfn.ts","../src/helpers/corner.ts","../src/fn/pinrow.ts","../src/fn/sot563.ts","../src/fn/ms012.ts","../src/fn/ms013.ts","../src/fn/sot723.ts","../src/fn/sod123.ts","../src/fn/axial.ts","../src/fn/pushbutton.ts","../src/helpers/silkscreenpath.ts","../src/fn/stampboard.ts","../src/fn/stampreceiver.ts","../src/helpers/is-not-null.ts","../src/footprinter.ts"],"sourcesContent":["export { dip } from \"./dip\"\nexport { diode } from \"./diode\"\nexport { cap } from \"./cap\"\nexport { led } from \"./led\"\nexport { res } from \"./res\"\nexport { bga } from \"./bga\"\nexport { soic } from \"./soic\"\nexport { quad } from \"./quad\"\nexport { qfn } from \"./qfn\"\nexport { qfp } from \"./qfp\"\nexport { mlp } from \"./mlp\"\nexport { ssop } from \"./ssop\"\nexport { tssop } from \"./tssop\"\nexport { sot236 } from \"./sot236\"\nexport { sot363 } from \"./sot363\"\nexport { sot23 } from \"./sot23\"\nexport { dfn } from \"./dfn\"\nexport { pinrow } from \"./pinrow\"\nexport { sot563 } from \"./sot563\"\nexport { ms012 } from \"./ms012\"\nexport { ms013 } from \"./ms013\"\nexport { sot723 } from \"./sot723\"\nexport { sod123 } from \"./sod123\"\nexport { axial } from \"./axial\"\nexport { pushbutton } from \"./pushbutton\"\nexport { stampboard } from \"./stampboard\"\nexport { stampreceiver } from \"./stampreceiver\"\n","export const u_curve = Array.from({ length: 9 }, (_, i) =>\n Math.cos((i / 8) * Math.PI - Math.PI),\n).map((x) => ({\n x,\n y: -Math.sqrt(1 - x ** 2),\n}))\n","import type { PcbPlatedHole } from \"circuit-json\"\nimport { mm } from \"@tscircuit/mm\"\n\nexport const platedhole = (\n pn: number,\n x: number,\n y: number,\n id: number | string,\n od: number | string,\n): PcbPlatedHole => {\n return {\n type: \"pcb_plated_hole\",\n shape: \"circle\",\n x,\n y,\n hole_diameter: mm(id),\n outer_diameter: mm(od),\n pcb_port_id: \"\",\n layers: [\"top\", \"bottom\"],\n port_hints: [pn.toString()],\n }\n}\n","import type {\n AnyCircuitElement,\n PcbFabricationNoteText,\n PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { u_curve } from \"../helpers/u-curve\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const extendDipDef = (newDefaults: { w?: string; p?: string }) =>\n z\n .object({\n fn: z.string(),\n dip: z.literal(true),\n num_pins: z.number(),\n wide: z.boolean().optional(),\n narrow: z.boolean().optional(),\n w: length.optional(),\n p: length.default(length.parse(newDefaults.p ?? \"2.54mm\")),\n id: length.optional(),\n od: length.optional(),\n })\n .transform((v) => {\n // Default inner diameter and outer diameter\n if (!v.id && !v.od) {\n v.id = length.parse(\"1.0mm\")\n v.od = length.parse(\"1.2mm\")\n } else if (!v.id) {\n v.id = v.od! * (1.0 / 1.2)\n } else if (!v.od) {\n v.od = v.id! * (1.2 / 1.0)\n }\n\n // Default width (TODO high pin counts should probably be wide?)\n if (!v.w) {\n if (v.wide) {\n v.w = length.parse(\"600mil\")\n } else if (v.narrow) {\n v.w = length.parse(\"300mil\")\n } else {\n v.w = length.parse(newDefaults.w ?? \"300mil\")\n }\n }\n return v as NowDefined<typeof v, \"w\" | \"p\" | \"id\" | \"od\">\n })\n\nexport const dip_def = extendDipDef({})\n\nexport const getCcwDipCoords = (\n pinCount: number,\n pn: number,\n w: number,\n p: number,\n) => {\n /** pin height */\n const ph = pinCount / 2\n const isLeft = pn <= ph\n\n /** Number of gaps between pins on each side, e.g. 4 pins = 3 spaces */\n const leftPinGaps = ph - 1\n\n /** gap size (pitch) */\n const gs = p\n\n const h = gs * leftPinGaps\n\n if (isLeft) {\n // The y position starts at h/2, then goes down by gap size\n // for each pin\n return { x: -w / 2, y: h / 2 - (pn - 1) * gs }\n } else {\n // The y position starts at -h/2, then goes up by gap size\n return { x: w / 2, y: -h / 2 + (pn - ph - 1) * gs }\n }\n}\n\n/**\n * Returns the plated holes for a DIP package.\n */\nexport const dip = (raw_params: {\n dip: true\n num_pins: number\n w: number\n p?: number\n id?: string | number\n od?: string | number\n}): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = dip_def.parse(raw_params)\n const platedHoles: AnyCircuitElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwDipCoords(\n parameters.num_pins,\n i + 1,\n parameters.w,\n parameters.p ?? 2.54,\n )\n platedHoles.push(\n platedhole(i + 1, x, y, parameters.id ?? \"0.8mm\", parameters.od ?? \"1mm\"),\n )\n }\n /** silkscreen width */\n const sw = parameters.w - parameters.od - 0.4\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.od + 0.4\n const silkscreenBorder: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: sh / 2 },\n // Little U shape at the top\n ...u_curve.map(({ x, y }) => ({\n x: (x * sw) / 6,\n y: (y * sw) / 6 + sh / 2,\n })),\n { x: sw / 2, y: sh / 2 },\n { x: sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: -sh / 2 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n const silkscreenPins: PcbFabricationNoteText[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const isLeft = i < parameters.num_pins / 2\n const pinLabelX = isLeft\n ? -parameters.w / 2 - parameters.p / 2 - 0.2\n : parameters.p / 2 + parameters.w / 2 + 0.2\n const pinLabelY = isLeft\n ? (-sh + 1.6) / 2 + i * parameters.p\n : (-sh + 1.6) / 2 + (i - parameters.num_pins / 2) * parameters.p\n const silkscreenPin = {\n type: \"pcb_fabrication_note_text\",\n layer: \"top\",\n pcb_component_id: `pin_${i + 1}`,\n pcb_silkscreen_text_id: `pin_${i + 1}`,\n text: `{pin${i + 1}}`,\n anchor_position: {\n x: pinLabelX,\n y: pinLabelY,\n },\n font_size: 0.3,\n font_color: \"red\",\n font: \"tscircuit2024\",\n anchor_alignment: \"top-left\",\n }\n\n silkscreenPins.push(silkscreenPin)\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, sh / 2 + 0.5, 0.4)\n\n return {\n circuitJson: [\n ...platedHoles,\n silkscreenBorder,\n silkscreenRefText,\n ...silkscreenPins,\n ],\n parameters,\n }\n}\n","import type { PcbSilkscreenText } from \"circuit-json\"\n\nexport const silkscreenRef: (\n x: number,\n y: number,\n font_size: number,\n) => PcbSilkscreenText = (x: number, y: number, font_size: number) => {\n return {\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: \"silkscreen_text_1\",\n font: \"tscircuit2024\",\n font_size: font_size,\n pcb_component_id: \"pcb_component_1\",\n text: \"{REF}\",\n layer: \"top\",\n anchor_position: { x: x, y: y },\n anchor_alignment: \"center\",\n }\n}\nexport type SilkscreenRef = ReturnType<typeof silkscreenRef>\n","import type { PCBSMTPad } from \"@tscircuit/soup\"\nexport const rectpad = (\n pn: number | Array<string | number>,\n x: number,\n y: number,\n w: number,\n h: number,\n): PCBSMTPad => {\n return {\n type: \"pcb_smtpad\",\n x,\n y,\n width: w,\n height: h,\n layer: \"top\",\n shape: \"rect\",\n pcb_smtpad_id: \"\",\n port_hints: Array.isArray(pn)\n ? pn.map((item) => item.toString())\n : [pn.toString()],\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport mm from \"@tscircuit/mm\"\nimport { platedhole } from \"./platedhole\"\nimport { z } from \"zod\"\nimport { length, distance } from \"circuit-json\"\nimport { type SilkscreenRef, silkscreenRef } from \"./silkscreenRef\"\n\ntype StandardSize = {\n imperial: string\n metric: string\n Z_mm_min: number\n G_mm_min: number\n X_mm_min: number\n C_mm_ref: number\n}\n\n// https://www.worthingtonassembly.com/perfect-0201-footprint\n// https://static1.squarespace.com/static/54982a02e4b02e9f5e5d9ca7/t/660c692f69a0d83a4afecdf0/1712089391915/Discrete+Component+Footprints.pdf\n// https://page.venkel.com/hubfs/Resources/Technical/Resistors%20Landing%20Pattern.pdf\nconst sizes = [\n {\n imperial: \"01005\",\n metric: \"0402\",\n Z_mm_min: 0.58,\n G_mm_min: 0.18,\n X_mm_min: 0.21,\n C_mm_ref: 0.038,\n },\n {\n imperial: \"0201\",\n metric: \"0603\",\n Z_mm_min: 0.9,\n G_mm_min: 0.3,\n X_mm_min: 0.3,\n C_mm_ref: 0.6,\n },\n {\n imperial: \"0402\",\n metric: \"1005\",\n Z_mm_min: 1.6,\n G_mm_min: 0.4,\n X_mm_min: 0.7,\n C_mm_ref: 1,\n },\n {\n imperial: \"0603\",\n metric: \"1608\",\n Z_mm_min: 2.6,\n G_mm_min: 0.6,\n X_mm_min: 1.0,\n C_mm_ref: 1.7,\n },\n {\n imperial: \"0805\",\n metric: \"2012\",\n Z_mm_min: 3.0,\n G_mm_min: 0.6,\n X_mm_min: 1.2,\n C_mm_ref: 1.9,\n },\n {\n imperial: \"1206\",\n metric: \"3216\",\n Z_mm_min: 4.2,\n G_mm_min: 1.2,\n X_mm_min: 1.4,\n C_mm_ref: 2.8,\n },\n {\n imperial: \"1210\",\n metric: \"3225\",\n Z_mm_min: 4.2,\n G_mm_min: 1.2,\n X_mm_min: 2.4,\n C_mm_ref: 2.8,\n },\n {\n imperial: \"2010\",\n metric: \"5025\",\n Z_mm_min: 6.0,\n G_mm_min: 2.6,\n X_mm_min: 2.4,\n C_mm_ref: 4.4,\n },\n {\n imperial: \"2512\",\n metric: \"6332\",\n Z_mm_min: 7.2,\n G_mm_min: 3.8,\n X_mm_min: 3.0,\n C_mm_ref: 5.6,\n },\n]\nconst metricMap: Record<string, StandardSize> = sizes.reduce((acc: any, s) => {\n acc[s.metric] = s\n return acc\n}, {})\nconst imperialMap: Record<string, StandardSize> = sizes.reduce(\n (acc: any, s) => {\n acc[s.imperial] = s\n return acc\n },\n {},\n)\n\nexport const passive_def = z.object({\n tht: z.boolean(),\n p: length,\n pw: length.optional(),\n ph: length.optional(),\n metric: distance.optional(),\n imperial: distance.optional(),\n w: length.optional(),\n h: length.optional(),\n})\n\nexport type PassiveDef = z.input<typeof passive_def>\n\nconst deriveXFromH = (h: number) => 0.079 * h ** 2 + 0.94 * h - 0.009\nconst deriveZFromW = (w: number) => 1.09 * w + 0.6\nconst deriveGFromW = (w: number) => 0.59 * w - 0.31\nconst deriveCFromW = (w: number) => -0.01 * w ** 2 + 0.94 * w + 0.03\n\nexport const passive = (params: PassiveDef): AnySoupElement[] => {\n let { tht, p, pw, ph, metric, imperial, w, h } = params\n\n if (typeof w === \"string\") w = mm(w)\n if (typeof h === \"string\") h = mm(h)\n if (typeof p === \"string\") p = mm(p)\n if (typeof pw === \"string\") pw = mm(pw)\n if (typeof ph === \"string\") ph = mm(ph)\n\n if (h! > w!) {\n throw new Error(\n \"height cannot be greater than width (rotated footprint not yet implemented)\",\n )\n }\n\n /** standard size */\n let sz: StandardSize | undefined\n if (metric) {\n sz = metricMap[metric]\n }\n\n if (imperial) {\n sz = imperialMap[imperial]\n }\n\n if (!sz && w && h && !pw && !ph) {\n sz = {\n imperial: \"custom\",\n metric: \"custom\",\n Z_mm_min: deriveZFromW(w),\n G_mm_min: deriveGFromW(w),\n X_mm_min: deriveXFromH(h),\n C_mm_ref: deriveCFromW(w),\n }\n }\n\n if (sz) {\n w = sz.Z_mm_min\n h = sz.X_mm_min\n p = sz.C_mm_ref\n pw = (sz.Z_mm_min - sz.G_mm_min) / 2\n ph = (sz.Z_mm_min - sz.G_mm_min) / 2\n }\n\n if (pw === undefined) throw new Error(\"could not infer pad width\")\n if (ph === undefined) throw new Error(\"could not infer pad width\")\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, h / 2, h / 12)\n if (tht) {\n return [\n platedhole(1, -p / 2, 0, pw, (pw * 1) / 0.8),\n platedhole(2, p / 2, 0, pw, (pw * 1) / 0.8),\n silkscreenRefText,\n ]\n } else {\n return [\n rectpad([\"1\", \"left\"], -p / 2, 0, pw, ph),\n rectpad([\"2\", \"right\"], p / 2, 0, pw, ph),\n silkscreenRefText,\n ]\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { passive } from \"src/helpers/passive-fn\"\n\nexport const diode = (parameters: {\n tht: boolean\n p: number\n}): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { type PassiveDef, passive } from \"../helpers/passive-fn\"\n\nexport const cap = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { type PassiveDef, passive } from \"../helpers/passive-fn\"\n\nexport const led = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { passive, type PassiveDef } from \"../helpers/passive-fn\"\n\nexport const res = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","export const ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n","import type { AnySoupElement, PCBSMTPad } from \"@tscircuit/soup\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { ALPHABET } from \"../helpers/zod/ALPHABET\"\nimport { z } from \"zod\"\nimport { length, distance } from \"@tscircuit/soup\"\nimport { dim2d } from \"src/helpers/zod/dim-2d\"\nimport { function_call } from \"src/helpers/zod/function-call\"\nimport type { NowDefined } from \"src/helpers/zod/now-defined\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const bga_def = z\n .object({\n fn: z.string(),\n num_pins: z.number(),\n grid: dim2d.optional(),\n p: distance.default(\"0.8mm\"),\n w: length.optional(),\n h: length.optional(),\n ball: length.optional().describe(\"ball diameter\"),\n pad: length.optional().describe(\"pad width/height\"),\n\n tlorigin: z.boolean().optional(),\n blorigin: z.boolean().optional(),\n trorigin: z.boolean().optional(),\n brorigin: z.boolean().optional(),\n\n missing: function_call.default([]),\n })\n .transform((a) => {\n let origin: \"tl\" | \"bl\" | \"tr\" | \"br\" = \"tl\"\n if (a.blorigin) origin = \"bl\"\n if (a.trorigin) origin = \"tr\"\n if (a.brorigin) origin = \"br\"\n\n if (!a.grid) {\n // find the largest square for the number of pins\n const largest_square = Math.ceil(Math.sqrt(a.num_pins))\n a.grid = { x: largest_square, y: largest_square }\n }\n\n if (a.missing) {\n a.missing = a.missing.map((s) => {\n if (typeof s === \"number\") return s\n if (s === \"center\") return \"center\"\n if (s === \"topleft\") return \"topleft\"\n const m = s.match(/([A-Z]+)(\\d+)/)\n if (!m) return s\n const Y = ALPHABET.indexOf(m[1]!)\n const X = Number.parseInt(m[2]!) - 1\n return Y * a.grid!.x + X + 1\n })\n }\n\n const new_def = { ...a, origin }\n\n return new_def as NowDefined<typeof new_def, \"w\" | \"h\" | \"grid\">\n })\n\nexport type BgaDefInput = z.input<typeof bga_def>\nexport type BgaDef = z.infer<typeof bga_def>\n\nexport const bga = (\n raw_params: BgaDefInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = bga_def.parse(raw_params)\n let { num_pins, grid, p, w, h, ball, pad, missing } = parameters\n\n ball ??= (0.75 / 1.27) * p\n\n pad ??= ball * 0.8\n\n const pads: PCBSMTPad[] = []\n\n const missing_pin_nums = (missing ?? []).filter((a) => typeof a === \"number\")\n const num_pins_missing = grid.x * grid.y - num_pins\n\n if (missing.length === 0 && num_pins_missing > 0) {\n // No missing pins specified, let's see if a squared center works\n // if num_pins_missing is a square\n if (Math.sqrt(num_pins_missing) % 1 === 0) {\n missing.push(\"center\")\n } else if (num_pins_missing === 1) {\n missing.push(\"topleft\")\n }\n }\n\n if (missing?.includes(\"center\")) {\n // Find the largest square that's square is less than\n // the number of missing pins\n const square_size = Math.floor(Math.sqrt(num_pins_missing))\n\n // Find the top left coordinate of the inner square, keep\n // in mind the full grid size is grid.x x grid.y\n const inner_square_x = Math.floor((grid.x - square_size) / 2)\n const inner_square_y = Math.floor((grid.y - square_size) / 2)\n\n // Add all the missing square pin numbers to missing_pin_nums\n for (let y = inner_square_y; y < inner_square_y + square_size; y++) {\n for (let x = inner_square_x; x < inner_square_x + square_size; x++) {\n missing_pin_nums.push(y * grid.x + x + 1)\n }\n }\n }\n\n if (missing?.includes(\"topleft\")) {\n missing_pin_nums.push(1)\n }\n\n if (num_pins_missing !== missing_pin_nums.length) {\n throw new Error(\n `not able to create bga component, unable to determine missing pins (try specifying them with \"missing+1+2+...\"\\n\\n${JSON.stringify(\n parameters,\n null,\n \" \",\n )}`,\n )\n }\n\n const missing_pin_nums_set = new Set(missing_pin_nums)\n\n let missing_pins_passed = 0\n for (let y = 0; y < grid.y; y++) {\n for (let x = 0; x < grid.x; x++) {\n let pin_num = y * grid.x + x + 1\n if (missing_pin_nums_set.has(pin_num)) {\n missing_pins_passed++\n continue\n }\n pin_num -= missing_pins_passed\n\n const pad_x = (x - (grid.x - 1) / 2) * p\n const pad_y = -(y - (grid.y - 1) / 2) * p\n\n // TODO handle >26 rows\n pads.push(\n rectpad([pin_num, `${ALPHABET[y]}${x + 1}`], pad_x, pad_y, pad, pad),\n )\n }\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n (grid.y * p) / 2,\n 0.2,\n )\n\n return {\n circuitJson: [...pads, silkscreenRefText as AnySoupElement],\n parameters,\n }\n}\n","import { z } from \"zod\"\n\nexport const dim2d = z\n .string()\n .transform((a) => {\n const [x, y] = a.split(/[x ]/)\n return {\n x: parseFloat(x),\n y: parseFloat(y),\n }\n })\n .pipe(\n z.object({\n x: z.number(),\n y: z.number(),\n }),\n )\n","import { z } from \"zod\"\n\nexport const function_call = z\n .string()\n .or(z.array(z.any()))\n .transform((a) => {\n if (Array.isArray(a)) return a\n if (a.startsWith(\"(\") && a.endsWith(\")\")) {\n a = a.slice(1, -1)\n }\n return a.split(\",\").map((v) => {\n const numVal = Number(v)\n return isNaN(numVal) ? v : numVal\n })\n })\n .pipe(z.array(z.string().or(z.number())))\n","import type { AnySoupElement, PcbSilkscreenPath } from \"@tscircuit/soup\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { z, type AnyZodObject } from \"zod\"\nimport { length } from \"@tscircuit/soup\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { u_curve } from \"../helpers/u-curve\"\nimport { rectpad } from \"src/helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nexport const extendSoicDef = (newDefaults: {\n w?: string\n p?: string\n legsoutside?: boolean\n}) =>\n z\n .object({\n fn: z.string(),\n num_pins: z.number(),\n w: length.default(length.parse(newDefaults.w ?? \"5.3mm\")),\n p: length.default(length.parse(newDefaults.p ?? \"1.27mm\")),\n pw: length.optional(),\n pl: length.optional(),\n legsoutside: z\n .boolean()\n .optional()\n .default(newDefaults.legsoutside ?? false),\n })\n .transform((v) => {\n // Default inner diameter and outer diameter\n if (!v.pw && !v.pl) {\n v.pw = length.parse(\"0.6mm\")\n v.pl = length.parse(\"1.0mm\")\n } else if (!v.pw) {\n v.pw = v.pl! * (0.6 / 1.0)\n } else if (!v.pl) {\n v.pl = v.pw! * (1.0 / 0.6)\n }\n\n return v as NowDefined<typeof v, \"w\" | \"p\" | \"pw\" | \"pl\">\n })\n\nexport const soic_def = extendSoicDef({})\nexport type SoicInput = z.infer<typeof soic_def>\n\nexport const getCcwSoicCoords = (parameters: {\n num_pins: number\n pn: number\n w: number\n p: number\n pl: number\n legsoutside?: boolean\n widthincludeslegs?: boolean\n}) => {\n if (parameters.widthincludeslegs !== undefined) {\n parameters.legsoutside = !parameters.widthincludeslegs\n }\n const { num_pins, pn, w, p, pl, legsoutside } = parameters\n /** pin height */\n const ph = num_pins / 2\n const isLeft = pn <= ph\n\n /** Number of gaps between pins on each side, e.g. 4 pins = 3 spaces */\n const leftPinGaps = ph - 1\n\n /** gap size (pitch) */\n const gs = p\n\n const h = gs * leftPinGaps\n\n const legoffset = legsoutside ? pl / 2 : -pl / 2\n\n if (isLeft) {\n // The y position starts at h/2, then goes down by gap size\n // for each pin\n return { x: -w / 2 - legoffset, y: h / 2 - (pn - 1) * gs }\n } else {\n // The y position starts at -h/2, then goes up by gap size\n return { x: w / 2 + legoffset, y: -h / 2 + (pn - ph - 1) * gs }\n }\n}\n\n/**\n * Returns the plated holes for a SOIC package.\n */\nexport const soic = (raw_params: {\n soic: true\n num_pins: number\n w: number\n p?: number\n id?: string | number\n od?: string | number\n}): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = soic_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters) as AnySoupElement[],\n parameters,\n }\n}\n\nexport const soicWithoutParsing = (parameters: z.infer<typeof soic_def>) => {\n const pads: AnySoupElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSoicCoords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n p: parameters.p ?? 1.27,\n pl: parameters.pl,\n legsoutside: parameters.legsoutside,\n })\n pads.push(\n rectpad(i + 1, x, y, parameters.pl ?? \"1mm\", parameters.pw ?? \"0.6mm\"),\n )\n }\n\n /** silkscreen width */\n const m = Math.min(1, parameters.p / 2)\n const sw =\n parameters.w - (parameters.legsoutside ? 0 : parameters.pl * 2) - 0.2\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw + m\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n sh / 2 + 0.4,\n sh / 12,\n )\n const silkscreenBorder: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n stroke_width: 0.1,\n route: [\n { x: -sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: sh / 2 },\n // Little U shape at the top\n ...u_curve.map(({ x, y }) => ({\n x: (x * sw) / 6,\n y: (y * sw) / 6 + sh / 2,\n })),\n { x: sw / 2, y: sh / 2 },\n { x: sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: -sh / 2 },\n ],\n }\n\n return [...pads, silkscreenBorder, silkscreenRefText] as AnySoupElement[]\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { length } from \"@tscircuit/soup\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { pin_order_specifier } from \"src/helpers/zod/pin-order-specifier\"\nimport { getQuadPinMap } from \"src/helpers/get-quad-pin-map\"\nimport { dim2d } from \"src/helpers/zod/dim-2d\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const base_quad_def = z.object({\n fn: z.string(),\n cc: z.literal(true).optional(),\n ccw: z.literal(true).optional(),\n startingpin: z\n .string()\n .or(z.array(pin_order_specifier))\n .transform((a) => (typeof a === \"string\" ? a.slice(1, -1).split(\",\") : a))\n .pipe(z.array(pin_order_specifier))\n .optional(),\n num_pins: z.number(),\n w: length.optional(),\n h: length.optional(),\n p: length.default(length.parse(\"0.5mm\")),\n pw: length.optional(),\n pl: length.optional(),\n thermalpad: z.union([z.literal(true), dim2d]).optional(),\n legsoutside: z.boolean().optional(),\n})\n\nexport const quadTransform = <T extends z.infer<typeof base_quad_def>>(\n v: T,\n) => {\n if (v.w && !v.h) {\n v.h = v.w\n } else if (!v.w && v.h) {\n v.w = v.h\n }\n\n const side_pin_count = v.num_pins / 4\n\n if (!v.p && !v.pw && !v.pl && v.w) {\n // HACK: This is wayyy underspecified\n const approx_pin_size_of_side = side_pin_count + 4\n v.p = v.w / approx_pin_size_of_side\n }\n\n if (!v.p && v.w && v.h && v.pw && v.pl) {\n // HACK: This is wayyy underspecified\n v.p = (v.w - v.pl * 2) / (side_pin_count - 1)\n }\n\n if (!v.w && !v.h && v.p) {\n // HACK: underspecified\n v.w = v.p * (side_pin_count + 4)\n v.h = v.w\n }\n\n if (v.p && !v.pw && !v.pl) {\n v.pw = v.p / 2\n v.pl = v.p / 2\n } else if (!v.pw) {\n v.pw = v.pl! * (0.6 / 1.0)\n } else if (!v.pl) {\n v.pl = v.pw! * (1.0 / 0.6)\n }\n\n return v as NowDefined<T, \"w\" | \"h\" | \"p\" | \"pw\" | \"pl\">\n}\n\nexport const quad_def = base_quad_def.transform(quadTransform)\n\nconst SIDES_CCW = [\"left\", \"bottom\", \"right\", \"top\"] as const\n\nexport const getQuadCoords = (params: {\n pin_count: number\n pn: number // pin number\n w: number // width of the package\n h: number // height (length) of the package\n p: number // pitch between pins\n pl: number // length of the pin\n legsoutside?: boolean\n}) => {\n const { pin_count, pn, w, h, p, pl, legsoutside } = params\n const sidePinCount = pin_count / 4\n const side = SIDES_CCW[Math.floor((pn - 1) / sidePinCount)]\n const pos = (pn - 1) % sidePinCount\n\n /** inner box width */\n const ibw = p * (sidePinCount - 1)\n /** inner box height */\n const ibh = p * (sidePinCount - 1)\n\n /** pad center distance from edge (negative is inside, positive is outside) */\n const pcdfe = legsoutside ? pl / 2 : -pl / 2\n\n switch (side) {\n case \"left\":\n return { x: -w / 2 - pcdfe, y: ibh / 2 - pos * p, o: \"vert\" }\n case \"bottom\":\n return { x: -ibw / 2 + pos * p, y: -h / 2 - pcdfe, o: \"horz\" }\n case \"right\":\n return { x: w / 2 + pcdfe, y: -ibh / 2 + pos * p, o: \"vert\" }\n case \"top\":\n return { x: ibw / 2 - pos * p, y: h / 2 + pcdfe, o: \"horz\" }\n default:\n throw new Error(\"Invalid pin number\")\n }\n}\n\nexport const quad = (\n raw_params: z.input<typeof quad_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = quad_def.parse(raw_params)\n const pads: AnySoupElement[] = []\n const pin_map = getQuadPinMap(parameters)\n /** Side pin count */\n const spc = parameters.num_pins / 4\n for (let i = 0; i < parameters.num_pins; i++) {\n const {\n x,\n y,\n o: orientation,\n } = getQuadCoords({\n pin_count: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n h: parameters.h,\n p: parameters.p ?? 0.5,\n pl: parameters.pl,\n legsoutside: parameters.legsoutside,\n })\n\n let pw = parameters.pw\n let pl = parameters.pl\n if (orientation === \"vert\") {\n ;[pw, pl] = [pl, pw]\n }\n\n const pn = pin_map[i + 1]!\n pads.push(rectpad(pn, x, y, pw, pl))\n }\n\n if (parameters.thermalpad) {\n if (typeof parameters.thermalpad === \"boolean\") {\n const ibw = parameters.p * (spc - 1) + parameters.pw\n const ibh = parameters.p * (spc - 1) + parameters.pw\n pads.push(rectpad([\"thermalpad\"], 0, 0, ibw, ibh))\n } else {\n pads.push(\n rectpad(\n [\"thermalpad\"],\n 0,\n 0,\n parameters.thermalpad.x,\n parameters.thermalpad.y,\n ),\n )\n }\n }\n\n // Silkscreen corners\n const silkscreen_corners: PcbSilkscreenPath[] = []\n for (const [corner, dx, dy] of [\n [\"top-left\", -1, 1],\n [\"bottom-left\", -1, -1],\n [\"bottom-right\", 1, -1],\n [\"top-right\", 1, 1],\n ] as const) {\n // const dx = Math.floor(corner_index / 2) * 2 - 1\n // const dy = 1 - (corner_index % 2) * 2\n const corner_x = (parameters.w / 2) * dx\n const corner_y = (parameters.h / 2) * dy\n let arrow: \"none\" | \"in1\" | \"in2\" = \"none\"\n\n let arrow_x = corner_x\n let arrow_y = corner_y\n\n /** corner size */\n const csz = parameters.pw * 2\n\n if (pin_map[1] === 1 && corner === \"top-left\") {\n arrow = \"in1\"\n } else if (pin_map[spc * 4] === 1 && corner === \"top-left\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 3 + 1] === 1 && corner === \"top-right\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 3] === 1 && corner === \"top-right\") {\n arrow = \"in1\"\n } else if (pin_map[spc] === 1 && corner === \"bottom-left\") {\n arrow = \"in1\"\n } else if (pin_map[spc + 1] === 1 && corner === \"bottom-left\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 2] === 1 && corner === \"bottom-right\") {\n arrow = \"in1\"\n } else if (pin_map[spc * 2 + 1] === 1 && corner === \"bottom-right\") {\n arrow = \"in2\"\n }\n\n const rotate_arrow = arrow === \"in1\" ? 1 : -1\n if (parameters.legsoutside) {\n const arrow_dx = arrow === \"in1\" ? parameters.pl / 2 : parameters.pw / 2\n const arrow_dy = arrow === \"in1\" ? parameters.pw / 2 : parameters.pl / 2\n arrow_x += arrow_dx * dx * rotate_arrow\n arrow_y -= arrow_dy * dy * rotate_arrow\n }\n\n // Normal Corner\n if (arrow === \"none\" || parameters.legsoutside) {\n silkscreen_corners.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}`,\n route: [\n {\n x: corner_x - csz * dx,\n y: corner_y,\n },\n {\n x: corner_x,\n y: corner_y,\n },\n {\n x: corner_x,\n y: corner_y - csz * dy,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n })\n }\n\n // Two lines nearly forming a corner, used when the arrow needs to overlap\n // the corne (QFN components where legs are inside)\n if ((arrow === \"in1\" || arrow === \"in2\") && !parameters.legsoutside) {\n silkscreen_corners.push(\n {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_1`,\n route: [\n {\n x: corner_x - csz * dx,\n y: corner_y,\n },\n {\n x: corner_x - (csz * dx) / 2,\n y: corner_y,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0,\n },\n {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_2`,\n route: [\n {\n x: corner_x,\n y: corner_y - (csz * dy) / 2,\n },\n {\n x: corner_x,\n y: corner_y - csz * dy,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n },\n )\n }\n if (arrow === \"in1\" || arrow === \"in2\") {\n silkscreen_corners.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_3`,\n route: [\n {\n x: arrow_x - 0.2 * -dx,\n y: arrow_y + 0.2 * rotate_arrow,\n },\n {\n x: arrow_x,\n y: arrow_y,\n },\n {\n x: arrow_x + 0.2 * rotate_arrow * -dx,\n y: arrow_y + 0.2,\n },\n {\n x: arrow_x - 0.2 * -dx,\n y: arrow_y + 0.2 * rotate_arrow,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n })\n }\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n parameters.h / 2 + (parameters.legsoutside ? parameters.pl * 1.2 : 0.5),\n 0.3,\n )\n return {\n circuitJson: [\n ...pads,\n ...silkscreen_corners,\n silkscreenRefText,\n ] as AnySoupElement[],\n parameters,\n }\n}\n","import { z } from \"zod\"\nexport const pin_order_specifier = z.enum([\n \"leftside\",\n \"topside\",\n \"rightside\",\n \"bottomside\",\n \"toppin\",\n \"bottompin\",\n \"leftpin\",\n \"rightpin\",\n])\n\nexport type PinOrderSpecifier = z.infer<typeof pin_order_specifier>\n","import type { PinOrderSpecifier } from \"./zod/pin-order-specifier\"\n\n/**\n * A counter-clockwise pin map is [1,2,3,4,5,6,7,8] for an 8-pin package\n *\n * 8 7\n * 1 6\n * 2 5\n * 3 4\n *\n * Given some parameters, we're returning how to map the pins in a quad package\n * with a different order. For example, if we pass in cw=true, we'll get the\n * following mapping\n *\n * 1 -> 1\n * 2 -> 8\n * 3 -> 7\n * 4 -> 6\n * 5 -> 5\n * 6 -> 4\n * 7 -> 3\n * 8 -> 2\n *\n * Which allows us to create the CW version of the package using...\n * new_pin = pin_map[normal_ccw_pin]\n *\n * 2 3\n * 1 4\n * 8 5\n * 7 6\n */\nexport const getQuadPinMap = ({\n num_pins,\n cw,\n ccw,\n startingpin,\n}: {\n num_pins: number\n cw?: boolean\n ccw?: boolean\n startingpin?: PinOrderSpecifier[]\n}): number[] => {\n const pin_map: number[] = []\n const pins_per_side = num_pins / 4\n let current_position_ccw_normal = 1\n\n /** Starting Flag Pins */\n const sfp: Record<PinOrderSpecifier, boolean> = {} as any\n for (const specifier of startingpin ?? []) {\n sfp[specifier] = true\n }\n if (!sfp.leftside && !sfp.topside && !sfp.rightside && !sfp.bottomside) {\n sfp.leftside = true\n }\n if (!sfp.bottompin && !sfp.leftpin && !sfp.rightpin && !sfp.toppin) {\n if (sfp.leftside) {\n sfp.toppin = true\n } else if (sfp.topside) {\n sfp.rightpin = true\n } else if (sfp.rightside) {\n sfp.bottompin = true\n } else if (sfp.bottomside) {\n sfp.leftpin = true\n }\n }\n\n if (sfp.leftside && sfp.toppin) {\n current_position_ccw_normal = 1\n } else if (sfp.leftside && sfp.bottompin) {\n current_position_ccw_normal = pins_per_side\n } else if (sfp.bottomside && sfp.leftpin) {\n current_position_ccw_normal = pins_per_side + 1\n } else if (sfp.bottomside && sfp.rightpin) {\n current_position_ccw_normal = pins_per_side * 2\n } else if (sfp.rightside && sfp.bottompin) {\n current_position_ccw_normal = pins_per_side * 2 + 1\n } else if (sfp.rightside && sfp.toppin) {\n current_position_ccw_normal = pins_per_side * 3\n } else if (sfp.topside && sfp.rightpin) {\n current_position_ccw_normal = pins_per_side * 3 + 1\n } else if (sfp.topside && sfp.leftpin) {\n current_position_ccw_normal = pins_per_side * 4\n }\n\n pin_map.push(-1) // the first index is meaningless\n\n // Each iteration we move the current position to the next pin, if we're\n // going CCW this means incrementing, if we're going CW this means\n // decrementing\n for (let i = 0; i < num_pins; i++) {\n pin_map[current_position_ccw_normal] = i + 1\n if (ccw || !cw) {\n current_position_ccw_normal++\n if (current_position_ccw_normal > num_pins) {\n current_position_ccw_normal = 1\n }\n } else {\n current_position_ccw_normal--\n if (current_position_ccw_normal < 1) {\n current_position_ccw_normal = num_pins\n }\n }\n }\n\n return pin_map\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { base_quad_def, quad, quad_def, quadTransform } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const qfn_def = base_quad_def.extend({}).transform(quadTransform)\n\nexport const qfn = (\n parameters: z.input<typeof qfn_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n parameters.legsoutside = false\n return quad(parameters)\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { quad, quad_def } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const qfp_def = quad_def\n\nexport const qfp = (\n raw_params: z.input<typeof quad_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n raw_params.legsoutside = true\n\n const quad_defaults = quad_def.parse(raw_params)\n if (!raw_params.p) {\n switch (raw_params.num_pins) {\n case 44:\n case 64:\n raw_params.p = 0.8\n break\n case 52:\n if (raw_params.w === 14) raw_params.p = 1\n else raw_params.p = 0.65\n break\n case 208:\n raw_params.p = 0.5\n break\n }\n }\n if (!raw_params.pl) {\n switch (raw_params.num_pins) {\n case 44:\n case 52:\n case 64:\n raw_params.pl = 2.25\n break\n case 208:\n raw_params.pl = 1.65\n break\n default:\n raw_params.pl = quad_defaults.pl * 4\n break\n }\n }\n if (!raw_params.pw) {\n switch (raw_params.num_pins) {\n case 44:\n case 64:\n raw_params.pw = 0.5\n break\n case 52:\n if (raw_params.w === 14) raw_params.pw = 0.45\n else raw_params.pw = 0.55\n break\n case 208:\n raw_params.pw = 0.3\n break\n default:\n raw_params.pw = quad_defaults.pw\n break\n }\n }\n return quad(raw_params)\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { base_quad_def, quad, quad_def, quadTransform } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const mlp_def = base_quad_def.extend({}).transform(quadTransform)\n\nexport const mlp = (\n parameters: z.input<typeof mlp_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n parameters.legsoutside = false\n if (parameters.thermalpad === undefined) {\n parameters.thermalpad = true\n }\n return quad(parameters)\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing, type SoicInput } from \"./soic\"\n\n// TODO we should accept MS-012 or MS-013\n\nexport const ssop_def = extendSoicDef({\n w: \"3.9mm\",\n p: \"1.27mm\",\n})\n\nexport const ssop = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = ssop_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing, type SoicInput } from \"./soic\"\n\nexport const tssop_def = extendSoicDef({\n w: \"6.1mm\",\n p: \"0.65mm\",\n legsoutside: true,\n})\n\nexport const tssop = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = tssop_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot236_def = extendSoicDef({\n p: \"0.95mm\",\n w: \"1.6mm\",\n legsoutside: true,\n})\n\nexport const sot236 = (\n raw_params: z.input<typeof sot236_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot236_def.parse({ ...raw_params, num_pins: 6 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot363_def = extendSoicDef({})\n\nexport const sot363 = (\n raw_params: z.input<typeof sot363_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot363_def.parse({\n fn: \"sot363\",\n num_pins: 6,\n w: 1.94,\n p: 0.65,\n pw: 0.3,\n pl: 0.7,\n legoutside: true,\n })\n\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const sot23_def = z.object({\n fn: z.string(),\n num_pins: z.number().default(3),\n w: z.string().default(\"1.92mm\"),\n h: z.string().default(\"2.74mm\"),\n pl: z.string().default(\"0.8mm\"),\n pw: z.string().default(\"0.764mm\"),\n})\n\nexport const sot23 = (\n raw_params: z.input<typeof sot23_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot23_def.parse(raw_params)\n return {\n circuitJson: sot23WithoutParsing(parameters),\n parameters: parameters,\n }\n}\n\nexport const getCcwSot23Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n}) => {\n const { pn, w, h, pl } = parameters\n\n if (pn === 1) {\n return { x: -1.7, y: 0 }\n } else if (pn === 2) {\n return { x: 1.7, y: -0.95 }\n } else {\n return { x: 1.7, y: 0.95 }\n }\n}\n\nexport const sot23WithoutParsing = (parameters: z.infer<typeof sot23_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSot23Coords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: Number.parseFloat(parameters.w),\n h: Number.parseFloat(parameters.h),\n pl: Number.parseFloat(parameters.pl),\n })\n pads.push(\n rectpad(\n i + 1,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n Number(parameters.h),\n 0.3,\n )\n return [...pads, silkscreenRefText as AnySoupElement]\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"@tscircuit/soup\"\nimport {\n extendSoicDef,\n soicWithoutParsing,\n type SoicInput,\n getCcwSoicCoords,\n} from \"./soic\"\nimport { rectpad } from \"src/helpers/rectpad\"\nimport { z } from \"zod\"\nimport { CORNERS } from \"src/helpers/corner\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const dfn_def = extendSoicDef({})\n\n/**\n * Dual Flat No-lead\n *\n * Similar to SOIC but different silkscreen\n */\nexport const dfn = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = dfn_def.parse(raw_params)\n const pads: AnySoupElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSoicCoords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n p: parameters.p ?? 1.27,\n pl: parameters.pl,\n widthincludeslegs: true,\n })\n pads.push(\n rectpad(i + 1, x, y, parameters.pl ?? \"1mm\", parameters.pw ?? \"0.6mm\"),\n )\n }\n\n // The silkscreen is 4 corners and an arrow identifier for pin1\n const m = Math.min(1, parameters.p / 2)\n const sw = parameters.w + m\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw + m\n const silkscreenPaths: PcbSilkscreenPath[] = []\n\n for (const corner of CORNERS) {\n const { dx, dy } = corner\n silkscreenPaths.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"\",\n route: [\n { x: (dx * sw) / 2 - dx * parameters.p, y: (dy * sh) / 2 },\n { x: (dx * sw) / 2, y: (dy * sh) / 2 },\n { x: (dx * sw) / 2, y: (dy * sh) / 2 - dy * parameters.p },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n })\n }\n\n // Arrow\n /** arrow size */\n const as = parameters.p / 4\n /** Arrow tip x */\n const atx = -sw / 2 - as / 2\n /** Arrow tip y */\n const aty = sh / 2 - parameters.p / 2\n\n silkscreenPaths.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"\",\n type: \"pcb_silkscreen_path\",\n route: [\n {\n x: atx,\n y: aty,\n },\n {\n x: atx - as,\n y: aty + as,\n },\n {\n x: atx - as,\n y: aty - as,\n },\n {\n x: atx,\n y: aty,\n },\n ],\n stroke_width: 0.1,\n })\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n sh / 2 + 0.4,\n sh / 12,\n )\n return {\n circuitJson: [\n ...pads,\n silkscreenRefText,\n ...silkscreenPaths,\n ] as AnySoupElement[],\n parameters,\n }\n}\n","export const CORNERS = [\n { name: \"top-left\", dx: -1, dy: 1 },\n { name: \"top-right\", dx: 1, dy: 1 },\n { name: \"bottom-left\", dx: -1, dy: -1 },\n { name: \"bottom-right\", dx: 1, dy: -1 },\n]\n","import { z } from \"zod\"\nimport { length, type AnySoupElement } from \"@tscircuit/soup\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const pinrow_def = z.object({\n fn: z.string(),\n num_pins: z.number(),\n p: length.default(\"0.1in\").describe(\"pitch\"),\n id: length.default(\"1.0mm\").describe(\"inner diameter\"),\n od: length.default(\"1.2mm\").describe(\"outer diameter\"),\n})\n\nexport const pinrow = (\n raw_params: z.input<typeof pinrow_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = pinrow_def.parse(raw_params)\n const { p, id, od } = parameters\n const holes: any[] = []\n /** num_spaces */\n const ns = parameters.num_pins - 1\n const xoff = -(ns / 2) * p\n\n for (let i = 0; i < parameters.num_pins; i++) {\n holes.push(platedhole(i + 1, xoff + i * p, 0, id, od))\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, p / 2, 0.5)\n return {\n circuitJson: [...holes, silkscreenRefText] as AnySoupElement[],\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot563_def = extendSoicDef({})\n\nexport const sot563 = (\n raw_params: z.input<typeof sot563_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot563_def.parse({\n fn: \"sot563\",\n num_pins: 6,\n w: 1.94,\n p: 0.5,\n pw: 0.3,\n pl: 0.67,\n legoutside: true,\n })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const ms012_def = extendSoicDef({\n p: \"1.27mm\",\n w: \"3.9mm\",\n legsoutside: true,\n})\n\nexport const ms012 = (\n raw_params: z.input<typeof ms012_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = ms012_def.parse({ ...raw_params, num_pins: 8 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const ms013_def = extendSoicDef({\n p: \"1.27mm\",\n w: \"7.5mm\",\n legsoutside: true,\n})\n\nexport const ms013 = (\n raw_params: z.input<typeof ms013_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = ms013_def.parse({ ...raw_params, num_pins: 16 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const sot723_def = z.object({\n fn: z.string(),\n num_pins: z.number().default(3),\n w: z.string().default(\"1.2mm\"),\n h: z.string().default(\"1.2mm\"),\n pl: z.string().default(\"0.3mm\"),\n pw: z.string().default(\"0.32mm\"),\n})\n\nexport const sot723 = (\n raw_params: z.input<typeof sot723_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot723_def.parse(raw_params)\n const pad = sot723WithoutParsing(parameters)\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n Number(parameters.h),\n 0.3,\n )\n return {\n circuitJson: [...pad, silkscreenRefText as AnySoupElement],\n parameters,\n }\n}\n\nexport const getCcwSot723Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n}) => {\n const { pn, w, h, pl } = parameters\n\n if (pn === 1) {\n return { x: 0, y: 0 }\n } else if (pn === 2) {\n return { x: 1, y: -0.4 }\n } else {\n return { x: 1, y: 0.4 }\n }\n}\n\nexport const sot723WithoutParsing = (\n parameters: z.infer<typeof sot723_def>,\n) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 0; i < 3; i++) {\n const { x, y } = getCcwSot723Coords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: Number.parseFloat(parameters.w),\n h: Number.parseFloat(parameters.h),\n pl: Number.parseFloat(parameters.pl),\n })\n pads.push(\n rectpad(\n i + 1,\n x,\n y,\n Number.parseFloat(parameters.pl),\n i !== 0 ? Number.parseFloat(parameters.pw) : 0.42,\n ),\n )\n }\n\n return pads\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\n\nexport const sod_def = z.object({\n fn: z.string(),\n w: z.string().default(\"2.36mm\"),\n h: z.string().default(\"1.22mm\"),\n pl: z.string().default(\"0.9mm\"),\n pw: z.string().default(\"0.9mm\"),\n pad_spacing: z.string().default(\"4.19mm\"),\n})\n\nexport const sod123 = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n Number(parameters.h) / 4 + 0.4,\n 0.3,\n )\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\nexport const getSodCoords = (parameters: {\n pn: number\n pad_spacing: number\n}) => {\n const { pn, pad_spacing } = parameters\n\n if (pn === 1) {\n return { x: -pad_spacing / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: pad_spacing / 2, y: 0 }\n }\n}\n\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 0; i < 2; i++) {\n const { x, y } = getSodCoords({\n pn: i + 1,\n pad_spacing: Number.parseFloat(parameters.pad_spacing),\n })\n pads.push(\n rectpad(\n i + 1,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import {\n length,\n type AnySoupElement,\n type PcbSilkscreenLine,\n type PcbSilkscreenPath,\n} from \"@tscircuit/soup\"\nimport { passive, type PassiveDef } from \"../helpers/passive-fn\"\nimport { z } from \"zod\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\n\nexport const axial_def = z.object({\n fn: z.string(),\n num_pins: z.any().transform(() => 2),\n p: length.optional().default(\"2.54mm\"),\n id: length.optional().default(\"0.7mm\"),\n od: length.optional().default(\"1mm\"),\n})\nexport type AxialDef = z.input<typeof axial_def>\n\nexport const axial = (\n raw_params: AxialDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = axial_def.parse(raw_params)\n\n const { p, id, od } = parameters\n\n const plated_holes = [\n platedhole(1, -p / 2, 0, id, od),\n platedhole(2, p / 2, 0, id, od),\n ]\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -p / 2 + od + id / 2, y: 0 },\n { x: p / 2 - od - id / 2, y: 0 },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, p / 4, 0.5)\n return {\n circuitJson: [\n ...plated_holes,\n silkscreenLine,\n silkscreenRefText as AnySoupElement,\n ],\n parameters,\n }\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { silkscreenpath } from \"../helpers/silkscreenpath\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const pushbutton_def = z.object({\n fn: z.literal(\"pushbutton\"),\n})\n\nexport const pushbutton = (\n raw_params: z.input<typeof pushbutton_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = pushbutton_def.parse(raw_params)\n\n const width = 4.5\n const height = 6.5\n const holeDiameter = 1\n\n const holes: AnyCircuitElement[] = [\n platedhole(1, -width / 2, height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(2, -width / 2, -height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(3, width / 2, -height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(4, width / 2, height / 2, holeDiameter, holeDiameter * 1.2),\n ]\n\n const silkscreenLines: AnyCircuitElement[] = [\n // Vertical lines indicating connections\n silkscreenpath([\n { x: -width / 2, y: -height / 2 },\n { x: -width / 2, y: height / 2 },\n ]),\n silkscreenpath([\n { x: width / 2, y: -height / 2 },\n { x: width / 2, y: height / 2 },\n ]),\n // Center indicating latch\n silkscreenpath([\n { x: -width / 2, y: 0 },\n { x: -width / 5, y: 0 },\n { x: ((width / 5) * 1) / Math.sqrt(2), y: height / 8 },\n ]),\n silkscreenpath([\n { x: width / 2, y: 0 },\n { x: width / 5, y: 0 },\n ]),\n ]\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n height / 2 + 0.4,\n 0.5,\n )\n return {\n circuitJson: [...holes, ...silkscreenLines, silkscreenRefText],\n parameters,\n }\n}\n","import type { PcbSilkscreenPath } from \"circuit-json\"\n\nexport const silkscreenpath = (\n route: Array<{ x: number; y: number }>,\n options: {\n stroke_width?: number\n layer?: string\n pcb_component_id?: string\n pcb_silkscreen_path_id?: string\n } = {},\n): PcbSilkscreenPath => {\n return {\n type: \"pcb_silkscreen_path\",\n layer: options.layer || \"top\",\n pcb_component_id: options.pcb_component_id || \"\",\n pcb_silkscreen_path_id: options.pcb_silkscreen_path_id || \"\",\n route,\n stroke_width: options.stroke_width || 0.1,\n }\n}\n","import {\n length,\n type AnyCircuitElement,\n type PcbPlatedHole,\n type PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const stampboard_def = z.object({\n fn: z.string(),\n w: length.default(\"22.58mm\"),\n left: length.optional(),\n right: length.optional(),\n top: length.optional(),\n bottom: length.optional(),\n p: length.default(length.parse(\"2.54mm\")),\n pw: length.default(length.parse(\"1.6mm\")),\n pl: length.default(length.parse(\"2.4mm\")),\n innerhole: z.boolean().default(false),\n innerholeedgedistance: length.default(length.parse(\"1.61mm\")),\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 rectpads: AnyCircuitElement[] = []\n const holes: PcbPlatedHole[] = []\n let routes: { x: number; y: number }[] = []\n const innerDiameter = 1\n const outerDiameter = 1.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 (i === 0 && !params.left && !params.bottom) {\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,\n params.w / 2 - params.pl / 2,\n yoff + i * params.p,\n params.pl,\n params.pw,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1,\n params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1,\n params.w / 2 - params.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 === params.left - 1) {\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.innerhole) {\n holes.push(\n platedhole(\n i + 1,\n -params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1,\n -params.w / 2 + params.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 === params.top - 1 &&\n !params.left &&\n !params.bottom &&\n !params.right\n ) {\n routes = getTriangleDir(\n xoff + i * params.p,\n getHeight(params) / 2 - params.pl * 1.4,\n \"top\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1,\n xoff + i * params.p,\n getHeight(params) / 2 - params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1,\n xoff + i * params.p,\n getHeight(params) / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1,\n xoff + i * params.p,\n getHeight(params) / 2 - params.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) {\n routes = getTriangleDir(\n xoff + i * params.p,\n -getHeight(params) / 2 + params.pl * 1.4,\n \"bottom\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1,\n xoff + i * params.p,\n -getHeight(params) / 2 + params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1,\n xoff + i * params.p,\n -getHeight(params) / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1,\n xoff + i * params.p,\n -getHeight(params) / 2 + params.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: getHeight(params) / 2 },\n { x: params.w / 2, y: getHeight(params) / 2 },\n { x: params.w / 2, y: -getHeight(params) / 2 },\n { x: -params.w / 2, y: -getHeight(params) / 2 },\n { x: -params.w / 2, y: getHeight(params) / 2 },\n ],\n stroke_width: 0.1,\n layer: \"top\",\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n getHeight(params) / 1.8,\n getHeight(params) / 25,\n )\n return {\n circuitJson: [\n ...rectpads,\n ...holes,\n silkscreenPath,\n silkscreenTriangle,\n silkscreenRefText,\n ],\n parameters: params,\n }\n}\n","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\"\n\nexport const stampreceiver_def = z.object({\n fn: z.string(),\n w: length.default(\"22.58mm\"),\n left: length.optional(),\n right: length.optional(),\n top: length.optional(),\n bottom: length.optional(),\n p: length.default(length.parse(\"2.54mm\")),\n pw: length.default(length.parse(\"1.6mm\")),\n pl: length.default(length.parse(\"3.2mm\")),\n innerhole: z.boolean().default(false),\n innerholeedgedistance: length.default(length.parse(\"1.61mm\")),\n})\n\nexport type Stampreceiver_def = z.input<typeof stampreceiver_def>\n\nconst getHeight = (parameters: Stampreceiver_def) => {\n const params = stampreceiver_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 === \"left\") {\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 === \"right\") {\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 === \"bottom\") {\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 === \"top\") {\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}\nexport const stampreceiver = (\n raw_params: Stampreceiver_def,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const params = stampreceiver_def.parse(raw_params)\n const rectpads: AnyCircuitElement[] = []\n const holes: PcbPlatedHole[] = []\n const innerDiameter = 1\n const outerDiameter = 1.2\n let routes: { 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 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,\n params.w / 2 - params.pl / 2,\n yoff + i * params.p,\n params.pl,\n params.pw,\n ),\n )\n params.innerhole &&\n holes.push(\n platedhole(\n i + 1,\n params.w / 2 - params.innerholeedgedistance,\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 routes = getTriangleDir(\n -params.w / 2 - params.pl / 3,\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 params.innerhole &&\n holes.push(\n platedhole(\n i + 1,\n -params.w / 2 + params.innerholeedgedistance,\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 routes = getTriangleDir(\n xoff + i * params.p,\n getHeight(params) / 2 + params.pl * 1.4,\n \"top\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1,\n xoff + i * params.p,\n getHeight(params) / 2 - params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n params.innerhole &&\n holes.push(\n platedhole(\n i + 1,\n xoff + i * params.p,\n getHeight(params) / 2 - params.innerholeedgedistance,\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 routes = getTriangleDir(\n xoff + i * params.p,\n -getHeight(params) / 2 - params.pl * 1.4,\n \"bottom\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1,\n xoff + i * params.p,\n -getHeight(params) / 2 + params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n params.innerhole &&\n holes.push(\n platedhole(\n i + 1,\n xoff + i * params.p,\n -getHeight(params) / 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: getHeight(params) / 2 + params.pl / 3,\n },\n {\n x: params.w / 2 + params.pl / 3,\n y: getHeight(params) / 2 + params.pl / 3,\n },\n {\n x: params.w / 2 + params.pl / 3,\n y: -getHeight(params) / 2 - params.pl / 3,\n },\n {\n x: -params.w / 2 - params.pl / 3,\n y: -getHeight(params) / 2 - params.pl / 3,\n },\n {\n x: -params.w / 2 - params.pl / 3,\n y: getHeight(params) / 2 + params.pl / 3,\n },\n ],\n stroke_width: 0.1,\n layer: \"top\",\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n getHeight(params) / 1.8,\n getHeight(params) / 25,\n )\n return {\n circuitJson: [\n ...holes,\n ...rectpads,\n silkscreenPath,\n silkscreenTriangle,\n silkscreenRefText,\n ],\n parameters: params,\n }\n}\n","export function isNotNull<T>(value: T | null): value is T {\n return value !== null\n}\n","import * as FOOTPRINT_FN from \"./fn\"\nimport type { AnySoupElement } from \"@tscircuit/soup\"\nimport type { AnyCircuitElement } from \"circuit-json\"\nimport type { AnyFootprinterDefinitionOutput } from \"./helpers/zod/AnyFootprinterDefinitionOutput\"\nimport { isNotNull } from \"./helpers/is-not-null\"\n\nexport type FootprinterParamsBuilder<K extends string> = {\n [P in K | \"params\" | \"soup\"]: P extends \"params\" | \"soup\"\n ? Footprinter[P]\n : (v?: number | string) => FootprinterParamsBuilder<K>\n}\n\ntype CommonPassiveOptionKey =\n | \"metric\"\n | \"imperial\"\n | \"tht\"\n | \"p\"\n | \"pw\"\n | \"ph\"\n | \"w\"\n | \"h\"\n\nexport type Footprinter = {\n dip: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\" | \"wide\" | \"narrow\">\n cap: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n res: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n diode: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n led: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n lr: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"l\" | \"pl\" | \"pr\">\n qfp: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\" | \"wide\" | \"narrow\">\n quad: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\n \"w\" | \"l\" | \"square\" | \"pl\" | \"pr\" | \"pb\" | \"pt\" | \"p\" | \"pw\" | \"ph\"\n >\n bga: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\n \"grid\" | \"p\" | \"w\" | \"h\" | \"ball\" | \"pad\" | \"missing\"\n >\n qfn: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\">\n soic: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\">\n mlp: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\">\n ssop: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n tssop: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n dfn: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n pinrow: (num_pins: number) => FootprinterParamsBuilder<\"p\" | \"id\" | \"od\">\n axial: () => FootprinterParamsBuilder<\"p\" | \"id\" | \"od\">\n pushbutton: () => FootprinterParamsBuilder<\n \"tllabel\" | \"trlabel\" | \"bllabel\" | \"brlabel\"\n >\n stampboard: () => FootprinterParamsBuilder<\n | \"w\"\n | \"left\"\n | \"right\"\n | \"top\"\n | \"bottom\"\n | \"p\"\n | \"pw\"\n | \"pl\"\n | \"innerhole\"\n | \"innerholeedgedistance\"\n >\n stampreceiver: () => FootprinterParamsBuilder<\n | \"w\"\n | \"left\"\n | \"right\"\n | \"top\"\n | \"bottom\"\n | \"p\"\n | \"pw\"\n | \"pl\"\n | \"innerhole\"\n | \"innerholeedgedistance\"\n >\n params: () => any\n /** @deprecated use circuitJson() instead */\n soup: () => AnySoupElement[]\n circuitJson: () => AnyCircuitElement[]\n json: () => AnyFootprinterDefinitionOutput[]\n}\n\nexport const string = (def: string): Footprinter => {\n let fp = footprinter()\n\n // special case: 0402, 0603, etc.\n if ((def.length === 4 || def.length === 5) && /^\\d+$/.test(def))\n def = `res${def}`\n\n const def_parts = def\n .split(\"_\")\n .map((s) => {\n const m = s.match(/([a-z]+)([\\(\\d\\.\\+\\?].*)?/)\n const [_, fn, v] = m ?? []\n if (v?.includes(\"?\")) return null\n return { fn: m?.[1]!, v: m?.[2]! }\n })\n .filter(isNotNull)\n\n for (const { fn, v } of def_parts) {\n fp = fp[fn](v)\n }\n\n fp.setString(def)\n\n return fp\n}\n\nexport const footprinter = (): Footprinter & {\n string: typeof string\n setString: (string) => void\n} => {\n const proxy = new Proxy(\n {},\n {\n get: (target: any, prop: string) => {\n // console.log(prop, target)\n if (prop === \"soup\" || prop === \"circuitJson\") {\n if (\"fn\" in target && FOOTPRINT_FN[target.fn]) {\n return () => FOOTPRINT_FN[target.fn](target).circuitJson\n }\n\n if (!FOOTPRINT_FN[target.fn]) {\n throw new Error(\n `Invalid footprint function, got \"${target.fn}\"${\n target.string ? `, from string \"${target.string}\"` : \"\"\n }`,\n )\n }\n\n return () => {\n // TODO improve error\n throw new Error(\n `No function found for footprinter, make sure to specify .dip, .lr, .p, etc. Got \"${prop}\"`,\n )\n }\n }\n if (prop === \"json\") {\n if (!FOOTPRINT_FN[target.fn]) {\n throw new Error(\n `Invalid footprint function, got \"${target.fn}\"${\n target.string ? `, from string \"${target.string}\"` : \"\"\n }`,\n )\n }\n return () => FOOTPRINT_FN[target.fn](target).parameters\n }\n if (prop === \"params\") {\n // TODO\n return () => target\n }\n if (prop === \"setString\") {\n return (v: string) => {\n target.string = v\n return proxy\n }\n }\n return (v: any) => {\n if (Object.keys(target).length === 0) {\n if (`${prop}${v}` in FOOTPRINT_FN) {\n target[`${prop}${v}`] = true\n target.fn = `${prop}${v}`\n } else {\n target[prop] = true\n target.fn = prop\n if (prop === \"res\" || prop === \"cap\") {\n if (v) {\n target.imperial = v // res0402, cap0603 etc.\n }\n } else {\n target.num_pins = Number.parseFloat(v)\n }\n }\n } else {\n // handle dip_w or other invalid booleans\n if (!v && [\"w\", \"h\", \"p\"].includes(prop as string)) {\n // ignore\n } else {\n target[prop] = v ?? true\n }\n }\n return proxy\n }\n },\n },\n )\n return proxy as any\n}\nfootprinter.string = string\n\nexport const fp = footprinter\n"],"mappings":"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","names":["mm","z","length","z","length","mm","z","length","distance","z","z","z","distance","length","z","length","z","length","z","length","z","z","length","z","z","z","length","z","length","z","z","z","z","length","z","z","length","z","z","length","z","z","length","length","z","z","length","getHeight","getTriangleDir","fp"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tscircuit/footprinter",
3
3
  "type": "module",
4
- "version": "0.0.79",
4
+ "version": "0.0.81",
5
5
  "description": "",
6
6
  "main": "dist/index.js",
7
7
  "files": [