forked from tscircuit/checks
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcheck-source-traces-have-pcb-traces.ts
More file actions
79 lines (70 loc) · 2.63 KB
/
check-source-traces-have-pcb-traces.ts
File metadata and controls
79 lines (70 loc) · 2.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import type {
AnyCircuitElement,
PcbPort,
PcbTrace,
PcbTraceMissingError,
SourceTrace,
} from "circuit-json"
import { containsCircuitJsonId } from "lib/util/get-readable-names"
const getSourceTraceIdsFromPcbTrace = (
pcbTraceSourceTraceId?: string,
): string[] => {
if (!pcbTraceSourceTraceId) return []
if (!pcbTraceSourceTraceId.includes("__")) return [pcbTraceSourceTraceId]
return pcbTraceSourceTraceId
.split("__")
.filter((part) => part.startsWith("source_trace_"))
}
/**
* Check that each source_trace which connects source ports has at least one
* pcb_trace associated with it. If a source_trace has no corresponding
* pcb_trace, return an error for that source_trace.
*/
function checkSourceTracesHavePcbTraces(
circuitJson: AnyCircuitElement[],
): PcbTraceMissingError[] {
const errors: PcbTraceMissingError[] = []
const sourceTraces = circuitJson.filter(
(el) => el.type === "source_trace",
) as SourceTrace[]
const pcbTraces = circuitJson.filter(
(el) => el.type === "pcb_trace",
) as PcbTrace[]
for (const sourceTrace of sourceTraces) {
if (!sourceTrace.connected_source_port_ids?.length) continue
if ((sourceTrace.connected_source_net_ids?.length ?? 0) > 0) continue
if (sourceTrace.connected_source_port_ids.length < 2) continue
const hasPcbTrace = pcbTraces.some((pcbTrace) =>
getSourceTraceIdsFromPcbTrace(pcbTrace.source_trace_id).includes(
sourceTrace.source_trace_id,
),
)
if (!hasPcbTrace) {
// Get PCB ports connected to this source trace
const connectedPcbPorts = circuitJson.filter(
(el) =>
el.type === "pcb_port" &&
sourceTrace.connected_source_port_ids.includes(el.source_port_id),
) as PcbPort[]
// Find PCB components that these ports belong to
const connectedPcbComponentIds = Array.from(
new Set(
connectedPcbPorts
.map((port) => port.pcb_component_id)
.filter((id): id is string => id !== undefined),
),
)
errors.push({
type: "pcb_trace_missing_error",
pcb_trace_missing_error_id: `pcb_trace_missing_${sourceTrace.source_trace_id}`,
error_type: "pcb_trace_missing_error",
message: `Trace [${sourceTrace.display_name && !containsCircuitJsonId(sourceTrace.display_name) ? sourceTrace.display_name : "trace"}] is not connected (it has no PCB trace)`,
source_trace_id: sourceTrace.source_trace_id,
pcb_component_ids: connectedPcbComponentIds,
pcb_port_ids: connectedPcbPorts.map((port) => port.pcb_port_id),
})
}
}
return errors
}
export { checkSourceTracesHavePcbTraces }