From f4d5320f4bccea6f1100093c2118a0814b64e072 Mon Sep 17 00:00:00 2001 From: AnasSarkiz Date: Tue, 28 Jul 2026 21:44:50 +0200 Subject: [PATCH] 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) + } +})