diff --git a/README.md b/README.md
index a2faa22..c27c433 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,7 @@ The first concrete model-specific modules are:
used by Arduino CNC shields, with its 2x8 socket, motor outputs, control
inputs, power domains, and microstep pull-downs modeled explicitly.
-Each component is a single `` backed entirely by a female `pinrow`
+Each component is a single `` backed entirely by a female `headermodule`
footprinter string. Every exposed header pin has `pinAttributes`, including
GPIO behavior, internal pull support, I2C/SPI/UART capabilities, and explicit
power/ground direction and voltage where applicable.
@@ -73,7 +73,7 @@ supply bulk capacitor.
The XIAO component also provides `XIAO_PIN1` through `XIAO_PIN14` aliases for
Seeed's official header numbering. This keeps those numbers exact even though
-the underlying generic pinrow footprinter has its own perimeter numbering.
+the underlying `headermodule` footprinter has its own perimeter numbering.
All aliases are available in selectors; pass `showPinAliases` when you also
want them rendered inside the schematic symbol.
@@ -86,8 +86,7 @@ The A4988 geometry, power limits, and control behavior come from Pololu's
## Footprinter compatibility
-Independent row spacing and sparse pin grids are implemented in footprinter's
-main branch but are not yet present in its latest published package. This repo
-temporarily carries the matching upstream patch so installs and builds use the
-correct geometry immediately. The patch can be removed after those features
-are included in a footprinter release consumed by tscircuit.
+Independent row spacing, sparse pin grids, module outlines, literal silkscreen
+labels, and pin-one markers are provided by `@tscircuit/footprinter` 0.0.409 or
+newer. The package is pinned to that release so the `headermodule` geometry and
+silkscreen output are generated by the published implementation.
diff --git a/__snapshots__/index.circuit-pcb.snap.svg b/__snapshots__/index.circuit-pcb.snap.svg
new file mode 100644
index 0000000..f7bd42d
--- /dev/null
+++ b/__snapshots__/index.circuit-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/__snapshots__/index.circuit-schematic.snap.svg b/__snapshots__/index.circuit-schematic.snap.svg
new file mode 100644
index 0000000..3a0f8a5
--- /dev/null
+++ b/__snapshots__/index.circuit-schematic.snap.svg
@@ -0,0 +1,26 @@
+
\ No newline at end of file
diff --git a/bun.lock b/bun.lock
index 8d0f33f..aefb4c9 100644
--- a/bun.lock
+++ b/bun.lock
@@ -5,18 +5,20 @@
"": {
"name": "header-modules",
"devDependencies": {
- "@tscircuit/footprinter": "0.0.387",
+ "@tscircuit/footprinter": "0.0.409",
"@tscircuit/props": "^0.0.604",
"@types/bun": "^1.3.14",
"@types/react": "^19.2.18",
- "tscircuit": "^0.0.2193",
+ "bun-match-svg": "^0.0.15",
+ "sharp": "0.32.6",
+ "tscircuit": "^0.0.2207",
"typescript": "^5.0.0",
},
},
},
- "patchedDependencies": {
- "@tscircuit/footprinter@0.0.387": "patches/@tscircuit%2Ffootprinter@0.0.387.patch",
- },
+ "trustedDependencies": [
+ "sharp",
+ ],
"packages": {
"@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="],
@@ -162,27 +164,27 @@
"@tscircuit/capacity-autorouter": ["@tscircuit/capacity-autorouter@0.0.722", "", { "dependencies": { "fast-json-stable-stringify": "^2.1.0", "object-hash": "^3.0.0", "stack-svgs": "^0.0.1" } }, "sha512-YFfn+pa7dEitt6H7+ykZOJr+fY4QM0e8cEVs7TIv3SU0gcZpqP2q62p8TmDhV8GyY+LxtOG385lAIkb9olhzTQ=="],
- "@tscircuit/checks": ["@tscircuit/checks@0.0.146", "", { "peerDependencies": { "@flatten-js/core": "*", "@tscircuit/math-utils": "*", "circuit-json": "*", "circuit-json-to-connectivity-map": "*", "typescript": "^5.5.3" } }, "sha512-zQOCjeLoSvq/my1ojSIkG3SHWYxZC0qq5MFocd2Y90Li/gvHVpEu+uBPMsBdy9Jb7tO16+UJOjmM5AKqrWYXpQ=="],
+ "@tscircuit/checks": ["@tscircuit/checks@0.0.151", "", { "peerDependencies": { "@flatten-js/core": "*", "@tscircuit/math-utils": "*", "circuit-json": "*", "circuit-json-to-connectivity-map": "*", "typescript": "^5.5.3" } }, "sha512-+qgG5HtgTgkVWl7T2UQhtjgqZDnUYHS62jEy6BdIsH1XoOSTTl9vEJmEMmmymeIeAmOfPZC92BjcI+0vO+6Ihw=="],
"@tscircuit/circuit-json-util": ["@tscircuit/circuit-json-util@0.0.102", "", { "dependencies": { "parsel-js": "^1.1.2" }, "peerDependencies": { "circuit-json": "*", "transformation-matrix": "*", "zod": "3" } }, "sha512-qn9L7bcVmDFGXUMb5NKaegdotJ4GiKVgzF8nA3gwBFauOEfumDjK/80AR6BnabsfuavvjV/KuQZHXNeaeNL4QQ=="],
- "@tscircuit/cli": ["@tscircuit/cli@0.1.1794", "", { "peerDependencies": { "circuit-json": "^0.0.446", "tscircuit": "*" }, "bin": { "tscircuit-cli": "cli/entrypoint.js" } }, "sha512-QHEjS3N41jyAXeNIPlVJZpyookYVju9zttfPCCkst9Bw1KnqBm4zTeqncsHYZT1GgWN+Kz1flmfDYFcaq/P57g=="],
+ "@tscircuit/cli": ["@tscircuit/cli@0.1.1806", "", { "peerDependencies": { "circuit-json": "^0.0.446", "tscircuit": "*" }, "bin": { "tscircuit-cli": "cli/entrypoint.js" } }, "sha512-0Ls3Tok4F/BL1yYYK77HwohW4jel3cmu4fxxERWeZBzjGyNsYthPfE/7wd9DcYvA5+phDvMRIjiYUr7p8NtfyQ=="],
"@tscircuit/copper-pour-solver": ["@tscircuit/copper-pour-solver@0.0.42", "", { "dependencies": { "@tscircuit/manifold-2d": "^0.0.6" }, "peerDependencies": { "typescript": "^5" } }, "sha512-FHsX32w/8upaPad+SkFe82JEWKCuRLzduDxJAZITPL9IdX9v/uMXiKGp2DQgoQ9kBgRHxyRcoRiaC6qCoEaq6Q=="],
- "@tscircuit/core": ["@tscircuit/core@0.0.1565", "", { "dependencies": { "@flatten-js/core": "^1.6.2", "@lume/kiwi": "^0.4.3", "calculate-cell-boundaries": "^0.0.13", "calculate-packing": "^0.0.82", "css-select": "5.1.0", "format-si-unit": "^0.0.7", "nanoid": "^5.0.7", "performance-now": "^2.1.0", "react-reconciler": "^0.32.0", "svg-path-commander": "^2.1.11", "transformation-matrix": "^2.16.1", "zod": "^3.25.67" }, "peerDependencies": { "@tscircuit/capacity-autorouter": "*", "@tscircuit/checks": "*", "@tscircuit/circuit-json-util": "*", "@tscircuit/create-fdm-enclosure": "*", "@tscircuit/footprinter": "*", "@tscircuit/infgrid-ijump-astar": "*", "@tscircuit/matchpack": "*", "@tscircuit/math-utils": "*", "@tscircuit/props": "*", "@tscircuit/schematic-match-adapt": "*", "bpc-graph": "*", "circuit-json": "*", "circuit-json-to-bpc": "*", "circuit-json-to-connectivity-map": "*", "circuit-json-to-spice": "*", "schematic-symbols": "*", "spicets": "*", "typescript": "^5.0.0" } }, "sha512-WDZjp7NcOS6FYJlvXFw8ttmMuTTOBEjaS/9NfC/ocwAv8xK1QGMxnAgarFMP6HUPZvoZXczTcsDBGas+X8k0Gg=="],
+ "@tscircuit/core": ["@tscircuit/core@0.0.1585", "", { "dependencies": { "@flatten-js/core": "^1.6.2", "@lume/kiwi": "^0.4.3", "calculate-cell-boundaries": "^0.0.13", "calculate-packing": "^0.0.82", "css-select": "5.1.0", "format-si-unit": "^0.0.7", "nanoid": "^5.0.7", "performance-now": "^2.1.0", "react-reconciler": "^0.32.0", "svg-path-commander": "^2.1.11", "transformation-matrix": "^2.16.1", "zod": "^3.25.67" }, "peerDependencies": { "@tscircuit/capacity-autorouter": "*", "@tscircuit/checks": "*", "@tscircuit/circuit-json-util": "*", "@tscircuit/create-fdm-enclosure": "*", "@tscircuit/footprinter": "*", "@tscircuit/infgrid-ijump-astar": "*", "@tscircuit/matchpack": "*", "@tscircuit/math-utils": "*", "@tscircuit/props": "*", "@tscircuit/schematic-match-adapt": "*", "bpc-graph": "*", "circuit-json": "*", "circuit-json-to-bpc": "*", "circuit-json-to-connectivity-map": "*", "circuit-json-to-spice": "*", "schematic-symbols": "*", "spicets": "*", "typescript": "^5.0.0" } }, "sha512-1dQkgC2s+Cywm4wtY01qBmc2MkjHR2IcWgmJB1XPsVe9y2rv7V7WM2/zJxcwVEUY+yu2/D1RhDNSE1zg4RQxDw=="],
"@tscircuit/create-fdm-enclosure": ["@tscircuit/create-fdm-enclosure@0.0.3", "", { "dependencies": { "@tscircuit/solver-utils": "^0.0.19", "graphics-debug": "^0.0.96", "jscad-planner": "^0.0.14" }, "peerDependencies": { "typescript": "^5" } }, "sha512-uEjUz/8mH5GZ7wHOtNE/vk0Jisn1AeXmLWQ1kuGHsl8ndbjH11+gBnqMrOjEIFDzMChJFOIlIcYpFYRbG0nj/A=="],
- "@tscircuit/eval": ["@tscircuit/eval@0.0.1107", "", { "peerDependencies": { "@tscircuit/core": "*", "circuit-json": "*", "typescript": "^5.0.0", "zod": "3" } }, "sha512-VRG5HFCTDkvg0z9au2tfzUUGLIsE/SZT1Yej5/2/TQvQ4SIS414eKaEPJA0M7gk0dkXsAapAljMEDzgfvtQzMw=="],
+ "@tscircuit/eval": ["@tscircuit/eval@0.0.1122", "", { "peerDependencies": { "@tscircuit/core": "*", "circuit-json": "*", "typescript": "^5.0.0", "zod": "3" } }, "sha512-rHOJByBDpX5lS+lQrGT9rFuDUkjFXyMV16ZNIXbUwHkS13HEDonyVrwdl6DwgUVXh0zwIIuvHWg6PLPcOKDu5w=="],
"@tscircuit/fanout-solver": ["@tscircuit/fanout-solver@0.0.11", "", { "dependencies": { "@tscircuit/capacity-autorouter": "0.0.718", "@tscircuit/solver-utils": "0.0.19", "graphics-debug": "0.0.96" }, "peerDependencies": { "typescript": "^5" } }, "sha512-qNlkFixA16wRUxjaWgUSdx1ICP1Vgc58v0pxkg17kuCErPpGtboSc6F58fNPnE96q7CuoiWudRsrr8cUTHJ7Ew=="],
- "@tscircuit/footprinter": ["@tscircuit/footprinter@0.0.387", "", { "dependencies": { "@tscircuit/mm": "^0.0.8", "zod": "^3.23.8" }, "peerDependencies": { "circuit-json": "*" } }, "sha512-xv4BQaHhwVitXmymq4s8QL1AldMaIqGm69fIas8qqLNSnFtI3v5uj4wnpzWvmEnmoAzI7zIgrmKW+mXwCDCKCA=="],
+ "@tscircuit/footprinter": ["@tscircuit/footprinter@0.0.409", "", { "dependencies": { "@tscircuit/mm": "^0.0.8", "zod": "^3.23.8" }, "peerDependencies": { "circuit-json": "*" } }, "sha512-6VsrtGsvBj7MCIXxo9ofZkdkQj/eUK4u9fHrRPo/Q+ePJB4qEl8QMAa4ih9PEWTv4OuZniAQnkaMbS6zwGkUfg=="],
"@tscircuit/image-utils": ["@tscircuit/image-utils@0.0.8", "", { "dependencies": { "@flatten-js/core": "^1.6.2", "color-diff": "^1.4.0", "fast-png": "^8.0.0", "svg-path-commander": "^2.1.11", "transformation-matrix": "^2.16.1" } }, "sha512-/a/dyd0Ly+YSk73pNXi0M02nfaiZ1NQ8PVNDBTOHHESyTOrNHiVAT+NWxsWi44gHZ/ivLegAmjxSSbSSGfU+sQ=="],
- "@tscircuit/infer-cable-insertion-point": ["@tscircuit/infer-cable-insertion-point@0.0.2", "", { "peerDependencies": { "typescript": "^5" } }, "sha512-k3JwlGtsdHRRZELJzjXBKP+9xdzn+v4dqllhJIFMcrMvlBIaOTt8CbxLO+vcxPvz8Csf+yFChnTos8/vYcSgNg=="],
+ "@tscircuit/infer-cable-insertion-point": ["@tscircuit/infer-cable-insertion-point@0.0.3", "", { "peerDependencies": { "typescript": "^5" } }, "sha512-ENVSKEgVx5/isMC+ttHNPCK+Os3MjALEM1MDI5M9JKMDjGqq5iPjxb5qwD3/GFwkc5Xl/DtRdOyKFC1lvrw1hg=="],
"@tscircuit/infgrid-ijump-astar": ["@tscircuit/infgrid-ijump-astar@0.0.35", "", {}, "sha512-PZx3GyD7mDNEhLJn8+7n8NjrieOvrX03g7Gx1cvwXv9mmgSC4M+yTA0WC4DgOvcRdTnarf0R8xvwtDeJ4tMK9Q=="],
@@ -204,13 +206,13 @@
"@tscircuit/props": ["@tscircuit/props@0.0.604", "", { "peerDependencies": { "circuit-json": "*", "react": "*", "zod": "*" } }, "sha512-O/0y/oQxQ880bCATuLILnwsW/Jg/l+3IWHxfn+GOVAycPfSiA8gDWQvWj72eUlITwXkOnQm+yUqCJYDfkRM+CA=="],
- "@tscircuit/runframe": ["@tscircuit/runframe@0.0.2329", "", { "dependencies": { "@tscircuit/eval": "^0.0.1107", "@tscircuit/solver-utils": "^0.0.7", "debug": "^4.4.0" } }, "sha512-WGrTOzBCUh8k7chniceSxs88umjF5SRXKvCarY0RqzCc42EuaIKdip04Fzt3oWIeLbUc77RgJTKuHhZIZdCqZQ=="],
+ "@tscircuit/runframe": ["@tscircuit/runframe@0.0.2344", "", { "dependencies": { "@tscircuit/eval": "^0.0.1122", "@tscircuit/solver-utils": "^0.0.7", "debug": "^4.4.0" } }, "sha512-uuPsWy1QpGz4Fq2oUiEbUTLd7EUDHUAWqydeGuh3Gofwoln428yK6tgZqfzNXMPuhu6CTUYUj+5c4cHVitGA4g=="],
"@tscircuit/schematic-corpus": ["@tscircuit/schematic-corpus@0.0.114", "", { "peerDependencies": { "typescript": "^5" } }, "sha512-jDQX+XDXP6PklB39X8AwUSuiqGRdn78esy1wD/qG8U3cCXkT5rtE3ousDVaKRxclCeED8FxJlD+ZvRtAe8mw8w=="],
"@tscircuit/schematic-match-adapt": ["@tscircuit/schematic-match-adapt@0.0.18", "", { "peerDependencies": { "typescript": "^5" } }, "sha512-LpXF7aSmP4xUZN1gdrU/YdAnotJ+oKW2a4YzGB6wNTXnw5+Yn0w/bPnReT4A+nNUrVJ9kyjgnXQkSlkhiejQGg=="],
- "@tscircuit/schematic-trace-solver": ["@tscircuit/schematic-trace-solver@0.0.117", "", { "peerDependencies": { "typescript": "^5" } }, "sha512-9I8/2RcZZnYlz4NQUl2FnWAKzrZvaoYU/D3GM/9TOonF0IibQGGWFv9YgQOWf0ynZRbzuv5or+W/34zMQEDSqQ=="],
+ "@tscircuit/schematic-trace-solver": ["@tscircuit/schematic-trace-solver@0.0.120", "", { "peerDependencies": { "typescript": "^5" } }, "sha512-4xAMM+P0/qHAu/fE0XSyNDU/2Kit2p5/cNPoP5flLRomLFnKiSdKsLcSE5XbCI/YNRlng0niRs8LKoNv4yoLHw=="],
"@tscircuit/simple-3d-svg": ["@tscircuit/simple-3d-svg@0.0.41", "", { "dependencies": { "fast-xml-parser": "^5.2.5", "fflate": "^0.8.2" } }, "sha512-2iwhHhMLElq5t0fcC0Gr7cCpZhEOAKh+6NN0NIJ9YWUCcsB7UN8uYko7jqNTxDlYOe6E0ZYaDZWsQ3amOZ3dlw=="],
@@ -278,9 +280,9 @@
"circuit-json-to-bpc": ["circuit-json-to-bpc@0.0.13", "", { "peerDependencies": { "bpc-graph": "*", "circuit-json": "*", "typescript": "^5" } }, "sha512-3wSMtPa6tJkiBQN4tsm7f0Mb7Wp90X2c8dNbULoDVE4mGGoFqP1DXqBlyvvZZl+4SjqznzQQ0EioLe2SCQTOcg=="],
- "circuit-json-to-connectivity-map": ["circuit-json-to-connectivity-map@0.0.23", "", { "dependencies": { "@tscircuit/math-utils": "^0.0.9" }, "peerDependencies": { "typescript": "^5.9.3" } }, "sha512-DSOiXaXOTvjU+7et8ITXb2LjgKto6cQzLv3hReYdXuUNtLw2GVnpOly1G83VcIBcSQ4hRVHI4VMKRyZB3XVzdg=="],
+ "circuit-json-to-connectivity-map": ["circuit-json-to-connectivity-map@0.0.27", "", { "dependencies": { "@tscircuit/math-utils": "^0.0.9" }, "peerDependencies": { "typescript": "^5.9.3" } }, "sha512-DxAcRjtKjzuB4IQluF2hSOvVxlwiIkXCcLDsdHWwyDXp+dEfGx+BfDzPrflk2sbgSOuLJUBfj2FJInWPFCh70Q=="],
- "circuit-json-to-gltf": ["circuit-json-to-gltf@0.0.108", "", { "dependencies": { "@jscad/modeling": "^2.12.6", "earcut": "^3.0.2", "jscad-electronics": "^0.0.135", "jscad-planner": "^0.0.14", "jscad-to-gltf": "^0.0.5", "occt-import-js": "^0.0.23" }, "peerDependencies": { "@resvg/resvg-js": "2", "@resvg/resvg-wasm": "2", "@tscircuit/circuit-json-util": "*", "circuit-json": "*", "circuit-to-svg": "*", "typescript": "^5" }, "optionalPeers": ["@resvg/resvg-js", "@resvg/resvg-wasm"] }, "sha512-TgxwbQr28VL0p8Np1xwb6r81USlLn/ItFljD3k+Lz5Ju+Wgxxc9AtLUuGtqJgxkDqLfNSqbUk5VmhQKRCNBy6A=="],
+ "circuit-json-to-gltf": ["circuit-json-to-gltf@0.0.111", "", { "dependencies": { "@jscad/modeling": "^2.12.6", "earcut": "^3.0.2", "jscad-electronics": "^0.0.135", "jscad-planner": "^0.0.14", "jscad-to-gltf": "^0.0.5", "occt-import-js": "^0.0.23" }, "peerDependencies": { "@resvg/resvg-js": "2", "@resvg/resvg-wasm": "2", "@tscircuit/circuit-json-util": "*", "circuit-json": "*", "circuit-to-svg": "*", "typescript": "^5" }, "optionalPeers": ["@resvg/resvg-js", "@resvg/resvg-wasm"] }, "sha512-EKIw/Bflz9NWmM7dNvFiKMVkNPF5Jbnze/Y2IjkwRGesi/Ep+8tR6q3flDgnHBTdNcPlT33RiYXXfH8mYOb3kg=="],
"circuit-json-to-pnp-csv": ["circuit-json-to-pnp-csv@0.0.8", "", { "dependencies": { "papaparse": "^5.4.1" }, "peerDependencies": { "@tscircuit/soup-util": "*", "typescript": "^5.0.0" } }, "sha512-m3ycvl5Cx1woE3qNdf457f2r/6WBxBxwbbkYbXbB/a+eEe7Y1Kk9BIq8GBsq7j25MTBeR0mbDMGL6yZGqSAVDA=="],
@@ -288,11 +290,11 @@
"circuit-json-to-spice": ["circuit-json-to-spice@0.0.45", "", { "dependencies": { "circuit-json-to-connectivity-map": "^0.0.22" }, "peerDependencies": { "@tscircuit/circuit-json-util": "*", "circuit-json": "*", "spicets": "*", "typescript": "^5.0.0" } }, "sha512-e8THrj+jWK0BEjpw0relCYNCuEYEFAy5dFRYUQgMxdnrTjs2h5WoGWRNGPndqNkrpV5b63AzdX3wVR7Mtqi1HQ=="],
- "circuit-to-svg": ["circuit-to-svg@0.0.393", "", { "dependencies": { "@types/node": "^22.5.5", "bun-types": "^1.1.40", "calculate-elbow": "0.0.12", "debug": "^4.4.3", "svg-path-commander": "^2.1.11", "svgson": "^5.3.1", "transformation-matrix": "^2.16.1" }, "peerDependencies": { "@tscircuit/alphabet": "*" } }, "sha512-wyPi94yex6lYMbXpNHyaTzrZM8qqH0nNUJDCl1bzQlpc9Q6P92aU6SwAHEkuxRAmhs3Yk1kS1DZLT9ci3KafDA=="],
+ "circuit-to-svg": ["circuit-to-svg@0.0.396", "", { "dependencies": { "@types/node": "^22.5.5", "bun-types": "^1.1.40", "calculate-elbow": "0.0.12", "debug": "^4.4.3", "svg-path-commander": "^2.1.11", "svgson": "^5.3.1", "transformation-matrix": "^2.16.1" }, "peerDependencies": { "@tscircuit/alphabet": "*" } }, "sha512-idE7yFgwqNp26edgQpEW1pMYJL/agWXTRQi88cPjdo6FpVuZJr2+MCQpmXMlQRhGYqyBEH2KHsPsiF+hA8cvAQ=="],
"color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="],
- "color-convert": ["color-convert@0.5.3", "", {}, "sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling=="],
+ "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
"color-diff": ["color-diff@1.4.0", "", {}, "sha512-4oDB/o78lNdppbaqrg0HjOp7pHmUc+dfCxWKWFnQg6AB/1dkjtBDop3RZht5386cq9xBUDRvDvSCA7WUlM9Jqw=="],
@@ -598,7 +600,7 @@
"ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="],
- "tscircuit": ["tscircuit@0.0.2193", "", { "dependencies": { "@flatten-js/core": "^1.6.2", "@lume/kiwi": "^0.4.3", "@resvg/resvg-js": "^2.6.2", "@rollup/plugin-commonjs": "^29.0.0", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-typescript": "^12.3.0", "@tscircuit/alphabet": "0.0.25", "@tscircuit/capacity-autorouter": "^0.0.722", "@tscircuit/checks": "0.0.146", "@tscircuit/circuit-json-util": "^0.0.102", "@tscircuit/cli": "^0.1.1794", "@tscircuit/copper-pour-solver": "0.0.42", "@tscircuit/core": "^0.0.1565", "@tscircuit/create-fdm-enclosure": "0.0.3", "@tscircuit/eval": "^0.0.1107", "@tscircuit/fanout-solver": "0.0.11", "@tscircuit/footprinter": "^0.0.387", "@tscircuit/image-utils": "^0.0.8", "@tscircuit/infer-cable-insertion-point": "^0.0.2", "@tscircuit/infgrid-ijump-astar": "^0.0.35", "@tscircuit/internal-dynamic-import": "^0.0.11", "@tscircuit/krt-wasm": "^0.1.1", "@tscircuit/matchpack": "^0.0.64", "@tscircuit/math-utils": "^0.0.36", "@tscircuit/miniflex": "^0.0.4", "@tscircuit/ngspice-spice-engine": "^0.0.20", "@tscircuit/props": "^0.0.602", "@tscircuit/runframe": "^0.0.2329", "@tscircuit/schematic-match-adapt": "^0.0.18", "@tscircuit/schematic-trace-solver": "^0.0.117", "@tscircuit/simple-3d-svg": "^0.0.41", "@tscircuit/solver-utils": "^0.0.16", "@tscircuit/soup-util": "^0.0.41", "bpc-graph": "^0.0.57", "calculate-cell-boundaries": "^0.0.13", "calculate-elbow": "^0.0.12", "calculate-packing": "^0.0.82", "circuit-json": "^0.0.455", "circuit-json-to-bpc": "^0.0.13", "circuit-json-to-connectivity-map": "^0.0.23", "circuit-json-to-gltf": "^0.0.108", "circuit-json-to-pnp-csv": "^0.0.8", "circuit-json-to-simple-3d": "^0.0.9", "circuit-json-to-spice": "^0.0.45", "circuit-to-svg": "^0.0.393", "comlink": "^4.4.2", "connectivity-map": "^1.0.0", "css-select": "5.1.0", "debug": "^4.3.6", "flatbush": "^4.5.0", "format-si-unit": "^0.0.7", "graphics-debug": "^0.0.95", "jscad-planner": "^0.0.13", "kicad-component-converter": "^0.1.40", "kicad-to-circuit-json": "^0.0.117", "kicadts": "^0.0.53", "minicssgrid": "^0.0.9", "performance-now": "^2.1.0", "poppygl": "^0.0.26", "react": "^19.1.0", "react-dom": "^19.1.0", "rollup": "^4.53.2", "rollup-plugin-dts": "^6.2.3", "s-expression": "^3.1.1", "schematic-symbols": "^0.0.238", "spicets": "^0.0.4", "spicey": "^0.0.14", "sucrase": "^3.35.0", "svg-path-commander": "^2.1.11", "transformation-matrix": "^2.16.1", "tslib": "^2.8.1", "zod": "^3.25.67" }, "peerDependencies": { "typescript": "^5.0.0" }, "bin": { "tsci": "cli.mjs", "tscircuit": "cli.mjs" } }, "sha512-edjZ2cJzcsuJJcx0YIoLBAEfYh6XHpG4iHDlJMlQdravQvK0cuw5z/PBb5ZvgRnw2yXYrhyuFy9goGKXUXVvjQ=="],
+ "tscircuit": ["tscircuit@0.0.2207", "", { "dependencies": { "@flatten-js/core": "^1.6.2", "@lume/kiwi": "^0.4.3", "@resvg/resvg-js": "^2.6.2", "@rollup/plugin-commonjs": "^29.0.0", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-typescript": "^12.3.0", "@tscircuit/alphabet": "0.0.25", "@tscircuit/capacity-autorouter": "^0.0.722", "@tscircuit/checks": "0.0.151", "@tscircuit/circuit-json-util": "^0.0.102", "@tscircuit/cli": "^0.1.1806", "@tscircuit/copper-pour-solver": "0.0.42", "@tscircuit/core": "^0.0.1585", "@tscircuit/create-fdm-enclosure": "0.0.3", "@tscircuit/eval": "^0.0.1122", "@tscircuit/fanout-solver": "0.0.11", "@tscircuit/footprinter": "^0.0.409", "@tscircuit/image-utils": "^0.0.8", "@tscircuit/infer-cable-insertion-point": "^0.0.3", "@tscircuit/infgrid-ijump-astar": "^0.0.35", "@tscircuit/internal-dynamic-import": "^0.0.11", "@tscircuit/krt-wasm": "^0.1.1", "@tscircuit/matchpack": "^0.0.64", "@tscircuit/math-utils": "^0.0.36", "@tscircuit/miniflex": "^0.0.4", "@tscircuit/ngspice-spice-engine": "^0.0.20", "@tscircuit/props": "^0.0.605", "@tscircuit/runframe": "^0.0.2344", "@tscircuit/schematic-match-adapt": "^0.0.18", "@tscircuit/schematic-trace-solver": "^0.0.120", "@tscircuit/simple-3d-svg": "^0.0.41", "@tscircuit/solver-utils": "^0.0.16", "@tscircuit/soup-util": "^0.0.41", "bpc-graph": "^0.0.57", "calculate-cell-boundaries": "^0.0.13", "calculate-elbow": "^0.0.12", "calculate-packing": "^0.0.82", "circuit-json": "^0.0.460", "circuit-json-to-bpc": "^0.0.13", "circuit-json-to-connectivity-map": "^0.0.27", "circuit-json-to-gltf": "^0.0.111", "circuit-json-to-pnp-csv": "^0.0.8", "circuit-json-to-simple-3d": "^0.0.9", "circuit-json-to-spice": "^0.0.45", "circuit-to-svg": "^0.0.396", "comlink": "^4.4.2", "connectivity-map": "^1.0.0", "css-select": "5.1.0", "debug": "^4.3.6", "flatbush": "^4.5.0", "format-si-unit": "^0.0.7", "graphics-debug": "^0.0.95", "jscad-planner": "^0.0.13", "kicad-component-converter": "^0.1.40", "kicad-to-circuit-json": "^0.0.117", "kicadts": "^0.0.53", "minicssgrid": "^0.0.9", "performance-now": "^2.1.0", "poppygl": "^0.0.26", "react": "^19.1.0", "react-dom": "^19.1.0", "rollup": "^4.53.2", "rollup-plugin-dts": "^6.2.3", "s-expression": "^3.1.1", "schematic-symbols": "^0.0.238", "spicets": "^0.0.4", "spicey": "^0.0.14", "sucrase": "^3.35.0", "svg-path-commander": "^2.1.11", "transformation-matrix": "^2.16.1", "tslib": "^2.8.1", "zod": "^3.25.67" }, "peerDependencies": { "typescript": "^5.0.0" }, "bin": { "tsci": "cli.mjs", "tscircuit": "cli.mjs" } }, "sha512-j3ejz3NnG4xzex223czRa3igJ/KzyDev9PFYlVx5IsFf98caZQuOdFUfM+rQs2Btp2aTfbVbqSHgrp525CxSQQ=="],
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
@@ -624,6 +626,8 @@
"zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
+ "@tscircuit/cli/circuit-json": ["circuit-json@0.0.460", "", { "peerDependencies": { "format-si-unit": "*" } }, "sha512-6L8Kf2dT+jTg0pdKkYuGG864gPf1h9I55YYAaosFklYY4EnHcAYcVrF0IylB0jBfYu9RY3clSoTWMkjAkAYGSA=="],
+
"@tscircuit/create-fdm-enclosure/@tscircuit/solver-utils": ["@tscircuit/solver-utils@0.0.19", "", { "peerDependencies": { "graphics-debug": "*", "typescript": "^5" } }, "sha512-UPUVgRRIrylSMJfKw7QwhSCvlODD+uAAwXc9jpOG06ipqteeeLRkj/HtHns31KQfLjRCSsGTvxMYBjmhaDDLGg=="],
"@tscircuit/create-fdm-enclosure/graphics-debug": ["graphics-debug@0.0.96", "", { "dependencies": { "@react-hook/resize-observer": "^2.0.2", "@tscircuit/alphabet": "^0.0.25", "@types/react-router-dom": "^5.3.3", "fast-png": "^8.0.0", "polished": "^4.3.1", "react-router-dom": "^6.28.0", "react-supergrid": "^1.0.10", "svgson": "^5.3.1", "transformation-matrix": "^3.0.0", "use-mouse-matrix-transform": "^1.3.0" }, "peerDependencies": { "bun-match-svg": "*", "looks-same": "^9.0.1", "typescript": "^5.0.0" }, "bin": { "graphics-debug": "dist/cli/cli.js", "gd": "dist/cli/cli.js" } }, "sha512-o3CKFIWtbSL1GSrDYaaYMUidjtCM5PClqvc9/vZVakUT1c61I935bcE++8DnLTXoevJMM1+92y8Uinxl//SuBQ=="],
@@ -654,15 +658,17 @@
"circuit-json-to-spice/circuit-json-to-connectivity-map": ["circuit-json-to-connectivity-map@0.0.22", "", { "dependencies": { "@tscircuit/math-utils": "^0.0.9" }, "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-HN8DiISjZZLTglGEkYNRpKeQ/DMG4dDo5j4Hck0UGSJbpux9aFwtJOGszMf06Inh/gu5oKBrpZJIeWxaNacKUg=="],
- "color/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
-
"graphics-debug/transformation-matrix": ["transformation-matrix@3.1.0", "", {}, "sha512-oYubRWTi2tYFHAL2J8DLvPIqIYcYZ0fSOi2vmSy042Ho4jBW2ce6VP7QfD44t65WQz6bw5w1Pk22J7lcUpaTKA=="],
+ "parse-color/color-convert": ["color-convert@0.5.3", "", {}, "sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling=="],
+
"prebuild-install/tar-fs": ["tar-fs@2.1.5", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw=="],
"react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="],
- "tscircuit/@tscircuit/props": ["@tscircuit/props@0.0.602", "", { "peerDependencies": { "circuit-json": "*", "react": "*", "zod": "*" } }, "sha512-YBh3NlKq4U9cdPXOLa5yuGQEMTltE0hKsO0q+G5/D6/Zl2k5HJm9YgnFz9fFRehBxtus5o9pIjPX+4x+ZxfyCw=="],
+ "tscircuit/@tscircuit/props": ["@tscircuit/props@0.0.605", "", { "peerDependencies": { "circuit-json": "*", "react": "*", "zod": "*" } }, "sha512-6mlEksBdXDR3cqwmbhaOl4BMEA0V3LQUOIhSETizkElfXwbhtL3G9VbGQirZ9JbEr2I4mwpAin0xRNkWRJTH1A=="],
+
+ "tscircuit/circuit-json": ["circuit-json@0.0.460", "", { "peerDependencies": { "format-si-unit": "*" } }, "sha512-6L8Kf2dT+jTg0pdKkYuGG864gPf1h9I55YYAaosFklYY4EnHcAYcVrF0IylB0jBfYu9RY3clSoTWMkjAkAYGSA=="],
"use-mouse-matrix-transform/react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="],
diff --git a/index.ts b/index.ts
index 96f5b8d..ab93874 100644
--- a/index.ts
+++ b/index.ts
@@ -5,7 +5,27 @@ export * from "./lib/AdafruitFeatherSTM32F405Express"
export * from "./lib/AdafruitFeatherESP32V2"
export * from "./lib/AdafruitFeatherESP32S2"
export * from "./lib/AdafruitFeatherESP32S34MBFlash2MBPSRAM"
+export * from "./lib/AdafruitFeatherESP32S3TFT"
export * from "./lib/AdafruitFeatherRP2040"
+export * from "./lib/AdafruitFeatherRP2350"
+export * from "./lib/AdafruitItsyBitsyESP32"
+export * from "./lib/AdafruitItsyBitsyM0Express"
+export * from "./lib/AdafruitItsyBitsyM4Express"
+export * from "./lib/AdafruitItsyBitsyNRF52840Express"
+export * from "./lib/AdafruitItsyBitsyRP2040"
+export * from "./lib/AdafruitQTPyESP32S2"
+export * from "./lib/AdafruitQTPyESP32S3"
+export * from "./lib/AdafruitQTPyNRF52840"
+export * from "./lib/AdafruitQTPyRP2350"
+export * from "./lib/AdafruitQTPySAMD21"
+export * from "./lib/ArduinoNano33BLE"
+export * from "./lib/ArduinoNano33BLESenseRev2"
+export * from "./lib/ArduinoNano33IoT"
+export * from "./lib/ArduinoNanoATmega328P"
+export * from "./lib/ArduinoNanoESP32"
+export * from "./lib/ArduinoNanoEvery"
+export * from "./lib/ArduinoNanoMatter"
+export * from "./lib/ArduinoNanoRP2040Connect"
export * from "./lib/generatedModules"
export * from "./lib/PololuA4988StepperMotorDriverCarrier"
export * from "./lib/SeeedXiaoRP2040"
diff --git a/lib/AdafruitFeatherESP32S2.tsx b/lib/AdafruitFeatherESP32S2.tsx
index 2ddf1f0..ecbda7f 100644
--- a/lib/AdafruitFeatherESP32S2.tsx
+++ b/lib/AdafruitFeatherESP32S2.tsx
@@ -2,7 +2,7 @@ import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
/** Adafruit ESP32-S2 Feather 12+16 female socket footprint. */
export const ADAFRUIT_FEATHER_ESP32_S2_FOOTPRINT =
- "pinrow28_rows2_cols16_p2.54mm_py20.32mm_missing(1,2,3,4)_id1mm_od1.6mm_female_nopinlabels" as const
+ "headermodule28_rows2_cols16_p2.54mm_py20.32mm_missing(1,2,3,4)_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(FEATHER ESP32-S2)" as const
export const ADAFRUIT_FEATHER_ESP32_S2_PIN_LABELS = {
// Short row, USB end to opposite end.
@@ -22,8 +22,8 @@ export const ADAFRUIT_FEATHER_ESP32_S2_PIN_LABELS = {
// Long row, USB end to opposite end. The final position is the board's
// debug UART TX connection rather than a general-purpose GPIO.
pin13: ["RST", "RESET"],
- pin14: ["3V3", "3.3V"],
- pin15: ["3V3_2", "3V3", "3.3V"],
+ pin14: ["3V3", "V3_3"],
+ pin15: ["3V3_2", "3V3", "V3_3"],
pin16: ["GND"],
pin17: ["A0", "GPIO18", "ADC2_CH7", "DAC_2"],
pin18: ["A1", "GPIO17", "ADC2_CH6", "DAC_1"],
@@ -260,6 +260,36 @@ export const AdafruitFeatherESP32S2 = (props: AdafruitFeatherESP32S2Props) => (
datasheetUrl="https://learn.adafruit.com/adafruit-esp32-s2-feather/pinouts"
footprint={ADAFRUIT_FEATHER_ESP32_S2_FOOTPRINT}
pinLabels={ADAFRUIT_FEATHER_ESP32_S2_PIN_LABELS}
+ pcbPinLabels={{
+ pin1: "BAT",
+ pin2: "EN",
+ pin3: "USB",
+ pin4: "D13",
+ pin5: "D12",
+ pin6: "D11",
+ pin7: "D10",
+ pin8: "D9",
+ pin9: "D6",
+ pin10: "D5",
+ pin11: "SCL",
+ pin12: "SDA",
+ pin13: "RST",
+ pin14: "3V3",
+ pin15: "3V3_2",
+ pin16: "GND",
+ pin17: "A0",
+ pin18: "A1",
+ pin19: "A2",
+ pin20: "A3",
+ pin21: "A4",
+ pin22: "A5",
+ pin23: "SCK",
+ pin24: "MOSI",
+ pin25: "MISO",
+ pin26: "RX",
+ pin27: "TX",
+ pin28: "DEBUG_TX",
+ }}
pinAttributes={ADAFRUIT_FEATHER_ESP32_S2_PIN_ATTRIBUTES}
schWidth={1.5}
schHeight={2.6}
diff --git a/lib/AdafruitFeatherESP32S34MBFlash2MBPSRAM.tsx b/lib/AdafruitFeatherESP32S34MBFlash2MBPSRAM.tsx
index 8907329..012cfff 100644
--- a/lib/AdafruitFeatherESP32S34MBFlash2MBPSRAM.tsx
+++ b/lib/AdafruitFeatherESP32S34MBFlash2MBPSRAM.tsx
@@ -2,7 +2,7 @@ import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
/** Adafruit ESP32-S3 Feather 4MB Flash / 2MB PSRAM 12+16 female socket. */
export const ADAFRUIT_FEATHER_ESP32_S3_4MB_FLASH_2MB_PSRAM_FOOTPRINT =
- "pinrow28_rows2_cols16_p2.54mm_py20.32mm_missing(1,2,3,4)_id1mm_od1.6mm_female_nopinlabels" as const
+ "headermodule28_rows2_cols16_p2.54mm_py20.32mm_missing(1,2,3,4)_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(FEATHER ESP32-S3)" as const
export const ADAFRUIT_FEATHER_ESP32_S3_4MB_FLASH_2MB_PSRAM_PIN_LABELS = {
// Short row, USB end to opposite end.
@@ -22,8 +22,8 @@ export const ADAFRUIT_FEATHER_ESP32_S3_4MB_FLASH_2MB_PSRAM_PIN_LABELS = {
// Long row, USB end to opposite end. The final position is the board's
// debug UART TX connection rather than a general-purpose GPIO.
pin13: ["RST", "RESET"],
- pin14: ["3V3", "3.3V"],
- pin15: ["3V3_2", "3V3", "3.3V"],
+ pin14: ["3V3", "V3_3"],
+ pin15: ["3V3_2", "3V3", "V3_3"],
pin16: ["GND"],
pin17: ["A0", "GPIO18", "ADC2_CH7"],
pin18: ["A1", "GPIO17", "ADC2_CH6"],
@@ -262,6 +262,36 @@ export const AdafruitFeatherESP32S34MBFlash2MBPSRAM = (
datasheetUrl="https://learn.adafruit.com/adafruit-esp32-s3-feather/pinouts"
footprint={ADAFRUIT_FEATHER_ESP32_S3_4MB_FLASH_2MB_PSRAM_FOOTPRINT}
pinLabels={ADAFRUIT_FEATHER_ESP32_S3_4MB_FLASH_2MB_PSRAM_PIN_LABELS}
+ pcbPinLabels={{
+ pin1: "BAT",
+ pin2: "EN",
+ pin3: "USB",
+ pin4: "D13",
+ pin5: "D12",
+ pin6: "D11",
+ pin7: "D10",
+ pin8: "D9",
+ pin9: "D6",
+ pin10: "D5",
+ pin11: "SCL",
+ pin12: "SDA",
+ pin13: "RST",
+ pin14: "3V3",
+ pin15: "3V3_2",
+ pin16: "GND",
+ pin17: "A0",
+ pin18: "A1",
+ pin19: "A2",
+ pin20: "A3",
+ pin21: "A4",
+ pin22: "A5",
+ pin23: "SCK",
+ pin24: "MOSI",
+ pin25: "MISO",
+ pin26: "RX",
+ pin27: "TX",
+ pin28: "DEBUG_TX",
+ }}
pinAttributes={ADAFRUIT_FEATHER_ESP32_S3_4MB_FLASH_2MB_PSRAM_PIN_ATTRIBUTES}
schWidth={1.5}
schHeight={2.6}
diff --git a/lib/AdafruitFeatherESP32S3TFT.tsx b/lib/AdafruitFeatherESP32S3TFT.tsx
new file mode 100644
index 0000000..0b5a635
--- /dev/null
+++ b/lib/AdafruitFeatherESP32S3TFT.tsx
@@ -0,0 +1,206 @@
+import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
+
+/** Adafruit ESP32-S3 TFT Feather: the two populated Feather header rows. */
+export const ADAFRUIT_FEATHER_ESP32_S3_TFT_FOOTPRINT =
+ "headermodule28_rows2_cols16_p2.54mm_py20.32mm_missing(1,2,3,4)_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(FEATHER S3 TFT)" as const
+
+export const ADAFRUIT_FEATHER_ESP32_S3_TFT_PIN_LABELS = {
+ pin1: ["VBAT"],
+ pin2: ["EN"],
+ pin3: ["VBUS"],
+ pin4: ["D13", "GPIO48"],
+ pin5: ["D12", "GPIO47"],
+ pin6: ["D11", "GPIO38"],
+ pin7: ["D10", "GPIO21"],
+ pin8: ["D9", "GPIO18"],
+ pin9: ["D6", "GPIO9"],
+ pin10: ["D5", "GPIO8"],
+ pin11: ["SCL", "GPIO4"],
+ pin12: ["SDA", "GPIO3"],
+ pin13: ["RESET", "RST"],
+ pin14: ["3V3", "V3_3"],
+ pin15: ["3V3_2", "V3_3"],
+ pin16: ["GND"],
+ pin17: ["A0"],
+ pin18: ["A1"],
+ pin19: ["A2"],
+ pin20: ["A3"],
+ pin21: ["A4"],
+ pin22: ["A5"],
+ pin23: ["SCK"],
+ pin24: ["MOSI"],
+ pin25: ["MISO"],
+ pin26: ["RX"],
+ pin27: ["TX"],
+ pin28: ["TXD0", "DEBUG_TX"],
+} as const
+
+const GPIO = {
+ isGpio: true,
+ includeInBoardPinout: true,
+ canUseInternalPullup: true,
+ canUseInternalPulldown: true,
+ canUseOpenDrain: true,
+ canUsePushPull: true,
+} as const satisfies PinAttributeMap
+
+const I2C_SCL = { ...GPIO, capabilities: ["i2c_scl"] } satisfies PinAttributeMap
+const I2C_SDA = { ...GPIO, capabilities: ["i2c_sda"] } satisfies PinAttributeMap
+const SPI_SCK = { ...GPIO, capabilities: ["spi_sck"] } satisfies PinAttributeMap
+const SPI_MOSI = { ...GPIO, capabilities: ["spi_mosi"] } satisfies PinAttributeMap
+const SPI_MISO = { ...GPIO, capabilities: ["spi_miso"] } satisfies PinAttributeMap
+const UART_RX = { ...GPIO, capabilities: ["uart_rx"] } satisfies PinAttributeMap
+const UART_TX = { ...GPIO, capabilities: ["uart_tx"] } satisfies PinAttributeMap
+
+export const ADAFRUIT_FEATHER_ESP32_S3_TFT_PIN_ATTRIBUTES = {
+ VBAT: { providesPower: true, includeInBoardPinout: true },
+ EN: { includeInBoardPinout: true },
+ VBUS: {
+ requiresPower: true,
+ providesPower: true,
+ requiresVoltage: "5V",
+ providesVoltage: "5V",
+ includeInBoardPinout: true,
+ },
+ D13: GPIO,
+ D12: GPIO,
+ D11: GPIO,
+ D10: GPIO,
+ D9: GPIO,
+ D6: GPIO,
+ D5: GPIO,
+ SCL: I2C_SCL,
+ SDA: I2C_SDA,
+ RESET: { includeInBoardPinout: true },
+ "3V3": {
+ providesPower: true,
+ providesVoltage: "3.3V",
+ includeInBoardPinout: true,
+ },
+ "3V3_2": {
+ providesPower: true,
+ providesVoltage: "3.3V",
+ includeInBoardPinout: true,
+ },
+ GND: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ A0: GPIO,
+ A1: GPIO,
+ A2: GPIO,
+ A3: GPIO,
+ A4: GPIO,
+ A5: GPIO,
+ SCK: SPI_SCK,
+ MOSI: SPI_MOSI,
+ MISO: SPI_MISO,
+ RX: UART_RX,
+ TX: UART_TX,
+ TXD0: { capabilities: ["uart_tx"], includeInBoardPinout: true },
+} as const satisfies Record
+
+type FixedProps =
+ | "datasheetUrl"
+ | "displayName"
+ | "footprint"
+ | "manufacturerPartNumber"
+ | "mfn"
+ | "pinAttributes"
+ | "pinLabels"
+ | "schHeight"
+ | "schPinArrangement"
+ | "schWidth"
+
+export type AdafruitFeatherESP32S3TFTProps = Omit<
+ ChipProps,
+ FixedProps
+>
+
+export const AdafruitFeatherESP32S3TFT = (
+ props: AdafruitFeatherESP32S3TFTProps,
+) => (
+
+)
diff --git a/lib/AdafruitFeatherESP32V2.tsx b/lib/AdafruitFeatherESP32V2.tsx
index bf9438e..a0726a6 100644
--- a/lib/AdafruitFeatherESP32V2.tsx
+++ b/lib/AdafruitFeatherESP32V2.tsx
@@ -2,7 +2,7 @@ import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
/** Adafruit ESP32 Feather V2 12+16 female socket footprint. */
export const ADAFRUIT_FEATHER_ESP32_V2_FOOTPRINT =
- "pinrow28_rows2_cols16_p2.54mm_py20.32mm_missing(1,2,3,4)_id1mm_od1.6mm_female_nopinlabels" as const
+ "headermodule28_rows2_cols16_p2.54mm_py20.32mm_missing(1,2,3,4)_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(FEATHER ESP32 V2)" as const
export const ADAFRUIT_FEATHER_ESP32_V2_PIN_LABELS = {
// Short row, USB end to opposite end.
@@ -22,7 +22,7 @@ export const ADAFRUIT_FEATHER_ESP32_V2_PIN_LABELS = {
// Long row, USB end to opposite end. The AREF position is an unconnected
// hole on the ESP32 V2; D37 is the input-only GPIO at the last position.
pin13: ["RST", "RESET"],
- pin14: ["3V3", "3.3V"],
+ pin14: ["3V3", "V3_3"],
pin15: ["NC"],
pin16: ["GND"],
pin17: ["A0", "GPIO26", "ADC2_CH9", "DAC2"],
@@ -241,6 +241,36 @@ export const AdafruitFeatherESP32V2 = (props: AdafruitFeatherESP32V2Props) => (
datasheetUrl="https://learn.adafruit.com/adafruit-esp32-feather-v2/pinouts"
footprint={ADAFRUIT_FEATHER_ESP32_V2_FOOTPRINT}
pinLabels={ADAFRUIT_FEATHER_ESP32_V2_PIN_LABELS}
+ pcbPinLabels={{
+ pin1: "BAT",
+ pin2: "EN",
+ pin3: "USB",
+ pin4: "D13",
+ pin5: "D12",
+ pin6: "D27",
+ pin7: "D33",
+ pin8: "D15",
+ pin9: "D32",
+ pin10: "D14",
+ pin11: "SCL",
+ pin12: "SDA",
+ pin13: "RST",
+ pin14: "3V3",
+ pin15: "NC",
+ pin16: "GND",
+ pin17: "A0",
+ pin18: "A1",
+ pin19: "A2",
+ pin20: "A3",
+ pin21: "A4",
+ pin22: "A5",
+ pin23: "SCK",
+ pin24: "MOSI",
+ pin25: "MISO",
+ pin26: "RX",
+ pin27: "TX",
+ pin28: "D37",
+ }}
pinAttributes={ADAFRUIT_FEATHER_ESP32_V2_PIN_ATTRIBUTES}
schWidth={1.5}
schHeight={2.6}
diff --git a/lib/AdafruitFeatherM0Express.tsx b/lib/AdafruitFeatherM0Express.tsx
index 032ff42..feb302e 100644
--- a/lib/AdafruitFeatherM0Express.tsx
+++ b/lib/AdafruitFeatherM0Express.tsx
@@ -3,7 +3,7 @@ import { samdGpio } from "./samdPinAttributes"
/** Adafruit Feather M0 Express 12+16 female socket footprint. */
export const ADAFRUIT_FEATHER_M0_EXPRESS_FOOTPRINT =
- "pinrow28_rows2_cols16_p2.54mm_py20.32mm_missing(1,2,3,4)_id1mm_od1.6mm_female_nopinlabels" as const
+ "headermodule28_rows2_cols16_p2.54mm_py20.32mm_missing(1,2,3,4)_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(FEATHER M0)" as const
export const ADAFRUIT_FEATHER_M0_EXPRESS_PIN_LABELS = {
// Short row, USB end to opposite end.
@@ -112,6 +112,36 @@ export const AdafruitFeatherM0Express = (
datasheetUrl="https://learn.adafruit.com/adafruit-feather-m0-express-designed-for-circuit-python-circuitpython/adafruit2-pinouts"
footprint={ADAFRUIT_FEATHER_M0_EXPRESS_FOOTPRINT}
pinLabels={ADAFRUIT_FEATHER_M0_EXPRESS_PIN_LABELS}
+ pcbPinLabels={{
+ pin1: "BAT",
+ pin2: "EN",
+ pin3: "USB",
+ pin4: "D13",
+ pin5: "D12",
+ pin6: "D11",
+ pin7: "D10",
+ pin8: "D9",
+ pin9: "D6",
+ pin10: "D5",
+ pin11: "SCL",
+ pin12: "SDA",
+ pin13: "RST",
+ pin14: "3V",
+ pin15: "AREF",
+ pin16: "GND",
+ pin17: "A0",
+ pin18: "A1",
+ pin19: "A2",
+ pin20: "A3",
+ pin21: "A4",
+ pin22: "A5",
+ pin23: "SCK",
+ pin24: "MOSI",
+ pin25: "MISO",
+ pin26: "RX",
+ pin27: "TX",
+ pin28: "D4",
+ }}
pinAttributes={ADAFRUIT_FEATHER_M0_EXPRESS_PIN_ATTRIBUTES}
schWidth={1.5}
schHeight={2.6}
diff --git a/lib/AdafruitFeatherM4Express.tsx b/lib/AdafruitFeatherM4Express.tsx
index 1ed9594..c751b20 100644
--- a/lib/AdafruitFeatherM4Express.tsx
+++ b/lib/AdafruitFeatherM4Express.tsx
@@ -3,7 +3,7 @@ import { samdGpio } from "./samdPinAttributes"
/** Adafruit Feather M4 Express 12+16 female socket footprint. */
export const ADAFRUIT_FEATHER_M4_EXPRESS_FOOTPRINT =
- "pinrow28_rows2_cols16_p2.54mm_py20.32mm_missing(1,2,3,4)_id1mm_od1.6mm_female_nopinlabels" as const
+ "headermodule28_rows2_cols16_p2.54mm_py20.32mm_missing(1,2,3,4)_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(FEATHER M4)" as const
export const ADAFRUIT_FEATHER_M4_EXPRESS_PIN_LABELS = {
// Short row, USB end to opposite end.
@@ -112,6 +112,36 @@ export const AdafruitFeatherM4Express = (
datasheetUrl="https://learn.adafruit.com/adafruit-feather-m4-express-atsamd51/pinouts"
footprint={ADAFRUIT_FEATHER_M4_EXPRESS_FOOTPRINT}
pinLabels={ADAFRUIT_FEATHER_M4_EXPRESS_PIN_LABELS}
+ pcbPinLabels={{
+ pin1: "BAT",
+ pin2: "EN",
+ pin3: "USB",
+ pin4: "D13",
+ pin5: "D12",
+ pin6: "D11",
+ pin7: "D10",
+ pin8: "D9",
+ pin9: "D6",
+ pin10: "D5",
+ pin11: "SCL",
+ pin12: "SDA",
+ pin13: "RST",
+ pin14: "3V",
+ pin15: "AREF",
+ pin16: "GND",
+ pin17: "A0",
+ pin18: "A1",
+ pin19: "A2",
+ pin20: "A3",
+ pin21: "A4",
+ pin22: "A5",
+ pin23: "SCK",
+ pin24: "MOSI",
+ pin25: "MISO",
+ pin26: "RX",
+ pin27: "TX",
+ pin28: "D4",
+ }}
pinAttributes={ADAFRUIT_FEATHER_M4_EXPRESS_PIN_ATTRIBUTES}
schWidth={1.5}
schHeight={2.6}
diff --git a/lib/AdafruitFeatherNRF52840Express.tsx b/lib/AdafruitFeatherNRF52840Express.tsx
index 2dfb1b2..a893f30 100644
--- a/lib/AdafruitFeatherNRF52840Express.tsx
+++ b/lib/AdafruitFeatherNRF52840Express.tsx
@@ -2,7 +2,7 @@ import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
/** Adafruit Feather nRF52840 Express 12+16 female socket footprint. */
export const ADAFRUIT_FEATHER_NRF52840_EXPRESS_FOOTPRINT =
- "pinrow28_rows2_cols16_p2.54mm_py20.32mm_missing(1,2,3,4)_id1mm_od1.6mm_female_nopinlabels" as const
+ "headermodule28_rows2_cols16_p2.54mm_py20.32mm_missing(1,2,3,4)_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(FEATHER NRF52840)" as const
export const ADAFRUIT_FEATHER_NRF52840_EXPRESS_PIN_LABELS = {
// Short row, USB end to opposite end. Aliases are from Adafruit's nRF52840
@@ -22,7 +22,7 @@ export const ADAFRUIT_FEATHER_NRF52840_EXPRESS_PIN_LABELS = {
// Long row, USB end to opposite end.
pin13: ["RST", "RESET"],
- pin14: ["3V", "3V3", "3.3V"],
+ pin14: ["3V", "3V3", "V3_3"],
pin15: ["AREF", "A7", "21", "P0.31", "AIN7"],
pin16: ["GND"],
pin17: ["A0", "14", "P0.04", "AIN2"],
@@ -257,6 +257,36 @@ export const AdafruitFeatherNRF52840Express = (
datasheetUrl="https://learn.adafruit.com/introducing-the-adafruit-nrf52840-feather/pinouts"
footprint={ADAFRUIT_FEATHER_NRF52840_EXPRESS_FOOTPRINT}
pinLabels={ADAFRUIT_FEATHER_NRF52840_EXPRESS_PIN_LABELS}
+ pcbPinLabels={{
+ pin1: "BAT",
+ pin2: "EN",
+ pin3: "USB",
+ pin4: "D13",
+ pin5: "D12",
+ pin6: "D11",
+ pin7: "D10",
+ pin8: "D9",
+ pin9: "D6",
+ pin10: "D5",
+ pin11: "SCL",
+ pin12: "SDA",
+ pin13: "RST",
+ pin14: "3V",
+ pin15: "AREF",
+ pin16: "GND",
+ pin17: "A0",
+ pin18: "A1",
+ pin19: "A2",
+ pin20: "A3",
+ pin21: "A4",
+ pin22: "A5",
+ pin23: "SCK",
+ pin24: "MOSI",
+ pin25: "MISO",
+ pin26: "RX",
+ pin27: "TX",
+ pin28: "D2",
+ }}
pinAttributes={ADAFRUIT_FEATHER_NRF52840_EXPRESS_PIN_ATTRIBUTES}
schWidth={1.5}
schHeight={2.6}
diff --git a/lib/AdafruitFeatherRP2040.tsx b/lib/AdafruitFeatherRP2040.tsx
index 1b2c0d4..503b4c5 100644
--- a/lib/AdafruitFeatherRP2040.tsx
+++ b/lib/AdafruitFeatherRP2040.tsx
@@ -6,7 +6,7 @@ import { rp2040Gpio } from "./rp2040PinAttributes"
* USB is on the negative PCB X side when pcbRotation is zero.
*/
export const ADAFRUIT_FEATHER_RP2040_FOOTPRINT =
- "pinrow28_rows2_cols16_p2.54mm_py20.32mm_missing(1,2,3,4)_id1mm_od1.6mm_female_nopinlabels" as const
+ "headermodule28_rows2_cols16_p2.54mm_py20.32mm_missing(1,2,3,4)_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(FEATHER RP2040)" as const
export const ADAFRUIT_FEATHER_RP2040_PIN_LABELS = {
// Short row, USB end to opposite end.
@@ -122,6 +122,36 @@ export const AdafruitFeatherRP2040 = (
datasheetUrl="https://learn.adafruit.com/adafruit-feather-rp2040-pico/pinouts"
footprint={ADAFRUIT_FEATHER_RP2040_FOOTPRINT}
pinLabels={ADAFRUIT_FEATHER_RP2040_PIN_LABELS}
+ pcbPinLabels={{
+ pin1: "BAT",
+ pin2: "EN",
+ pin3: "USB",
+ pin4: "D13",
+ pin5: "D12",
+ pin6: "D11",
+ pin7: "D10",
+ pin8: "D9",
+ pin9: "D6",
+ pin10: "D5",
+ pin11: "SCL",
+ pin12: "SDA",
+ pin13: "RST",
+ pin14: "3V3",
+ pin15: "3V3_AREF",
+ pin16: "GND",
+ pin17: "A0",
+ pin18: "A1",
+ pin19: "A2",
+ pin20: "A3",
+ pin21: "D24",
+ pin22: "D25",
+ pin23: "SCK",
+ pin24: "MOSI",
+ pin25: "MISO",
+ pin26: "RX",
+ pin27: "TX",
+ pin28: "D4",
+ }}
pinAttributes={ADAFRUIT_FEATHER_RP2040_PIN_ATTRIBUTES}
schWidth={1.5}
schHeight={2.6}
diff --git a/lib/AdafruitFeatherRP2350.tsx b/lib/AdafruitFeatherRP2350.tsx
new file mode 100644
index 0000000..6fd0242
--- /dev/null
+++ b/lib/AdafruitFeatherRP2350.tsx
@@ -0,0 +1,203 @@
+import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
+
+/** Adafruit Feather RP2350 socket: one 12-pin row and one 16-pin row. */
+export const ADAFRUIT_FEATHER_RP2350_FOOTPRINT =
+ "headermodule28_rows2_cols16_p2.54mm_py20.32mm_missing(1,2,3,4)_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(FEATHER RP2350)" as const
+
+export const ADAFRUIT_FEATHER_RP2350_PIN_LABELS = {
+ pin1: ["VBAT"],
+ pin2: ["EN"],
+ pin3: ["VBUS"],
+ pin4: ["D7"],
+ pin5: ["D4"],
+ pin6: ["D11"],
+ pin7: ["D10"],
+ pin8: ["D9"],
+ pin9: ["D6"],
+ pin10: ["D5"],
+ pin11: ["SCL"],
+ pin12: ["SDA"],
+ pin13: ["RESET", "RUN", "RST"],
+ pin14: ["3V3"],
+ pin15: ["3V3_2", "3V3"],
+ pin16: ["GND"],
+ pin17: ["A0"],
+ pin18: ["A1"],
+ pin19: ["A2"],
+ pin20: ["A3"],
+ pin21: ["D24"],
+ pin22: ["D25"],
+ pin23: ["SCK"],
+ pin24: ["MOSI"],
+ pin25: ["MISO"],
+ pin26: ["RX"],
+ pin27: ["TX"],
+ pin28: ["PSRAM_CS"],
+} as const
+
+const GPIO = {
+ isGpio: true,
+ includeInBoardPinout: true,
+ canUseInternalPullup: true,
+ canUseInternalPulldown: true,
+ canUseOpenDrain: true,
+ canUsePushPull: true,
+} as const satisfies PinAttributeMap
+const I2C_SCL = { ...GPIO, capabilities: ["i2c_scl"] } satisfies PinAttributeMap
+const I2C_SDA = { ...GPIO, capabilities: ["i2c_sda"] } satisfies PinAttributeMap
+const SPI_SCK = { ...GPIO, capabilities: ["spi_sck"] } satisfies PinAttributeMap
+const SPI_MOSI = { ...GPIO, capabilities: ["spi_mosi"] } satisfies PinAttributeMap
+const SPI_MISO = { ...GPIO, capabilities: ["spi_miso"] } satisfies PinAttributeMap
+const UART_RX = { ...GPIO, capabilities: ["uart_rx"] } satisfies PinAttributeMap
+const UART_TX = { ...GPIO, capabilities: ["uart_tx"] } satisfies PinAttributeMap
+
+export const ADAFRUIT_FEATHER_RP2350_PIN_ATTRIBUTES = {
+ VBAT: { providesPower: true, includeInBoardPinout: true },
+ EN: { includeInBoardPinout: true },
+ VBUS: {
+ requiresPower: true,
+ providesPower: true,
+ requiresVoltage: "5V",
+ providesVoltage: "5V",
+ includeInBoardPinout: true,
+ },
+ D7: GPIO,
+ D4: GPIO,
+ D11: GPIO,
+ D10: GPIO,
+ D9: GPIO,
+ D6: GPIO,
+ D5: GPIO,
+ SCL: I2C_SCL,
+ SDA: I2C_SDA,
+ RESET: { includeInBoardPinout: true },
+ "3V3": {
+ providesPower: true,
+ providesVoltage: "3.3V",
+ includeInBoardPinout: true,
+ },
+ "3V3_2": {
+ providesPower: true,
+ providesVoltage: "3.3V",
+ includeInBoardPinout: true,
+ },
+ GND: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ A0: GPIO,
+ A1: GPIO,
+ A2: GPIO,
+ A3: GPIO,
+ D24: GPIO,
+ D25: GPIO,
+ SCK: SPI_SCK,
+ MOSI: SPI_MOSI,
+ MISO: SPI_MISO,
+ RX: UART_RX,
+ TX: UART_TX,
+ PSRAM_CS: { includeInBoardPinout: true },
+} as const satisfies Record
+
+type FixedProps =
+ | "datasheetUrl"
+ | "displayName"
+ | "footprint"
+ | "manufacturerPartNumber"
+ | "mfn"
+ | "pinAttributes"
+ | "pinLabels"
+ | "schHeight"
+ | "schPinArrangement"
+ | "schWidth"
+
+export type AdafruitFeatherRP2350Props = Omit<
+ ChipProps,
+ FixedProps
+>
+
+export const AdafruitFeatherRP2350 = (props: AdafruitFeatherRP2350Props) => (
+
+)
diff --git a/lib/AdafruitFeatherSTM32F405Express.tsx b/lib/AdafruitFeatherSTM32F405Express.tsx
index df57a24..00e395d 100644
--- a/lib/AdafruitFeatherSTM32F405Express.tsx
+++ b/lib/AdafruitFeatherSTM32F405Express.tsx
@@ -2,7 +2,7 @@ import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
/** Adafruit Feather STM32F405 Express 12+16 female socket footprint. */
export const ADAFRUIT_FEATHER_STM32F405_EXPRESS_FOOTPRINT =
- "pinrow28_rows2_cols16_p2.54mm_py20.32mm_missing(1,2,3,4)_id1mm_od1.6mm_female_nopinlabels" as const
+ "headermodule28_rows2_cols16_p2.54mm_py20.32mm_missing(1,2,3,4)_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(FEATHER STM32F405)" as const
export const ADAFRUIT_FEATHER_STM32F405_EXPRESS_PIN_LABELS = {
// Short row, USB end to opposite end. The MCU aliases and alternate
@@ -23,8 +23,8 @@ export const ADAFRUIT_FEATHER_STM32F405_EXPRESS_PIN_LABELS = {
// Long row, USB end to opposite end. This board uses both 3V3 holes and
// exposes BOOT0 at the last header position instead of an Arduino D4 pin.
pin13: ["RST", "RESET"],
- pin14: ["3V3", "3.3V"],
- pin15: ["3V3_2", "3V3", "3.3V"],
+ pin14: ["3V3", "V3_3"],
+ pin15: ["3V3_2", "3V3", "V3_3"],
pin16: ["GND"],
pin17: ["A0", "GPIO16", "PA4", "DAC_OUT1"],
pin18: ["A1", "GPIO17", "PA5", "DAC_OUT2"],
@@ -261,6 +261,36 @@ export const AdafruitFeatherSTM32F405Express = (
datasheetUrl="https://learn.adafruit.com/adafruit-stm32f405-feather-express/pinouts"
footprint={ADAFRUIT_FEATHER_STM32F405_EXPRESS_FOOTPRINT}
pinLabels={ADAFRUIT_FEATHER_STM32F405_EXPRESS_PIN_LABELS}
+ pcbPinLabels={{
+ pin1: "BAT",
+ pin2: "EN",
+ pin3: "USB",
+ pin4: "D13",
+ pin5: "D12",
+ pin6: "D11",
+ pin7: "D10",
+ pin8: "D9",
+ pin9: "D6",
+ pin10: "D5",
+ pin11: "SCL",
+ pin12: "SDA",
+ pin13: "RST",
+ pin14: "3V3",
+ pin15: "3V3_2",
+ pin16: "GND",
+ pin17: "A0",
+ pin18: "A1",
+ pin19: "A2",
+ pin20: "A3",
+ pin21: "A4",
+ pin22: "A5",
+ pin23: "SCK",
+ pin24: "MOSI",
+ pin25: "MISO",
+ pin26: "RX",
+ pin27: "TX",
+ pin28: "BOOT0",
+ }}
pinAttributes={ADAFRUIT_FEATHER_STM32F405_EXPRESS_PIN_ATTRIBUTES}
schWidth={1.5}
schHeight={2.6}
diff --git a/lib/AdafruitItsyBitsyESP32.tsx b/lib/AdafruitItsyBitsyESP32.tsx
new file mode 100644
index 0000000..835f04a
--- /dev/null
+++ b/lib/AdafruitItsyBitsyESP32.tsx
@@ -0,0 +1,205 @@
+import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
+
+/** Adafruit ItsyBitsy ESP32: two 14-pin female header rows. */
+export const ADAFRUIT_ITSYBITSY_ESP32_FOOTPRINT =
+ "headermodule28_rows2_cols14_p2.54mm_py15.24mm_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(ITSY ESP32)" as const
+
+export const ADAFRUIT_ITSYBITSY_ESP32_PIN_LABELS = {
+ pin1: ["VBAT"],
+ pin2: ["GND"],
+ pin3: ["VBUS"],
+ pin4: ["D13", "GPIO13"],
+ pin5: ["D12", "GPIO12"],
+ pin6: ["D14", "GPIO14"],
+ pin7: ["D33", "GPIO33"],
+ pin8: ["D32", "GPIO32"],
+ pin9: ["D7", "GPIO7"],
+ pin10: ["D5", "GPIO5"],
+ pin11: ["SCL", "GPIO27"],
+ pin12: ["SDA", "GPIO15"],
+ pin13: ["TX", "GPIO20"],
+ pin14: ["RX", "GPIO8"],
+ pin15: ["GND_2", "GND"],
+ pin16: ["MISO", "GPIO22"],
+ pin17: ["MOSI", "GPIO21"],
+ pin18: ["SCK", "GPIO19"],
+ pin19: ["A5", "GPIO36"],
+ pin20: ["A4", "GPIO37"],
+ pin21: ["A3", "GPIO38"],
+ pin22: ["A2", "GPIO4"],
+ pin23: ["A1", "GPIO26"],
+ pin24: ["A0", "GPIO25"],
+ pin25: ["VHI"],
+ pin26: ["EN"],
+ pin27: ["3V3", "V3_3"],
+ pin28: ["RESET", "RST"],
+} as const
+
+const GPIO = {
+ isGpio: true,
+ includeInBoardPinout: true,
+ canUseInternalPullup: true,
+ canUseInternalPulldown: true,
+ canUseOpenDrain: true,
+ canUsePushPull: true,
+} as const satisfies PinAttributeMap
+const I2C_SCL = { ...GPIO, capabilities: ["i2c_scl"] } satisfies PinAttributeMap
+const I2C_SDA = { ...GPIO, capabilities: ["i2c_sda"] } satisfies PinAttributeMap
+const SPI_SCK = { ...GPIO, capabilities: ["spi_sck"] } satisfies PinAttributeMap
+const SPI_MOSI = { ...GPIO, capabilities: ["spi_mosi"] } satisfies PinAttributeMap
+const SPI_MISO = { ...GPIO, capabilities: ["spi_miso"] } satisfies PinAttributeMap
+const UART_TX = { ...GPIO, capabilities: ["uart_tx"] } satisfies PinAttributeMap
+const UART_RX = { ...GPIO, capabilities: ["uart_rx"] } satisfies PinAttributeMap
+
+export const ADAFRUIT_ITSYBITSY_ESP32_PIN_ATTRIBUTES = {
+ VBAT: { providesPower: true, includeInBoardPinout: true },
+ GND: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ VBUS: {
+ requiresPower: true,
+ providesPower: true,
+ requiresVoltage: "5V",
+ providesVoltage: "5V",
+ includeInBoardPinout: true,
+ },
+ D13: GPIO,
+ D12: GPIO,
+ D14: GPIO,
+ D33: GPIO,
+ D32: GPIO,
+ D7: GPIO,
+ D5: GPIO,
+ SCL: I2C_SCL,
+ SDA: I2C_SDA,
+ TX: UART_TX,
+ RX: UART_RX,
+ GND_2: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ MISO: SPI_MISO,
+ MOSI: SPI_MOSI,
+ SCK: SPI_SCK,
+ A5: GPIO,
+ A4: GPIO,
+ A3: GPIO,
+ A2: GPIO,
+ A1: GPIO,
+ A0: GPIO,
+ VHI: { includeInBoardPinout: true },
+ EN: { includeInBoardPinout: true },
+ "3V3": {
+ providesPower: true,
+ providesVoltage: "3.3V",
+ includeInBoardPinout: true,
+ },
+ RESET: { includeInBoardPinout: true },
+} as const satisfies Record
+
+type FixedProps =
+ | "datasheetUrl"
+ | "displayName"
+ | "footprint"
+ | "manufacturerPartNumber"
+ | "mfn"
+ | "pinAttributes"
+ | "pinLabels"
+ | "schHeight"
+ | "schPinArrangement"
+ | "schWidth"
+
+export type AdafruitItsyBitsyESP32Props = Omit<
+ ChipProps,
+ FixedProps
+>
+
+export const AdafruitItsyBitsyESP32 = (
+ props: AdafruitItsyBitsyESP32Props,
+) => (
+
+)
diff --git a/lib/AdafruitItsyBitsyM0Express.tsx b/lib/AdafruitItsyBitsyM0Express.tsx
new file mode 100644
index 0000000..2294cf7
--- /dev/null
+++ b/lib/AdafruitItsyBitsyM0Express.tsx
@@ -0,0 +1,195 @@
+import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
+import { samdGpio } from "./samdPinAttributes"
+
+/** Adafruit ItsyBitsy M0 Express: two 14-pin female header rows. */
+export const ADAFRUIT_ITSYBITSY_M0_EXPRESS_FOOTPRINT =
+ "headermodule28_rows2_cols14_p2.54mm_py15.24mm_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(ITSY M0)" as const
+
+export const ADAFRUIT_ITSYBITSY_M0_EXPRESS_PIN_LABELS = {
+ pin1: ["VBAT"],
+ pin2: ["GND"],
+ pin3: ["VBUS"],
+ pin4: ["D13", "PA17"],
+ pin5: ["D12", "PA19"],
+ pin6: ["D11", "PA16"],
+ pin7: ["D10", "PA18"],
+ pin8: ["D9", "PA07", "A7", "BATTERY_SENSE"],
+ pin9: ["D7", "PA21"],
+ pin10: ["D5", "PA15"],
+ pin11: ["SCL", "D21", "PA23"],
+ pin12: ["SDA", "D20", "PA22"],
+ pin13: ["TX", "D1", "PA10"],
+ pin14: ["RX", "D0", "PA11"],
+ pin15: ["D2", "PA14"],
+ pin16: ["MISO", "D22", "PA12"],
+ pin17: ["MOSI", "D23", "PB10"],
+ pin18: ["SCK", "D24", "PB11"],
+ pin19: ["A5", "PB02"],
+ pin20: ["A4", "PA05"],
+ pin21: ["A3", "PA04"],
+ pin22: ["A2", "PB09"],
+ pin23: ["A1", "PB08", "DAC1"],
+ pin24: ["A0", "PA02", "DAC0"],
+ pin25: ["VHI"],
+ pin26: ["EN"],
+ pin27: ["3V3", "V3_3"],
+ pin28: ["RESET", "RST"],
+} as const
+
+const GPIO = samdGpio()
+const I2C_SCL = samdGpio(["i2c_scl"])
+const I2C_SDA = samdGpio(["i2c_sda"])
+const SPI_SCK = samdGpio(["spi_sck"])
+const SPI_MOSI = samdGpio(["spi_mosi"])
+const SPI_MISO = samdGpio(["spi_miso"])
+const UART_TX = samdGpio(["uart_tx"])
+const UART_RX = samdGpio(["uart_rx"])
+
+export const ADAFRUIT_ITSYBITSY_M0_EXPRESS_PIN_ATTRIBUTES = {
+ VBAT: { providesPower: true, includeInBoardPinout: true },
+ GND: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ VBUS: {
+ requiresPower: true,
+ providesPower: true,
+ requiresVoltage: "5V",
+ providesVoltage: "5V",
+ includeInBoardPinout: true,
+ },
+ D13: GPIO,
+ D12: GPIO,
+ D11: GPIO,
+ D10: GPIO,
+ D9: GPIO,
+ D7: GPIO,
+ D5: GPIO,
+ SCL: I2C_SCL,
+ SDA: I2C_SDA,
+ TX: UART_TX,
+ RX: UART_RX,
+ D2: GPIO,
+ MISO: SPI_MISO,
+ MOSI: SPI_MOSI,
+ SCK: SPI_SCK,
+ A5: GPIO,
+ A4: GPIO,
+ A3: GPIO,
+ A2: GPIO,
+ A1: GPIO,
+ A0: GPIO,
+ VHI: { includeInBoardPinout: true },
+ EN: { includeInBoardPinout: true },
+ "3V3": {
+ providesPower: true,
+ providesVoltage: "3.3V",
+ includeInBoardPinout: true,
+ },
+ RESET: { includeInBoardPinout: true },
+} as const satisfies Record
+
+type FixedProps =
+ | "datasheetUrl"
+ | "displayName"
+ | "footprint"
+ | "manufacturerPartNumber"
+ | "mfn"
+ | "pinAttributes"
+ | "pinLabels"
+ | "schHeight"
+ | "schPinArrangement"
+ | "schWidth"
+
+export type AdafruitItsyBitsyM0ExpressProps = Omit<
+ ChipProps,
+ FixedProps
+>
+
+export const AdafruitItsyBitsyM0Express = (
+ props: AdafruitItsyBitsyM0ExpressProps,
+) => (
+
+)
diff --git a/lib/AdafruitItsyBitsyM4Express.tsx b/lib/AdafruitItsyBitsyM4Express.tsx
new file mode 100644
index 0000000..a9bd9c6
--- /dev/null
+++ b/lib/AdafruitItsyBitsyM4Express.tsx
@@ -0,0 +1,195 @@
+import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
+import { samdGpio } from "./samdPinAttributes"
+
+/** Adafruit ItsyBitsy M4 Express: two 14-pin female header rows. */
+export const ADAFRUIT_ITSYBITSY_M4_EXPRESS_FOOTPRINT =
+ "headermodule28_rows2_cols14_p2.54mm_py15.24mm_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(ITSY M4)" as const
+
+export const ADAFRUIT_ITSYBITSY_M4_EXPRESS_PIN_LABELS = {
+ pin1: ["VBAT"],
+ pin2: ["GND"],
+ pin3: ["VBUS"],
+ pin4: ["D13"],
+ pin5: ["D12"],
+ pin6: ["D11"],
+ pin7: ["D10"],
+ pin8: ["D9"],
+ pin9: ["D7"],
+ pin10: ["D5"],
+ pin11: ["SCL"],
+ pin12: ["SDA"],
+ pin13: ["TX_D1"],
+ pin14: ["RX_D0"],
+ pin15: ["D2"],
+ pin16: ["MISO"],
+ pin17: ["MOSI"],
+ pin18: ["SCK"],
+ pin19: ["A5"],
+ pin20: ["A4"],
+ pin21: ["A3"],
+ pin22: ["A2"],
+ pin23: ["A1"],
+ pin24: ["A0"],
+ pin25: ["VHI"],
+ pin26: ["AREF"],
+ pin27: ["V3_3", "3V3"],
+ pin28: ["RESET", "RST"],
+} as const
+
+const GPIO = samdGpio()
+const I2C_SCL = samdGpio(["i2c_scl"])
+const I2C_SDA = samdGpio(["i2c_sda"])
+const SPI_SCK = samdGpio(["spi_sck"])
+const SPI_MOSI = samdGpio(["spi_mosi"])
+const SPI_MISO = samdGpio(["spi_miso"])
+const UART_TX = samdGpio(["uart_tx"])
+const UART_RX = samdGpio(["uart_rx"])
+
+export const ADAFRUIT_ITSYBITSY_M4_EXPRESS_PIN_ATTRIBUTES = {
+ VBAT: { providesPower: true, includeInBoardPinout: true },
+ GND: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ VBUS: {
+ requiresPower: true,
+ providesPower: true,
+ requiresVoltage: "5V",
+ providesVoltage: "5V",
+ includeInBoardPinout: true,
+ },
+ D13: GPIO,
+ D12: GPIO,
+ D11: GPIO,
+ D10: GPIO,
+ D9: GPIO,
+ D7: GPIO,
+ D5: GPIO,
+ SCL: I2C_SCL,
+ SDA: I2C_SDA,
+ TX_D1: UART_TX,
+ RX_D0: UART_RX,
+ D2: GPIO,
+ MISO: SPI_MISO,
+ MOSI: SPI_MOSI,
+ SCK: SPI_SCK,
+ A5: GPIO,
+ A4: GPIO,
+ A3: GPIO,
+ A2: GPIO,
+ A1: GPIO,
+ A0: GPIO,
+ VHI: { includeInBoardPinout: true },
+ AREF: { includeInBoardPinout: true },
+ V3_3: {
+ providesPower: true,
+ providesVoltage: "3.3V",
+ includeInBoardPinout: true,
+ },
+ RESET: { includeInBoardPinout: true },
+} as const satisfies Record
+
+type FixedProps =
+ | "datasheetUrl"
+ | "displayName"
+ | "footprint"
+ | "manufacturerPartNumber"
+ | "mfn"
+ | "pinAttributes"
+ | "pinLabels"
+ | "schHeight"
+ | "schPinArrangement"
+ | "schWidth"
+
+export type AdafruitItsyBitsyM4ExpressProps = Omit<
+ ChipProps,
+ FixedProps
+>
+
+export const AdafruitItsyBitsyM4Express = (
+ props: AdafruitItsyBitsyM4ExpressProps,
+) => (
+
+)
diff --git a/lib/AdafruitItsyBitsyNRF52840Express.tsx b/lib/AdafruitItsyBitsyNRF52840Express.tsx
new file mode 100644
index 0000000..a9ed62d
--- /dev/null
+++ b/lib/AdafruitItsyBitsyNRF52840Express.tsx
@@ -0,0 +1,209 @@
+import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
+
+/** Adafruit ItsyBitsy nRF52840 Express: two 14-pin female header rows. */
+export const ADAFRUIT_ITSYBITSY_NRF52840_EXPRESS_FOOTPRINT =
+ "headermodule28_rows2_cols14_p2.54mm_py15.24mm_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(ITSY NRF52840)" as const
+
+export const ADAFRUIT_ITSYBITSY_NRF52840_EXPRESS_PIN_LABELS = {
+ pin1: ["VBAT"],
+ pin2: ["GND"],
+ pin3: ["VBUS"],
+ pin4: ["D13"],
+ pin5: ["D12"],
+ pin6: ["D11"],
+ pin7: ["D10"],
+ pin8: ["D9"],
+ pin9: ["D7"],
+ pin10: ["D5"],
+ pin11: ["SCL"],
+ pin12: ["SDA"],
+ pin13: ["TX_D1"],
+ pin14: ["RX_D0"],
+ pin15: ["D2"],
+ pin16: ["MISO"],
+ pin17: ["MOSI"],
+ pin18: ["SCK"],
+ pin19: ["A5"],
+ pin20: ["A4"],
+ pin21: ["A3"],
+ pin22: ["A2"],
+ pin23: ["A1"],
+ pin24: ["A0"],
+ pin25: ["VHI"],
+ pin26: ["EN"],
+ pin27: ["3V3", "V3_3"],
+ pin28: ["RESET", "RST"],
+} as const
+
+const GPIO = {
+ isGpio: true,
+ includeInBoardPinout: true,
+ canUseInternalPullup: true,
+ canUseInternalPulldown: true,
+ canUseOpenDrain: true,
+ canUsePushPull: true,
+} as const satisfies PinAttributeMap
+const I2C_SCL = {
+ ...GPIO,
+ capabilities: ["i2c_scl"],
+ needsExternalPullup: true,
+} satisfies PinAttributeMap
+const I2C_SDA = {
+ ...GPIO,
+ capabilities: ["i2c_sda"],
+ needsExternalPullup: true,
+} satisfies PinAttributeMap
+const SPI_SCK = { ...GPIO, capabilities: ["spi_sck"] } satisfies PinAttributeMap
+const SPI_MOSI = { ...GPIO, capabilities: ["spi_mosi"] } satisfies PinAttributeMap
+const SPI_MISO = { ...GPIO, capabilities: ["spi_miso"] } satisfies PinAttributeMap
+const UART_TX = { ...GPIO, capabilities: ["uart_tx"] } satisfies PinAttributeMap
+const UART_RX = { ...GPIO, capabilities: ["uart_rx"] } satisfies PinAttributeMap
+
+export const ADAFRUIT_ITSYBITSY_NRF52840_EXPRESS_PIN_ATTRIBUTES = {
+ VBAT: { providesPower: true, includeInBoardPinout: true },
+ GND: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ VBUS: {
+ requiresPower: true,
+ providesPower: true,
+ requiresVoltage: "5V",
+ providesVoltage: "5V",
+ includeInBoardPinout: true,
+ },
+ D13: GPIO,
+ D12: GPIO,
+ D11: GPIO,
+ D10: GPIO,
+ D9: GPIO,
+ D7: GPIO,
+ D5: GPIO,
+ SCL: I2C_SCL,
+ SDA: I2C_SDA,
+ TX_D1: UART_TX,
+ RX_D0: UART_RX,
+ D2: GPIO,
+ MISO: SPI_MISO,
+ MOSI: SPI_MOSI,
+ SCK: SPI_SCK,
+ A5: GPIO,
+ A4: GPIO,
+ A3: GPIO,
+ A2: GPIO,
+ A1: GPIO,
+ A0: GPIO,
+ VHI: { includeInBoardPinout: true },
+ EN: { includeInBoardPinout: true },
+ "3V3": {
+ providesPower: true,
+ providesVoltage: "3.3V",
+ includeInBoardPinout: true,
+ },
+ RESET: { includeInBoardPinout: true },
+} as const satisfies Record
+
+type FixedProps =
+ | "datasheetUrl"
+ | "displayName"
+ | "footprint"
+ | "manufacturerPartNumber"
+ | "mfn"
+ | "pinAttributes"
+ | "pinLabels"
+ | "schHeight"
+ | "schPinArrangement"
+ | "schWidth"
+
+export type AdafruitItsyBitsyNRF52840ExpressProps = Omit<
+ ChipProps,
+ FixedProps
+>
+
+export const AdafruitItsyBitsyNRF52840Express = (
+ props: AdafruitItsyBitsyNRF52840ExpressProps,
+) => (
+
+)
diff --git a/lib/AdafruitItsyBitsyRP2040.tsx b/lib/AdafruitItsyBitsyRP2040.tsx
new file mode 100644
index 0000000..dcae4b6
--- /dev/null
+++ b/lib/AdafruitItsyBitsyRP2040.tsx
@@ -0,0 +1,190 @@
+import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
+import { rp2040Gpio } from "./rp2040PinAttributes"
+
+/** Adafruit ItsyBitsy RP2040: two 14-pin female header rows. */
+export const ADAFRUIT_ITSYBITSY_RP2040_FOOTPRINT =
+ "headermodule28_rows2_cols14_p2.54mm_py15.24mm_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(ITSY RP2040)" as const
+
+export const ADAFRUIT_ITSYBITSY_RP2040_PIN_LABELS = {
+ pin1: ["VBAT"],
+ pin2: ["GND"],
+ pin3: ["VBUS"],
+ pin4: ["D13", "GP11", "GPIO11"],
+ pin5: ["D12", "GP10", "GPIO10"],
+ pin6: ["D11", "GP9", "GPIO9"],
+ pin7: ["D10", "GP8", "GPIO8"],
+ pin8: ["D9", "GP7", "GPIO7"],
+ pin9: ["D7", "GP6", "GPIO6"],
+ pin10: ["D5", "GP14", "GPIO14"],
+ pin11: ["SCL", "GP3", "GPIO3"],
+ pin12: ["SDA", "GP2", "GPIO2"],
+ pin13: ["TX", "D1", "GP0", "GPIO0"],
+ pin14: ["RX", "D0", "GP1", "GPIO1"],
+ pin15: ["D2", "GP12", "GPIO12"],
+ pin16: ["MISO", "GP20", "GPIO20"],
+ pin17: ["MOSI", "GP19", "GPIO19"],
+ pin18: ["SCK", "GP18", "GPIO18"],
+ pin19: ["D25", "GP25", "GPIO25"],
+ pin20: ["D24", "GP24", "GPIO24"],
+ pin21: ["A3", "GP29", "GPIO29"],
+ pin22: ["A2", "GP28", "GPIO28"],
+ pin23: ["A1", "GP27", "GPIO27"],
+ pin24: ["A0", "GP26", "GPIO26"],
+ pin25: ["VHI"],
+ pin26: ["V3_3", "3V3"],
+ pin27: ["V3_3_2", "3V3"],
+ pin28: ["RESET", "RUN", "RST"],
+} as const
+
+export const ADAFRUIT_ITSYBITSY_RP2040_PIN_ATTRIBUTES = {
+ VBAT: { providesPower: true, includeInBoardPinout: true },
+ GND: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ VBUS: {
+ requiresPower: true,
+ providesPower: true,
+ requiresVoltage: "5V",
+ providesVoltage: "5V",
+ includeInBoardPinout: true,
+ },
+ D13: rp2040Gpio(11),
+ D12: rp2040Gpio(10),
+ D11: rp2040Gpio(9),
+ D10: rp2040Gpio(8),
+ D9: rp2040Gpio(7),
+ D7: rp2040Gpio(6),
+ D5: rp2040Gpio(14),
+ SCL: rp2040Gpio(3),
+ SDA: rp2040Gpio(2),
+ TX: rp2040Gpio(0),
+ RX: rp2040Gpio(1),
+ D2: rp2040Gpio(12),
+ MISO: rp2040Gpio(20),
+ MOSI: rp2040Gpio(19),
+ SCK: rp2040Gpio(18),
+ D25: rp2040Gpio(25),
+ D24: rp2040Gpio(24),
+ A3: rp2040Gpio(29),
+ A2: rp2040Gpio(28),
+ A1: rp2040Gpio(27),
+ A0: rp2040Gpio(26),
+ VHI: { includeInBoardPinout: true },
+ V3_3: {
+ providesPower: true,
+ providesVoltage: "3.3V",
+ includeInBoardPinout: true,
+ },
+ V3_3_2: {
+ providesPower: true,
+ providesVoltage: "3.3V",
+ includeInBoardPinout: true,
+ },
+ RESET: { includeInBoardPinout: true },
+} as const satisfies Record
+
+type FixedProps =
+ | "datasheetUrl"
+ | "displayName"
+ | "footprint"
+ | "manufacturerPartNumber"
+ | "mfn"
+ | "pinAttributes"
+ | "pinLabels"
+ | "schHeight"
+ | "schPinArrangement"
+ | "schWidth"
+
+export type AdafruitItsyBitsyRP2040Props = Omit<
+ ChipProps,
+ FixedProps
+>
+
+export const AdafruitItsyBitsyRP2040 = (
+ props: AdafruitItsyBitsyRP2040Props,
+) => (
+
+)
diff --git a/lib/AdafruitQTPyESP32S2.tsx b/lib/AdafruitQTPyESP32S2.tsx
new file mode 100644
index 0000000..6fa9ffb
--- /dev/null
+++ b/lib/AdafruitQTPyESP32S2.tsx
@@ -0,0 +1,135 @@
+import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
+
+/** Adafruit QT Py ESP32-S2: two seven-pin female header rows. */
+export const ADAFRUIT_QT_PY_ESP32_S2_FOOTPRINT =
+ "headermodule14_rows2_cols7_p2.54mm_py15.24mm_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(QT PY ESP32-S2)" as const
+
+export const ADAFRUIT_QT_PY_ESP32_S2_PIN_LABELS = {
+ pin1: ["A0", "GPIO18"],
+ pin2: ["A1", "GPIO17"],
+ pin3: ["A2", "GPIO9"],
+ pin4: ["A3", "GPIO7"],
+ pin5: ["SDA", "GPIO8"],
+ pin6: ["SCL", "GPIO6"],
+ pin7: ["TX", "GPIO5"],
+ pin8: ["RX", "GPIO16"],
+ pin9: ["SCK", "GPIO36"],
+ pin10: ["MISO", "GPIO37"],
+ pin11: ["MOSI", "GPIO35"],
+ pin12: ["V3_3", "3V3"],
+ pin13: ["GND"],
+ pin14: ["V5", "5V"],
+} as const
+
+const GPIO = {
+ isGpio: true,
+ includeInBoardPinout: true,
+ canUseInternalPullup: true,
+ canUseInternalPulldown: true,
+ canUseOpenDrain: true,
+ canUsePushPull: true,
+} as const satisfies PinAttributeMap
+const I2C_SCL = {
+ ...GPIO,
+ capabilities: ["i2c_scl"],
+ needsExternalPullup: true,
+} satisfies PinAttributeMap
+const I2C_SDA = {
+ ...GPIO,
+ capabilities: ["i2c_sda"],
+ needsExternalPullup: true,
+} satisfies PinAttributeMap
+const SPI_SCK = { ...GPIO, capabilities: ["spi_sck"] } satisfies PinAttributeMap
+const SPI_MISO = { ...GPIO, capabilities: ["spi_miso"] } satisfies PinAttributeMap
+const SPI_MOSI = { ...GPIO, capabilities: ["spi_mosi"] } satisfies PinAttributeMap
+const UART_TX = { ...GPIO, capabilities: ["uart_tx"] } satisfies PinAttributeMap
+const UART_RX = { ...GPIO, capabilities: ["uart_rx"] } satisfies PinAttributeMap
+
+export const ADAFRUIT_QT_PY_ESP32_S2_PIN_ATTRIBUTES = {
+ A0: GPIO,
+ A1: GPIO,
+ A2: GPIO,
+ A3: GPIO,
+ SDA: I2C_SDA,
+ SCL: I2C_SCL,
+ TX: UART_TX,
+ RX: UART_RX,
+ SCK: SPI_SCK,
+ MISO: SPI_MISO,
+ MOSI: SPI_MOSI,
+ V3_3: {
+ providesPower: true,
+ providesVoltage: "3.3V",
+ includeInBoardPinout: true,
+ },
+ GND: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ V5: {
+ requiresPower: true,
+ providesPower: true,
+ requiresVoltage: "5V",
+ providesVoltage: "5V",
+ includeInBoardPinout: true,
+ },
+} as const satisfies Record
+
+type FixedProps =
+ | "datasheetUrl"
+ | "displayName"
+ | "footprint"
+ | "manufacturerPartNumber"
+ | "mfn"
+ | "pinAttributes"
+ | "pinLabels"
+ | "schHeight"
+ | "schPinArrangement"
+ | "schWidth"
+
+export type AdafruitQTPyESP32S2Props = Omit<
+ ChipProps,
+ FixedProps
+>
+
+export const AdafruitQTPyESP32S2 = (props: AdafruitQTPyESP32S2Props) => (
+
+)
diff --git a/lib/AdafruitQTPyESP32S3.tsx b/lib/AdafruitQTPyESP32S3.tsx
new file mode 100644
index 0000000..4d26b48
--- /dev/null
+++ b/lib/AdafruitQTPyESP32S3.tsx
@@ -0,0 +1,135 @@
+import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
+
+/** Adafruit QT Py ESP32-S3: two seven-pin female header rows. */
+export const ADAFRUIT_QT_PY_ESP32_S3_FOOTPRINT =
+ "headermodule14_rows2_cols7_p2.54mm_py15.24mm_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(QT PY ESP32-S3)" as const
+
+export const ADAFRUIT_QT_PY_ESP32_S3_PIN_LABELS = {
+ pin1: ["A0", "GPIO18"],
+ pin2: ["A1", "GPIO17"],
+ pin3: ["A2", "GPIO9"],
+ pin4: ["A3", "GPIO7"],
+ pin5: ["SDA", "GPIO8"],
+ pin6: ["SCL", "GPIO6"],
+ pin7: ["TX", "GPIO5"],
+ pin8: ["RX", "GPIO16"],
+ pin9: ["SCK", "GPIO36"],
+ pin10: ["MISO", "GPIO37"],
+ pin11: ["MOSI", "GPIO35"],
+ pin12: ["V3_3", "3V3"],
+ pin13: ["GND"],
+ pin14: ["V5", "5V"],
+} as const
+
+const GPIO = {
+ isGpio: true,
+ includeInBoardPinout: true,
+ canUseInternalPullup: true,
+ canUseInternalPulldown: true,
+ canUseOpenDrain: true,
+ canUsePushPull: true,
+} as const satisfies PinAttributeMap
+const I2C_SCL = {
+ ...GPIO,
+ capabilities: ["i2c_scl"],
+ needsExternalPullup: true,
+} satisfies PinAttributeMap
+const I2C_SDA = {
+ ...GPIO,
+ capabilities: ["i2c_sda"],
+ needsExternalPullup: true,
+} satisfies PinAttributeMap
+const SPI_SCK = { ...GPIO, capabilities: ["spi_sck"] } satisfies PinAttributeMap
+const SPI_MISO = { ...GPIO, capabilities: ["spi_miso"] } satisfies PinAttributeMap
+const SPI_MOSI = { ...GPIO, capabilities: ["spi_mosi"] } satisfies PinAttributeMap
+const UART_TX = { ...GPIO, capabilities: ["uart_tx"] } satisfies PinAttributeMap
+const UART_RX = { ...GPIO, capabilities: ["uart_rx"] } satisfies PinAttributeMap
+
+export const ADAFRUIT_QT_PY_ESP32_S3_PIN_ATTRIBUTES = {
+ A0: GPIO,
+ A1: GPIO,
+ A2: GPIO,
+ A3: GPIO,
+ SDA: I2C_SDA,
+ SCL: I2C_SCL,
+ TX: UART_TX,
+ RX: UART_RX,
+ SCK: SPI_SCK,
+ MISO: SPI_MISO,
+ MOSI: SPI_MOSI,
+ V3_3: {
+ providesPower: true,
+ providesVoltage: "3.3V",
+ includeInBoardPinout: true,
+ },
+ GND: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ V5: {
+ requiresPower: true,
+ providesPower: true,
+ requiresVoltage: "5V",
+ providesVoltage: "5V",
+ includeInBoardPinout: true,
+ },
+} as const satisfies Record
+
+type FixedProps =
+ | "datasheetUrl"
+ | "displayName"
+ | "footprint"
+ | "manufacturerPartNumber"
+ | "mfn"
+ | "pinAttributes"
+ | "pinLabels"
+ | "schHeight"
+ | "schPinArrangement"
+ | "schWidth"
+
+export type AdafruitQTPyESP32S3Props = Omit<
+ ChipProps,
+ FixedProps
+>
+
+export const AdafruitQTPyESP32S3 = (props: AdafruitQTPyESP32S3Props) => (
+
+)
diff --git a/lib/AdafruitQTPyNRF52840.tsx b/lib/AdafruitQTPyNRF52840.tsx
new file mode 100644
index 0000000..21c4c29
--- /dev/null
+++ b/lib/AdafruitQTPyNRF52840.tsx
@@ -0,0 +1,141 @@
+import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
+
+/**
+ * QT Py-size nRF52840 header module.
+ *
+ * Adafruit does not currently publish a QT Py nRF52840 SKU. This entry keeps
+ * the catalog's planned QT Py-compatible footprint explicit while using the
+ * standard QT Py seven-pin-per-side signal order; the actual public nRF52840
+ * product is represented by AdafruitItsyBitsyNRF52840Express.
+ */
+export const ADAFRUIT_QT_PY_NRF52840_FOOTPRINT =
+ "headermodule14_rows2_cols7_p2.54mm_py15.24mm_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(QT PY NRF52840)" as const
+
+export const ADAFRUIT_QT_PY_NRF52840_PIN_LABELS = {
+ pin1: ["A0"],
+ pin2: ["A1"],
+ pin3: ["A2"],
+ pin4: ["A3"],
+ pin5: ["SDA"],
+ pin6: ["SCL"],
+ pin7: ["TX_A6"],
+ pin8: ["RX_A7"],
+ pin9: ["SCK"],
+ pin10: ["MISO"],
+ pin11: ["MOSI"],
+ pin12: ["V3_3", "3V3"],
+ pin13: ["GND"],
+ pin14: ["V5", "5V"],
+} as const
+
+const GPIO = {
+ isGpio: true,
+ includeInBoardPinout: true,
+ canUseInternalPullup: true,
+ canUseInternalPulldown: true,
+ canUseOpenDrain: true,
+ canUsePushPull: true,
+} as const satisfies PinAttributeMap
+const I2C_SDA = {
+ ...GPIO,
+ capabilities: ["i2c_sda"],
+ needsExternalPullup: true,
+} satisfies PinAttributeMap
+const I2C_SCL = {
+ ...GPIO,
+ capabilities: ["i2c_scl"],
+ needsExternalPullup: true,
+} satisfies PinAttributeMap
+const SPI_SCK = { ...GPIO, capabilities: ["spi_sck"] } satisfies PinAttributeMap
+const SPI_MISO = { ...GPIO, capabilities: ["spi_miso"] } satisfies PinAttributeMap
+const SPI_MOSI = { ...GPIO, capabilities: ["spi_mosi"] } satisfies PinAttributeMap
+const UART_TX = { ...GPIO, capabilities: ["uart_tx"] } satisfies PinAttributeMap
+const UART_RX = { ...GPIO, capabilities: ["uart_rx"] } satisfies PinAttributeMap
+
+export const ADAFRUIT_QT_PY_NRF52840_PIN_ATTRIBUTES = {
+ A0: GPIO,
+ A1: GPIO,
+ A2: GPIO,
+ A3: GPIO,
+ SDA: I2C_SDA,
+ SCL: I2C_SCL,
+ TX_A6: UART_TX,
+ RX_A7: UART_RX,
+ SCK: SPI_SCK,
+ MISO: SPI_MISO,
+ MOSI: SPI_MOSI,
+ V3_3: {
+ providesPower: true,
+ providesVoltage: "3.3V",
+ includeInBoardPinout: true,
+ },
+ GND: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ V5: {
+ requiresPower: true,
+ providesPower: true,
+ requiresVoltage: "5V",
+ providesVoltage: "5V",
+ includeInBoardPinout: true,
+ },
+} as const satisfies Record
+
+type FixedProps =
+ | "datasheetUrl"
+ | "displayName"
+ | "footprint"
+ | "manufacturerPartNumber"
+ | "mfn"
+ | "pinAttributes"
+ | "pinLabels"
+ | "schHeight"
+ | "schPinArrangement"
+ | "schWidth"
+
+export type AdafruitQTPyNRF52840Props = Omit<
+ ChipProps,
+ FixedProps
+>
+
+export const AdafruitQTPyNRF52840 = (props: AdafruitQTPyNRF52840Props) => (
+
+)
diff --git a/lib/AdafruitQTPyRP2350.tsx b/lib/AdafruitQTPyRP2350.tsx
new file mode 100644
index 0000000..4264c7a
--- /dev/null
+++ b/lib/AdafruitQTPyRP2350.tsx
@@ -0,0 +1,140 @@
+import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
+
+/**
+ * QT Py-size RP2350 header module.
+ *
+ * There is not yet a public Adafruit QT Py RP2350 SKU. The pin order is kept
+ * as the standard QT Py 14-pin mechanical interface; use the Feather RP2350
+ * module when a production Adafruit RP2350 pinout is required.
+ */
+export const ADAFRUIT_QT_PY_RP2350_FOOTPRINT =
+ "headermodule14_rows2_cols7_p2.54mm_py15.24mm_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(QT PY RP2350)" as const
+
+export const ADAFRUIT_QT_PY_RP2350_PIN_LABELS = {
+ pin1: ["A0"],
+ pin2: ["A1"],
+ pin3: ["A2"],
+ pin4: ["A3"],
+ pin5: ["SDA"],
+ pin6: ["SCL"],
+ pin7: ["TX"],
+ pin8: ["RX"],
+ pin9: ["SCK"],
+ pin10: ["MISO"],
+ pin11: ["MOSI"],
+ pin12: ["V3_3", "3V3"],
+ pin13: ["GND"],
+ pin14: ["V5", "5V"],
+} as const
+
+const GPIO = {
+ isGpio: true,
+ includeInBoardPinout: true,
+ canUseInternalPullup: true,
+ canUseInternalPulldown: true,
+ canUseOpenDrain: true,
+ canUsePushPull: true,
+} as const satisfies PinAttributeMap
+const I2C_SDA = {
+ ...GPIO,
+ capabilities: ["i2c_sda"],
+ needsExternalPullup: true,
+} satisfies PinAttributeMap
+const I2C_SCL = {
+ ...GPIO,
+ capabilities: ["i2c_scl"],
+ needsExternalPullup: true,
+} satisfies PinAttributeMap
+const SPI_SCK = { ...GPIO, capabilities: ["spi_sck"] } satisfies PinAttributeMap
+const SPI_MISO = { ...GPIO, capabilities: ["spi_miso"] } satisfies PinAttributeMap
+const SPI_MOSI = { ...GPIO, capabilities: ["spi_mosi"] } satisfies PinAttributeMap
+const UART_TX = { ...GPIO, capabilities: ["uart_tx"] } satisfies PinAttributeMap
+const UART_RX = { ...GPIO, capabilities: ["uart_rx"] } satisfies PinAttributeMap
+
+export const ADAFRUIT_QT_PY_RP2350_PIN_ATTRIBUTES = {
+ A0: GPIO,
+ A1: GPIO,
+ A2: GPIO,
+ A3: GPIO,
+ SDA: I2C_SDA,
+ SCL: I2C_SCL,
+ TX: UART_TX,
+ RX: UART_RX,
+ SCK: SPI_SCK,
+ MISO: SPI_MISO,
+ MOSI: SPI_MOSI,
+ V3_3: {
+ providesPower: true,
+ providesVoltage: "3.3V",
+ includeInBoardPinout: true,
+ },
+ GND: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ V5: {
+ requiresPower: true,
+ providesPower: true,
+ requiresVoltage: "5V",
+ providesVoltage: "5V",
+ includeInBoardPinout: true,
+ },
+} as const satisfies Record
+
+type FixedProps =
+ | "datasheetUrl"
+ | "displayName"
+ | "footprint"
+ | "manufacturerPartNumber"
+ | "mfn"
+ | "pinAttributes"
+ | "pinLabels"
+ | "schHeight"
+ | "schPinArrangement"
+ | "schWidth"
+
+export type AdafruitQTPyRP2350Props = Omit<
+ ChipProps,
+ FixedProps
+>
+
+export const AdafruitQTPyRP2350 = (props: AdafruitQTPyRP2350Props) => (
+
+)
diff --git a/lib/AdafruitQTPySAMD21.tsx b/lib/AdafruitQTPySAMD21.tsx
new file mode 100644
index 0000000..2ca60dd
--- /dev/null
+++ b/lib/AdafruitQTPySAMD21.tsx
@@ -0,0 +1,118 @@
+import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
+import { samdGpio } from "./samdPinAttributes"
+
+/** Adafruit QT Py SAMD21: two seven-pin female header rows. */
+export const ADAFRUIT_QT_PY_SAMD21_FOOTPRINT =
+ "headermodule14_rows2_cols7_p2.54mm_py15.24mm_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(QT PY SAMD21)" as const
+
+export const ADAFRUIT_QT_PY_SAMD21_PIN_LABELS = {
+ pin1: ["A0", "PA02"],
+ pin2: ["A1", "PA03"],
+ pin3: ["A2", "PA04"],
+ pin4: ["A3", "PA05"],
+ pin5: ["SDA"],
+ pin6: ["SCL"],
+ pin7: ["TX_A6"],
+ pin8: ["RX_A7"],
+ pin9: ["SCK"],
+ pin10: ["MISO"],
+ pin11: ["MOSI"],
+ pin12: ["V3_3", "3V3"],
+ pin13: ["GND"],
+ pin14: ["V5", "5V"],
+} as const
+
+export const ADAFRUIT_QT_PY_SAMD21_PIN_ATTRIBUTES = {
+ A0: samdGpio(),
+ A1: samdGpio(),
+ A2: samdGpio(),
+ A3: samdGpio(),
+ SDA: {
+ ...samdGpio(["i2c_sda"]),
+ needsExternalPullup: true,
+ },
+ SCL: {
+ ...samdGpio(["i2c_scl"]),
+ needsExternalPullup: true,
+ },
+ TX_A6: samdGpio(["uart_tx"]),
+ RX_A7: samdGpio(["uart_rx"]),
+ SCK: samdGpio(["spi_sck"]),
+ MISO: samdGpio(["spi_miso"]),
+ MOSI: samdGpio(["spi_mosi"]),
+ V3_3: {
+ providesPower: true,
+ providesVoltage: "3.3V",
+ includeInBoardPinout: true,
+ },
+ GND: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ V5: {
+ requiresPower: true,
+ providesPower: true,
+ requiresVoltage: "5V",
+ providesVoltage: "5V",
+ includeInBoardPinout: true,
+ },
+} as const satisfies Record
+
+type FixedProps =
+ | "datasheetUrl"
+ | "displayName"
+ | "footprint"
+ | "manufacturerPartNumber"
+ | "mfn"
+ | "pinAttributes"
+ | "pinLabels"
+ | "schHeight"
+ | "schPinArrangement"
+ | "schWidth"
+
+export type AdafruitQTPySAMD21Props = Omit<
+ ChipProps,
+ FixedProps
+>
+
+export const AdafruitQTPySAMD21 = (props: AdafruitQTPySAMD21Props) => (
+
+)
diff --git a/lib/ArduinoNano33BLE.tsx b/lib/ArduinoNano33BLE.tsx
new file mode 100644
index 0000000..4d77490
--- /dev/null
+++ b/lib/ArduinoNano33BLE.tsx
@@ -0,0 +1,220 @@
+import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
+
+/** Arduino Nano 33 BLE: the 30-pin Nano header arrangement. */
+export const ARDUINO_NANO_33_BLE_FOOTPRINT =
+ "headermodule30_rows2_cols15_p2.54mm_py15.24mm_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(NANO 33 BLE)" as const
+
+export const ARDUINO_NANO_33_BLE_PIN_LABELS = {
+ pin1: ["TX", "D1"],
+ pin2: ["RX", "D0"],
+ pin3: ["RESET", "RST"],
+ pin4: ["GND"],
+ pin5: ["D2"],
+ pin6: ["D3"],
+ pin7: ["D4"],
+ pin8: ["D5"],
+ pin9: ["D6"],
+ pin10: ["D7"],
+ pin11: ["D8"],
+ pin12: ["D9"],
+ pin13: ["D10", "SS"],
+ pin14: ["D11", "MOSI"],
+ pin15: ["D12", "MISO"],
+ pin16: ["D13", "SCK", "LED"],
+ pin17: ["3V3"],
+ pin18: ["AREF"],
+ pin19: ["A0"],
+ pin20: ["A1"],
+ pin21: ["A2"],
+ pin22: ["A3"],
+ pin23: ["A4", "SDA"],
+ pin24: ["A5", "SCL"],
+ pin25: ["A6"],
+ pin26: ["A7"],
+ pin27: ["V5", "5V"],
+ pin28: ["RESET_2", "RST"],
+ pin29: ["GND_2", "GND"],
+ pin30: ["VIN"],
+} as const
+
+const GPIO = {
+ isGpio: true,
+ includeInBoardPinout: true,
+ canUseInternalPullup: true,
+ canUseInternalPulldown: true,
+ canUseOpenDrain: true,
+ canUsePushPull: true,
+} as const satisfies PinAttributeMap
+const I2C_SDA = {
+ ...GPIO,
+ capabilities: ["i2c_sda"],
+ needsExternalPullup: true,
+} satisfies PinAttributeMap
+const I2C_SCL = {
+ ...GPIO,
+ capabilities: ["i2c_scl"],
+ needsExternalPullup: true,
+} satisfies PinAttributeMap
+const SPI_CS = { ...GPIO, capabilities: ["spi_cs"] } satisfies PinAttributeMap
+const SPI_MOSI = { ...GPIO, capabilities: ["spi_mosi"] } satisfies PinAttributeMap
+const SPI_MISO = { ...GPIO, capabilities: ["spi_miso"] } satisfies PinAttributeMap
+const SPI_SCK = { ...GPIO, capabilities: ["spi_sck"] } satisfies PinAttributeMap
+const UART_TX = { ...GPIO, capabilities: ["uart_tx"] } satisfies PinAttributeMap
+const UART_RX = { ...GPIO, capabilities: ["uart_rx"] } satisfies PinAttributeMap
+
+export const ARDUINO_NANO_33_BLE_PIN_ATTRIBUTES = {
+ TX: UART_TX,
+ RX: UART_RX,
+ RESET: { includeInBoardPinout: true },
+ GND: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ D2: GPIO,
+ D3: GPIO,
+ D4: GPIO,
+ D5: GPIO,
+ D6: GPIO,
+ D7: GPIO,
+ D8: GPIO,
+ D9: GPIO,
+ D10: SPI_CS,
+ D11: SPI_MOSI,
+ D12: SPI_MISO,
+ D13: SPI_SCK,
+ "3V3": {
+ providesPower: true,
+ providesVoltage: "3.3V",
+ includeInBoardPinout: true,
+ },
+ AREF: { includeInBoardPinout: true },
+ A0: GPIO,
+ A1: GPIO,
+ A2: GPIO,
+ A3: GPIO,
+ A4: I2C_SDA,
+ A5: I2C_SCL,
+ A6: GPIO,
+ A7: GPIO,
+ V5: {
+ requiresPower: true,
+ providesPower: true,
+ requiresVoltage: "5V",
+ providesVoltage: "5V",
+ includeInBoardPinout: true,
+ },
+ RESET_2: { includeInBoardPinout: true },
+ GND_2: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ VIN: { requiresPower: true, includeInBoardPinout: true },
+} as const satisfies Record
+
+type FixedProps =
+ | "datasheetUrl"
+ | "displayName"
+ | "footprint"
+ | "manufacturerPartNumber"
+ | "mfn"
+ | "pinAttributes"
+ | "pinLabels"
+ | "schHeight"
+ | "schPinArrangement"
+ | "schWidth"
+
+export type ArduinoNano33BLEProps = Omit<
+ ChipProps,
+ FixedProps
+>
+
+export const ArduinoNano33BLE = (props: ArduinoNano33BLEProps) => (
+
+)
diff --git a/lib/ArduinoNano33BLESenseRev2.tsx b/lib/ArduinoNano33BLESenseRev2.tsx
new file mode 100644
index 0000000..cf5f619
--- /dev/null
+++ b/lib/ArduinoNano33BLESenseRev2.tsx
@@ -0,0 +1,222 @@
+import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
+
+/** Arduino Nano 33 BLE Sense Rev2: the 30-pin Nano header arrangement. */
+export const ARDUINO_NANO_33_BLE_SENSE_REV2_FOOTPRINT =
+ "headermodule30_rows2_cols15_p2.54mm_py15.24mm_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(NANO 33 BLE SENSE)" as const
+
+export const ARDUINO_NANO_33_BLE_SENSE_REV2_PIN_LABELS = {
+ pin1: ["TX", "D1"],
+ pin2: ["RX", "D0"],
+ pin3: ["RESET", "RST"],
+ pin4: ["GND"],
+ pin5: ["D2"],
+ pin6: ["D3"],
+ pin7: ["D4"],
+ pin8: ["D5"],
+ pin9: ["D6"],
+ pin10: ["D7"],
+ pin11: ["D8"],
+ pin12: ["D9"],
+ pin13: ["D10", "SS"],
+ pin14: ["D11", "MOSI"],
+ pin15: ["D12", "MISO"],
+ pin16: ["D13", "SCK", "LED"],
+ pin17: ["3V3"],
+ pin18: ["AREF"],
+ pin19: ["A0"],
+ pin20: ["A1"],
+ pin21: ["A2"],
+ pin22: ["A3"],
+ pin23: ["A4", "SDA"],
+ pin24: ["A5", "SCL"],
+ pin25: ["A6"],
+ pin26: ["A7"],
+ pin27: ["V5", "5V"],
+ pin28: ["RESET_2", "RST"],
+ pin29: ["GND_2", "GND"],
+ pin30: ["VIN"],
+} as const
+
+const GPIO = {
+ isGpio: true,
+ includeInBoardPinout: true,
+ canUseInternalPullup: true,
+ canUseInternalPulldown: true,
+ canUseOpenDrain: true,
+ canUsePushPull: true,
+} as const satisfies PinAttributeMap
+const I2C_SDA = {
+ ...GPIO,
+ capabilities: ["i2c_sda"],
+ needsExternalPullup: true,
+} satisfies PinAttributeMap
+const I2C_SCL = {
+ ...GPIO,
+ capabilities: ["i2c_scl"],
+ needsExternalPullup: true,
+} satisfies PinAttributeMap
+const SPI_CS = { ...GPIO, capabilities: ["spi_cs"] } satisfies PinAttributeMap
+const SPI_MOSI = { ...GPIO, capabilities: ["spi_mosi"] } satisfies PinAttributeMap
+const SPI_MISO = { ...GPIO, capabilities: ["spi_miso"] } satisfies PinAttributeMap
+const SPI_SCK = { ...GPIO, capabilities: ["spi_sck"] } satisfies PinAttributeMap
+const UART_TX = { ...GPIO, capabilities: ["uart_tx"] } satisfies PinAttributeMap
+const UART_RX = { ...GPIO, capabilities: ["uart_rx"] } satisfies PinAttributeMap
+
+export const ARDUINO_NANO_33_BLE_SENSE_REV2_PIN_ATTRIBUTES = {
+ TX: UART_TX,
+ RX: UART_RX,
+ RESET: { includeInBoardPinout: true },
+ GND: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ D2: GPIO,
+ D3: GPIO,
+ D4: GPIO,
+ D5: GPIO,
+ D6: GPIO,
+ D7: GPIO,
+ D8: GPIO,
+ D9: GPIO,
+ D10: SPI_CS,
+ D11: SPI_MOSI,
+ D12: SPI_MISO,
+ D13: SPI_SCK,
+ "3V3": {
+ providesPower: true,
+ providesVoltage: "3.3V",
+ includeInBoardPinout: true,
+ },
+ AREF: { includeInBoardPinout: true },
+ A0: GPIO,
+ A1: GPIO,
+ A2: GPIO,
+ A3: GPIO,
+ A4: I2C_SDA,
+ A5: I2C_SCL,
+ A6: GPIO,
+ A7: GPIO,
+ V5: {
+ requiresPower: true,
+ providesPower: true,
+ requiresVoltage: "5V",
+ providesVoltage: "5V",
+ includeInBoardPinout: true,
+ },
+ RESET_2: { includeInBoardPinout: true },
+ GND_2: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ VIN: { requiresPower: true, includeInBoardPinout: true },
+} as const satisfies Record
+
+type FixedProps =
+ | "datasheetUrl"
+ | "displayName"
+ | "footprint"
+ | "manufacturerPartNumber"
+ | "mfn"
+ | "pinAttributes"
+ | "pinLabels"
+ | "schHeight"
+ | "schPinArrangement"
+ | "schWidth"
+
+export type ArduinoNano33BLESenseRev2Props = Omit<
+ ChipProps,
+ FixedProps
+>
+
+export const ArduinoNano33BLESenseRev2 = (
+ props: ArduinoNano33BLESenseRev2Props,
+) => (
+
+)
diff --git a/lib/ArduinoNano33IoT.tsx b/lib/ArduinoNano33IoT.tsx
new file mode 100644
index 0000000..4421169
--- /dev/null
+++ b/lib/ArduinoNano33IoT.tsx
@@ -0,0 +1,220 @@
+import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
+
+/** Arduino Nano 33 IoT: the 30-pin Nano header arrangement. */
+export const ARDUINO_NANO_33_IOT_FOOTPRINT =
+ "headermodule30_rows2_cols15_p2.54mm_py15.24mm_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(NANO 33 IOT)" as const
+
+export const ARDUINO_NANO_33_IOT_PIN_LABELS = {
+ pin1: ["TX", "D1"],
+ pin2: ["RX", "D0"],
+ pin3: ["RESET", "RST"],
+ pin4: ["GND"],
+ pin5: ["D2"],
+ pin6: ["D3"],
+ pin7: ["D4"],
+ pin8: ["D5"],
+ pin9: ["D6"],
+ pin10: ["D7"],
+ pin11: ["D8"],
+ pin12: ["D9"],
+ pin13: ["D10", "SS"],
+ pin14: ["D11", "MOSI"],
+ pin15: ["D12", "MISO"],
+ pin16: ["D13", "SCK", "LED"],
+ pin17: ["3V3"],
+ pin18: ["AREF"],
+ pin19: ["A0"],
+ pin20: ["A1"],
+ pin21: ["A2"],
+ pin22: ["A3"],
+ pin23: ["A4", "SDA"],
+ pin24: ["A5", "SCL"],
+ pin25: ["A6"],
+ pin26: ["A7"],
+ pin27: ["V5", "5V"],
+ pin28: ["RESET_2", "RST"],
+ pin29: ["GND_2", "GND"],
+ pin30: ["VIN"],
+} as const
+
+const GPIO = {
+ isGpio: true,
+ includeInBoardPinout: true,
+ canUseInternalPullup: true,
+ canUseInternalPulldown: true,
+ canUseOpenDrain: true,
+ canUsePushPull: true,
+} as const satisfies PinAttributeMap
+const I2C_SDA = {
+ ...GPIO,
+ capabilities: ["i2c_sda"],
+ needsExternalPullup: true,
+} satisfies PinAttributeMap
+const I2C_SCL = {
+ ...GPIO,
+ capabilities: ["i2c_scl"],
+ needsExternalPullup: true,
+} satisfies PinAttributeMap
+const SPI_CS = { ...GPIO, capabilities: ["spi_cs"] } satisfies PinAttributeMap
+const SPI_MOSI = { ...GPIO, capabilities: ["spi_mosi"] } satisfies PinAttributeMap
+const SPI_MISO = { ...GPIO, capabilities: ["spi_miso"] } satisfies PinAttributeMap
+const SPI_SCK = { ...GPIO, capabilities: ["spi_sck"] } satisfies PinAttributeMap
+const UART_TX = { ...GPIO, capabilities: ["uart_tx"] } satisfies PinAttributeMap
+const UART_RX = { ...GPIO, capabilities: ["uart_rx"] } satisfies PinAttributeMap
+
+export const ARDUINO_NANO_33_IOT_PIN_ATTRIBUTES = {
+ TX: UART_TX,
+ RX: UART_RX,
+ RESET: { includeInBoardPinout: true },
+ GND: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ D2: GPIO,
+ D3: GPIO,
+ D4: GPIO,
+ D5: GPIO,
+ D6: GPIO,
+ D7: GPIO,
+ D8: GPIO,
+ D9: GPIO,
+ D10: SPI_CS,
+ D11: SPI_MOSI,
+ D12: SPI_MISO,
+ D13: SPI_SCK,
+ "3V3": {
+ providesPower: true,
+ providesVoltage: "3.3V",
+ includeInBoardPinout: true,
+ },
+ AREF: { includeInBoardPinout: true },
+ A0: GPIO,
+ A1: GPIO,
+ A2: GPIO,
+ A3: GPIO,
+ A4: I2C_SDA,
+ A5: I2C_SCL,
+ A6: GPIO,
+ A7: GPIO,
+ V5: {
+ requiresPower: true,
+ providesPower: true,
+ requiresVoltage: "5V",
+ providesVoltage: "5V",
+ includeInBoardPinout: true,
+ },
+ RESET_2: { includeInBoardPinout: true },
+ GND_2: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ VIN: { requiresPower: true, includeInBoardPinout: true },
+} as const satisfies Record
+
+type FixedProps =
+ | "datasheetUrl"
+ | "displayName"
+ | "footprint"
+ | "manufacturerPartNumber"
+ | "mfn"
+ | "pinAttributes"
+ | "pinLabels"
+ | "schHeight"
+ | "schPinArrangement"
+ | "schWidth"
+
+export type ArduinoNano33IoTProps = Omit<
+ ChipProps,
+ FixedProps
+>
+
+export const ArduinoNano33IoT = (props: ArduinoNano33IoTProps) => (
+
+)
diff --git a/lib/ArduinoNanoATmega328P.tsx b/lib/ArduinoNanoATmega328P.tsx
new file mode 100644
index 0000000..8a1e4f1
--- /dev/null
+++ b/lib/ArduinoNanoATmega328P.tsx
@@ -0,0 +1,222 @@
+import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
+
+/** Arduino Nano ATmega328P: the standard 30-pin Nano header arrangement. */
+export const ARDUINO_NANO_ATMEGA328P_FOOTPRINT =
+ "headermodule30_rows2_cols15_p2.54mm_py15.24mm_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(NANO ATMEGA328P)" as const
+
+export const ARDUINO_NANO_ATMEGA328P_PIN_LABELS = {
+ pin1: ["TX", "D1"],
+ pin2: ["RX", "D0"],
+ pin3: ["RESET", "RST"],
+ pin4: ["GND"],
+ pin5: ["D2"],
+ pin6: ["D3"],
+ pin7: ["D4"],
+ pin8: ["D5"],
+ pin9: ["D6"],
+ pin10: ["D7"],
+ pin11: ["D8"],
+ pin12: ["D9"],
+ pin13: ["D10", "SS"],
+ pin14: ["D11", "MOSI"],
+ pin15: ["D12", "MISO"],
+ pin16: ["D13", "SCK", "LED"],
+ pin17: ["3V3"],
+ pin18: ["AREF"],
+ pin19: ["A0"],
+ pin20: ["A1"],
+ pin21: ["A2"],
+ pin22: ["A3"],
+ pin23: ["A4", "SDA"],
+ pin24: ["A5", "SCL"],
+ pin25: ["A6"],
+ pin26: ["A7"],
+ pin27: ["V5", "5V"],
+ pin28: ["RESET_2", "RST"],
+ pin29: ["GND_2", "GND"],
+ pin30: ["VIN"],
+} as const
+
+const GPIO = {
+ isGpio: true,
+ includeInBoardPinout: true,
+ canUseInternalPullup: true,
+ canUseInternalPulldown: true,
+ canUseOpenDrain: true,
+ canUsePushPull: true,
+} as const satisfies PinAttributeMap
+const I2C_SDA = {
+ ...GPIO,
+ capabilities: ["i2c_sda"],
+ needsExternalPullup: true,
+} satisfies PinAttributeMap
+const I2C_SCL = {
+ ...GPIO,
+ capabilities: ["i2c_scl"],
+ needsExternalPullup: true,
+} satisfies PinAttributeMap
+const SPI_CS = { ...GPIO, capabilities: ["spi_cs"] } satisfies PinAttributeMap
+const SPI_MOSI = { ...GPIO, capabilities: ["spi_mosi"] } satisfies PinAttributeMap
+const SPI_MISO = { ...GPIO, capabilities: ["spi_miso"] } satisfies PinAttributeMap
+const SPI_SCK = { ...GPIO, capabilities: ["spi_sck"] } satisfies PinAttributeMap
+const UART_TX = { ...GPIO, capabilities: ["uart_tx"] } satisfies PinAttributeMap
+const UART_RX = { ...GPIO, capabilities: ["uart_rx"] } satisfies PinAttributeMap
+
+export const ARDUINO_NANO_ATMEGA328P_PIN_ATTRIBUTES = {
+ TX: UART_TX,
+ RX: UART_RX,
+ RESET: { includeInBoardPinout: true },
+ GND: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ D2: GPIO,
+ D3: GPIO,
+ D4: GPIO,
+ D5: GPIO,
+ D6: GPIO,
+ D7: GPIO,
+ D8: GPIO,
+ D9: GPIO,
+ D10: SPI_CS,
+ D11: SPI_MOSI,
+ D12: SPI_MISO,
+ D13: SPI_SCK,
+ "3V3": {
+ providesPower: true,
+ providesVoltage: "3.3V",
+ includeInBoardPinout: true,
+ },
+ AREF: { includeInBoardPinout: true },
+ A0: GPIO,
+ A1: GPIO,
+ A2: GPIO,
+ A3: GPIO,
+ A4: I2C_SDA,
+ A5: I2C_SCL,
+ A6: GPIO,
+ A7: GPIO,
+ V5: {
+ requiresPower: true,
+ providesPower: true,
+ requiresVoltage: "5V",
+ providesVoltage: "5V",
+ includeInBoardPinout: true,
+ },
+ RESET_2: { includeInBoardPinout: true },
+ GND_2: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ VIN: { requiresPower: true, includeInBoardPinout: true },
+} as const satisfies Record
+
+type FixedProps =
+ | "datasheetUrl"
+ | "displayName"
+ | "footprint"
+ | "manufacturerPartNumber"
+ | "mfn"
+ | "pinAttributes"
+ | "pinLabels"
+ | "schHeight"
+ | "schPinArrangement"
+ | "schWidth"
+
+export type ArduinoNanoATmega328PProps = Omit<
+ ChipProps,
+ FixedProps
+>
+
+export const ArduinoNanoATmega328P = (
+ props: ArduinoNanoATmega328PProps,
+) => (
+
+)
diff --git a/lib/ArduinoNanoESP32.tsx b/lib/ArduinoNanoESP32.tsx
new file mode 100644
index 0000000..6bf1466
--- /dev/null
+++ b/lib/ArduinoNanoESP32.tsx
@@ -0,0 +1,220 @@
+import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
+
+/** Arduino Nano ESP32: the ESP32-S3 Nano 30-pin header arrangement. */
+export const ARDUINO_NANO_ESP32_FOOTPRINT =
+ "headermodule30_rows2_cols15_p2.54mm_py15.24mm_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(NANO ESP32)" as const
+
+export const ARDUINO_NANO_ESP32_PIN_LABELS = {
+ pin1: ["TX", "D1", "GPIO43"],
+ pin2: ["RX", "D0", "GPIO44"],
+ pin3: ["RESET", "RST"],
+ pin4: ["GND"],
+ pin5: ["D2", "GPIO5"],
+ pin6: ["D3", "GPIO6"],
+ pin7: ["D4", "GPIO7"],
+ pin8: ["D5", "GPIO8"],
+ pin9: ["D6", "GPIO9"],
+ pin10: ["D7", "GPIO10"],
+ pin11: ["D8", "GPIO17"],
+ pin12: ["D9", "GPIO18"],
+ pin13: ["D10", "GPIO21"],
+ pin14: ["D11", "GPIO38"],
+ pin15: ["D12", "GPIO47"],
+ pin16: ["D13", "GPIO48"],
+ pin17: ["3V3"],
+ pin18: ["B0", "GPIO46"],
+ pin19: ["A0", "D17", "GPIO1"],
+ pin20: ["A1", "D18", "GPIO2"],
+ pin21: ["A2", "D19", "GPIO3"],
+ pin22: ["A3", "D20", "GPIO4"],
+ pin23: ["A4", "D21", "GPIO11"],
+ pin24: ["A5", "D22", "GPIO12"],
+ pin25: ["A6", "D23", "GPIO13"],
+ pin26: ["A7", "D24", "GPIO14"],
+ pin27: ["VUSB", "USB_5V"],
+ pin28: ["B1", "GPIO0"],
+ pin29: ["GND_2", "GND"],
+ pin30: ["VIN"],
+} as const
+
+const GPIO = {
+ isGpio: true,
+ includeInBoardPinout: true,
+ canUseInternalPullup: true,
+ canUseInternalPulldown: true,
+ canUseOpenDrain: true,
+ canUsePushPull: true,
+} as const satisfies PinAttributeMap
+const I2C_SDA = {
+ ...GPIO,
+ capabilities: ["i2c_sda"],
+ needsExternalPullup: true,
+} satisfies PinAttributeMap
+const I2C_SCL = {
+ ...GPIO,
+ capabilities: ["i2c_scl"],
+ needsExternalPullup: true,
+} satisfies PinAttributeMap
+const SPI_CS = { ...GPIO, capabilities: ["spi_cs"] } satisfies PinAttributeMap
+const SPI_MOSI = { ...GPIO, capabilities: ["spi_mosi"] } satisfies PinAttributeMap
+const SPI_MISO = { ...GPIO, capabilities: ["spi_miso"] } satisfies PinAttributeMap
+const SPI_SCK = { ...GPIO, capabilities: ["spi_sck"] } satisfies PinAttributeMap
+const UART_TX = { ...GPIO, capabilities: ["uart_tx"] } satisfies PinAttributeMap
+const UART_RX = { ...GPIO, capabilities: ["uart_rx"] } satisfies PinAttributeMap
+
+export const ARDUINO_NANO_ESP32_PIN_ATTRIBUTES = {
+ TX: UART_TX,
+ RX: UART_RX,
+ RESET: { includeInBoardPinout: true },
+ GND: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ D2: GPIO,
+ D3: GPIO,
+ D4: GPIO,
+ D5: GPIO,
+ D6: GPIO,
+ D7: GPIO,
+ D8: GPIO,
+ D9: GPIO,
+ D10: SPI_CS,
+ D11: SPI_MOSI,
+ D12: SPI_MISO,
+ D13: SPI_SCK,
+ "3V3": {
+ providesPower: true,
+ providesVoltage: "3.3V",
+ includeInBoardPinout: true,
+ },
+ B0: GPIO,
+ A0: GPIO,
+ A1: GPIO,
+ A2: GPIO,
+ A3: GPIO,
+ A4: I2C_SDA,
+ A5: I2C_SCL,
+ A6: GPIO,
+ A7: GPIO,
+ VUSB: {
+ requiresPower: true,
+ providesPower: true,
+ requiresVoltage: "5V",
+ providesVoltage: "5V",
+ includeInBoardPinout: true,
+ },
+ B1: GPIO,
+ GND_2: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ VIN: { requiresPower: true, includeInBoardPinout: true },
+} as const satisfies Record
+
+type FixedProps =
+ | "datasheetUrl"
+ | "displayName"
+ | "footprint"
+ | "manufacturerPartNumber"
+ | "mfn"
+ | "pinAttributes"
+ | "pinLabels"
+ | "schHeight"
+ | "schPinArrangement"
+ | "schWidth"
+
+export type ArduinoNanoESP32Props = Omit<
+ ChipProps,
+ FixedProps
+>
+
+export const ArduinoNanoESP32 = (props: ArduinoNanoESP32Props) => (
+
+)
diff --git a/lib/ArduinoNanoEvery.tsx b/lib/ArduinoNanoEvery.tsx
new file mode 100644
index 0000000..3f37f50
--- /dev/null
+++ b/lib/ArduinoNanoEvery.tsx
@@ -0,0 +1,220 @@
+import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
+
+/** Arduino Nano Every: the standard 30-pin Nano header arrangement. */
+export const ARDUINO_NANO_EVERY_FOOTPRINT =
+ "headermodule30_rows2_cols15_p2.54mm_py15.24mm_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(NANO EVERY)" as const
+
+export const ARDUINO_NANO_EVERY_PIN_LABELS = {
+ pin1: ["TX", "D1"],
+ pin2: ["RX", "D0"],
+ pin3: ["RESET", "RST"],
+ pin4: ["GND"],
+ pin5: ["D2"],
+ pin6: ["D3"],
+ pin7: ["D4"],
+ pin8: ["D5"],
+ pin9: ["D6"],
+ pin10: ["D7"],
+ pin11: ["D8"],
+ pin12: ["D9"],
+ pin13: ["D10", "SS"],
+ pin14: ["D11", "MOSI"],
+ pin15: ["D12", "MISO"],
+ pin16: ["D13", "SCK", "LED"],
+ pin17: ["3V3"],
+ pin18: ["AREF"],
+ pin19: ["A0"],
+ pin20: ["A1"],
+ pin21: ["A2"],
+ pin22: ["A3"],
+ pin23: ["A4", "SDA"],
+ pin24: ["A5", "SCL"],
+ pin25: ["A6"],
+ pin26: ["A7"],
+ pin27: ["V5", "5V"],
+ pin28: ["RESET_2", "RST"],
+ pin29: ["GND_2", "GND"],
+ pin30: ["VIN"],
+} as const
+
+const GPIO = {
+ isGpio: true,
+ includeInBoardPinout: true,
+ canUseInternalPullup: true,
+ canUseInternalPulldown: true,
+ canUseOpenDrain: true,
+ canUsePushPull: true,
+} as const satisfies PinAttributeMap
+const I2C_SDA = {
+ ...GPIO,
+ capabilities: ["i2c_sda"],
+ needsExternalPullup: true,
+} satisfies PinAttributeMap
+const I2C_SCL = {
+ ...GPIO,
+ capabilities: ["i2c_scl"],
+ needsExternalPullup: true,
+} satisfies PinAttributeMap
+const SPI_CS = { ...GPIO, capabilities: ["spi_cs"] } satisfies PinAttributeMap
+const SPI_MOSI = { ...GPIO, capabilities: ["spi_mosi"] } satisfies PinAttributeMap
+const SPI_MISO = { ...GPIO, capabilities: ["spi_miso"] } satisfies PinAttributeMap
+const SPI_SCK = { ...GPIO, capabilities: ["spi_sck"] } satisfies PinAttributeMap
+const UART_TX = { ...GPIO, capabilities: ["uart_tx"] } satisfies PinAttributeMap
+const UART_RX = { ...GPIO, capabilities: ["uart_rx"] } satisfies PinAttributeMap
+
+export const ARDUINO_NANO_EVERY_PIN_ATTRIBUTES = {
+ TX: UART_TX,
+ RX: UART_RX,
+ RESET: { includeInBoardPinout: true },
+ GND: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ D2: GPIO,
+ D3: GPIO,
+ D4: GPIO,
+ D5: GPIO,
+ D6: GPIO,
+ D7: GPIO,
+ D8: GPIO,
+ D9: GPIO,
+ D10: SPI_CS,
+ D11: SPI_MOSI,
+ D12: SPI_MISO,
+ D13: SPI_SCK,
+ "3V3": {
+ providesPower: true,
+ providesVoltage: "3.3V",
+ includeInBoardPinout: true,
+ },
+ AREF: { includeInBoardPinout: true },
+ A0: GPIO,
+ A1: GPIO,
+ A2: GPIO,
+ A3: GPIO,
+ A4: I2C_SDA,
+ A5: I2C_SCL,
+ A6: GPIO,
+ A7: GPIO,
+ V5: {
+ requiresPower: true,
+ providesPower: true,
+ requiresVoltage: "5V",
+ providesVoltage: "5V",
+ includeInBoardPinout: true,
+ },
+ RESET_2: { includeInBoardPinout: true },
+ GND_2: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ VIN: { requiresPower: true, includeInBoardPinout: true },
+} as const satisfies Record
+
+type FixedProps =
+ | "datasheetUrl"
+ | "displayName"
+ | "footprint"
+ | "manufacturerPartNumber"
+ | "mfn"
+ | "pinAttributes"
+ | "pinLabels"
+ | "schHeight"
+ | "schPinArrangement"
+ | "schWidth"
+
+export type ArduinoNanoEveryProps = Omit<
+ ChipProps,
+ FixedProps
+>
+
+export const ArduinoNanoEvery = (props: ArduinoNanoEveryProps) => (
+
+)
diff --git a/lib/ArduinoNanoMatter.tsx b/lib/ArduinoNanoMatter.tsx
new file mode 100644
index 0000000..cf50401
--- /dev/null
+++ b/lib/ArduinoNanoMatter.tsx
@@ -0,0 +1,212 @@
+import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
+
+/** Arduino Nano Matter: MGM240S-based 30-pin Nano header arrangement. */
+export const ARDUINO_NANO_MATTER_FOOTPRINT =
+ "headermodule30_rows2_cols15_p2.54mm_py15.24mm_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(NANO MATTER)" as const
+
+export const ARDUINO_NANO_MATTER_PIN_LABELS = {
+ pin1: ["D0", "TX", "PIN_SERIAL_TX1"],
+ pin2: ["D1", "RX", "PIN_SERIAL_RX1"],
+ pin3: ["RST", "RESET"],
+ pin4: ["GND"],
+ pin5: ["D2"],
+ pin6: ["D3"],
+ pin7: ["D4"],
+ pin8: ["D5"],
+ pin9: ["D6"],
+ pin10: ["D7"],
+ pin11: ["D8"],
+ pin12: ["D9"],
+ pin13: ["D10"],
+ pin14: ["D11"],
+ pin15: ["D12"],
+ pin16: ["D13"],
+ pin17: ["V3_3", "3V3"],
+ pin18: ["AREF"],
+ pin19: ["A0"],
+ pin20: ["A1"],
+ pin21: ["A2"],
+ pin22: ["A3"],
+ pin23: ["A4", "SDA"],
+ pin24: ["A5", "SCL"],
+ pin25: ["A6"],
+ pin26: ["A7"],
+ pin27: ["V5", "5V"],
+ pin28: ["NC"],
+ pin29: ["GND_2", "GND"],
+ pin30: ["VIN"],
+} as const
+
+const GPIO = {
+ isGpio: true,
+ includeInBoardPinout: true,
+ canUseInternalPullup: true,
+ canUseInternalPulldown: true,
+ canUseOpenDrain: true,
+ canUsePushPull: true,
+} as const satisfies PinAttributeMap
+const I2C_SDA = { ...GPIO, capabilities: ["i2c_sda"] } satisfies PinAttributeMap
+const I2C_SCL = { ...GPIO, capabilities: ["i2c_scl"] } satisfies PinAttributeMap
+const SPI_CS = { ...GPIO, capabilities: ["spi_cs"] } satisfies PinAttributeMap
+const SPI_MOSI = { ...GPIO, capabilities: ["spi_mosi"] } satisfies PinAttributeMap
+const SPI_MISO = { ...GPIO, capabilities: ["spi_miso"] } satisfies PinAttributeMap
+const SPI_SCK = { ...GPIO, capabilities: ["spi_sck"] } satisfies PinAttributeMap
+const UART_TX = { ...GPIO, capabilities: ["uart_tx"] } satisfies PinAttributeMap
+const UART_RX = { ...GPIO, capabilities: ["uart_rx"] } satisfies PinAttributeMap
+
+export const ARDUINO_NANO_MATTER_PIN_ATTRIBUTES = {
+ D0: UART_TX,
+ D1: UART_RX,
+ RST: { includeInBoardPinout: true },
+ GND: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ D2: GPIO,
+ D3: GPIO,
+ D4: GPIO,
+ D5: GPIO,
+ D6: GPIO,
+ D7: GPIO,
+ D8: GPIO,
+ D9: GPIO,
+ D10: SPI_CS,
+ D11: SPI_MOSI,
+ D12: SPI_MISO,
+ D13: SPI_SCK,
+ V3_3: {
+ providesPower: true,
+ providesVoltage: "3.3V",
+ includeInBoardPinout: true,
+ },
+ AREF: { includeInBoardPinout: true },
+ A0: GPIO,
+ A1: GPIO,
+ A2: GPIO,
+ A3: GPIO,
+ A4: I2C_SDA,
+ A5: I2C_SCL,
+ A6: GPIO,
+ A7: GPIO,
+ V5: {
+ requiresPower: true,
+ providesPower: true,
+ requiresVoltage: "5V",
+ providesVoltage: "5V",
+ includeInBoardPinout: true,
+ },
+ NC: { doNotConnect: true, includeInBoardPinout: true },
+ GND_2: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ VIN: { requiresPower: true, includeInBoardPinout: true },
+} as const satisfies Record
+
+type FixedProps =
+ | "datasheetUrl"
+ | "displayName"
+ | "footprint"
+ | "manufacturerPartNumber"
+ | "mfn"
+ | "pinAttributes"
+ | "pinLabels"
+ | "schHeight"
+ | "schPinArrangement"
+ | "schWidth"
+
+export type ArduinoNanoMatterProps = Omit<
+ ChipProps,
+ FixedProps
+>
+
+export const ArduinoNanoMatter = (props: ArduinoNanoMatterProps) => (
+
+)
diff --git a/lib/ArduinoNanoRP2040Connect.tsx b/lib/ArduinoNanoRP2040Connect.tsx
new file mode 100644
index 0000000..16c9ee7
--- /dev/null
+++ b/lib/ArduinoNanoRP2040Connect.tsx
@@ -0,0 +1,214 @@
+import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
+
+/** Arduino Nano RP2040 Connect: the RP2040 30-pin Nano header arrangement. */
+export const ARDUINO_NANO_RP2040_CONNECT_FOOTPRINT =
+ "headermodule30_rows2_cols15_p2.54mm_py15.24mm_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(NANO RP2040)" as const
+
+export const ARDUINO_NANO_RP2040_CONNECT_PIN_LABELS = {
+ pin1: ["TX", "D1", "GPIO0"],
+ pin2: ["RX", "D0", "GPIO1"],
+ pin3: ["RESET", "RST"],
+ pin4: ["GND"],
+ pin5: ["D2", "GPIO25"],
+ pin6: ["D3", "GPIO15"],
+ pin7: ["D4", "GPIO16"],
+ pin8: ["D5", "GPIO17"],
+ pin9: ["D6", "GPIO18"],
+ pin10: ["D7", "GPIO19"],
+ pin11: ["D8", "GPIO20"],
+ pin12: ["D9", "GPIO21"],
+ pin13: ["D10", "GPIO5"],
+ pin14: ["D11", "GPIO7", "MOSI"],
+ pin15: ["D12", "GPIO4", "MISO"],
+ pin16: ["D13", "GPIO6", "SCK"],
+ pin17: ["3V3"],
+ pin18: ["AREF"],
+ pin19: ["A0", "GPIO26"],
+ pin20: ["A1", "GPIO27"],
+ pin21: ["A2", "GPIO28"],
+ pin22: ["A3", "GPIO29"],
+ pin23: ["A4", "SDA", "GPIO12"],
+ pin24: ["A5", "SCL", "GPIO13"],
+ pin25: ["A6"],
+ pin26: ["A7"],
+ pin27: ["V5", "5V"],
+ pin28: ["QSPI_CSn", "REC"],
+ pin29: ["GND_2", "GND"],
+ pin30: ["VIN"],
+} as const
+
+const GPIO = {
+ isGpio: true,
+ includeInBoardPinout: true,
+ canUseInternalPullup: true,
+ canUseInternalPulldown: true,
+ canUseOpenDrain: true,
+ canUsePushPull: true,
+} as const satisfies PinAttributeMap
+const I2C_SDA = { ...GPIO, capabilities: ["i2c_sda"] } satisfies PinAttributeMap
+const I2C_SCL = { ...GPIO, capabilities: ["i2c_scl"] } satisfies PinAttributeMap
+const SPI_CS = { ...GPIO, capabilities: ["spi_cs"] } satisfies PinAttributeMap
+const SPI_MOSI = { ...GPIO, capabilities: ["spi_mosi"] } satisfies PinAttributeMap
+const SPI_MISO = { ...GPIO, capabilities: ["spi_miso"] } satisfies PinAttributeMap
+const SPI_SCK = { ...GPIO, capabilities: ["spi_sck"] } satisfies PinAttributeMap
+const UART_TX = { ...GPIO, capabilities: ["uart_tx"] } satisfies PinAttributeMap
+const UART_RX = { ...GPIO, capabilities: ["uart_rx"] } satisfies PinAttributeMap
+
+export const ARDUINO_NANO_RP2040_CONNECT_PIN_ATTRIBUTES = {
+ TX: UART_TX,
+ RX: UART_RX,
+ RESET: { includeInBoardPinout: true },
+ GND: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ D2: GPIO,
+ D3: GPIO,
+ D4: GPIO,
+ D5: GPIO,
+ D6: GPIO,
+ D7: GPIO,
+ D8: GPIO,
+ D9: GPIO,
+ D10: SPI_CS,
+ D11: SPI_MOSI,
+ D12: SPI_MISO,
+ D13: SPI_SCK,
+ "3V3": {
+ providesPower: true,
+ providesVoltage: "3.3V",
+ includeInBoardPinout: true,
+ },
+ AREF: { includeInBoardPinout: true },
+ A0: GPIO,
+ A1: GPIO,
+ A2: GPIO,
+ A3: GPIO,
+ A4: I2C_SDA,
+ A5: I2C_SCL,
+ A6: GPIO,
+ A7: GPIO,
+ V5: {
+ requiresPower: true,
+ providesPower: true,
+ requiresVoltage: "5V",
+ providesVoltage: "5V",
+ includeInBoardPinout: true,
+ },
+ QSPI_CSn: { includeInBoardPinout: true },
+ GND_2: {
+ requiresGround: true,
+ providesGround: true,
+ includeInBoardPinout: true,
+ },
+ VIN: { requiresPower: true, includeInBoardPinout: true },
+} as const satisfies Record
+
+type FixedProps =
+ | "datasheetUrl"
+ | "displayName"
+ | "footprint"
+ | "manufacturerPartNumber"
+ | "mfn"
+ | "pinAttributes"
+ | "pinLabels"
+ | "schHeight"
+ | "schPinArrangement"
+ | "schWidth"
+
+export type ArduinoNanoRP2040ConnectProps = Omit<
+ ChipProps,
+ FixedProps
+>
+
+export const ArduinoNanoRP2040Connect = (
+ props: ArduinoNanoRP2040ConnectProps,
+) => (
+
+)
diff --git a/lib/PololuA4988StepperMotorDriverCarrier.tsx b/lib/PololuA4988StepperMotorDriverCarrier.tsx
index f6b4966..6c92c52 100644
--- a/lib/PololuA4988StepperMotorDriverCarrier.tsx
+++ b/lib/PololuA4988StepperMotorDriverCarrier.tsx
@@ -6,11 +6,11 @@ import type { ChipProps, PinAttributeMap } from "@tscircuit/props"
* when pcbRotation is zero.
*/
export const POLOLU_A4988_STEPPER_MOTOR_DRIVER_CARRIER_FOOTPRINT =
- "pinrow16_rows2_p2.54mm_py12.7mm_id1mm_od1.6mm_female_nopinlabels" as const
+ "headermodule16_rows2_p2.54mm_py12.7mm_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(A4988 DRIVER)" as const
export const POLOLU_A4988_STEPPER_MOTOR_DRIVER_CARRIER_PIN_LABELS = {
- // ENABLE/VMOT end to DIR/logic-GND end. The generic pinrow footprinter
- // numbers around the perimeter, so the second physical row runs pin16→10.
+ // ENABLE/VMOT end to DIR/logic-GND end. The headermodule footprinter numbers
+ // around the perimeter, so the second physical row runs pin16→10.
pin1: ["ENABLE", "EN", "nENABLE"],
pin2: ["VMOT", "MOTOR_SUPPLY"],
pin3: ["GND_MOTOR", "PGND", "GND"],
@@ -132,6 +132,24 @@ export const PololuA4988StepperMotorDriverCarrier = (
datasheetUrl="https://www.pololu.com/product-info-merged/2980"
footprint={POLOLU_A4988_STEPPER_MOTOR_DRIVER_CARRIER_FOOTPRINT}
pinLabels={POLOLU_A4988_STEPPER_MOTOR_DRIVER_CARRIER_PIN_LABELS}
+ pcbPinLabels={{
+ pin1: "ENABLE",
+ pin2: "VMOT",
+ pin3: "GND_MOTOR",
+ pin4: "2B",
+ pin5: "2A",
+ pin6: "1A",
+ pin7: "1B",
+ pin8: "VDD",
+ pin9: "GND_LOGIC",
+ pin10: "DIR",
+ pin11: "STEP",
+ pin12: "SLEEP",
+ pin13: "RESET",
+ pin14: "MS3",
+ pin15: "MS2",
+ pin16: "MS1",
+ }}
pinAttributes={POLOLU_A4988_STEPPER_MOTOR_DRIVER_CARRIER_PIN_ATTRIBUTES}
schWidth={2}
schHeight={1.8}
diff --git a/lib/SeeedXiaoRP2040.tsx b/lib/SeeedXiaoRP2040.tsx
index a3e871d..08c7457 100644
--- a/lib/SeeedXiaoRP2040.tsx
+++ b/lib/SeeedXiaoRP2040.tsx
@@ -6,7 +6,7 @@ import { rp2040Gpio } from "./rp2040PinAttributes"
* USB is on the negative PCB X side when pcbRotation is zero.
*/
export const SEEED_XIAO_RP2040_FOOTPRINT =
- "pinrow14_rows2_p2.54mm_py15.24mm_id1mm_od1.6mm_female_nopinlabels" as const
+ "headermodule14_rows2_p2.54mm_py15.24mm_id1mm_od1.6mm_female_silkscreenborder_silkscreenlabel(XIAO RP2040)" as const
export const SEEED_XIAO_RP2040_PIN_LABELS = {
// Footprinter numbering follows its perimeter traversal. XIAO_PIN aliases
@@ -84,6 +84,22 @@ export const SeeedXiaoRP2040 = (props: SeeedXiaoRP2040Props) => (
datasheetUrl="https://wiki.seeedstudio.com/XIAO-RP2040/"
footprint={SEEED_XIAO_RP2040_FOOTPRINT}
pinLabels={SEEED_XIAO_RP2040_PIN_LABELS}
+ pcbPinLabels={{
+ pin1: "5V",
+ pin2: "D0",
+ pin3: "D1",
+ pin4: "D2",
+ pin5: "D3",
+ pin6: "D4",
+ pin7: "D5",
+ pin8: "D6",
+ pin9: "D7",
+ pin10: "D8",
+ pin11: "D9",
+ pin12: "D10",
+ pin13: "3V3",
+ pin14: "GND",
+ }}
pinAttributes={SEEED_XIAO_RP2040_PIN_ATTRIBUTES}
schWidth={1.675}
schHeight={1.6}
diff --git a/lib/generatedModules.tsx b/lib/generatedModules.tsx
index 4dde7be..7e6a8d2 100644
--- a/lib/generatedModules.tsx
+++ b/lib/generatedModules.tsx
@@ -86,20 +86,20 @@ const UART_RX = {
capabilities: ["uart_rx"],
} as const satisfies PinAttributeMap
-const FOOTPRINT_F3 = "pinrow3_p2.54mm_id1mm_od1.6mm_female_nopinlabels" as const
-const FOOTPRINT_F4 = "pinrow4_p2.54mm_id1mm_od1.6mm_female_nopinlabels" as const
-const FOOTPRINT_F5 = "pinrow5_p2.54mm_id1mm_od1.6mm_female_nopinlabels" as const
-const FOOTPRINT_F6 = "pinrow6_p2.54mm_id1mm_od1.6mm_female_nopinlabels" as const
-const FOOTPRINT_F8 = "pinrow8_p2.54mm_id1mm_od1.6mm_female_nopinlabels" as const
-const FOOTPRINT_F10 = "pinrow10_p2.54mm_id1mm_od1.6mm_female_nopinlabels" as const
-const FOOTPRINT_F12 = "pinrow12_rows2_p2.54mm_py7.62mm_id1mm_od1.6mm_female_nopinlabels" as const
-const FOOTPRINT_F14 = "pinrow14_rows2_p2.54mm_py15.24mm_id1mm_od1.6mm_female_nopinlabels" as const
-const FOOTPRINT_F16 = "pinrow16_rows2_p2.54mm_py12.7mm_id1mm_od1.6mm_female_nopinlabels" as const
-const FOOTPRINT_F24 = "pinrow24_rows2_p2.54mm_py15.24mm_id1mm_od1.6mm_female_nopinlabels" as const
-const FOOTPRINT_F28 = "pinrow28_rows2_cols16_p2.54mm_py20.32mm_missing(1,2,3,4)_id1mm_od1.6mm_female_nopinlabels" as const
-const FOOTPRINT_F30 = "pinrow30_rows2_p2.54mm_py15.24mm_id1mm_od1.6mm_female_nopinlabels" as const
-const FOOTPRINT_F40 = "pinrow40_rows2_p2.54mm_py17.78mm_id1mm_od1.6mm_female_nopinlabels" as const
-const FOOTPRINT_F42 = "pinrow42_rows2_p2.54mm_py17.78mm_id1mm_od1.6mm_female_nopinlabels" as const
+const FOOTPRINT_F3 = "headermodule3_p2.54mm_id1mm_od1.6mm_female_nopinlabels" as const
+const FOOTPRINT_F4 = "headermodule4_p2.54mm_id1mm_od1.6mm_female_nopinlabels" as const
+const FOOTPRINT_F5 = "headermodule5_p2.54mm_id1mm_od1.6mm_female_nopinlabels" as const
+const FOOTPRINT_F6 = "headermodule6_p2.54mm_id1mm_od1.6mm_female_nopinlabels" as const
+const FOOTPRINT_F8 = "headermodule8_p2.54mm_id1mm_od1.6mm_female_nopinlabels" as const
+const FOOTPRINT_F10 = "headermodule10_p2.54mm_id1mm_od1.6mm_female_nopinlabels" as const
+const FOOTPRINT_F12 = "headermodule12_rows2_p2.54mm_py7.62mm_id1mm_od1.6mm_female_nopinlabels" as const
+const FOOTPRINT_F14 = "headermodule14_rows2_p2.54mm_py15.24mm_id1mm_od1.6mm_female_nopinlabels" as const
+const FOOTPRINT_F16 = "headermodule16_rows2_p2.54mm_py12.7mm_id1mm_od1.6mm_female_nopinlabels" as const
+const FOOTPRINT_F24 = "headermodule24_rows2_p2.54mm_py15.24mm_id1mm_od1.6mm_female_nopinlabels" as const
+const FOOTPRINT_F28 = "headermodule28_rows2_cols16_p2.54mm_py20.32mm_missing(1,2,3,4)_id1mm_od1.6mm_female_nopinlabels" as const
+const FOOTPRINT_F30 = "headermodule30_rows2_p2.54mm_py15.24mm_id1mm_od1.6mm_female_nopinlabels" as const
+const FOOTPRINT_F40 = "headermodule40_rows2_p2.54mm_py17.78mm_id1mm_od1.6mm_female_nopinlabels" as const
+const FOOTPRINT_F42 = "headermodule42_rows2_p2.54mm_py17.78mm_id1mm_od1.6mm_female_nopinlabels" as const
export const FEATHER28_PIN_LABELS = {
pin1: ["BAT"],
@@ -1527,366 +1527,6 @@ export const GENERIC4_PIN_ATTRIBUTES = {
SIG2: GPIO,
} as const satisfies Record
-/** Adafruit Feather ESP32-S3 TFT — ESP32-S3 Feather-format board with display. */
-export const AdafruitFeatherESP32S3TFT_PIN_LABELS = FEATHER28_PIN_LABELS
-export const AdafruitFeatherESP32S3TFT_PIN_ATTRIBUTES = FEATHER28_PIN_ATTRIBUTES
-export const AdafruitFeatherESP32S3TFT_FOOTPRINT = FOOTPRINT_F28
-export type AdafruitFeatherESP32S3TFTProps = ChipProps
-export const AdafruitFeatherESP32S3TFT = (props: AdafruitFeatherESP32S3TFTProps) => (
-
-)
-
-/** Adafruit Feather RP2350 — RP2350 Feather-format board. */
-export const AdafruitFeatherRP2350_PIN_LABELS = FEATHER28_PIN_LABELS
-export const AdafruitFeatherRP2350_PIN_ATTRIBUTES = FEATHER28_PIN_ATTRIBUTES
-export const AdafruitFeatherRP2350_FOOTPRINT = FOOTPRINT_F28
-export type AdafruitFeatherRP2350Props = ChipProps
-export const AdafruitFeatherRP2350 = (props: AdafruitFeatherRP2350Props) => (
-
-)
-
-/** Adafruit ItsyBitsy M0 Express — compact SAMD21 board. */
-export const AdafruitItsyBitsyM0Express_PIN_LABELS = ITSYBITSY24_PIN_LABELS
-export const AdafruitItsyBitsyM0Express_PIN_ATTRIBUTES = ITSYBITSY24_PIN_ATTRIBUTES
-export const AdafruitItsyBitsyM0Express_FOOTPRINT = FOOTPRINT_F24
-export type AdafruitItsyBitsyM0ExpressProps = ChipProps
-export const AdafruitItsyBitsyM0Express = (props: AdafruitItsyBitsyM0ExpressProps) => (
-
-)
-
-/** Adafruit ItsyBitsy M4 Express — compact SAMD51 board. */
-export const AdafruitItsyBitsyM4Express_PIN_LABELS = ITSYBITSY24_PIN_LABELS
-export const AdafruitItsyBitsyM4Express_PIN_ATTRIBUTES = ITSYBITSY24_PIN_ATTRIBUTES
-export const AdafruitItsyBitsyM4Express_FOOTPRINT = FOOTPRINT_F24
-export type AdafruitItsyBitsyM4ExpressProps = ChipProps
-export const AdafruitItsyBitsyM4Express = (props: AdafruitItsyBitsyM4ExpressProps) => (
-
-)
-
-/** Adafruit ItsyBitsy nRF52840 Express — compact Bluetooth board. */
-export const AdafruitItsyBitsyNRF52840Express_PIN_LABELS = ITSYBITSY24_PIN_LABELS
-export const AdafruitItsyBitsyNRF52840Express_PIN_ATTRIBUTES = ITSYBITSY24_PIN_ATTRIBUTES
-export const AdafruitItsyBitsyNRF52840Express_FOOTPRINT = FOOTPRINT_F24
-export type AdafruitItsyBitsyNRF52840ExpressProps = ChipProps
-export const AdafruitItsyBitsyNRF52840Express = (props: AdafruitItsyBitsyNRF52840ExpressProps) => (
-
-)
-
-/** Adafruit ItsyBitsy RP2040 — compact RP2040 board. */
-export const AdafruitItsyBitsyRP2040_PIN_LABELS = ITSYBITSY24_PIN_LABELS
-export const AdafruitItsyBitsyRP2040_PIN_ATTRIBUTES = ITSYBITSY24_PIN_ATTRIBUTES
-export const AdafruitItsyBitsyRP2040_FOOTPRINT = FOOTPRINT_F24
-export type AdafruitItsyBitsyRP2040Props = ChipProps
-export const AdafruitItsyBitsyRP2040 = (props: AdafruitItsyBitsyRP2040Props) => (
-
-)
-
-/** Adafruit ItsyBitsy ESP32 — compact ESP32 board. */
-export const AdafruitItsyBitsyESP32_PIN_LABELS = ITSYBITSY24_PIN_LABELS
-export const AdafruitItsyBitsyESP32_PIN_ATTRIBUTES = ITSYBITSY24_PIN_ATTRIBUTES
-export const AdafruitItsyBitsyESP32_FOOTPRINT = FOOTPRINT_F24
-export type AdafruitItsyBitsyESP32Props = ChipProps
-export const AdafruitItsyBitsyESP32 = (props: AdafruitItsyBitsyESP32Props) => (
-
-)
-
-/** Adafruit QT Py SAMD21 — tiny castellated/0.1 in header-ready board. */
-export const AdafruitQTPySAMD21_PIN_LABELS = QTPY12_PIN_LABELS
-export const AdafruitQTPySAMD21_PIN_ATTRIBUTES = QTPY12_PIN_ATTRIBUTES
-export const AdafruitQTPySAMD21_FOOTPRINT = FOOTPRINT_F12
-export type AdafruitQTPySAMD21Props = ChipProps
-export const AdafruitQTPySAMD21 = (props: AdafruitQTPySAMD21Props) => (
-
-)
-
-/** Adafruit QT Py ESP32-S2 — tiny castellated/0.1 in header-ready board. */
-export const AdafruitQTPyESP32S2_PIN_LABELS = QTPY12_PIN_LABELS
-export const AdafruitQTPyESP32S2_PIN_ATTRIBUTES = QTPY12_PIN_ATTRIBUTES
-export const AdafruitQTPyESP32S2_FOOTPRINT = FOOTPRINT_F12
-export type AdafruitQTPyESP32S2Props = ChipProps
-export const AdafruitQTPyESP32S2 = (props: AdafruitQTPyESP32S2Props) => (
-
-)
-
-/** Adafruit QT Py ESP32-S3 — tiny castellated/0.1 in header-ready board. */
-export const AdafruitQTPyESP32S3_PIN_LABELS = QTPY12_PIN_LABELS
-export const AdafruitQTPyESP32S3_PIN_ATTRIBUTES = QTPY12_PIN_ATTRIBUTES
-export const AdafruitQTPyESP32S3_FOOTPRINT = FOOTPRINT_F12
-export type AdafruitQTPyESP32S3Props = ChipProps
-export const AdafruitQTPyESP32S3 = (props: AdafruitQTPyESP32S3Props) => (
-
-)
-
-/** Adafruit QT Py nRF52840 — tiny castellated/0.1 in header-ready board. */
-export const AdafruitQTPyNRF52840_PIN_LABELS = QTPY12_PIN_LABELS
-export const AdafruitQTPyNRF52840_PIN_ATTRIBUTES = QTPY12_PIN_ATTRIBUTES
-export const AdafruitQTPyNRF52840_FOOTPRINT = FOOTPRINT_F12
-export type AdafruitQTPyNRF52840Props = ChipProps
-export const AdafruitQTPyNRF52840 = (props: AdafruitQTPyNRF52840Props) => (
-
-)
-
-/** Adafruit QT Py RP2350 — tiny castellated/0.1 in header-ready board. */
-export const AdafruitQTPyRP2350_PIN_LABELS = QTPY12_PIN_LABELS
-export const AdafruitQTPyRP2350_PIN_ATTRIBUTES = QTPY12_PIN_ATTRIBUTES
-export const AdafruitQTPyRP2350_FOOTPRINT = FOOTPRINT_F12
-export type AdafruitQTPyRP2350Props = ChipProps
-export const AdafruitQTPyRP2350 = (props: AdafruitQTPyRP2350Props) => (
-
-)
-
-/** Arduino Nano ATmega328P — classic Nano dual-row module. */
-export const ArduinoNanoATmega328P_PIN_LABELS = NANO30_PIN_LABELS
-export const ArduinoNanoATmega328P_PIN_ATTRIBUTES = NANO30_PIN_ATTRIBUTES
-export const ArduinoNanoATmega328P_FOOTPRINT = FOOTPRINT_F30
-export type ArduinoNanoATmega328PProps = ChipProps
-export const ArduinoNanoATmega328P = (props: ArduinoNanoATmega328PProps) => (
-
-)
-
-/** Arduino Nano Every — ATmega4809 Nano module. */
-export const ArduinoNanoEvery_PIN_LABELS = NANO30_PIN_LABELS
-export const ArduinoNanoEvery_PIN_ATTRIBUTES = NANO30_PIN_ATTRIBUTES
-export const ArduinoNanoEvery_FOOTPRINT = FOOTPRINT_F30
-export type ArduinoNanoEveryProps = ChipProps
-export const ArduinoNanoEvery = (props: ArduinoNanoEveryProps) => (
-
-)
-
-/** Arduino Nano 33 IoT — SAMD21 + wireless Nano module. */
-export const ArduinoNano33IoT_PIN_LABELS = NANO30_PIN_LABELS
-export const ArduinoNano33IoT_PIN_ATTRIBUTES = NANO30_PIN_ATTRIBUTES
-export const ArduinoNano33IoT_FOOTPRINT = FOOTPRINT_F30
-export type ArduinoNano33IoTProps = ChipProps
-export const ArduinoNano33IoT = (props: ArduinoNano33IoTProps) => (
-
-)
-
-/** Arduino Nano 33 BLE — nRF52840 Nano module. */
-export const ArduinoNano33BLE_PIN_LABELS = NANO30_PIN_LABELS
-export const ArduinoNano33BLE_PIN_ATTRIBUTES = NANO30_PIN_ATTRIBUTES
-export const ArduinoNano33BLE_FOOTPRINT = FOOTPRINT_F30
-export type ArduinoNano33BLEProps = ChipProps
-export const ArduinoNano33BLE = (props: ArduinoNano33BLEProps) => (
-
-)
-
-/** Arduino Nano 33 BLE Sense Rev2 — sensor-rich nRF52840 Nano module. */
-export const ArduinoNano33BLESenseRev2_PIN_LABELS = NANO30_PIN_LABELS
-export const ArduinoNano33BLESenseRev2_PIN_ATTRIBUTES = NANO30_PIN_ATTRIBUTES
-export const ArduinoNano33BLESenseRev2_FOOTPRINT = FOOTPRINT_F30
-export type ArduinoNano33BLESenseRev2Props = ChipProps
-export const ArduinoNano33BLESenseRev2 = (props: ArduinoNano33BLESenseRev2Props) => (
-
-)
-
-/** Arduino Nano ESP32 — ESP32-S3 Nano module. */
-export const ArduinoNanoESP32_PIN_LABELS = NANO30_PIN_LABELS
-export const ArduinoNanoESP32_PIN_ATTRIBUTES = NANO30_PIN_ATTRIBUTES
-export const ArduinoNanoESP32_FOOTPRINT = FOOTPRINT_F30
-export type ArduinoNanoESP32Props = ChipProps
-export const ArduinoNanoESP32 = (props: ArduinoNanoESP32Props) => (
-
-)
-
-/** Arduino Nano RP2040 Connect — RP2040 + wireless Nano module. */
-export const ArduinoNanoRP2040Connect_PIN_LABELS = NANO30_PIN_LABELS
-export const ArduinoNanoRP2040Connect_PIN_ATTRIBUTES = NANO30_PIN_ATTRIBUTES
-export const ArduinoNanoRP2040Connect_FOOTPRINT = FOOTPRINT_F30
-export type ArduinoNanoRP2040ConnectProps = ChipProps
-export const ArduinoNanoRP2040Connect = (props: ArduinoNanoRP2040ConnectProps) => (
-
-)
-
-/** Arduino Nano Matter — MGM240S Matter/Thread Nano module. */
-export const ArduinoNanoMatter_PIN_LABELS = NANO30_PIN_LABELS
-export const ArduinoNanoMatter_PIN_ATTRIBUTES = NANO30_PIN_ATTRIBUTES
-export const ArduinoNanoMatter_FOOTPRINT = FOOTPRINT_F30
-export type ArduinoNanoMatterProps = ChipProps
-export const ArduinoNanoMatter = (props: ArduinoNanoMatterProps) => (
-
-)
-
/** Raspberry Pi Pico H — headered RP2040 module. */
export const RaspberryPiPicoH_PIN_LABELS = PICO40_PIN_LABELS
export const RaspberryPiPicoH_PIN_ATTRIBUTES = PICO40_PIN_ATTRIBUTES
diff --git a/package.json b/package.json
index f059404..f821816 100644
--- a/package.json
+++ b/package.json
@@ -29,14 +29,16 @@
"typecheck": "tsc --noEmit"
},
"devDependencies": {
- "@tscircuit/footprinter": "0.0.387",
+ "@tscircuit/footprinter": "0.0.409",
"@tscircuit/props": "^0.0.604",
"@types/bun": "^1.3.14",
"@types/react": "^19.2.18",
- "tscircuit": "^0.0.2193",
+ "bun-match-svg": "^0.0.15",
+ "sharp": "0.32.6",
+ "tscircuit": "^0.0.2207",
"typescript": "^5.0.0"
},
- "patchedDependencies": {
- "@tscircuit/footprinter@0.0.387": "patches/@tscircuit%2Ffootprinter@0.0.387.patch"
- }
+ "trustedDependencies": [
+ "sharp"
+ ]
}
diff --git a/patches/@tscircuit%2Ffootprinter@0.0.387.patch b/patches/@tscircuit%2Ffootprinter@0.0.387.patch
deleted file mode 100644
index afca006..0000000
--- a/patches/@tscircuit%2Ffootprinter@0.0.387.patch
+++ /dev/null
@@ -1,117 +0,0 @@
-diff --git a/dist/index.js b/dist/index.js
-index 8d7db1f54405212128e9d64c0777170d9a7a75ee..aea46eecb7d95a87524cb0421f3e37ddcd587290 100644
---- a/dist/index.js
-+++ b/dist/index.js
-@@ -3268,9 +3268,12 @@ var pinrow_def = base_def.extend({
- fn: z24.string(),
- num_pins: z24.number().optional().default(6),
- rows: z24.union([z24.string(), z24.number()]).transform((val) => Number(val)).optional().default(1).describe("number of rows"),
-+ cols: z24.union([z24.string(), z24.number()]).transform((val) => Number(val)).optional().describe("number of nominal columns in a sparse grid"),
- p: length17.default("0.1in").describe("pitch"),
-+ py: length17.optional().describe("vertical row pitch"),
- id: length17.default("1.0mm").describe("inner diameter"),
- od: length17.default("1.5mm").describe("outer diameter"),
-+ missing: function_call.default([]).describe("row-major nominal grid positions to omit"),
- male: z24.boolean().optional().describe("for male pin headers"),
- female: z24.boolean().optional().describe("for female pin headers"),
- smd: z24.boolean().optional().describe("surface mount device"),
-@@ -3307,15 +3310,32 @@ var pinrow_def = base_def.extend({
- path: ["male", "female"]
- });
- }
-+ if (data.cols !== void 0 && (!Number.isInteger(data.cols) || data.cols < 1)) {
-+ ctx.addIssue({
-+ code: z24.ZodIssueCode.custom,
-+ message: "'cols' must be a positive integer",
-+ path: ["cols"]
-+ });
-+ }
-+ if (data.missing.some((position) => typeof position !== "number")) {
-+ ctx.addIssue({
-+ code: z24.ZodIssueCode.custom,
-+ message: "'missing' positions must be pad numbers",
-+ path: ["missing"]
-+ });
-+ }
- });
- var pinrow = (raw_params) => {
- const parameters = pinrow_def.parse(raw_params);
- const {
- p,
-+ py,
- id,
- od,
- rows,
-+ cols,
- num_pins,
-+ missing,
- pinlabelAnchorSide,
- pinlabelverticallyinverted,
- pinlabelorthogonal,
-@@ -3329,10 +3349,29 @@ var pinrow = (raw_params) => {
- if (pinlabeltextalignleft) pinlabelTextAlign = "left";
- else if (pinlabeltextalignright) pinlabelTextAlign = "right";
- const holes = [];
-- const numPinsPerRow = Math.ceil(num_pins / rows);
-- const pinRowSpanY = (rows - 1) * p;
-+ const missingPositions = missing;
-+ const uniqueMissingPositions = /* @__PURE__ */ new Set(missingPositions);
-+ if (uniqueMissingPositions.size !== missingPositions.length) {
-+ throw new Error("Pinrow missing positions must not contain duplicates");
-+ }
-+ const nominalPinCount = num_pins + missingPositions.length;
-+ const numPinsPerRow = cols ?? Math.ceil(nominalPinCount / rows);
-+ const gridPositionCount = numPinsPerRow * rows;
-+ const usesExplicitGrid = cols !== void 0 || missingPositions.length > 0;
-+ if (usesExplicitGrid && gridPositionCount !== nominalPinCount) {
-+ throw new Error(
-+ `Pinrow grid has ${gridPositionCount} positions, but ${nominalPinCount} are required for ${num_pins} pins and ${missingPositions.length} missing positions`
-+ );
-+ }
-+ if (missingPositions.some(
-+ (position) => !Number.isInteger(position) || position < 1 || position > gridPositionCount
-+ )) {
-+ throw new Error("Pinrow missing position is outside the nominal grid");
-+ }
-+ const rowPitch = py ?? p;
-+ const pinRowSpanY = (rows - 1) * rowPitch;
- const yStart = pinRowSpanY / 2;
-- const ySpacing = -p;
-+ const ySpacing = -rowPitch;
- const calculateAnchorPosition = ({
- xoff,
- yoff,
-@@ -3455,8 +3494,22 @@ var pinrow = (raw_params) => {
- }
- };
- const usedPositions = /* @__PURE__ */ new Set();
-- const useBGAStyle = rows > 2 && numPinsPerRow > 2;
-- if (rows === 1) {
-+ if (usesExplicitGrid) {
-+ const xStart = -((numPinsPerRow - 1) / 2) * p;
-+ let outputPinNumber = 1;
-+ for (let row = 0; row < rows; row++) {
-+ for (let col = 0; col < numPinsPerRow; col++) {
-+ const nominalPosition = row * numPinsPerRow + col + 1;
-+ if (uniqueMissingPositions.has(nominalPosition)) continue;
-+ const xoff = xStart + col * p;
-+ const yoff = yStart + row * ySpacing;
-+ const posKey = `${xoff},${yoff}`;
-+ if (usedPositions.has(posKey)) throw new Error(`Overlap at ${posKey}`);
-+ usedPositions.add(posKey);
-+ addPin(outputPinNumber++, xoff, yoff);
-+ }
-+ }
-+ } else if (rows === 1) {
- const xStart = -((num_pins - 1) / 2) * p;
- for (let i = 0; i < num_pins; i++) {
- const pinNumber = i + 1;
-@@ -3466,7 +3519,7 @@ var pinrow = (raw_params) => {
- usedPositions.add(posKey);
- addPin(pinNumber, xoff, 0);
- }
-- } else if (useBGAStyle) {
-+ } else if (rows > 2 && numPinsPerRow > 2) {
- const xStart = -((numPinsPerRow - 1) / 2) * p;
- let currentPin = 1;
- for (let row = 0; row < rows && currentPin <= num_pins; row++) {
diff --git a/sample-boards/__snapshots__/xiao-rp2040-a4988-stepper-controller.circuit-pcb.snap.svg b/sample-boards/__snapshots__/xiao-rp2040-a4988-stepper-controller.circuit-pcb.snap.svg
index 05c82c1..b03babc 100644
--- a/sample-boards/__snapshots__/xiao-rp2040-a4988-stepper-controller.circuit-pcb.snap.svg
+++ b/sample-boards/__snapshots__/xiao-rp2040-a4988-stepper-controller.circuit-pcb.snap.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/sample-boards/__snapshots__/xiao-rp2040-a4988-stepper-controller.circuit-schematic.snap.svg b/sample-boards/__snapshots__/xiao-rp2040-a4988-stepper-controller.circuit-schematic.snap.svg
index 601d64c..0f5c2c2 100644
--- a/sample-boards/__snapshots__/xiao-rp2040-a4988-stepper-controller.circuit-schematic.snap.svg
+++ b/sample-boards/__snapshots__/xiao-rp2040-a4988-stepper-controller.circuit-schematic.snap.svg
@@ -9,14 +9,7 @@
.port-label { fill: rgb(0, 100, 100); }
.component-name { fill: rgb(0, 100, 100); }
- 102010428Seeed Studio XIAO RP204015V2D03D14D25D36D47D58D69D710D811D912D10133V314GND2980Pololu A4988 Stepper Motor Driver Carrier1ENABLE2VMOT3GND_MOTOR42B52A61A71B8VDD9GND_LOGIC10DIR11STEP12SLEEP13RESET14MS315MS216MS1MOTOR_POWER1VMOT2GNDSTEPPER_MOTOR11A21B32A42BC_VMOT100uFUSB_5V102010428Seeed Studio XIAO RP204015V2D03D14D25D36D47D58D69D710D811D912D10133V314GND2980Pololu A4988 Stepper Motor Driver Carrier1ENABLE2VMOT3GND_MOTOR42B52A61A71B8VDD9GND_LOGIC10DIR11STEP12SLEEP13RESET14MS315MS216MS1MOTOR_POWER1VMOT2GNDSTEPPER_MOTOR11A21B32A42BC_VMOT100uFUSB_5VenableLOGIC_3V3LOGIC_3V3enableLOGIC_3V3LOGIC_3V3LOGIC_3V3GNDGNDLOGIC_3V3GNDGND {
+ const circuit = new Circuit()
+ circuit.add(React.createElement(AdafruitFeatherESP32S3TFT, { name: "U1" }))
+ await circuit.renderUntilSettled()
+ expect(
+ circuit
+ .getCircuitJson()
+ .filter((element) => element.type === "source_failed_to_create_component_error"),
+ ).toHaveLength(0)
+ const pcbSvg = await circuit.getSvg({ view: "pcb" })
+ const schematicSvg = await circuit.getSvg({ view: "schematic" })
+ expect(pcbSvg).toMatchSvgSnapshot(import.meta.path, "pcb")
+ expect(schematicSvg).toMatchSvgSnapshot(import.meta.path, "schematic")
+})
diff --git a/tests/AdafruitFeatherRP2350.test.tsx b/tests/AdafruitFeatherRP2350.test.tsx
new file mode 100644
index 0000000..af1c15a
--- /dev/null
+++ b/tests/AdafruitFeatherRP2350.test.tsx
@@ -0,0 +1,20 @@
+import { expect, test } from "bun:test"
+import "bun-match-svg"
+import React from "react"
+import { Circuit } from "tscircuit"
+import { AdafruitFeatherRP2350 } from "../lib/AdafruitFeatherRP2350"
+
+test("Adafruit Feather RP2350 PCB and schematic snapshots", async () => {
+ const circuit = new Circuit()
+ circuit.add(React.createElement(AdafruitFeatherRP2350, { name: "U1" }))
+ await circuit.renderUntilSettled()
+ expect(
+ circuit
+ .getCircuitJson()
+ .filter((element) => element.type === "source_failed_to_create_component_error"),
+ ).toHaveLength(0)
+ const pcbSvg = await circuit.getSvg({ view: "pcb" })
+ const schematicSvg = await circuit.getSvg({ view: "schematic" })
+ expect(pcbSvg).toMatchSvgSnapshot(import.meta.path, "pcb")
+ expect(schematicSvg).toMatchSvgSnapshot(import.meta.path, "schematic")
+})
diff --git a/tests/AdafruitItsyBitsyESP32.test.tsx b/tests/AdafruitItsyBitsyESP32.test.tsx
new file mode 100644
index 0000000..d54f405
--- /dev/null
+++ b/tests/AdafruitItsyBitsyESP32.test.tsx
@@ -0,0 +1,20 @@
+import { expect, test } from "bun:test"
+import "bun-match-svg"
+import React from "react"
+import { Circuit } from "tscircuit"
+import { AdafruitItsyBitsyESP32 } from "../lib/AdafruitItsyBitsyESP32"
+
+test("Adafruit ItsyBitsy ESP32 PCB and schematic snapshots", async () => {
+ const circuit = new Circuit()
+ circuit.add(React.createElement(AdafruitItsyBitsyESP32, { name: "U1" }))
+ await circuit.renderUntilSettled()
+ expect(
+ circuit
+ .getCircuitJson()
+ .filter((element) => element.type === "source_failed_to_create_component_error"),
+ ).toHaveLength(0)
+ const pcbSvg = await circuit.getSvg({ view: "pcb" })
+ const schematicSvg = await circuit.getSvg({ view: "schematic" })
+ expect(pcbSvg).toMatchSvgSnapshot(import.meta.path, "pcb")
+ expect(schematicSvg).toMatchSvgSnapshot(import.meta.path, "schematic")
+})
diff --git a/tests/AdafruitItsyBitsyM0Express.test.tsx b/tests/AdafruitItsyBitsyM0Express.test.tsx
new file mode 100644
index 0000000..bf36567
--- /dev/null
+++ b/tests/AdafruitItsyBitsyM0Express.test.tsx
@@ -0,0 +1,20 @@
+import { expect, test } from "bun:test"
+import "bun-match-svg"
+import React from "react"
+import { Circuit } from "tscircuit"
+import { AdafruitItsyBitsyM0Express } from "../lib/AdafruitItsyBitsyM0Express"
+
+test("Adafruit ItsyBitsy M0 Express PCB and schematic snapshots", async () => {
+ const circuit = new Circuit()
+ circuit.add(React.createElement(AdafruitItsyBitsyM0Express, { name: "U1" }))
+ await circuit.renderUntilSettled()
+ expect(
+ circuit
+ .getCircuitJson()
+ .filter((element) => element.type === "source_failed_to_create_component_error"),
+ ).toHaveLength(0)
+ const pcbSvg = await circuit.getSvg({ view: "pcb" })
+ const schematicSvg = await circuit.getSvg({ view: "schematic" })
+ expect(pcbSvg).toMatchSvgSnapshot(import.meta.path, "pcb")
+ expect(schematicSvg).toMatchSvgSnapshot(import.meta.path, "schematic")
+})
diff --git a/tests/AdafruitItsyBitsyM4Express.test.tsx b/tests/AdafruitItsyBitsyM4Express.test.tsx
new file mode 100644
index 0000000..43659e0
--- /dev/null
+++ b/tests/AdafruitItsyBitsyM4Express.test.tsx
@@ -0,0 +1,20 @@
+import { expect, test } from "bun:test"
+import "bun-match-svg"
+import React from "react"
+import { Circuit } from "tscircuit"
+import { AdafruitItsyBitsyM4Express } from "../lib/AdafruitItsyBitsyM4Express"
+
+test("Adafruit ItsyBitsy M4 Express PCB and schematic snapshots", async () => {
+ const circuit = new Circuit()
+ circuit.add(React.createElement(AdafruitItsyBitsyM4Express, { name: "U1" }))
+ await circuit.renderUntilSettled()
+ expect(
+ circuit
+ .getCircuitJson()
+ .filter((element) => element.type === "source_failed_to_create_component_error"),
+ ).toHaveLength(0)
+ const pcbSvg = await circuit.getSvg({ view: "pcb" })
+ const schematicSvg = await circuit.getSvg({ view: "schematic" })
+ expect(pcbSvg).toMatchSvgSnapshot(import.meta.path, "pcb")
+ expect(schematicSvg).toMatchSvgSnapshot(import.meta.path, "schematic")
+})
diff --git a/tests/AdafruitItsyBitsyNRF52840Express.test.tsx b/tests/AdafruitItsyBitsyNRF52840Express.test.tsx
new file mode 100644
index 0000000..590ced1
--- /dev/null
+++ b/tests/AdafruitItsyBitsyNRF52840Express.test.tsx
@@ -0,0 +1,22 @@
+import { expect, test } from "bun:test"
+import "bun-match-svg"
+import React from "react"
+import { Circuit } from "tscircuit"
+import { AdafruitItsyBitsyNRF52840Express } from "../lib/AdafruitItsyBitsyNRF52840Express"
+
+test("Adafruit ItsyBitsy nRF52840 Express PCB and schematic snapshots", async () => {
+ const circuit = new Circuit()
+ circuit.add(
+ React.createElement(AdafruitItsyBitsyNRF52840Express, { name: "U1" }),
+ )
+ await circuit.renderUntilSettled()
+ expect(
+ circuit
+ .getCircuitJson()
+ .filter((element) => element.type === "source_failed_to_create_component_error"),
+ ).toHaveLength(0)
+ const pcbSvg = await circuit.getSvg({ view: "pcb" })
+ const schematicSvg = await circuit.getSvg({ view: "schematic" })
+ expect(pcbSvg).toMatchSvgSnapshot(import.meta.path, "pcb")
+ expect(schematicSvg).toMatchSvgSnapshot(import.meta.path, "schematic")
+})
diff --git a/tests/AdafruitItsyBitsyRP2040.test.tsx b/tests/AdafruitItsyBitsyRP2040.test.tsx
new file mode 100644
index 0000000..eb03b34
--- /dev/null
+++ b/tests/AdafruitItsyBitsyRP2040.test.tsx
@@ -0,0 +1,20 @@
+import { expect, test } from "bun:test"
+import "bun-match-svg"
+import React from "react"
+import { Circuit } from "tscircuit"
+import { AdafruitItsyBitsyRP2040 } from "../lib/AdafruitItsyBitsyRP2040"
+
+test("Adafruit ItsyBitsy RP2040 PCB and schematic snapshots", async () => {
+ const circuit = new Circuit()
+ circuit.add(React.createElement(AdafruitItsyBitsyRP2040, { name: "U1" }))
+ await circuit.renderUntilSettled()
+ expect(
+ circuit
+ .getCircuitJson()
+ .filter((element) => element.type === "source_failed_to_create_component_error"),
+ ).toHaveLength(0)
+ const pcbSvg = await circuit.getSvg({ view: "pcb" })
+ const schematicSvg = await circuit.getSvg({ view: "schematic" })
+ expect(pcbSvg).toMatchSvgSnapshot(import.meta.path, "pcb")
+ expect(schematicSvg).toMatchSvgSnapshot(import.meta.path, "schematic")
+})
diff --git a/tests/AdafruitQTPyESP32S2.test.tsx b/tests/AdafruitQTPyESP32S2.test.tsx
new file mode 100644
index 0000000..c416570
--- /dev/null
+++ b/tests/AdafruitQTPyESP32S2.test.tsx
@@ -0,0 +1,20 @@
+import { expect, test } from "bun:test"
+import "bun-match-svg"
+import React from "react"
+import { Circuit } from "tscircuit"
+import { AdafruitQTPyESP32S2 } from "../lib/AdafruitQTPyESP32S2"
+
+test("Adafruit QT Py ESP32-S2 PCB and schematic snapshots", async () => {
+ const circuit = new Circuit()
+ circuit.add(React.createElement(AdafruitQTPyESP32S2, { name: "U1" }))
+ await circuit.renderUntilSettled()
+ expect(
+ circuit
+ .getCircuitJson()
+ .filter((element) => element.type === "source_failed_to_create_component_error"),
+ ).toHaveLength(0)
+ const pcbSvg = await circuit.getSvg({ view: "pcb" })
+ const schematicSvg = await circuit.getSvg({ view: "schematic" })
+ expect(pcbSvg).toMatchSvgSnapshot(import.meta.path, "pcb")
+ expect(schematicSvg).toMatchSvgSnapshot(import.meta.path, "schematic")
+})
diff --git a/tests/AdafruitQTPyESP32S3.test.tsx b/tests/AdafruitQTPyESP32S3.test.tsx
new file mode 100644
index 0000000..085333f
--- /dev/null
+++ b/tests/AdafruitQTPyESP32S3.test.tsx
@@ -0,0 +1,20 @@
+import { expect, test } from "bun:test"
+import "bun-match-svg"
+import React from "react"
+import { Circuit } from "tscircuit"
+import { AdafruitQTPyESP32S3 } from "../lib/AdafruitQTPyESP32S3"
+
+test("Adafruit QT Py ESP32-S3 PCB and schematic snapshots", async () => {
+ const circuit = new Circuit()
+ circuit.add(React.createElement(AdafruitQTPyESP32S3, { name: "U1" }))
+ await circuit.renderUntilSettled()
+ expect(
+ circuit
+ .getCircuitJson()
+ .filter((element) => element.type === "source_failed_to_create_component_error"),
+ ).toHaveLength(0)
+ const pcbSvg = await circuit.getSvg({ view: "pcb" })
+ const schematicSvg = await circuit.getSvg({ view: "schematic" })
+ expect(pcbSvg).toMatchSvgSnapshot(import.meta.path, "pcb")
+ expect(schematicSvg).toMatchSvgSnapshot(import.meta.path, "schematic")
+})
diff --git a/tests/AdafruitQTPyNRF52840.test.tsx b/tests/AdafruitQTPyNRF52840.test.tsx
new file mode 100644
index 0000000..092344b
--- /dev/null
+++ b/tests/AdafruitQTPyNRF52840.test.tsx
@@ -0,0 +1,20 @@
+import { expect, test } from "bun:test"
+import "bun-match-svg"
+import React from "react"
+import { Circuit } from "tscircuit"
+import { AdafruitQTPyNRF52840 } from "../lib/AdafruitQTPyNRF52840"
+
+test("Adafruit QT Py nRF52840 PCB and schematic snapshots", async () => {
+ const circuit = new Circuit()
+ circuit.add(React.createElement(AdafruitQTPyNRF52840, { name: "U1" }))
+ await circuit.renderUntilSettled()
+ expect(
+ circuit
+ .getCircuitJson()
+ .filter((element) => element.type === "source_failed_to_create_component_error"),
+ ).toHaveLength(0)
+ const pcbSvg = await circuit.getSvg({ view: "pcb" })
+ const schematicSvg = await circuit.getSvg({ view: "schematic" })
+ expect(pcbSvg).toMatchSvgSnapshot(import.meta.path, "pcb")
+ expect(schematicSvg).toMatchSvgSnapshot(import.meta.path, "schematic")
+})
diff --git a/tests/AdafruitQTPyRP2350.test.tsx b/tests/AdafruitQTPyRP2350.test.tsx
new file mode 100644
index 0000000..9d93671
--- /dev/null
+++ b/tests/AdafruitQTPyRP2350.test.tsx
@@ -0,0 +1,20 @@
+import { expect, test } from "bun:test"
+import "bun-match-svg"
+import React from "react"
+import { Circuit } from "tscircuit"
+import { AdafruitQTPyRP2350 } from "../lib/AdafruitQTPyRP2350"
+
+test("Adafruit QT Py RP2350 PCB and schematic snapshots", async () => {
+ const circuit = new Circuit()
+ circuit.add(React.createElement(AdafruitQTPyRP2350, { name: "U1" }))
+ await circuit.renderUntilSettled()
+ expect(
+ circuit
+ .getCircuitJson()
+ .filter((element) => element.type === "source_failed_to_create_component_error"),
+ ).toHaveLength(0)
+ const pcbSvg = await circuit.getSvg({ view: "pcb" })
+ const schematicSvg = await circuit.getSvg({ view: "schematic" })
+ expect(pcbSvg).toMatchSvgSnapshot(import.meta.path, "pcb")
+ expect(schematicSvg).toMatchSvgSnapshot(import.meta.path, "schematic")
+})
diff --git a/tests/AdafruitQTPySAMD21.test.tsx b/tests/AdafruitQTPySAMD21.test.tsx
new file mode 100644
index 0000000..b9a24dd
--- /dev/null
+++ b/tests/AdafruitQTPySAMD21.test.tsx
@@ -0,0 +1,20 @@
+import { expect, test } from "bun:test"
+import "bun-match-svg"
+import React from "react"
+import { Circuit } from "tscircuit"
+import { AdafruitQTPySAMD21 } from "../lib/AdafruitQTPySAMD21"
+
+test("Adafruit QT Py SAMD21 PCB and schematic snapshots", async () => {
+ const circuit = new Circuit()
+ circuit.add(React.createElement(AdafruitQTPySAMD21, { name: "U1" }))
+ await circuit.renderUntilSettled()
+ expect(
+ circuit
+ .getCircuitJson()
+ .filter((element) => element.type === "source_failed_to_create_component_error"),
+ ).toHaveLength(0)
+ const pcbSvg = await circuit.getSvg({ view: "pcb" })
+ const schematicSvg = await circuit.getSvg({ view: "schematic" })
+ expect(pcbSvg).toMatchSvgSnapshot(import.meta.path, "pcb")
+ expect(schematicSvg).toMatchSvgSnapshot(import.meta.path, "schematic")
+})
diff --git a/tests/ArduinoNano33BLE.test.tsx b/tests/ArduinoNano33BLE.test.tsx
new file mode 100644
index 0000000..aa1d5ec
--- /dev/null
+++ b/tests/ArduinoNano33BLE.test.tsx
@@ -0,0 +1,20 @@
+import { expect, test } from "bun:test"
+import "bun-match-svg"
+import React from "react"
+import { Circuit } from "tscircuit"
+import { ArduinoNano33BLE } from "../lib/ArduinoNano33BLE"
+
+test("Arduino Nano 33 BLE PCB and schematic snapshots", async () => {
+ const circuit = new Circuit()
+ circuit.add(React.createElement(ArduinoNano33BLE, { name: "U1" }))
+ await circuit.renderUntilSettled()
+ expect(
+ circuit
+ .getCircuitJson()
+ .filter((element) => element.type === "source_failed_to_create_component_error"),
+ ).toHaveLength(0)
+ const pcbSvg = await circuit.getSvg({ view: "pcb" })
+ const schematicSvg = await circuit.getSvg({ view: "schematic" })
+ expect(pcbSvg).toMatchSvgSnapshot(import.meta.path, "pcb")
+ expect(schematicSvg).toMatchSvgSnapshot(import.meta.path, "schematic")
+})
diff --git a/tests/ArduinoNano33BLESenseRev2.test.tsx b/tests/ArduinoNano33BLESenseRev2.test.tsx
new file mode 100644
index 0000000..769c1f6
--- /dev/null
+++ b/tests/ArduinoNano33BLESenseRev2.test.tsx
@@ -0,0 +1,20 @@
+import { expect, test } from "bun:test"
+import "bun-match-svg"
+import React from "react"
+import { Circuit } from "tscircuit"
+import { ArduinoNano33BLESenseRev2 } from "../lib/ArduinoNano33BLESenseRev2"
+
+test("Arduino Nano 33 BLE Sense Rev2 PCB and schematic snapshots", async () => {
+ const circuit = new Circuit()
+ circuit.add(React.createElement(ArduinoNano33BLESenseRev2, { name: "U1" }))
+ await circuit.renderUntilSettled()
+ expect(
+ circuit
+ .getCircuitJson()
+ .filter((element) => element.type === "source_failed_to_create_component_error"),
+ ).toHaveLength(0)
+ const pcbSvg = await circuit.getSvg({ view: "pcb" })
+ const schematicSvg = await circuit.getSvg({ view: "schematic" })
+ expect(pcbSvg).toMatchSvgSnapshot(import.meta.path, "pcb")
+ expect(schematicSvg).toMatchSvgSnapshot(import.meta.path, "schematic")
+})
diff --git a/tests/ArduinoNano33IoT.test.tsx b/tests/ArduinoNano33IoT.test.tsx
new file mode 100644
index 0000000..c87ee1c
--- /dev/null
+++ b/tests/ArduinoNano33IoT.test.tsx
@@ -0,0 +1,20 @@
+import { expect, test } from "bun:test"
+import "bun-match-svg"
+import React from "react"
+import { Circuit } from "tscircuit"
+import { ArduinoNano33IoT } from "../lib/ArduinoNano33IoT"
+
+test("Arduino Nano 33 IoT PCB and schematic snapshots", async () => {
+ const circuit = new Circuit()
+ circuit.add(React.createElement(ArduinoNano33IoT, { name: "U1" }))
+ await circuit.renderUntilSettled()
+ expect(
+ circuit
+ .getCircuitJson()
+ .filter((element) => element.type === "source_failed_to_create_component_error"),
+ ).toHaveLength(0)
+ const pcbSvg = await circuit.getSvg({ view: "pcb" })
+ const schematicSvg = await circuit.getSvg({ view: "schematic" })
+ expect(pcbSvg).toMatchSvgSnapshot(import.meta.path, "pcb")
+ expect(schematicSvg).toMatchSvgSnapshot(import.meta.path, "schematic")
+})
diff --git a/tests/ArduinoNanoATmega328P.test.tsx b/tests/ArduinoNanoATmega328P.test.tsx
new file mode 100644
index 0000000..f3fce4c
--- /dev/null
+++ b/tests/ArduinoNanoATmega328P.test.tsx
@@ -0,0 +1,20 @@
+import { expect, test } from "bun:test"
+import "bun-match-svg"
+import React from "react"
+import { Circuit } from "tscircuit"
+import { ArduinoNanoATmega328P } from "../lib/ArduinoNanoATmega328P"
+
+test("Arduino Nano ATmega328P PCB and schematic snapshots", async () => {
+ const circuit = new Circuit()
+ circuit.add(React.createElement(ArduinoNanoATmega328P, { name: "U1" }))
+ await circuit.renderUntilSettled()
+ expect(
+ circuit
+ .getCircuitJson()
+ .filter((element) => element.type === "source_failed_to_create_component_error"),
+ ).toHaveLength(0)
+ const pcbSvg = await circuit.getSvg({ view: "pcb" })
+ const schematicSvg = await circuit.getSvg({ view: "schematic" })
+ expect(pcbSvg).toMatchSvgSnapshot(import.meta.path, "pcb")
+ expect(schematicSvg).toMatchSvgSnapshot(import.meta.path, "schematic")
+})
diff --git a/tests/ArduinoNanoESP32.test.tsx b/tests/ArduinoNanoESP32.test.tsx
new file mode 100644
index 0000000..1ae9953
--- /dev/null
+++ b/tests/ArduinoNanoESP32.test.tsx
@@ -0,0 +1,20 @@
+import { expect, test } from "bun:test"
+import "bun-match-svg"
+import React from "react"
+import { Circuit } from "tscircuit"
+import { ArduinoNanoESP32 } from "../lib/ArduinoNanoESP32"
+
+test("Arduino Nano ESP32 PCB and schematic snapshots", async () => {
+ const circuit = new Circuit()
+ circuit.add(React.createElement(ArduinoNanoESP32, { name: "U1" }))
+ await circuit.renderUntilSettled()
+ expect(
+ circuit
+ .getCircuitJson()
+ .filter((element) => element.type === "source_failed_to_create_component_error"),
+ ).toHaveLength(0)
+ const pcbSvg = await circuit.getSvg({ view: "pcb" })
+ const schematicSvg = await circuit.getSvg({ view: "schematic" })
+ expect(pcbSvg).toMatchSvgSnapshot(import.meta.path, "pcb")
+ expect(schematicSvg).toMatchSvgSnapshot(import.meta.path, "schematic")
+})
diff --git a/tests/ArduinoNanoEvery.test.tsx b/tests/ArduinoNanoEvery.test.tsx
new file mode 100644
index 0000000..88fe584
--- /dev/null
+++ b/tests/ArduinoNanoEvery.test.tsx
@@ -0,0 +1,20 @@
+import { expect, test } from "bun:test"
+import "bun-match-svg"
+import React from "react"
+import { Circuit } from "tscircuit"
+import { ArduinoNanoEvery } from "../lib/ArduinoNanoEvery"
+
+test("Arduino Nano Every PCB and schematic snapshots", async () => {
+ const circuit = new Circuit()
+ circuit.add(React.createElement(ArduinoNanoEvery, { name: "U1" }))
+ await circuit.renderUntilSettled()
+ expect(
+ circuit
+ .getCircuitJson()
+ .filter((element) => element.type === "source_failed_to_create_component_error"),
+ ).toHaveLength(0)
+ const pcbSvg = await circuit.getSvg({ view: "pcb" })
+ const schematicSvg = await circuit.getSvg({ view: "schematic" })
+ expect(pcbSvg).toMatchSvgSnapshot(import.meta.path, "pcb")
+ expect(schematicSvg).toMatchSvgSnapshot(import.meta.path, "schematic")
+})
diff --git a/tests/ArduinoNanoMatter.test.tsx b/tests/ArduinoNanoMatter.test.tsx
new file mode 100644
index 0000000..411ab09
--- /dev/null
+++ b/tests/ArduinoNanoMatter.test.tsx
@@ -0,0 +1,20 @@
+import { expect, test } from "bun:test"
+import "bun-match-svg"
+import React from "react"
+import { Circuit } from "tscircuit"
+import { ArduinoNanoMatter } from "../lib/ArduinoNanoMatter"
+
+test("Arduino Nano Matter PCB and schematic snapshots", async () => {
+ const circuit = new Circuit()
+ circuit.add(React.createElement(ArduinoNanoMatter, { name: "U1" }))
+ await circuit.renderUntilSettled()
+ expect(
+ circuit
+ .getCircuitJson()
+ .filter((element) => element.type === "source_failed_to_create_component_error"),
+ ).toHaveLength(0)
+ const pcbSvg = await circuit.getSvg({ view: "pcb" })
+ const schematicSvg = await circuit.getSvg({ view: "schematic" })
+ expect(pcbSvg).toMatchSvgSnapshot(import.meta.path, "pcb")
+ expect(schematicSvg).toMatchSvgSnapshot(import.meta.path, "schematic")
+})
diff --git a/tests/ArduinoNanoRP2040Connect.test.tsx b/tests/ArduinoNanoRP2040Connect.test.tsx
new file mode 100644
index 0000000..17247b9
--- /dev/null
+++ b/tests/ArduinoNanoRP2040Connect.test.tsx
@@ -0,0 +1,20 @@
+import { expect, test } from "bun:test"
+import "bun-match-svg"
+import React from "react"
+import { Circuit } from "tscircuit"
+import { ArduinoNanoRP2040Connect } from "../lib/ArduinoNanoRP2040Connect"
+
+test("Arduino Nano RP2040 Connect PCB and schematic snapshots", async () => {
+ const circuit = new Circuit()
+ circuit.add(React.createElement(ArduinoNanoRP2040Connect, { name: "U1" }))
+ await circuit.renderUntilSettled()
+ expect(
+ circuit
+ .getCircuitJson()
+ .filter((element) => element.type === "source_failed_to_create_component_error"),
+ ).toHaveLength(0)
+ const pcbSvg = await circuit.getSvg({ view: "pcb" })
+ const schematicSvg = await circuit.getSvg({ view: "schematic" })
+ expect(pcbSvg).toMatchSvgSnapshot(import.meta.path, "pcb")
+ expect(schematicSvg).toMatchSvgSnapshot(import.meta.path, "schematic")
+})
diff --git a/tests/__snapshots__/AdafruitFeatherESP32S3TFT-pcb.snap.svg b/tests/__snapshots__/AdafruitFeatherESP32S3TFT-pcb.snap.svg
new file mode 100644
index 0000000..87a8c43
--- /dev/null
+++ b/tests/__snapshots__/AdafruitFeatherESP32S3TFT-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/AdafruitFeatherESP32S3TFT-schematic.snap.svg b/tests/__snapshots__/AdafruitFeatherESP32S3TFT-schematic.snap.svg
new file mode 100644
index 0000000..59ab60b
--- /dev/null
+++ b/tests/__snapshots__/AdafruitFeatherESP32S3TFT-schematic.snap.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/AdafruitFeatherRP2350-pcb.snap.svg b/tests/__snapshots__/AdafruitFeatherRP2350-pcb.snap.svg
new file mode 100644
index 0000000..ff927ca
--- /dev/null
+++ b/tests/__snapshots__/AdafruitFeatherRP2350-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/AdafruitFeatherRP2350-schematic.snap.svg b/tests/__snapshots__/AdafruitFeatherRP2350-schematic.snap.svg
new file mode 100644
index 0000000..41fc79c
--- /dev/null
+++ b/tests/__snapshots__/AdafruitFeatherRP2350-schematic.snap.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/AdafruitItsyBitsyESP32-pcb.snap.svg b/tests/__snapshots__/AdafruitItsyBitsyESP32-pcb.snap.svg
new file mode 100644
index 0000000..683b573
--- /dev/null
+++ b/tests/__snapshots__/AdafruitItsyBitsyESP32-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/AdafruitItsyBitsyESP32-schematic.snap.svg b/tests/__snapshots__/AdafruitItsyBitsyESP32-schematic.snap.svg
new file mode 100644
index 0000000..2780a40
--- /dev/null
+++ b/tests/__snapshots__/AdafruitItsyBitsyESP32-schematic.snap.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/AdafruitItsyBitsyM0Express-pcb.snap.svg b/tests/__snapshots__/AdafruitItsyBitsyM0Express-pcb.snap.svg
new file mode 100644
index 0000000..0f89d98
--- /dev/null
+++ b/tests/__snapshots__/AdafruitItsyBitsyM0Express-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/AdafruitItsyBitsyM0Express-schematic.snap.svg b/tests/__snapshots__/AdafruitItsyBitsyM0Express-schematic.snap.svg
new file mode 100644
index 0000000..acc7726
--- /dev/null
+++ b/tests/__snapshots__/AdafruitItsyBitsyM0Express-schematic.snap.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/AdafruitItsyBitsyM4Express-pcb.snap.svg b/tests/__snapshots__/AdafruitItsyBitsyM4Express-pcb.snap.svg
new file mode 100644
index 0000000..0108631
--- /dev/null
+++ b/tests/__snapshots__/AdafruitItsyBitsyM4Express-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/AdafruitItsyBitsyM4Express-schematic.snap.svg b/tests/__snapshots__/AdafruitItsyBitsyM4Express-schematic.snap.svg
new file mode 100644
index 0000000..210e656
--- /dev/null
+++ b/tests/__snapshots__/AdafruitItsyBitsyM4Express-schematic.snap.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/AdafruitItsyBitsyNRF52840Express-pcb.snap.svg b/tests/__snapshots__/AdafruitItsyBitsyNRF52840Express-pcb.snap.svg
new file mode 100644
index 0000000..ea5e662
--- /dev/null
+++ b/tests/__snapshots__/AdafruitItsyBitsyNRF52840Express-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/AdafruitItsyBitsyNRF52840Express-schematic.snap.svg b/tests/__snapshots__/AdafruitItsyBitsyNRF52840Express-schematic.snap.svg
new file mode 100644
index 0000000..be7fab4
--- /dev/null
+++ b/tests/__snapshots__/AdafruitItsyBitsyNRF52840Express-schematic.snap.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/AdafruitItsyBitsyRP2040-pcb.snap.svg b/tests/__snapshots__/AdafruitItsyBitsyRP2040-pcb.snap.svg
new file mode 100644
index 0000000..f661eeb
--- /dev/null
+++ b/tests/__snapshots__/AdafruitItsyBitsyRP2040-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/AdafruitItsyBitsyRP2040-schematic.snap.svg b/tests/__snapshots__/AdafruitItsyBitsyRP2040-schematic.snap.svg
new file mode 100644
index 0000000..5896ffb
--- /dev/null
+++ b/tests/__snapshots__/AdafruitItsyBitsyRP2040-schematic.snap.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/AdafruitQTPyESP32S2-pcb.snap.svg b/tests/__snapshots__/AdafruitQTPyESP32S2-pcb.snap.svg
new file mode 100644
index 0000000..027a7b6
--- /dev/null
+++ b/tests/__snapshots__/AdafruitQTPyESP32S2-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/AdafruitQTPyESP32S2-schematic.snap.svg b/tests/__snapshots__/AdafruitQTPyESP32S2-schematic.snap.svg
new file mode 100644
index 0000000..826dc15
--- /dev/null
+++ b/tests/__snapshots__/AdafruitQTPyESP32S2-schematic.snap.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/AdafruitQTPyESP32S3-pcb.snap.svg b/tests/__snapshots__/AdafruitQTPyESP32S3-pcb.snap.svg
new file mode 100644
index 0000000..f22926a
--- /dev/null
+++ b/tests/__snapshots__/AdafruitQTPyESP32S3-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/AdafruitQTPyESP32S3-schematic.snap.svg b/tests/__snapshots__/AdafruitQTPyESP32S3-schematic.snap.svg
new file mode 100644
index 0000000..5a4d682
--- /dev/null
+++ b/tests/__snapshots__/AdafruitQTPyESP32S3-schematic.snap.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/AdafruitQTPyNRF52840-pcb.snap.svg b/tests/__snapshots__/AdafruitQTPyNRF52840-pcb.snap.svg
new file mode 100644
index 0000000..02dbb3d
--- /dev/null
+++ b/tests/__snapshots__/AdafruitQTPyNRF52840-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/AdafruitQTPyNRF52840-schematic.snap.svg b/tests/__snapshots__/AdafruitQTPyNRF52840-schematic.snap.svg
new file mode 100644
index 0000000..b206cf5
--- /dev/null
+++ b/tests/__snapshots__/AdafruitQTPyNRF52840-schematic.snap.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/AdafruitQTPyRP2350-pcb.snap.svg b/tests/__snapshots__/AdafruitQTPyRP2350-pcb.snap.svg
new file mode 100644
index 0000000..214904d
--- /dev/null
+++ b/tests/__snapshots__/AdafruitQTPyRP2350-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/AdafruitQTPyRP2350-schematic.snap.svg b/tests/__snapshots__/AdafruitQTPyRP2350-schematic.snap.svg
new file mode 100644
index 0000000..638cb86
--- /dev/null
+++ b/tests/__snapshots__/AdafruitQTPyRP2350-schematic.snap.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/AdafruitQTPySAMD21-pcb.snap.svg b/tests/__snapshots__/AdafruitQTPySAMD21-pcb.snap.svg
new file mode 100644
index 0000000..4d60eb7
--- /dev/null
+++ b/tests/__snapshots__/AdafruitQTPySAMD21-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/AdafruitQTPySAMD21-schematic.snap.svg b/tests/__snapshots__/AdafruitQTPySAMD21-schematic.snap.svg
new file mode 100644
index 0000000..9c3a68d
--- /dev/null
+++ b/tests/__snapshots__/AdafruitQTPySAMD21-schematic.snap.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/ArduinoNano33BLE-pcb.snap.svg b/tests/__snapshots__/ArduinoNano33BLE-pcb.snap.svg
new file mode 100644
index 0000000..ee7f762
--- /dev/null
+++ b/tests/__snapshots__/ArduinoNano33BLE-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/ArduinoNano33BLE-schematic.snap.svg b/tests/__snapshots__/ArduinoNano33BLE-schematic.snap.svg
new file mode 100644
index 0000000..ff4a18a
--- /dev/null
+++ b/tests/__snapshots__/ArduinoNano33BLE-schematic.snap.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/ArduinoNano33BLESenseRev2-pcb.snap.svg b/tests/__snapshots__/ArduinoNano33BLESenseRev2-pcb.snap.svg
new file mode 100644
index 0000000..13a3ea9
--- /dev/null
+++ b/tests/__snapshots__/ArduinoNano33BLESenseRev2-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/ArduinoNano33BLESenseRev2-schematic.snap.svg b/tests/__snapshots__/ArduinoNano33BLESenseRev2-schematic.snap.svg
new file mode 100644
index 0000000..2e09b60
--- /dev/null
+++ b/tests/__snapshots__/ArduinoNano33BLESenseRev2-schematic.snap.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/ArduinoNano33IoT-pcb.snap.svg b/tests/__snapshots__/ArduinoNano33IoT-pcb.snap.svg
new file mode 100644
index 0000000..173512e
--- /dev/null
+++ b/tests/__snapshots__/ArduinoNano33IoT-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/ArduinoNano33IoT-schematic.snap.svg b/tests/__snapshots__/ArduinoNano33IoT-schematic.snap.svg
new file mode 100644
index 0000000..024f3bf
--- /dev/null
+++ b/tests/__snapshots__/ArduinoNano33IoT-schematic.snap.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/ArduinoNanoATmega328P-pcb.snap.svg b/tests/__snapshots__/ArduinoNanoATmega328P-pcb.snap.svg
new file mode 100644
index 0000000..64c3caf
--- /dev/null
+++ b/tests/__snapshots__/ArduinoNanoATmega328P-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/ArduinoNanoATmega328P-schematic.snap.svg b/tests/__snapshots__/ArduinoNanoATmega328P-schematic.snap.svg
new file mode 100644
index 0000000..e48914e
--- /dev/null
+++ b/tests/__snapshots__/ArduinoNanoATmega328P-schematic.snap.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/ArduinoNanoESP32-pcb.snap.svg b/tests/__snapshots__/ArduinoNanoESP32-pcb.snap.svg
new file mode 100644
index 0000000..5d12c90
--- /dev/null
+++ b/tests/__snapshots__/ArduinoNanoESP32-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/ArduinoNanoESP32-schematic.snap.svg b/tests/__snapshots__/ArduinoNanoESP32-schematic.snap.svg
new file mode 100644
index 0000000..d570b38
--- /dev/null
+++ b/tests/__snapshots__/ArduinoNanoESP32-schematic.snap.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/ArduinoNanoEvery-pcb.snap.svg b/tests/__snapshots__/ArduinoNanoEvery-pcb.snap.svg
new file mode 100644
index 0000000..ab71f01
--- /dev/null
+++ b/tests/__snapshots__/ArduinoNanoEvery-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/ArduinoNanoEvery-schematic.snap.svg b/tests/__snapshots__/ArduinoNanoEvery-schematic.snap.svg
new file mode 100644
index 0000000..9ef4678
--- /dev/null
+++ b/tests/__snapshots__/ArduinoNanoEvery-schematic.snap.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/ArduinoNanoMatter-pcb.snap.svg b/tests/__snapshots__/ArduinoNanoMatter-pcb.snap.svg
new file mode 100644
index 0000000..83669d1
--- /dev/null
+++ b/tests/__snapshots__/ArduinoNanoMatter-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/ArduinoNanoMatter-schematic.snap.svg b/tests/__snapshots__/ArduinoNanoMatter-schematic.snap.svg
new file mode 100644
index 0000000..f3de1d1
--- /dev/null
+++ b/tests/__snapshots__/ArduinoNanoMatter-schematic.snap.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/ArduinoNanoRP2040Connect-pcb.snap.svg b/tests/__snapshots__/ArduinoNanoRP2040Connect-pcb.snap.svg
new file mode 100644
index 0000000..e2fe5bc
--- /dev/null
+++ b/tests/__snapshots__/ArduinoNanoRP2040Connect-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/__snapshots__/ArduinoNanoRP2040Connect-schematic.snap.svg b/tests/__snapshots__/ArduinoNanoRP2040Connect-schematic.snap.svg
new file mode 100644
index 0000000..0c51efd
--- /dev/null
+++ b/tests/__snapshots__/ArduinoNanoRP2040Connect-schematic.snap.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/tests/footprints.test.ts b/tests/footprints.test.ts
index ee174c2..0d6f654 100644
--- a/tests/footprints.test.ts
+++ b/tests/footprints.test.ts
@@ -104,6 +104,26 @@ test("Seeed XIAO RP2040 is a 2x7 female header footprint", () => {
])
})
+test("header modules include a silkscreen pin-one arrow", () => {
+ const arrow = fp
+ .string(SEEED_XIAO_RP2040_FOOTPRINT)
+ .circuitJson()
+ .find(
+ (element) =>
+ element.type === "pcb_silkscreen_path" &&
+ element.pcb_silkscreen_path_id === "pin_marker_1",
+ )
+
+ expect(arrow).toMatchObject({
+ pcb_component_id: "pin_marker_1",
+ layer: "top",
+ })
+ if (arrow?.type === "pcb_silkscreen_path") {
+ expect(arrow.route[0]).toMatchObject({ x: -8.57, y: 7.62 })
+ expect(arrow.route[3]).toMatchObject({ x: -8.57, y: 7.62 })
+ }
+})
+
test("Pololu A4988 carrier is a 2x8 female header footprint", () => {
const footprint = fp.string(
POLOLU_A4988_STEPPER_MOTOR_DRIVER_CARRIER_FOOTPRINT,