Skip to content

Commit 06bb90c

Browse files
committed
fix
1 parent 382864b commit 06bb90c

File tree

2 files changed

+71
-41
lines changed

2 files changed

+71
-41
lines changed

lib/utils/autorouting/getSimpleRouteJsonFromCircuitJson.ts

Lines changed: 66 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { getDescendantSubcircuitIds } from "./getAncestorSubcircuitIds"
1414
* This function can only be called in the PcbTraceRender phase or later
1515
*/
1616
export const getSimpleRouteJsonFromCircuitJson = ({
17-
db,
17+
db: inputDb,
1818
circuitJson,
1919
subcircuit_id,
2020
minTraceWidth = 0.1,
@@ -26,6 +26,7 @@ export const getSimpleRouteJsonFromCircuitJson = ({
2626
minTraceWidth?: number
2727
nominalTraceWidth?: number
2828
}): { simpleRouteJson: SimpleRouteJson; connMap: ConnectivityMap } => {
29+
let db = inputDb
2930
if (!db && circuitJson) {
3031
db = su(circuitJson)
3132
}
@@ -70,18 +71,18 @@ export const getSimpleRouteJsonFromCircuitJson = ({
7071
board = db.pcb_board.list()[0]
7172
}
7273

73-
db = su(subcircuitElements)
74+
const subcircuitDb = su(subcircuitElements)
7475

75-
const connMap = getFullConnectivityMapFromCircuitJson(subcircuitElements)
76+
const connMap = getFullConnectivityMapFromCircuitJson(db.toArray())
7677

7778
const obstacles = getObstaclesFromCircuitJson(
7879
[
79-
...db.pcb_component.list(),
80-
...db.pcb_smtpad.list(),
81-
...db.pcb_plated_hole.list(),
82-
...db.pcb_hole.list(),
83-
...db.pcb_via.list(),
84-
...db.pcb_cutout.list(),
80+
...subcircuitDb.pcb_component.list(),
81+
...subcircuitDb.pcb_smtpad.list(),
82+
...subcircuitDb.pcb_plated_hole.list(),
83+
...subcircuitDb.pcb_hole.list(),
84+
...subcircuitDb.pcb_via.list(),
85+
...subcircuitDb.pcb_cutout.list(),
8586
// getObstaclesFromSoup is old and doesn't support diagonal traces
8687
// ...db.pcb_trace.list(),
8788
].filter(
@@ -99,7 +100,8 @@ export const getSimpleRouteJsonFromCircuitJson = ({
99100
}
100101

101102
// Build mapping from source_port_id to internal connection ID for interconnects
102-
const internalConnections = db.source_component_internal_connection.list()
103+
const internalConnections =
104+
subcircuitDb.source_component_internal_connection.list()
103105
const sourcePortIdToInternalConnectionId = new Map<string, string>()
104106
for (const ic of internalConnections) {
105107
for (const sourcePortId of ic.source_port_ids) {
@@ -209,7 +211,7 @@ export const getSimpleRouteJsonFromCircuitJson = ({
209211
)
210212

211213
// Create connections from traces
212-
const directTraceConnections = db.source_trace
214+
const directTraceConnections = subcircuitDb.source_trace
213215
.list()
214216
.filter((trace) => !routedTraceIds.has(trace.source_trace_id))
215217
.map((trace) => {
@@ -228,29 +230,51 @@ export const getSimpleRouteJsonFromCircuitJson = ({
228230
const [portA, portB] = connectedPorts
229231

230232
if (
231-
!portA.pcb_port_id ||
233+
!portA.source_port_id ||
232234
portA.x === undefined ||
233235
portA.y === undefined
234236
) {
235-
const readablePortA = portA.pcb_port_id
236-
? getReadableNameForPcbPort(db.toArray(), portA.pcb_port_id)
237-
: "unknown"
238-
console.error(
239-
`(${readablePortA}) for trace ${trace.source_trace_id} does not have x/y coordinates. Skipping this trace.`,
240-
)
237+
const source_port = db.source_port.get(portA.source_port_id!)
238+
const source_component = source_port
239+
? db.source_component.get(source_port.source_component_id!)
240+
: null
241+
const readablePortA =
242+
source_component && source_port
243+
? `.${source_component.name} > .${source_port.name}`
244+
: portA.pcb_port_id
245+
? getReadableNameForPcbPort(db.toArray(), portA.pcb_port_id)
246+
: portA.source_port_id ?? "unknown"
247+
248+
db.pcb_trace_error.insert({
249+
error_type: "pcb_trace_error",
250+
message: `(pcb_port[${readablePortA}]) for trace ${trace.source_trace_id} does not have x/y coordinates. Skipping this trace.`,
251+
source_trace_id: trace.source_trace_id,
252+
source_port_ids: portA.source_port_id ? [portA.source_port_id] : [],
253+
} as any)
241254
return null
242255
}
243256
if (
244-
!portB.pcb_port_id ||
257+
!portB.source_port_id ||
245258
portB.x === undefined ||
246259
portB.y === undefined
247260
) {
248-
const readablePortB = portB.pcb_port_id
249-
? getReadableNameForPcbPort(db.toArray(), portB.pcb_port_id)
250-
: "unknown"
251-
console.error(
252-
`(${readablePortB}) for trace ${trace.source_trace_id} does not have x/y coordinates. Skipping this trace.`,
253-
)
261+
const source_port = db.source_port.get(portB.source_port_id!)
262+
const source_component = source_port
263+
? db.source_component.get(source_port.source_component_id!)
264+
: null
265+
const readablePortB =
266+
source_component && source_port
267+
? `.${source_component.name} > .${source_port.name}`
268+
: portB.pcb_port_id
269+
? getReadableNameForPcbPort(db.toArray(), portB.pcb_port_id)
270+
: portB.source_port_id ?? "unknown"
271+
272+
db.pcb_trace_error.insert({
273+
error_type: "pcb_trace_error",
274+
message: `(pcb_port[${readablePortB}]) for trace ${trace.source_trace_id} does not have x/y coordinates. Skipping this trace.`,
275+
source_trace_id: trace.source_trace_id,
276+
source_port_ids: portB.source_port_id ? [portB.source_port_id] : [],
277+
} as any)
254278
return null
255279
}
256280

@@ -260,6 +284,8 @@ export const getSimpleRouteJsonFromCircuitJson = ({
260284
// Collect all traceHints that apply to either port
261285
const matchingHints = traceHints.filter(
262286
(hint) =>
287+
(hint as any).source_port_id === portA.source_port_id ||
288+
(hint as any).source_port_id === portB.source_port_id ||
263289
hint.pcb_port_id === portA.pcb_port_id ||
264290
hint.pcb_port_id === portB.pcb_port_id,
265291
)
@@ -291,15 +317,15 @@ export const getSimpleRouteJsonFromCircuitJson = ({
291317
x: portA.x!,
292318
y: portA.y!,
293319
layer: layerA,
294-
pointId: portA.pcb_port_id,
320+
pointId: portA.source_port_id,
295321
pcb_port_id: portA.pcb_port_id,
296322
},
297323
...hintPoints,
298324
{
299325
x: portB.x!,
300326
y: portB.y!,
301327
layer: layerB,
302-
pointId: portB.pcb_port_id,
328+
pointId: portB.source_port_id,
303329
pcb_port_id: portB.pcb_port_id,
304330
},
305331
],
@@ -310,7 +336,7 @@ export const getSimpleRouteJsonFromCircuitJson = ({
310336
directTraceConnections.map((c) => [c.source_trace_id, c]),
311337
)
312338

313-
const source_nets = db.source_net
339+
const source_nets = subcircuitDb.source_net
314340
.list()
315341
.filter(
316342
(e) => !subcircuit_id || relevantSubcircuitIds?.has(e.subcircuit_id!),
@@ -335,14 +361,14 @@ export const getSimpleRouteJsonFromCircuitJson = ({
335361
x: p.x!,
336362
y: p.y!,
337363
layer: (p.layers?.[0] as any) ?? "top",
338-
pointId: p.pcb_port_id,
364+
pointId: p.source_port_id,
339365
pcb_port_id: p.pcb_port_id,
340366
}))
341367
}),
342368
})
343369
}
344370

345-
const breakoutPoints = db.pcb_breakout_point
371+
const breakoutPoints = subcircuitDb.pcb_breakout_point
346372
.list()
347373
.filter(
348374
(bp) => !subcircuit_id || relevantSubcircuitIds?.has(bp.subcircuit_id!),
@@ -392,7 +418,7 @@ export const getSimpleRouteJsonFromCircuitJson = ({
392418
x: pcb_port.x!,
393419
y: pcb_port.y!,
394420
layer: (pcb_port.layers?.[0] as any) ?? "top",
395-
pointId: pcb_port.pcb_port_id,
421+
pointId: pcb_port.source_port_id,
396422
// @ts-ignore
397423
pcb_port_id: pcb_port.pcb_port_id,
398424
},
@@ -428,8 +454,14 @@ export const getSimpleRouteJsonFromCircuitJson = ({
428454
for (const tr of existingTraces) {
429455
const tracePortIds = new Set<string>()
430456
for (const seg of tr.route as any[]) {
431-
if (seg.start_pcb_port_id) tracePortIds.add(seg.start_pcb_port_id)
432-
if (seg.end_pcb_port_id) tracePortIds.add(seg.end_pcb_port_id)
457+
if (seg.start_pcb_port_id) {
458+
const port = db.pcb_port.get(seg.start_pcb_port_id)
459+
if (port?.source_port_id) tracePortIds.add(port.source_port_id)
460+
}
461+
if (seg.end_pcb_port_id) {
462+
const port = db.pcb_port.get(seg.end_pcb_port_id)
463+
if (port?.source_port_id) tracePortIds.add(port.source_port_id)
464+
}
433465
}
434466
if (tracePortIds.size < 2) continue
435467

@@ -460,3 +492,4 @@ export const getSimpleRouteJsonFromCircuitJson = ({
460492
connMap,
461493
}
462494
}
495+

tests/utils/autorouting/simple-route-json-readable-names.test.tsx

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { expect, test, spyOn } from "bun:test"
1+
import { expect, test } from "bun:test"
22
import { RootCircuit } from "lib/RootCircuit"
33
import "lib/register-catalogue"
44
import { getSimpleRouteJsonFromCircuitJson } from "lib/utils/autorouting/getSimpleRouteJsonFromCircuitJson"
@@ -24,14 +24,11 @@ test("verify human-readable errors in autorouter diagnostics", async () => {
2424
circuit.db.pcb_trace.delete(pcb_trace.pcb_trace_id)
2525
}
2626

27-
const consoleSpy = spyOn(console, "error").mockImplementation(() => {})
28-
2927
getSimpleRouteJsonFromCircuitJson({ db: circuit.db })
30-
31-
expect(consoleSpy).toHaveBeenCalled()
32-
expect(consoleSpy.mock.calls[0][0]).toMatchInlineSnapshot(
28+
29+
const pcb_trace_errors = circuit.db.pcb_trace_error.list()
30+
expect(pcb_trace_errors).toHaveLength(1)
31+
expect(pcb_trace_errors[0].message).toMatchInlineSnapshot(
3332
`"(pcb_port[.R1 > .pin1]) for trace source_trace_0 does not have x/y coordinates. Skipping this trace."`,
3433
)
35-
36-
consoleSpy.mockRestore()
3734
})

0 commit comments

Comments
 (0)