Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions lib/components/normal-components/Board.ts
Original file line number Diff line number Diff line change
Expand Up @@ -383,10 +383,13 @@ export class Board
super.doInitialSourceRender()

const { db } = this.root!
const { minViaDiameter, minViaHole } = this._parsedProps

const source_board = db.source_board.insert({
source_group_id: this.source_group_id!,
title: this.props.title || this.props.name,
...(minViaDiameter != null ? { min_via_diameter: minViaDiameter } : {}),
...(minViaHole != null ? { min_via_hole: minViaHole } : {}),
})

this.source_board_id = source_board.source_board_id
Expand Down Expand Up @@ -509,6 +512,8 @@ export class Board
}
}

const { minViaDiameter, minViaHole } = this._parsedProps

const pcb_board = db.pcb_board.insert({
source_board_id: this.source_board_id,
center,
Expand All @@ -523,6 +528,8 @@ export class Board
y: point.y + (props.outlineOffsetY ?? 0) + outlineTranslation.y,
})),
material: props.material,
...(minViaDiameter != null ? { min_via_diameter: minViaDiameter } : {}),
...(minViaHole != null ? { min_via_hole: minViaHole } : {}),
} as Omit<PcbBoard, "type" | "pcb_board_id">)

this.pcb_board_id = pcb_board.pcb_board_id!
Expand Down
24 changes: 21 additions & 3 deletions lib/components/primitive-components/Group/Group.ts
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,8 @@ export class Group<Props extends z.ZodType<any, any, any> = typeof groupProps>

doInitialSourceGroupRender() {
const { db } = this.root!
const { minViaDiameter, minViaHole } = this
._parsedProps as SubcircuitGroupProps
const hasExplicitName =
typeof (this._parsedProps as { name?: unknown }).name === "string" &&
(this._parsedProps as { name?: string }).name!.length > 0
Expand All @@ -141,6 +143,8 @@ export class Group<Props extends z.ZodType<any, any, any> = typeof groupProps>
name: this.name,
is_subcircuit: this.isSubcircuit,
was_automatically_named: !hasExplicitName,
...(minViaDiameter != null ? { min_via_diameter: minViaDiameter } : {}),
...(minViaHole != null ? { min_via_hole: minViaHole } : {}),
})
this.source_group_id = source_group.source_group_id
if (this.isSubcircuit) {
Expand Down Expand Up @@ -185,6 +189,7 @@ export class Group<Props extends z.ZodType<any, any, any> = typeof groupProps>

const groupProps = props as SubcircuitGroupProps
const hasOutline = groupProps.outline && groupProps.outline.length > 0
const { minViaDiameter, minViaHole } = groupProps

const numericOutline = hasOutline
? groupProps.outline!.map((point) => ({
Expand All @@ -211,6 +216,8 @@ export class Group<Props extends z.ZodType<any, any, any> = typeof groupProps>
}
: undefined,
anchor_alignment: props.pcbAnchorAlignment ?? null,
...(minViaDiameter != null ? { min_via_diameter: minViaDiameter } : {}),
...(minViaHole != null ? { min_via_hole: minViaHole } : {}),
})
this.pcb_group_id = pcb_group.pcb_group_id

Expand Down Expand Up @@ -609,7 +616,10 @@ export class Group<Props extends z.ZodType<any, any, any> = typeof groupProps>
)
simpleRouteJson.obstacles = [
...simpleRouteJson.obstacles,
...Group_getObstaclesFromRoutedTraces(outputTraces),
...Group_getObstaclesFromRoutedTraces(
outputTraces,
baseSimpleRouteJson.minViaDiameter,
),
]
}

Expand Down Expand Up @@ -904,6 +914,8 @@ export class Group<Props extends z.ZodType<any, any, any> = typeof groupProps>
// Apply each routed trace to the corresponding circuit trace
const pcbStyle = this.getInheritedMergedProperty("pcbStyle")
const { holeDiameter, padDiameter } = getViaDiameterDefaults(pcbStyle)
const { minViaDiameter, minViaHole } = this
._parsedProps as SubcircuitGroupProps

