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 @@ +BATENUSBD13D12D11D10D9D6D5SCLSDARST3V33V3_AREFGNDA0A1A2A3D24D25SCKMOSIMISORXTXD4FEATHER RP20405VD0D1D2D3D4D5D6D7D8D9D103V3GNDXIAO RP2040 \ 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 @@ +4884Adafruit Feather RP20401BAT2EN3USB4D135D126D117D108D99D610D511SCL12SDA13RST143V3153V3_AREF16GND17A018A119A220A321D2422D2523SCK24MOSI25MISO26RX27TX28D4102010428Seeed Studio XIAO RP204015V2D03D14D25D36D47D58D69D710D811D912D10133V314GNDFEATHER_VBUSGNDXIAO_VBUS \ 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 @@ -U_MCUU_DRIVERVMOTGNDMOTOR_POWER1A1B2A2BSTEPPER_MOTORC_VMOTVMOT: 8–35V — never connect to XIAO VIN \ No newline at end of file +5VD0D1D2D3D4D5D6D7D8D9D103V3GNDXIAO RP2040ENABLEVMOTGND_MOTOR2B2A1A1BVDDGND_LOGICDIRSTEPSLEEPRESETMS3MS2MS1A4988 DRIVERVMOTGNDMOTOR_POWER1A1B2A2BSTEPPER_MOTORC_VMOTVMOT: 8–35V — never connect to XIAO VIN \ 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 @@ +VBATENVBUSD13D12D11D10D9D6D5SCLSDARESET3V33V3_2GNDA0A1A2A3A4A5SCKMOSIMISORXTXTXD0FEATHER S3 TFT \ 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 @@ +5483Adafruit Feather ESP32-S3 TFT1VBAT2EN3VBUS4D135D126D117D108D99D610D511SCL12SDA13RESET143V3153V3_216GND17A018A119A220A321A422A523SCK24MOSI25MISO26RX27TX28TXD0 \ 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 @@ +VBATENVBUSD7D4D11D10D9D6D5SCLSDARESET3V33V3_2GNDA0A1A2A3D24D25SCKMOSIMISORXTXPSRAM_CSFEATHER RP2350 \ 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 @@ +6000Adafruit Feather RP23501VBAT2EN3VBUS4D75D46D117D108D99D610D511SCL12SDA13RESET143V3153V3_216GND17A018A119A220A321D2422D2523SCK24MOSI25MISO26RX27TX28PSRAM_CS \ 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 @@ +VBATGNDVBUSD13D12D14D33D32D7D5SCLSDATXRXGND_2MISOMOSISCKA5A4A3A2A1A0VHIEN3V3RESETITSY ESP32 \ 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 @@ +5889Adafruit ItsyBitsy ESP321VBAT2GND3VBUS4D135D126D147D338D329D710D511SCL12SDA13TX14RX15GND_216MISO17MOSI18SCK19A520A421A322A223A124A025VHI26EN273V328RESET \ 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 @@ +VBATGNDVBUSD13D12D11D10D9D7D5SCLSDATXRXD2MISOMOSISCKA5A4A3A2A1A0VHIEN3V3RESETITSY M0 \ 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 @@ +3727Adafruit ItsyBitsy M0 Express1VBAT2GND3VBUS4D135D126D117D108D99D710D511SCL12SDA13TX14RX15D216MISO17MOSI18SCK19A520A421A322A223A124A025VHI26EN273V328RESET \ 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 @@ +VBATGNDVBUSD13D12D11D10D9D7D5SCLSDATX_D1RX_D0D2MISOMOSISCKA5A4A3A2A1A0VHIAREFV3_3RESETITSY M4 \ 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 @@ +3800Adafruit ItsyBitsy M4 Express1VBAT2GND3VBUS4D135D126D117D108D99D710D511SCL12SDA13TX_D114RX_D015D216MISO17MOSI18SCK19A520A421A322A223A124A025VHI26AREF27V3_328RESET \ 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 @@ +VBATGNDVBUSD13D12D11D10D9D7D5SCLSDATX_D1RX_D0D2MISOMOSISCKA5A4A3A2A1A0VHIEN3V3RESETITSY NRF52840 \ 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 @@ +4481Adafruit ItsyBitsy nRF52840 Express1VBAT2GND3VBUS4D135D126D117D108D99D710D511SCL12SDA13TX_D114RX_D015D216MISO17MOSI18SCK19A520A421A322A223A124A025VHI26EN273V328RESET \ 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 @@ +VBATGNDVBUSD13D12D11D10D9D7D5SCLSDATXRXD2MISOMOSISCKD25D24A3A2A1A0VHIV3_3V3_3_2RESETITSY RP2040 \ 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 @@ +4888Adafruit ItsyBitsy RP20401VBAT2GND3VBUS4D135D126D117D108D99D710D511SCL12SDA13TX14RX15D216MISO17MOSI18SCK19D2520D2421A322A223A124A025VHI26V3_327V3_3_228RESET \ 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 @@ +A0A1A2A3SDASCLTXRXSCKMISOMOSIV3_3GNDV5QT PY ESP32-S2 \ 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 @@ +5325Adafruit QT Py ESP32-S21A02A13A24A35SDA6SCL7TX8RX9SCK10MISO11MOSI12V3_313GND14V5 \ 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 @@ +A0A1A2A3SDASCLTXRXSCKMISOMOSIV3_3GNDV5QT PY ESP32-S3 \ 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 @@ +5426Adafruit QT Py ESP32-S31A02A13A24A35SDA6SCL7TX8RX9SCK10MISO11MOSI12V3_313GND14V5 \ 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 @@ +A0A1A2A3SDASCLTX_A6RX_A7SCKMISOMOSIV3_3GNDV5QT PY NRF52840 \ 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 @@ +Adafruit QT Py nRF52840 (planned footprint)1A02A13A24A35SDA6SCL7TX_A68RX_A79SCK10MISO11MOSI12V3_313GND14V5 \ 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 @@ +A0A1A2A3SDASCLTXRXSCKMISOMOSIV3_3GNDV5QT PY RP2350 \ 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 @@ +Adafruit QT Py RP2350 (planned footprint)1A02A13A24A35SDA6SCL7TX8RX9SCK10MISO11MOSI12V3_313GND14V5 \ 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 @@ +A0A1A2A3SDASCLTX_A6RX_A7SCKMISOMOSIV3_3GNDV5QT PY SAMD21 \ 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 @@ +4600Adafruit QT Py SAMD211A02A13A24A35SDA6SCL7TX_A68RX_A79SCK10MISO11MOSI12V3_313GND14V5 \ 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 @@ +TXRXRESETGNDD2D3D4D5D6D7D8D9D10D11D12D133V3AREFA0A1A2A3A4A5A6A7V5RESET_2GND_2VINNANO 33 BLE \ 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 @@ +ABX00030Arduino Nano 33 BLE1TX2RX3RESET4GND5D26D37D48D59D610D711D812D913D1014D1115D1216D13173V318AREF19A020A121A222A323A424A525A626A727V528RESET_229GND_230VIN \ 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 @@ +TXRXRESETGNDD2D3D4D5D6D7D8D9D10D11D12D133V3AREFA0A1A2A3A4A5A6A7V5RESET_2GND_2VINNANO 33 BLE SENSE \ 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 @@ +ABX00069Arduino Nano 33 BLE Sense Rev21TX2RX3RESET4GND5D26D37D48D59D610D711D812D913D1014D1115D1216D13173V318AREF19A020A121A222A323A424A525A626A727V528RESET_229GND_230VIN \ 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 @@ +TXRXRESETGNDD2D3D4D5D6D7D8D9D10D11D12D133V3AREFA0A1A2A3A4A5A6A7V5RESET_2GND_2VINNANO 33 IOT \ 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 @@ +ABX00027Arduino Nano 33 IoT1TX2RX3RESET4GND5D26D37D48D59D610D711D812D913D1014D1115D1216D13173V318AREF19A020A121A222A323A424A525A626A727V528RESET_229GND_230VIN \ 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 @@ +TXRXRESETGNDD2D3D4D5D6D7D8D9D10D11D12D133V3AREFA0A1A2A3A4A5A6A7V5RESET_2GND_2VINNANO ATMEGA328P \ 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 @@ +A000005Arduino Nano ATmega328P1TX2RX3RESET4GND5D26D37D48D59D610D711D812D913D1014D1115D1216D13173V318AREF19A020A121A222A323A424A525A626A727V528RESET_229GND_230VIN \ 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 @@ +TXRXRESETGNDD2D3D4D5D6D7D8D9D10D11D12D133V3B0A0A1A2A3A4A5A6A7VUSBB1GND_2VINNANO ESP32 \ 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 @@ +ABX00083Arduino Nano ESP321TX2RX3RESET4GND5D26D37D48D59D610D711D812D913D1014D1115D1216D13173V318B019A020A121A222A323A424A525A626A727VUSB28B129GND_230VIN \ 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 @@ +TXRXRESETGNDD2D3D4D5D6D7D8D9D10D11D12D133V3AREFA0A1A2A3A4A5A6A7V5RESET_2GND_2VINNANO EVERY \ 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 @@ +ABX00028Arduino Nano Every1TX2RX3RESET4GND5D26D37D48D59D610D711D812D913D1014D1115D1216D13173V318AREF19A020A121A222A323A424A525A626A727V528RESET_229GND_230VIN \ 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 @@ +D0D1RSTGNDD2D3D4D5D6D7D8D9D10D11D12D13V3_3AREFA0A1A2A3A4A5A6A7V5NCGND_2VINNANO MATTER \ 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 @@ +ABX00112Arduino Nano Matter1D02D13RST4GND5D26D37D48D59D610D711D812D913D1014D1115D1216D1317V3_318AREF19A020A121A222A323A424A525A626A727V528NC29GND_230VIN \ 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 @@ +TXRXRESETGNDD2D3D4D5D6D7D8D9D10D11D12D133V3AREFA0A1A2A3A4A5A6A7V5QSPI_CSnGND_2VINNANO RP2040 \ 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 @@ +ABX00053Arduino Nano RP2040 Connect1TX2RX3RESET4GND5D26D37D48D59D610D711D812D913D1014D1115D1216D13173V318AREF19A020A121A222A323A424A525A626A727V528QSPI_CSn29GND_230VIN \ 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,