From 522506e200abefd70d1b7734514a2ff658e2940d Mon Sep 17 00:00:00 2001 From: seveibar Date: Thu, 30 Jul 2026 12:28:45 -0700 Subject: [PATCH] Map RK3326 supply fanout to plane nets --- README.md | 17 ++++++++++ __snapshots__/index.circuit-pcb.snap.svg | 1 + bun.lock | 20 ++++++------ index.tsx | 1 + package.json | 2 +- src/RK3326Breakout.tsx | 40 +++++++++++++----------- tests/rk3326.test.ts | 8 +++-- 7 files changed, 57 insertions(+), 32 deletions(-) create mode 100644 __snapshots__/index.circuit-pcb.snap.svg 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", () => {