diff --git a/lib/solvers.ts b/lib/solvers.ts
index 71f659412..4957952fd 100644
--- a/lib/solvers.ts
+++ b/lib/solvers.ts
@@ -5,6 +5,7 @@ import {
AutoroutingPipeline1_OriginalUnravel,
AssignableAutoroutingPipeline3,
AutoroutingPipelineSolver3_HgPortPointPathing,
+ AutoroutingPipelineSolver4,
} from "@tscircuit/capacity-autorouter"
import { CopperPourPipelineSolver } from "@tscircuit/copper-pour-solver"
@@ -15,6 +16,7 @@ export const SOLVERS = {
AssignableAutoroutingPipeline3,
AutoroutingPipeline1_OriginalUnravel,
AutoroutingPipelineSolver3_HgPortPointPathing,
+ AutoroutingPipelineSolver4,
CopperPourPipelineSolver,
}
diff --git a/lib/utils/autorouting/CapacityMeshAutorouter.ts b/lib/utils/autorouting/CapacityMeshAutorouter.ts
index a03c9317f..06ab7f678 100644
--- a/lib/utils/autorouting/CapacityMeshAutorouter.ts
+++ b/lib/utils/autorouting/CapacityMeshAutorouter.ts
@@ -4,6 +4,7 @@ import {
AssignableAutoroutingPipeline3,
AutoroutingPipeline1_OriginalUnravel,
AutoroutingPipelineSolver3_HgPortPointPathing,
+ AutoroutingPipelineSolver4,
} from "@tscircuit/capacity-autorouter"
import { AutorouterError } from "lib/errors/AutorouterError"
import type { SimpleRouteJson, SimplifiedPcbTrace } from "./SimpleRouteJson"
@@ -22,7 +23,7 @@ export interface AutorouterOptions {
stepDelay?: number
useAssignableSolver?: boolean
useAutoJumperSolver?: boolean
- autorouterVersion?: "v1" | "v2" | "v3" | "latest"
+ autorouterVersion?: "v1" | "v2" | "v3" | "v4" | "latest"
effort?: number
onSolverStarted?: (details: {
solverName: string
@@ -39,6 +40,7 @@ export class TscircuitAutorouter implements GenericLocalAutorouter {
| AssignableAutoroutingPipeline3
| AutoroutingPipeline1_OriginalUnravel
| AutoroutingPipelineSolver3_HgPortPointPathing
+ | AutoroutingPipelineSolver4
private eventHandlers: {
complete: Array<(ev: AutorouterCompleteEvent) => void>
error: Array<(ev: AutorouterErrorEvent) => void>
@@ -71,6 +73,8 @@ export class TscircuitAutorouter implements GenericLocalAutorouter {
solverName = "AutoroutingPipeline1_OriginalUnravel"
} else if (autorouterVersion === "v3") {
solverName = "AutoroutingPipelineSolver3_HgPortPointPathing"
+ } else if (autorouterVersion === "v4") {
+ solverName = "AutoroutingPipelineSolver4"
} else if (useAutoJumperSolver) {
solverName = "AssignableAutoroutingPipeline3"
} else if (useAssignableSolver) {
diff --git a/package.json b/package.json
index 0f0d17165..2e5334b9d 100644
--- a/package.json
+++ b/package.json
@@ -34,7 +34,7 @@
"@resvg/resvg-js": "^2.6.2",
"@tscircuit/alphabet": "0.0.18",
"@tscircuit/checks": "0.0.110",
- "@tscircuit/capacity-autorouter": "^0.0.334",
+ "@tscircuit/capacity-autorouter": "^0.0.353",
"@tscircuit/circuit-json-util": "^0.0.90",
"@tscircuit/common": "^0.0.20",
"@tscircuit/copper-pour-solver": "^0.0.20",
@@ -46,7 +46,7 @@
"@tscircuit/math-utils": "^0.0.36",
"@tscircuit/miniflex": "^0.0.4",
"@tscircuit/ngspice-spice-engine": "^0.0.8",
- "@tscircuit/props": "^0.0.497",
+ "@tscircuit/props": "^0.0.498",
"@tscircuit/schematic-match-adapt": "^0.0.16",
"@tscircuit/schematic-trace-solver": "^v0.0.45",
"@tscircuit/solver-utils": "^0.0.3",
diff --git a/tests/components/primitive-components/__snapshots__/via-connect-trace-pcb.snap.svg b/tests/components/primitive-components/__snapshots__/via-connect-trace-pcb.snap.svg
index 3ec0ccc0d..877511ca6 100644
--- a/tests/components/primitive-components/__snapshots__/via-connect-trace-pcb.snap.svg
+++ b/tests/components/primitive-components/__snapshots__/via-connect-trace-pcb.snap.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/tests/components/primitive-components/__snapshots__/via-connect-trace-simple-3d.snap.png b/tests/components/primitive-components/__snapshots__/via-connect-trace-simple-3d.snap.png
index 1885ebd03..aa0a96d8a 100644
Binary files a/tests/components/primitive-components/__snapshots__/via-connect-trace-simple-3d.snap.png and b/tests/components/primitive-components/__snapshots__/via-connect-trace-simple-3d.snap.png differ
diff --git a/tests/examples/__snapshots__/example3-3x3-keyboard-pcb.snap.svg b/tests/examples/__snapshots__/example3-3x3-keyboard-pcb.snap.svg
index 8a93309e0..7c3678cad 100644
--- a/tests/examples/__snapshots__/example3-3x3-keyboard-pcb.snap.svg
+++ b/tests/examples/__snapshots__/example3-3x3-keyboard-pcb.snap.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/tests/features/__snapshots__/autorouter-version-v4-pcb.snap.svg b/tests/features/__snapshots__/autorouter-version-v4-pcb.snap.svg
new file mode 100644
index 000000000..e4c1d155c
--- /dev/null
+++ b/tests/features/__snapshots__/autorouter-version-v4-pcb.snap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/features/autorouter-version-v4.test.tsx b/tests/features/autorouter-version-v4.test.tsx
new file mode 100644
index 000000000..64c8c3f53
--- /dev/null
+++ b/tests/features/autorouter-version-v4.test.tsx
@@ -0,0 +1,44 @@
+import { expect, test } from "bun:test"
+import { getTestFixture } from "../fixtures/get-test-fixture"
+
+test("board with autorouterVersion v4 uses AutoroutingPipelineSolver4", async () => {
+ const { circuit } = getTestFixture()
+
+ let solverStartedName: string | undefined
+
+ circuit.on("solver:started", (event) => {
+ solverStartedName = event.solverName
+ })
+
+ circuit.add(
+
+
+
+
+
+ ,
+ )
+
+ await circuit.renderUntilSettled()
+
+ expect(solverStartedName).toBe("AutoroutingPipelineSolver4")
+
+ const traces = circuit.selectAll("trace")
+ expect(traces.length).toBeGreaterThan(0)
+
+ expect(circuit).toMatchPcbSnapshot(import.meta.path)
+})