// First, create jumper components from getOutputJumpers() result
if (output_jumpers && output_jumpers.length > 0) {
Expand Down Expand Up @@ -958,12 +970,18 @@ export class Group<Props extends z.ZodType<any, any, any> = typeof groupProps>
if (pcb_trace.type === "pcb_trace") {
for (const point of pcb_trace.route) {
if (point.route_type === "via") {
const routeVia = point as typeof point & {
via_diameter?: number
via_hole_diameter?: number
}
db.pcb_via.insert({
pcb_trace_id: pcb_trace.pcb_trace_id,
x: point.x,
y: point.y,
hole_diameter: holeDiameter,
outer_diameter: padDiameter,
hole_diameter:
routeVia.via_hole_diameter ?? minViaHole ?? holeDiameter,
outer_diameter:
routeVia.via_diameter ?? minViaDiameter ?? padDiameter,
layers: [
point.from_layer as LayerRef,
point.to_layer as LayerRef,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,28 +114,37 @@ function createViaObstacle(
point: Extract<RoutePoint, { route_type: "via" }>,
connectedTo: string,
obstacleIndex: number,
defaultViaDiameter: number,
): Obstacle {
return {
obstacleId: `${connectedTo}_phase_via_obstacle_${obstacleIndex}`,
type: "rect",
layers: [point.from_layer, point.to_layer],
center: { x: point.x, y: point.y },
width: 0.6,
height: 0.6,
width: point.via_diameter ?? defaultViaDiameter,
height: point.via_diameter ?? defaultViaDiameter,
connectedTo: [connectedTo],
}
}

function addTraceObstacles(
obstacles: Obstacle[],
trace: SimplifiedPcbTrace,
defaultViaDiameter: number,
): void {
const connectedTo = getTraceConnectionName(trace)

for (let routeIndex = 0; routeIndex < trace.route.length; routeIndex++) {
const routePoint = trace.route[routeIndex]
if (isViaPoint(routePoint)) {
obstacles.push(createViaObstacle(routePoint, connectedTo, routeIndex))
obstacles.push(
createViaObstacle(
routePoint,
connectedTo,
routeIndex,
defaultViaDiameter,
),
)
} else if (isJumperPoint(routePoint)) {
obstacles.push(createJumperObstacle(routePoint, connectedTo, routeIndex))
}
Expand Down Expand Up @@ -198,10 +207,11 @@ export function Group_filterSimpleRouteJsonForPhase(

export function Group_getObstaclesFromRoutedTraces(
traces: SimplifiedPcbTrace[],
defaultViaDiameter = 0.6,
): Obstacle[] {
const obstacles: Obstacle[] = []
for (const trace of traces) {
addTraceObstacles(obstacles, trace)
addTraceObstacles(obstacles, trace, defaultViaDiameter)
}
return obstacles
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@ export function inflatePcbBoard(
if (pcbBoard.outline) boardProps.outline = pcbBoard.outline
if (pcbBoard.thickness) boardProps.thickness = pcbBoard.thickness
if (pcbBoard.material) boardProps.material = pcbBoard.material
if (pcbBoard.min_via_diameter != null) {
boardProps.minViaDiameter = pcbBoard.min_via_diameter
}
if (pcbBoard.min_via_hole != null) {
boardProps.minViaHole = pcbBoard.min_via_hole
}

// Create the Board instance
const board = new Board(boardProps)
Expand Down
4 changes: 4 additions & 0 deletions lib/utils/autorouting/SimpleRouteJson.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ export type SimplifiedPcbTrace = {
y: number
to_layer: string
from_layer: string
via_diameter?: number
via_hole_diameter?: number
}
| {
route_type: "jumper"
Expand Down Expand Up @@ -60,6 +62,8 @@ export interface SimpleRouteJson {
layerCount: number
minTraceWidth: number
nominalTraceWidth?: number
minViaDiameter?: number
minViaHole?: number
obstacles: Obstacle[]
connections: Array<SimpleRouteConnection>
bounds: { minX: number; maxX: number; minY: number; maxY: number }
Expand Down
2 changes: 2 additions & 0 deletions lib/utils/autorouting/getSimpleRouteJsonFromCircuitJson.ts
Original file line number Diff line number Diff line change
Expand Up @@ -464,6 +464,8 @@ export const getSimpleRouteJsonFromCircuitJson = ({
// subcircuit
layerCount: board?.num_layers ?? 2,
minTraceWidth,
minViaDiameter: board?.min_via_diameter ?? pcbGroup?.min_via_diameter,
minViaHole: board?.min_via_hole ?? pcbGroup?.min_via_hole,
nominalTraceWidth,
outline: board?.outline?.map((point) => ({ ...point })),
},
Expand Down
69 changes: 69 additions & 0 deletions tests/features/board-min-via-rules.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import { expect, test } from "bun:test"
import { getTestFixture } from "tests/fixtures/get-test-fixture"
import { createBasicAutorouter } from "tests/fixtures/createBasicAutorouter"
import type { SimpleRouteJson } from "lib/utils/autorouting/SimpleRouteJson"

test("board min via rules flow into srj and routed vias", async () => {
const { circuit } = getTestFixture()

let capturedSimpleRouteJson: SimpleRouteJson | undefined

circuit.add(
<board
width="20mm"
height="20mm"
minViaDiameter="0.6mm"
minViaHole="0.3mm"
autorouter={{
local: true,
algorithmFn: createBasicAutorouter(async (simpleRouteJson) => {
capturedSimpleRouteJson = simpleRouteJson

return [
{
type: "pcb_trace",
pcb_trace_id: "trace_0",
connection_name: simpleRouteJson.connections[0]!.name,
route: [
{
route_type: "wire",
x: -4,
y: 0,
width: 0.15,
layer: "top",
},
{
route_type: "via",
x: 0,
y: 0,
from_layer: "top",
to_layer: "bottom",
},
{
route_type: "wire",
x: 4,
y: 0,
width: 0.15,
layer: "bottom",
},
],
},
]
}),
}}
>
<resistor name="R1" resistance="1k" footprint="0402" pcbX={-4} pcbY={0} />
<resistor name="R2" resistance="1k" footprint="0402" pcbX={4} pcbY={0} />
<trace from=".R1 > .pin2" to=".R2 > .pin1" />
</board>,
)

await circuit.renderUntilSettled()

expect(capturedSimpleRouteJson?.minViaDiameter).toBe(0.6)
expect(capturedSimpleRouteJson?.minViaHole).toBe(0.3)

const via = circuit.db.pcb_via.list()[0]
expect(via?.outer_diameter).toBe(0.6)
expect(via?.hole_diameter).toBe(0.3)
})
26 changes: 26 additions & 0 deletions tests/groups/group-min-via-rules.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { expect, test } from "bun:test"
import { getTestFixture } from "tests/fixtures/get-test-fixture"
import { getSimpleRouteJsonFromCircuitJson } from "lib/utils/autorouting/getSimpleRouteJsonFromCircuitJson"

test("group min via rules flow into simple route json", async () => {
const { circuit } = getTestFixture()

circuit.add(
<group subcircuit minViaDiameter="0.55mm" minViaHole="0.25mm">
<resistor name="R1" resistance="1k" footprint="0402" pcbX={-2} pcbY={0} />
<resistor name="R2" resistance="1k" footprint="0402" pcbX={2} pcbY={0} />
<trace from=".R1 > .pin2" to=".R2 > .pin1" />
</group>,
)

await circuit.renderUntilSettled()

const subcircuitId = circuit.db.source_group.list()[0]?.subcircuit_id
const { simpleRouteJson } = getSimpleRouteJsonFromCircuitJson({
db: circuit.db,
subcircuit_id: subcircuitId,
})

expect(simpleRouteJson.minViaDiameter).toBe(0.55)

Check failure on line 24 in tests/groups/group-min-via-rules.test.tsx

View workflow job for this annotation

GitHub Actions / test (2)

error: expect(received).toBe(expected)

Expected: 0.55 Received: undefined at <anonymous> (/home/runner/work/core/core/tests/groups/group-min-via-rules.test.tsx:24:42)
expect(simpleRouteJson.minViaHole).toBe(0.25)
})
Loading