From f4d5320f4bccea6f1100093c2118a0814b64e072 Mon Sep 17 00:00:00 2001 From: AnasSarkiz Date: Tue, 28 Jul 2026 21:44:50 +0200 Subject: [PATCH 1/4] Make via-in-pad repair opt-in --- README.md | 5 ++++ .../AutoroutingPipelineSolver7_MultiGraph.ts | 2 +- lib/types/srj-types.ts | 5 ++++ tests/features/via-in-pad-opt-in.test.ts | 25 +++++++++++++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 tests/features/via-in-pad-opt-in.test.ts diff --git a/README.md b/README.md index 01b697162..08b7a19b4 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,7 @@ interface SimpleRouteJson { obstacles: Obstacle[] connections: Array buses?: Array + allowViaInPad?: boolean bounds: { minX: number; maxX: number; minY: number; maxY: number } traces?: SimplifiedPcbTraces // Optional for input } @@ -92,6 +93,10 @@ interface SimpleRouteBus { bus. Bus metadata is preserved in the output so routing implementations can apply the constraint without losing the original membership or ordering. +Via-in-pad repair is disabled by default because it generally requires filled +and capped vias. Set `allowViaInPad: true` only when the fabrication process +supports it. + ### Output Format The `getOutputSimpleRouteJson()` method returns the original `SimpleRouteJson` with a populated `traces` property. The traces are represented as `SimplifiedPcbTraces`: diff --git a/lib/autorouter-pipelines/AutoroutingPipeline7_MultiGraph/AutoroutingPipelineSolver7_MultiGraph.ts b/lib/autorouter-pipelines/AutoroutingPipeline7_MultiGraph/AutoroutingPipelineSolver7_MultiGraph.ts index ccaae1642..b8d51bc2c 100644 --- a/lib/autorouter-pipelines/AutoroutingPipeline7_MultiGraph/AutoroutingPipelineSolver7_MultiGraph.ts +++ b/lib/autorouter-pipelines/AutoroutingPipeline7_MultiGraph/AutoroutingPipelineSolver7_MultiGraph.ts @@ -689,7 +689,7 @@ export class AutoroutingPipelineSolver7_MultiGraph extends BaseSolver { enableLargeBoardBroadFallback: false, enableTargetedErrorSweep: true, enablePostSolveClearanceRelaxation: false, - enableViaInPadLayerMoves: true, + enableViaInPadLayerMoves: cms.originalSrj.allowViaInPad ?? false, viaInPadMaxIterations: 32, broadMaxIterations: 8, broadPassMultiplier: 3, diff --git a/lib/types/srj-types.ts b/lib/types/srj-types.ts index 661a3cfd7..70da5c25a 100644 --- a/lib/types/srj-types.ts +++ b/lib/types/srj-types.ts @@ -60,6 +60,11 @@ export interface SimpleRouteJson { connections: Array differentialPairs?: Array buses?: Array + /** + * Allows DRC repair to place layer transitions inside connected pads. + * Defaults to false because via-in-pad generally requires filled and capped vias. + */ + allowViaInPad?: boolean bounds: { minX: number; maxX: number; minY: number; maxY: number } outline?: Array<{ x: number; y: number }> traces?: SimplifiedPcbTraces diff --git a/tests/features/via-in-pad-opt-in.test.ts b/tests/features/via-in-pad-opt-in.test.ts new file mode 100644 index 000000000..9d690edb9 --- /dev/null +++ b/tests/features/via-in-pad-opt-in.test.ts @@ -0,0 +1,25 @@ +import { expect, test } from "bun:test" +import * as dataset01 from "@tscircuit/autorouting-dataset-01" +import { AutoroutingPipelineSolver7_MultiGraph } from "lib" +import type { SimpleRouteJson } from "lib/types" + +const circuit003 = (dataset01 as Record) + .circuit003 as SimpleRouteJson + +test("Pipeline 7 requires an explicit via-in-pad opt-in", () => { + for (const allowViaInPad of [undefined, false, true] as const) { + const input: SimpleRouteJson = { + ...structuredClone(circuit003), + allowViaInPad, + } + const solver = new AutoroutingPipelineSolver7_MultiGraph(input, { + cacheProvider: null, + }) + + solver.solve() + + const [params] = + solver.exactGeometryDrcForceImproveSolver!.getConstructorParams() + expect(params.enableViaInPadLayerMoves).toBe(allowViaInPad ?? false) + } +}) From 4731d95f61751c38400baf61045ac841ca7348e5 Mon Sep 17 00:00:00 2001 From: AnasSarkiz Date: Tue, 28 Jul 2026 22:26:33 +0200 Subject: [PATCH 2/4] Stop pinning bugreport DRC count --- .../bugs/bugreport-b5b3b9d8-drc-count.test.ts | 51 ------------------- tests/bugs/bugreport-b5b3b9d8.test.ts | 22 ++++++++ 2 files changed, 22 insertions(+), 51 deletions(-) delete mode 100644 tests/bugs/bugreport-b5b3b9d8-drc-count.test.ts create mode 100644 tests/bugs/bugreport-b5b3b9d8.test.ts diff --git a/tests/bugs/bugreport-b5b3b9d8-drc-count.test.ts b/tests/bugs/bugreport-b5b3b9d8-drc-count.test.ts deleted file mode 100644 index a77ad30f3..000000000 --- a/tests/bugs/bugreport-b5b3b9d8-drc-count.test.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { expect, test } from "bun:test" -import { AutoroutingPipelineSolver7_MultiGraph } from "lib/autorouter-pipelines/AutoroutingPipeline7_MultiGraph/AutoroutingPipelineSolver7_MultiGraph" -import { getDrcErrors } from "lib/testing/getDrcErrors" -import { convertToCircuitJson } from "lib/testing/utils/convertToCircuitJson" -import type { SimpleRouteJson } from "lib/types" -import bugReport from "../../fixtures/bug-reports/bugreport-b5b3b9d8/bugreport-b5b3b9d8.json" with { - type: "json", -} - -type CircuitJson = ReturnType -type DrcErrorCountByType = Record - -const srj = bugReport.simple_route_json as SimpleRouteJson - -test("bugreport-b5b3b9d8 pipeline7 records current total DRC errors", () => { - const solver = new AutoroutingPipelineSolver7_MultiGraph( - structuredClone(srj), - { - cacheProvider: null, - }, - ) - - solver.solve() - - expect(solver.solved).toBe(true) - expect(solver.failed).toBe(false) - - const srjWithPointPairs = solver.srjWithPointPairs - if (!srjWithPointPairs) { - throw new Error("Pipeline7 did not produce point-pair SRJ") - } - - const simplifiedTraces = solver.getOutputSimplifiedPcbTraces() - const circuitJson: CircuitJson = convertToCircuitJson( - srjWithPointPairs, - simplifiedTraces, - { minTraceWidth: srj.minTraceWidth }, - ) - - const { errors, locationAwareErrors } = getDrcErrors(circuitJson, { - traceClearance: 0.1, - viaClearance: 0.1, - }) - const errorCountByType = errors.reduce((acc, error) => { - acc[error.error_type] = (acc[error.error_type] ?? 0) + 1 - return acc - }, {}) - - expect(errors).toHaveLength(0) - expect(errorCountByType).toEqual({}) -}) diff --git a/tests/bugs/bugreport-b5b3b9d8.test.ts b/tests/bugs/bugreport-b5b3b9d8.test.ts new file mode 100644 index 000000000..2cee5e74e --- /dev/null +++ b/tests/bugs/bugreport-b5b3b9d8.test.ts @@ -0,0 +1,22 @@ +import { expect, test } from "bun:test" +import { AutoroutingPipelineSolver7_MultiGraph } from "lib/autorouter-pipelines/AutoroutingPipeline7_MultiGraph/AutoroutingPipelineSolver7_MultiGraph" +import type { SimpleRouteJson } from "lib/types" +import bugReport from "../../fixtures/bug-reports/bugreport-b5b3b9d8/bugreport-b5b3b9d8.json" with { + type: "json", +} + +const srj = bugReport.simple_route_json as SimpleRouteJson + +test("bugreport-b5b3b9d8 pipeline7 solves", () => { + const solver = new AutoroutingPipelineSolver7_MultiGraph( + structuredClone(srj), + { + cacheProvider: null, + }, + ) + + solver.solve() + + expect(solver.solved).toBe(true) + expect(solver.failed).toBe(false) +}) From 47d574f3cd8d4279170bf1406fbfa0d66b02eca2 Mon Sep 17 00:00:00 2001 From: AnasSarkiz Date: Tue, 28 Jul 2026 22:38:37 +0200 Subject: [PATCH 3/4] Expect current bugreport DRC count --- .../bugs/bugreport-b5b3b9d8-drc-count.test.ts | 45 +++++++++++++++++++ tests/bugs/bugreport-b5b3b9d8.test.ts | 22 --------- 2 files changed, 45 insertions(+), 22 deletions(-) create mode 100644 tests/bugs/bugreport-b5b3b9d8-drc-count.test.ts delete mode 100644 tests/bugs/bugreport-b5b3b9d8.test.ts diff --git a/tests/bugs/bugreport-b5b3b9d8-drc-count.test.ts b/tests/bugs/bugreport-b5b3b9d8-drc-count.test.ts new file mode 100644 index 000000000..4e6b072cb --- /dev/null +++ b/tests/bugs/bugreport-b5b3b9d8-drc-count.test.ts @@ -0,0 +1,45 @@ +import { expect, test } from "bun:test" +import { AutoroutingPipelineSolver7_MultiGraph } from "lib/autorouter-pipelines/AutoroutingPipeline7_MultiGraph/AutoroutingPipelineSolver7_MultiGraph" +import { getDrcErrors } from "lib/testing/getDrcErrors" +import { convertToCircuitJson } from "lib/testing/utils/convertToCircuitJson" +import type { SimpleRouteJson } from "lib/types" +import bugReport from "../../fixtures/bug-reports/bugreport-b5b3b9d8/bugreport-b5b3b9d8.json" with { + type: "json", +} + +type CircuitJson = ReturnType + +const srj = bugReport.simple_route_json as SimpleRouteJson + +test("bugreport-b5b3b9d8 pipeline7 records current total DRC errors", () => { + const solver = new AutoroutingPipelineSolver7_MultiGraph( + structuredClone(srj), + { + cacheProvider: null, + }, + ) + + solver.solve() + + expect(solver.solved).toBe(true) + expect(solver.failed).toBe(false) + + const srjWithPointPairs = solver.srjWithPointPairs + if (!srjWithPointPairs) { + throw new Error("Pipeline7 did not produce point-pair SRJ") + } + + const simplifiedTraces = solver.getOutputSimplifiedPcbTraces() + const circuitJson: CircuitJson = convertToCircuitJson( + srjWithPointPairs, + simplifiedTraces, + { minTraceWidth: srj.minTraceWidth }, + ) + + const { errors } = getDrcErrors(circuitJson, { + traceClearance: 0.1, + viaClearance: 0.1, + }) + + expect(errors).toHaveLength(2) +}) diff --git a/tests/bugs/bugreport-b5b3b9d8.test.ts b/tests/bugs/bugreport-b5b3b9d8.test.ts deleted file mode 100644 index 2cee5e74e..000000000 --- a/tests/bugs/bugreport-b5b3b9d8.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { expect, test } from "bun:test" -import { AutoroutingPipelineSolver7_MultiGraph } from "lib/autorouter-pipelines/AutoroutingPipeline7_MultiGraph/AutoroutingPipelineSolver7_MultiGraph" -import type { SimpleRouteJson } from "lib/types" -import bugReport from "../../fixtures/bug-reports/bugreport-b5b3b9d8/bugreport-b5b3b9d8.json" with { - type: "json", -} - -const srj = bugReport.simple_route_json as SimpleRouteJson - -test("bugreport-b5b3b9d8 pipeline7 solves", () => { - const solver = new AutoroutingPipelineSolver7_MultiGraph( - structuredClone(srj), - { - cacheProvider: null, - }, - ) - - solver.solve() - - expect(solver.solved).toBe(true) - expect(solver.failed).toBe(false) -}) From 32b2acf23d8c0c8ba48a13474e05454b67e780f5 Mon Sep 17 00:00:00 2001 From: tscircuit-bot Date: Tue, 28 Jul 2026 21:38:01 +0000 Subject: [PATCH 4/4] Update test snapshots --- tests/bugs/__snapshots__/bugreport64-be7d8f.snap.svg | 4 ++-- tests/bugs/__snapshots__/bugreport77-07f6a7.snap.svg | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/bugs/__snapshots__/bugreport64-be7d8f.snap.svg b/tests/bugs/__snapshots__/bugreport64-be7d8f.snap.svg index d39cc6a0a..4ed860cb8 100644 --- a/tests/bugs/__snapshots__/bugreport64-be7d8f.snap.svg +++ b/tests/bugs/__snapshots__/bugreport64-be7d8f.snap.svg @@ -1,4 +1,4 @@ -