Skip to content

Commit f352c31

Browse files
committed
fix(autorouter): wire autorouter traceClearance into the capacity router
The board/subcircuit `autorouter={{ traceClearance }}` prop was written to the pcb_group's autorouter_configuration but never passed to the autorouter, so it had no effect - the capacity mesh router always used its default obstacle margin. SimpleRouteJson already has a `defaultObstacleMargin` field (the trace-to-obstacle spacing the solver reads), it just wasn't set. Thread traceClearance -> getSimpleRouteJsonFromCircuitJson({ defaultObstacleMargin }) -> SimpleRouteJson.defaultObstacleMargin, parsing the Distance to mm. Covers both the local capacity autorouter and the legacy solve-endpoint path.
1 parent 19a848d commit f352c31

3 files changed

Lines changed: 48 additions & 0 deletions

File tree

lib/components/primitive-components/Group/Group.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -760,6 +760,10 @@ export class Group<Props extends z.ZodType<any, any, any> = typeof groupProps>
760760
db,
761761
minTraceWidth: Number(props.minTraceWidth ?? 0.15),
762762
nominalTraceWidth: this.props.nominalTraceWidth,
763+
defaultObstacleMargin:
764+
this.props.autorouter?.traceClearance != null
765+
? distance.parse(this.props.autorouter.traceClearance)
766+
: undefined,
763767
subcircuit_id: this.subcircuit_id,
764768
subcircuitComponent: this,
765769
}).simpleRouteJson,
@@ -893,6 +897,10 @@ export class Group<Props extends z.ZodType<any, any, any> = typeof groupProps>
893897
db,
894898
minTraceWidth,
895899
nominalTraceWidth,
900+
defaultObstacleMargin:
901+
autorouterConfig.traceClearance != null
902+
? distance.parse(autorouterConfig.traceClearance)
903+
: undefined,
896904
subcircuit_id: this.subcircuit_id,
897905
subcircuitComponent: this,
898906
})

lib/utils/autorouting/getSimpleRouteJsonFromCircuitJson.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export const getSimpleRouteJsonFromCircuitJson = ({
2727
minBoardEdgeClearance,
2828
minViaHoleDiameter,
2929
minViaPadDiameter,
30+
defaultObstacleMargin,
3031
nominalTraceWidth,
3132
subcircuitComponent,
3233
}: {
@@ -43,6 +44,8 @@ export const getSimpleRouteJsonFromCircuitJson = ({
4344
minBoardEdgeClearance?: number
4445
minViaHoleDiameter?: number
4546
minViaPadDiameter?: number
47+
/** trace-to-obstacle clearance for the capacity autorouter (mm) */
48+
defaultObstacleMargin?: number
4649
subcircuitComponent?: {
4750
selectAll(selector: string): unknown[]
4851
}
@@ -628,6 +631,7 @@ export const getSimpleRouteJsonFromCircuitJson = ({
628631
: undefined,
629632
layerCount: board?.num_layers ?? 2,
630633
minTraceWidth: minTraceWidth ?? board?.min_trace_width ?? 0.1,
634+
defaultObstacleMargin,
631635
minViaDiameter: resolvedMinViaPadDiameter,
632636
minViaHoleDiameter: resolvedMinViaHoleDiameter,
633637
minViaPadDiameter: resolvedMinViaPadDiameter,
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { expect, test } from "bun:test"
2+
import { getSimpleRouteJsonFromCircuitJson } from "lib/utils/autorouting/getSimpleRouteJsonFromCircuitJson"
3+
import { getTestFixture } from "tests/fixtures/get-test-fixture"
4+
5+
// The board-level autorouter `traceClearance` is surfaced to the capacity
6+
// autorouter via SimpleRouteJson.defaultObstacleMargin, which sets the
7+
// trace-to-obstacle spacing. Before this it was dropped and the clearance
8+
// could not be configured.
9+
test("getSimpleRouteJsonFromCircuitJson forwards defaultObstacleMargin", async () => {
10+
const { circuit } = getTestFixture()
11+
12+
circuit.add(
13+
<board width="10mm" height="10mm">
14+
<resistor resistance="1k" footprint="0402" name="R1" />
15+
<capacitor capacitance="1000pF" footprint="0402" name="C1" />
16+
<trace from="R1.pin1" to="C1.pin1" />
17+
</board>,
18+
)
19+
20+
await circuit.renderUntilSettled()
21+
22+
const circuitJson = circuit
23+
.getCircuitJson()
24+
.filter((elm) => elm.type !== "pcb_trace")
25+
26+
const { simpleRouteJson: withMargin } = getSimpleRouteJsonFromCircuitJson({
27+
circuitJson,
28+
defaultObstacleMargin: 0.3,
29+
})
30+
expect(withMargin.defaultObstacleMargin).toBe(0.3)
31+
32+
const { simpleRouteJson: withoutMargin } = getSimpleRouteJsonFromCircuitJson({
33+
circuitJson,
34+
})
35+
expect(withoutMargin.defaultObstacleMargin).toBeUndefined()
36+
})

0 commit comments

Comments
 (0)