diff --git a/README.md b/README.md
index 5959e4b..25d9153 100644
--- a/README.md
+++ b/README.md
@@ -66,6 +66,23 @@ The power rails share a routing layer, not a net. A downstream board design must
create the appropriate isolated copper regions for the 23 named power nets on
`inner2`.
+The breakout declares that plane intent once through the fanout phase:
+
+```tsx
+
+```
+
+There is no singleton bus per supply ball. The fanout router recognizes each
+source-only supply trace from its net and drops it to the mapped layer. In a
+board design with matching `` components, the same layer-to-net
+intent can be inferred without specifying `fanoutPourNetMap`.
+
```tsx
import { RK3326Breakout } from "@tsci/tscircuit.rk3326"
diff --git a/__snapshots__/index.circuit-pcb.snap.svg b/__snapshots__/index.circuit-pcb.snap.svg
new file mode 100644
index 0000000..1f0143e
--- /dev/null
+++ b/__snapshots__/index.circuit-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/bun.lock b/bun.lock
index 6862c62..8ca171e 100644
--- a/bun.lock
+++ b/bun.lock
@@ -7,7 +7,7 @@
"devDependencies": {
"@types/bun": "^1.3.14",
"@types/react": "^19.2.17",
- "tscircuit": "0.0.2180",
+ "tscircuit": "0.0.2185",
"typescript": "^5.0.0",
},
},
@@ -161,15 +161,15 @@
"@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.1777", "", { "peerDependencies": { "circuit-json": "^0.0.446", "tscircuit": "*" }, "bin": { "tscircuit-cli": "cli/entrypoint.js" } }, "sha512-nz50RlrUUFY+6C+AN6rfmnrOOaLXoOBomquYUrUzl+j05HrhvQJWN8XxSUSsahyIZOACKjIEo2s3LXein/qcnQ=="],
+ "@tscircuit/cli": ["@tscircuit/cli@0.1.1782", "", { "peerDependencies": { "circuit-json": "^0.0.446", "tscircuit": "*" }, "bin": { "tscircuit-cli": "cli/entrypoint.js" } }, "sha512-wh46LG8lnRV31CcthYWbSSzVt1jVZyUqh/CTpVleoRrP4i4ZFydJVj5QuARtsgRa9CPnOnWFSfNezxY87wuPKg=="],
"@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.1549", "", { "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-bh8TehXW/WdPKrTx0ZacNkOTruIRZRb+M9adt42NOhoTKieYgfzHNYWlsjtBoJLk846ZyAeEvxU1nT4YIcbNGw=="],
+ "@tscircuit/core": ["@tscircuit/core@0.0.1554", "", { "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-mSXaQF86TniYGblEsuvtuScjBOg/NIigu30C5w4ZOQdC76+uUGFySMRqbObkVfLxSW/0Qmti0QmgwiJO/KvSXg=="],
"@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.1095", "", { "peerDependencies": { "@tscircuit/core": "*", "circuit-json": "*", "typescript": "^5.0.0", "zod": "3" } }, "sha512-9QtfHK6UDsiLuPKq30LQs1JIc7703Ppnb3p+829KJRUDe+nz1I5lnmjKunKChgLJCC3ESnBGIcmI2NYG+ttcQQ=="],
+ "@tscircuit/eval": ["@tscircuit/eval@0.0.1099", "", { "peerDependencies": { "@tscircuit/core": "*", "circuit-json": "*", "typescript": "^5.0.0", "zod": "3" } }, "sha512-IneWqiU2vF+q4yLjYhatDxy7LIGrWska2yzJISQ2/EbUewenYm+qjdk5Gi7H5weL3O9eFQ4skhceSqSpgNiWAA=="],
"@tscircuit/fanout-solver": ["@tscircuit/fanout-solver@0.0.10", "", { "dependencies": { "@tscircuit/capacity-autorouter": "0.0.718", "@tscircuit/solver-utils": "0.0.19", "graphics-debug": "0.0.96" }, "peerDependencies": { "typescript": "^5" } }, "sha512-JqHpS0Uflu7vZeSAO7MLHRsuEfAxwSPAyMiFCcaRGGDJsQZRSJBIevKmQDR23FHmFAdWzAFoCaEjHkx714DNyg=="],
@@ -187,7 +187,7 @@
"@tscircuit/manifold-2d": ["@tscircuit/manifold-2d@0.0.6", "", {}, "sha512-kYny1hDwPHOwRfMQtbfLh0nvCQ7nM91kkHy7pnj1UrqM6rcgDymZVCZB7ib5Cx1aZFIs8xCCF7lA51tq+giDcw=="],
- "@tscircuit/matchpack": ["@tscircuit/matchpack@0.0.60", "", { "peerDependencies": { "typescript": "^5" } }, "sha512-vnWcv+5p0bzoYMBG/DmUOF230pT3GxXSLecdGEpWJlIrszjROys+TnmJ2vdyUN7fU4w23Y22doT5dRJPad+rCg=="],
+ "@tscircuit/matchpack": ["@tscircuit/matchpack@0.0.61", "", { "peerDependencies": { "typescript": "^5" } }, "sha512-VIQfj49MmVpyhBhFqTDAqCQwr/d9UzZwWhblceg7OFbcoJESw7SiEihtc2ROQKotO4cN1y+88p7mULf4iUM2OA=="],
"@tscircuit/math-utils": ["@tscircuit/math-utils@0.0.36", "", { "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-HwHS3do6CLQFnLGd0f3+kQzGfENFllpt5ZFWF9gfw2k5Rc5VSxSJi8/MLfHEgaMgrnMCZ5Hqh3DlUD6U3pMXyg=="],
@@ -197,15 +197,15 @@
"@tscircuit/ngspice-spice-engine": ["@tscircuit/ngspice-spice-engine@0.0.20", "", { "peerDependencies": { "@tscircuit/props": "*", "circuit-json": "*", "spicets": "*", "typescript": "^5" } }, "sha512-dXjH51Wl95B6yEVkWCz65DpAHWTJRLHDyD/09eJUpGwLcYfd1F9m4E0XWbuiYZ8wKygYlACTozrSX9n3/LtfwA=="],
- "@tscircuit/props": ["@tscircuit/props@0.0.598", "", { "peerDependencies": { "circuit-json": "*", "react": "*", "zod": "*" } }, "sha512-4hH1SMIkS8ukJ8t3+qjzHT3cJxLGAjpOofZIvcIIdpOJ5NkJpfK7CyTMOba9uzXJSSIveI+ZpsJXsZMX/JAB3A=="],
+ "@tscircuit/props": ["@tscircuit/props@0.0.599", "", { "peerDependencies": { "circuit-json": "*", "react": "*", "zod": "*" } }, "sha512-BtPRIiiuhvSR+fGLG6xYikykHg4MZcjMxuKO2LLk3v0Iprk0YLaTcOBVflNBDTOJPcrncvNgnlWxOcdZJ+Xy0g=="],
- "@tscircuit/runframe": ["@tscircuit/runframe@0.0.2314", "", { "dependencies": { "@tscircuit/eval": "^0.0.1095", "@tscircuit/solver-utils": "^0.0.7", "debug": "^4.4.0" } }, "sha512-I0ijoPCKKvTu4arsNwg6eBLanYAgkXJnD2O2yTiXAr8DUfmNZDsM3NTng8Xn42WSAI/TRmZxezoTXQYY8EAX9g=="],
+ "@tscircuit/runframe": ["@tscircuit/runframe@0.0.2319", "", { "dependencies": { "@tscircuit/eval": "^0.0.1099", "@tscircuit/solver-utils": "^0.0.7", "debug": "^4.4.0" } }, "sha512-HNwDyw2ZauC+7b/SIaY9EabjOwWh+MDMOz0hqI8XEq2eMAQYuZrgp8lGMiNTVIJSP1hiJyYY1En3WWmw06gDww=="],
"@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.115", "", { "peerDependencies": { "typescript": "^5" } }, "sha512-Id5+Babo3iu8ouJli+8geG+IMWgvRsXviEEsTzg1zF52HUSy0PGaw7xgrJoriiBC3ajdmb0DfPJzw8t5zvIUaA=="],
+ "@tscircuit/schematic-trace-solver": ["@tscircuit/schematic-trace-solver@0.0.116", "", { "peerDependencies": { "typescript": "^5" } }, "sha512-68q63UM3MZRaWmqfh8PJodNOV9NrGWKQ6E4VXyqIYzdzkwV9/27XBuXtJqS3l9KvT2N+1Mj2fKa4TVy7CCJ6Tw=="],
"@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=="],
@@ -275,7 +275,7 @@
"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-gltf": ["circuit-json-to-gltf@0.0.107", "", { "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-YuER0b6d+bYk/S/FAClS3RPW3ipo/CQb+OoNZiNkNqObsuRh6N/UxQeo/M1NXh+b0j2tfeL0nlSIkfSmKx9lyQ=="],
+ "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-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=="],
@@ -593,7 +593,7 @@
"ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="],
- "tscircuit": ["tscircuit@0.0.2180", "", { "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.1777", "@tscircuit/copper-pour-solver": "0.0.42", "@tscircuit/core": "^0.0.1549", "@tscircuit/create-fdm-enclosure": "0.0.3", "@tscircuit/eval": "^0.0.1095", "@tscircuit/fanout-solver": "0.0.10", "@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.60", "@tscircuit/math-utils": "^0.0.36", "@tscircuit/miniflex": "^0.0.4", "@tscircuit/ngspice-spice-engine": "^0.0.20", "@tscircuit/props": "^0.0.598", "@tscircuit/runframe": "^0.0.2314", "@tscircuit/schematic-match-adapt": "^0.0.18", "@tscircuit/schematic-trace-solver": "^0.0.115", "@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.107", "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-332krsPi/CzFnUjYfN6lNC6kwk4hHJ7MmVNeEkjRtLer0GvMP7j4ELh6gV5GERhetuYMeguYVaSVwoYm0cxpMw=="],
+ "tscircuit": ["tscircuit@0.0.2185", "", { "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.1782", "@tscircuit/copper-pour-solver": "0.0.42", "@tscircuit/core": "^0.0.1554", "@tscircuit/create-fdm-enclosure": "0.0.3", "@tscircuit/eval": "^0.0.1099", "@tscircuit/fanout-solver": "0.0.10", "@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.61", "@tscircuit/math-utils": "^0.0.36", "@tscircuit/miniflex": "^0.0.4", "@tscircuit/ngspice-spice-engine": "^0.0.20", "@tscircuit/props": "^0.0.599", "@tscircuit/runframe": "^0.0.2319", "@tscircuit/schematic-match-adapt": "^0.0.18", "@tscircuit/schematic-trace-solver": "^0.0.116", "@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-BDXKdVLgCp4XOMMuLnYv6XNq4bKUdfHLK37bd/bAQzGvXuJG0ivzWOgjWpj6tYnkhR+tm+LufzR8xV5mKjsSqw=="],
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
diff --git a/index.tsx b/index.tsx
index b691321..a712483 100644
--- a/index.tsx
+++ b/index.tsx
@@ -19,6 +19,7 @@ export {
RK3326_INITIAL_FANOUT_BUS_IDS,
RK3326_PLANE_FANOUT_CONNECTIONS,
RK3326_POWER_PLANE_LAYER,
+ RK3326_POWER_RAIL_NETS,
RK3326_SUPPLY_PINS,
getRK3326FanoutBreakoutPoints,
getRK3326PlaneFanoutConnections,
diff --git a/package.json b/package.json
index d38d393..f2ecde2 100644
--- a/package.json
+++ b/package.json
@@ -22,7 +22,7 @@
"devDependencies": {
"@types/bun": "^1.3.14",
"@types/react": "^19.2.17",
- "tscircuit": "0.0.2180",
+ "tscircuit": "0.0.2185",
"typescript": "^5.0.0"
}
}
diff --git a/src/RK3326Breakout.tsx b/src/RK3326Breakout.tsx
index 9064cf1..24840bc 100644
--- a/src/RK3326Breakout.tsx
+++ b/src/RK3326Breakout.tsx
@@ -211,7 +211,6 @@ export interface RK3326PlaneFanoutConnection {
pinFunction: string
netName: string
traceName: string
- busName: string
layer: typeof RK3326_GROUND_PLANE_LAYER | typeof RK3326_POWER_PLANE_LAYER
direction: RK3326FanoutDirection
}
@@ -435,6 +434,14 @@ export const RK3326_SUPPLY_PINS = RK3326_BALLS.flatMap((ball) => {
return supplyPin ? [supplyPin] : []
})
+export const RK3326_POWER_RAIL_NETS = Array.from(
+ new Set(
+ RK3326_SUPPLY_PINS.filter(({ category }) => category === "power").map(
+ ({ netName }) => netName,
+ ),
+ ),
+)
+
export const getRK3326PlaneFanoutConnections = (
selectedSignalBusIds: readonly RK3326FanoutBusId[] = RK3326_INITIAL_FANOUT_BUS_IDS,
): readonly RK3326PlaneFanoutConnection[] => {
@@ -449,7 +456,6 @@ export const getRK3326PlaneFanoutConnections = (
pinFunction,
netName,
traceName: `PLANE_TRACE_${ball}`,
- busName: `plane-${category}-${ball}`,
layer:
category === "ground"
? RK3326_GROUND_PLANE_LAYER
@@ -509,7 +515,10 @@ export const RK3326Breakout = ({
),
...planeFanoutConnections.map(
(connection) =>
- [connection.busName, directionToAnchor[connection.direction]] as const,
+ [
+ connection.traceName,
+ directionToAnchor[connection.direction],
+ ] as const,
),
])
const { sizeMm, paddingMm } = RK3326_BREAKOUT_GEOMETRY
@@ -538,24 +547,19 @@ export const RK3326Breakout = ({
autorouter="fanout"
busFanoutDirections={busFanoutDirections}
fanoutRoutingLayers={[...signalFanoutLayers]}
+ fanoutPourNetMap={{
+ [RK3326_GROUND_PLANE_LAYER]: "GND",
+ [RK3326_POWER_PLANE_LAYER]: RK3326_POWER_RAIL_NETS,
+ }}
/>
{planeFanoutConnections.map((connection) => (
-
- .${connection.ball}`}
- to={`net.${connection.netName}`}
- />
-
-
+ .${connection.ball}`}
+ to={`net.${connection.netName}`}
+ />
))}
{breakoutPoints.map(
({ ball, busId, endpointName, netName, traceName, pcbX, pcbY }) => (
diff --git a/tests/rk3326.test.ts b/tests/rk3326.test.ts
index b16086c..58a06fa 100644
--- a/tests/rk3326.test.ts
+++ b/tests/rk3326.test.ts
@@ -13,6 +13,7 @@ import {
RK3326_FANOUT_BUS_IDS,
RK3326_GROUND_PLANE_LAYER,
RK3326_INITIAL_FANOUT_BUS_IDS,
+ RK3326_POWER_RAIL_NETS,
RK3326_POWER_PLANE_LAYER,
RK3326_SUPPLY_PINS,
} from "../src/RK3326Breakout"
@@ -114,9 +115,6 @@ describe("RK3326 initial fanout", () => {
expect(
new Set(planeConnections.map(({ traceName }) => traceName)).size,
).toBe(205)
- expect(new Set(planeConnections.map(({ busName }) => busName)).size).toBe(
- 205,
- )
expect(groundConnections).toHaveLength(154)
expect(
@@ -142,6 +140,10 @@ describe("RK3326 initial fanout", () => {
expect(new Set(powerConnections.map(({ netName }) => netName)).size).toBe(
23,
)
+ expect(RK3326_POWER_RAIL_NETS).toHaveLength(23)
+ expect(new Set(RK3326_POWER_RAIL_NETS)).toEqual(
+ new Set(powerConnections.map(({ netName }) => netName)),
+ )
})
test("reserves both plane layers from signal fanout", () => {