@tscircuit/checks 0.0.205 → 0.0.207
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +15 -5
- package/dist/index.js +184 -32
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import * as circuit_json from 'circuit-json';
|
|
2
2
|
import { AnyCircuitElement, PcbPlacementError, PcbPortNotConnectedError, PcbTraceError, PcbKeepoutOverlapWarning, PcbComponentOutsideBoardError, PcbViaClearanceError, PcbTraceWarning, PcbTraceMissingError, PcbFootprintOverlapError, PcbPadPadClearanceError, PcbCourtyardOverlapError, PcbComponentMissingCourtyardWarning, PcbTraceTooLongError, PcbPadTraceClearanceError, PcbViaTraceClearanceError, SourceComponentMisconfiguredError, SourceComponentPinsUnderspecifiedWarning, SourceNoPowerPinDefinedWarning, SourceNoGroundPinDefinedWarning, SchematicComponentStylingWarning, PcbConnectorNotInAccessibleOrientationWarning, SourceConfusingNetNameWarning, PcbBusLengthSkewError } from 'circuit-json';
|
|
3
|
-
import { ConnectivityMap } from 'circuit-json-to-connectivity-map';
|
|
3
|
+
import { ConnectivityMap, PcbConnectivityMap } from 'circuit-json-to-connectivity-map';
|
|
4
4
|
|
|
5
5
|
/** Detect accidental copper contact, rather than enforcing a clearance margin. */
|
|
6
|
-
declare function checkCopperPourShorts(circuitJson: AnyCircuitElement[]
|
|
6
|
+
declare function checkCopperPourShorts(circuitJson: AnyCircuitElement[], { connMap }?: {
|
|
7
|
+
connMap?: ConnectivityMap;
|
|
8
|
+
}): PcbPlacementError[];
|
|
7
9
|
|
|
8
|
-
declare function checkEachPcbPortConnectedToPcbTraces(circuitJson: AnyCircuitElement[]
|
|
10
|
+
declare function checkEachPcbPortConnectedToPcbTraces(circuitJson: AnyCircuitElement[], { connMap, pcbConnectivityMap, }?: {
|
|
11
|
+
connMap?: ConnectivityMap;
|
|
12
|
+
pcbConnectivityMap?: PcbConnectivityMap;
|
|
13
|
+
}): PcbPortNotConnectedError[];
|
|
9
14
|
|
|
10
15
|
declare function checkEachPcbTraceNonOverlapping(circuitJson: AnyCircuitElement[], { connMap, minClearance, }?: {
|
|
11
16
|
connMap?: ConnectivityMap;
|
|
@@ -63,9 +68,14 @@ declare function checkSourceTracesMatchPcbTraceThickness(circuitJson: AnyCircuit
|
|
|
63
68
|
* pcb_trace associated with it, or its ports physically joined through a
|
|
64
69
|
* same-net copper pour. Otherwise return an error for that source_trace.
|
|
65
70
|
*/
|
|
66
|
-
declare function checkSourceTracesHavePcbTraces(circuitJson: AnyCircuitElement[]
|
|
71
|
+
declare function checkSourceTracesHavePcbTraces(circuitJson: AnyCircuitElement[], { connMap }?: {
|
|
72
|
+
connMap?: ConnectivityMap;
|
|
73
|
+
}): PcbTraceMissingError[];
|
|
67
74
|
|
|
68
|
-
declare function checkTracesAreContiguous(circuitJson: AnyCircuitElement[]
|
|
75
|
+
declare function checkTracesAreContiguous(circuitJson: AnyCircuitElement[], { connMap, pcbConnectivityMap, }?: {
|
|
76
|
+
connMap?: ConnectivityMap;
|
|
77
|
+
pcbConnectivityMap?: PcbConnectivityMap;
|
|
78
|
+
}): PcbTraceError[];
|
|
69
79
|
|
|
70
80
|
/**
|
|
71
81
|
* Configuration for trace board boundary checking
|
package/dist/index.js
CHANGED
|
@@ -635,14 +635,16 @@ function convertCircuitJsonToFlattenJs(json, options = {}) {
|
|
|
635
635
|
}
|
|
636
636
|
|
|
637
637
|
// lib/check-copper-pour-shorts.ts
|
|
638
|
-
import {
|
|
638
|
+
import {
|
|
639
|
+
getFullConnectivityMapFromCircuitJson
|
|
640
|
+
} from "circuit-json-to-connectivity-map";
|
|
639
641
|
function touchesPour(pour, geometry) {
|
|
640
642
|
if (!pour.box.intersect(geometry.box)) return false;
|
|
641
643
|
return pour.intersect(geometry).length > 0 || [...geometry.faces].some((face) => pour.contains(face.first.start)) || [...pour.faces].some((face) => geometry.contains(face.first.start));
|
|
642
644
|
}
|
|
643
|
-
function checkCopperPourShorts(circuitJson) {
|
|
645
|
+
function checkCopperPourShorts(circuitJson, { connMap } = {}) {
|
|
644
646
|
if (!circuitJson.some((e) => e.type === "pcb_copper_pour")) return [];
|
|
645
|
-
|
|
647
|
+
connMap ??= getFullConnectivityMapFromCircuitJson(circuitJson);
|
|
646
648
|
const { elements: copper } = convertCircuitJsonToFlattenJs(circuitJson, {
|
|
647
649
|
elementTypes: [
|
|
648
650
|
"pcb_smtpad",
|
|
@@ -706,6 +708,97 @@ function checkCopperPourShorts(circuitJson) {
|
|
|
706
708
|
return [...errors.values()];
|
|
707
709
|
}
|
|
708
710
|
|
|
711
|
+
// lib/util/create-indexed-pcb-connectivity-map.ts
|
|
712
|
+
import {
|
|
713
|
+
ConnectivityMap,
|
|
714
|
+
findConnectedNetworks,
|
|
715
|
+
PcbConnectivityMap
|
|
716
|
+
} from "circuit-json-to-connectivity-map";
|
|
717
|
+
import Flatbush2 from "flatbush";
|
|
718
|
+
function createIndexedPcbConnectivityMap(circuitJson) {
|
|
719
|
+
const map = new PcbConnectivityMap();
|
|
720
|
+
map.circuitJson = circuitJson;
|
|
721
|
+
for (const element of circuitJson) {
|
|
722
|
+
if (element.type === "pcb_trace") {
|
|
723
|
+
map.traceIdToElm.set(element.pcb_trace_id, element);
|
|
724
|
+
} else if (element.type === "pcb_port") {
|
|
725
|
+
map.portIdToElm.set(element.pcb_port_id, element);
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
const traces = [...map.traceIdToElm.values()];
|
|
729
|
+
const boundsByLayer = /* @__PURE__ */ new Map();
|
|
730
|
+
for (const [traceIndex, trace] of traces.entries()) {
|
|
731
|
+
const boundsForTrace = /* @__PURE__ */ new Map();
|
|
732
|
+
for (let i = 0; i < trace.route.length - 1; i++) {
|
|
733
|
+
const a = trace.route[i];
|
|
734
|
+
const b = trace.route[i + 1];
|
|
735
|
+
if (a.route_type !== "wire" || b.route_type !== "wire" || a.layer !== b.layer)
|
|
736
|
+
continue;
|
|
737
|
+
const bounds = boundsForTrace.get(a.layer) ?? {
|
|
738
|
+
traceIndex,
|
|
739
|
+
minX: Infinity,
|
|
740
|
+
minY: Infinity,
|
|
741
|
+
maxX: -Infinity,
|
|
742
|
+
maxY: -Infinity
|
|
743
|
+
};
|
|
744
|
+
const radius = a.width / 2 + 1e-9;
|
|
745
|
+
bounds.minX = Math.min(bounds.minX, a.x - radius, b.x - radius);
|
|
746
|
+
bounds.minY = Math.min(bounds.minY, a.y - radius, b.y - radius);
|
|
747
|
+
bounds.maxX = Math.max(bounds.maxX, a.x + radius, b.x + radius);
|
|
748
|
+
bounds.maxY = Math.max(bounds.maxY, a.y + radius, b.y + radius);
|
|
749
|
+
boundsForTrace.set(a.layer, bounds);
|
|
750
|
+
}
|
|
751
|
+
for (const [layer, bounds] of boundsForTrace) {
|
|
752
|
+
const entries = boundsByLayer.get(layer) ?? [];
|
|
753
|
+
entries.push(bounds);
|
|
754
|
+
boundsByLayer.set(layer, entries);
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
const candidates = traces.map(() => /* @__PURE__ */ new Set());
|
|
758
|
+
for (const bounds of boundsByLayer.values()) {
|
|
759
|
+
const index = new Flatbush2(bounds.length);
|
|
760
|
+
for (const box of bounds) index.add(box.minX, box.minY, box.maxX, box.maxY);
|
|
761
|
+
index.finish();
|
|
762
|
+
for (const box of bounds) {
|
|
763
|
+
for (const hit of index.search(box.minX, box.minY, box.maxX, box.maxY)) {
|
|
764
|
+
const other = bounds[hit].traceIndex;
|
|
765
|
+
if (other > box.traceIndex) candidates[box.traceIndex].add(other);
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
const connections = [];
|
|
770
|
+
for (const [i, neighbors] of candidates.entries()) {
|
|
771
|
+
for (const j of [...neighbors].sort((a, b) => a - b)) {
|
|
772
|
+
if (map._arePcbTracesConnected(traces[i], traces[j])) {
|
|
773
|
+
connections.push([traces[i].pcb_trace_id, traces[j].pcb_trace_id]);
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
const connectionsByPort = /* @__PURE__ */ new Map();
|
|
778
|
+
for (const trace of traces) {
|
|
779
|
+
for (const point2 of trace.route) {
|
|
780
|
+
if (point2.route_type !== "wire") continue;
|
|
781
|
+
for (const portId of /* @__PURE__ */ new Set([
|
|
782
|
+
point2.start_pcb_port_id,
|
|
783
|
+
point2.end_pcb_port_id
|
|
784
|
+
])) {
|
|
785
|
+
if (!portId || !map.portIdToElm.has(portId)) continue;
|
|
786
|
+
const entries = connectionsByPort.get(portId) ?? [];
|
|
787
|
+
entries.push(
|
|
788
|
+
point2.start_pcb_port_id === portId ? [portId, trace.pcb_trace_id] : [trace.pcb_trace_id, portId]
|
|
789
|
+
);
|
|
790
|
+
connectionsByPort.set(portId, entries);
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
for (const portId of map.portIdToElm.keys()) {
|
|
795
|
+
for (const connection of connectionsByPort.get(portId) ?? [])
|
|
796
|
+
connections.push(connection);
|
|
797
|
+
}
|
|
798
|
+
map.connMap = new ConnectivityMap(findConnectedNetworks(connections));
|
|
799
|
+
return map;
|
|
800
|
+
}
|
|
801
|
+
|
|
709
802
|
// lib/check-traces-are-contiguous/is-point-in-pad.ts
|
|
710
803
|
import { pointToSegmentDistance } from "@tscircuit/math-utils";
|
|
711
804
|
|
|
@@ -1041,8 +1134,7 @@ var addStartAndEndPortIdsIfMissing = (soup) => {
|
|
|
1041
1134
|
|
|
1042
1135
|
// lib/check-each-pcb-port-connected-to-pcb-trace.ts
|
|
1043
1136
|
import {
|
|
1044
|
-
getFullConnectivityMapFromCircuitJson as getFullConnectivityMapFromCircuitJson2
|
|
1045
|
-
PcbConnectivityMap
|
|
1137
|
+
getFullConnectivityMapFromCircuitJson as getFullConnectivityMapFromCircuitJson2
|
|
1046
1138
|
} from "circuit-json-to-connectivity-map";
|
|
1047
1139
|
|
|
1048
1140
|
// lib/util/get-readable-names.ts
|
|
@@ -1172,10 +1264,58 @@ function getReadableNameForFootprintPad(circuitJson, pad, ordinal) {
|
|
|
1172
1264
|
return `${padKind} #${ordinal + 1} at ${location}`;
|
|
1173
1265
|
}
|
|
1174
1266
|
|
|
1267
|
+
// lib/copper-pour-connectivity/create-copper-polygon-contact-tester.ts
|
|
1268
|
+
import {
|
|
1269
|
+
Box
|
|
1270
|
+
} from "@flatten-js/core";
|
|
1271
|
+
function createCopperPolygonContactTester(tolerance) {
|
|
1272
|
+
const cache = /* @__PURE__ */ new WeakMap();
|
|
1273
|
+
const getGeometry = (polygon) => {
|
|
1274
|
+
let geometry = cache.get(polygon);
|
|
1275
|
+
if (!geometry) {
|
|
1276
|
+
geometry = {
|
|
1277
|
+
box: polygon.box,
|
|
1278
|
+
facePoints: [...polygon.faces].map((face) => face.first.start),
|
|
1279
|
+
edges: [...polygon.edges].map((edge) => edge.shape),
|
|
1280
|
+
edgeIndex: polygon.edges
|
|
1281
|
+
};
|
|
1282
|
+
cache.set(polygon, geometry);
|
|
1283
|
+
}
|
|
1284
|
+
return geometry;
|
|
1285
|
+
};
|
|
1286
|
+
return (a, b) => {
|
|
1287
|
+
if (a.isEmpty() || b.isEmpty()) return false;
|
|
1288
|
+
const ga = getGeometry(a);
|
|
1289
|
+
const gb = getGeometry(b);
|
|
1290
|
+
if (ga.box.xmin > gb.box.xmax + tolerance || ga.box.xmax < gb.box.xmin - tolerance || ga.box.ymin > gb.box.ymax + tolerance || ga.box.ymax < gb.box.ymin - tolerance)
|
|
1291
|
+
return false;
|
|
1292
|
+
if (ga.facePoints.some(
|
|
1293
|
+
(point2) => gb.box.contains(point2) && b.contains(point2)
|
|
1294
|
+
) || gb.facePoints.some((point2) => ga.box.contains(point2) && a.contains(point2)))
|
|
1295
|
+
return true;
|
|
1296
|
+
const [small, large] = ga.edges.length <= gb.edges.length ? [ga, gb] : [gb, ga];
|
|
1297
|
+
for (const edge of small.edges) {
|
|
1298
|
+
const box = edge.box;
|
|
1299
|
+
const queryBox = new Box(
|
|
1300
|
+
box.xmin - tolerance,
|
|
1301
|
+
box.ymin - tolerance,
|
|
1302
|
+
box.xmax + tolerance,
|
|
1303
|
+
box.ymax + tolerance
|
|
1304
|
+
);
|
|
1305
|
+
const candidates = large.edgeIndex.search(
|
|
1306
|
+
queryBox
|
|
1307
|
+
);
|
|
1308
|
+
for (const candidate of candidates) {
|
|
1309
|
+
if (edge.distanceTo(candidate.shape)[0] <= tolerance) return true;
|
|
1310
|
+
}
|
|
1311
|
+
}
|
|
1312
|
+
return false;
|
|
1313
|
+
};
|
|
1314
|
+
}
|
|
1315
|
+
|
|
1175
1316
|
// lib/copper-pour-connectivity/get-copper-pour-connectivity.ts
|
|
1176
1317
|
import {
|
|
1177
1318
|
getPrimaryId,
|
|
1178
|
-
copperPolygonsTouch,
|
|
1179
1319
|
getPlatedHolePolygon,
|
|
1180
1320
|
getPourPolygon,
|
|
1181
1321
|
getSmtPadPolygon,
|
|
@@ -1185,6 +1325,7 @@ import {
|
|
|
1185
1325
|
function getCopperPourConnectivity(circuitJson, connectivity) {
|
|
1186
1326
|
const scale = 1e6;
|
|
1187
1327
|
const tolerance = 1e-7 * scale;
|
|
1328
|
+
const copperPolygonsTouch = createCopperPolygonContactTester(tolerance);
|
|
1188
1329
|
const conductors = [];
|
|
1189
1330
|
const pouredNets = /* @__PURE__ */ new Set();
|
|
1190
1331
|
const netForId = (id) => connectivity.getNetConnectedToId(id);
|
|
@@ -1288,11 +1429,7 @@ function getCopperPourConnectivity(circuitJson, connectivity) {
|
|
|
1288
1429
|
(layer) => conductors[j].layers.includes(layer)
|
|
1289
1430
|
))
|
|
1290
1431
|
continue;
|
|
1291
|
-
if (copperPolygonsTouch(
|
|
1292
|
-
conductors[i].polygon,
|
|
1293
|
-
conductors[j].polygon,
|
|
1294
|
-
tolerance
|
|
1295
|
-
))
|
|
1432
|
+
if (copperPolygonsTouch(conductors[i].polygon, conductors[j].polygon))
|
|
1296
1433
|
parent[find(j)] = find(i);
|
|
1297
1434
|
}
|
|
1298
1435
|
}
|
|
@@ -1339,7 +1476,10 @@ function getCopperPourConnectivity(circuitJson, connectivity) {
|
|
|
1339
1476
|
}
|
|
1340
1477
|
|
|
1341
1478
|
// lib/check-each-pcb-port-connected-to-pcb-trace.ts
|
|
1342
|
-
function checkEachPcbPortConnectedToPcbTraces(circuitJson
|
|
1479
|
+
function checkEachPcbPortConnectedToPcbTraces(circuitJson, {
|
|
1480
|
+
connMap,
|
|
1481
|
+
pcbConnectivityMap
|
|
1482
|
+
} = {}) {
|
|
1343
1483
|
addStartAndEndPortIdsIfMissing(circuitJson);
|
|
1344
1484
|
const sourceTraces = circuitJson.filter(
|
|
1345
1485
|
(item) => item.type === "source_trace"
|
|
@@ -1351,8 +1491,8 @@ function checkEachPcbPortConnectedToPcbTraces(circuitJson) {
|
|
|
1351
1491
|
(item) => item.type === "source_net"
|
|
1352
1492
|
);
|
|
1353
1493
|
const errors = [];
|
|
1354
|
-
const connectivityMap = getFullConnectivityMapFromCircuitJson2(circuitJson);
|
|
1355
|
-
|
|
1494
|
+
const connectivityMap = connMap ?? getFullConnectivityMapFromCircuitJson2(circuitJson);
|
|
1495
|
+
pcbConnectivityMap ??= createIndexedPcbConnectivityMap(circuitJson);
|
|
1356
1496
|
let pourConnectivity;
|
|
1357
1497
|
const getPourConnectivity = () => pourConnectivity ??= getCopperPourConnectivity(
|
|
1358
1498
|
circuitJson,
|
|
@@ -3279,8 +3419,10 @@ function checkSourceTracesMatchPcbTraceThickness(circuitJson) {
|
|
|
3279
3419
|
}
|
|
3280
3420
|
|
|
3281
3421
|
// lib/check-source-traces-have-pcb-traces.ts
|
|
3282
|
-
import {
|
|
3283
|
-
|
|
3422
|
+
import {
|
|
3423
|
+
getFullConnectivityMapFromCircuitJson as getFullConnectivityMapFromCircuitJson7
|
|
3424
|
+
} from "circuit-json-to-connectivity-map";
|
|
3425
|
+
function checkSourceTracesHavePcbTraces(circuitJson, { connMap } = {}) {
|
|
3284
3426
|
const errors = [];
|
|
3285
3427
|
const sourceTraces = circuitJson.filter(
|
|
3286
3428
|
(el) => el.type === "source_trace"
|
|
@@ -3294,7 +3436,7 @@ function checkSourceTracesHavePcbTraces(circuitJson) {
|
|
|
3294
3436
|
const sourcePortToPcbPort = new Map(
|
|
3295
3437
|
pcbPorts.map((pcbPort) => [pcbPort.source_port_id, pcbPort])
|
|
3296
3438
|
);
|
|
3297
|
-
const connectivityMap = getFullConnectivityMapFromCircuitJson7(circuitJson);
|
|
3439
|
+
const connectivityMap = connMap ?? getFullConnectivityMapFromCircuitJson7(circuitJson);
|
|
3298
3440
|
let pourConnectivity;
|
|
3299
3441
|
const getPourConnectivity = () => pourConnectivity ??= getCopperPourConnectivity(
|
|
3300
3442
|
circuitJson,
|
|
@@ -3342,8 +3484,7 @@ import {
|
|
|
3342
3484
|
getReadableNameForPcbTrace
|
|
3343
3485
|
} from "@tscircuit/circuit-json-util";
|
|
3344
3486
|
import {
|
|
3345
|
-
getFullConnectivityMapFromCircuitJson as getFullConnectivityMapFromCircuitJson8
|
|
3346
|
-
PcbConnectivityMap as PcbConnectivityMap2
|
|
3487
|
+
getFullConnectivityMapFromCircuitJson as getFullConnectivityMapFromCircuitJson8
|
|
3347
3488
|
} from "circuit-json-to-connectivity-map";
|
|
3348
3489
|
|
|
3349
3490
|
// lib/check-traces-are-contiguous/via-contact-index.ts
|
|
@@ -3607,7 +3748,10 @@ function getMissingConnectionErrorCenter({
|
|
|
3607
3748
|
y: (firstPointCenter.y + lastPointCenter.y) / 2
|
|
3608
3749
|
};
|
|
3609
3750
|
}
|
|
3610
|
-
function checkTracesAreContiguous(circuitJson
|
|
3751
|
+
function checkTracesAreContiguous(circuitJson, {
|
|
3752
|
+
connMap,
|
|
3753
|
+
pcbConnectivityMap
|
|
3754
|
+
} = {}) {
|
|
3611
3755
|
const errors = [];
|
|
3612
3756
|
const pcbPorts = circuitJson.filter(
|
|
3613
3757
|
(el) => el.type === "pcb_port"
|
|
@@ -3625,8 +3769,8 @@ function checkTracesAreContiguous(circuitJson) {
|
|
|
3625
3769
|
(el) => el.type === "pcb_plated_hole"
|
|
3626
3770
|
);
|
|
3627
3771
|
const padMap = /* @__PURE__ */ new Map();
|
|
3628
|
-
|
|
3629
|
-
let fullConnectivityMap;
|
|
3772
|
+
pcbConnectivityMap ??= createIndexedPcbConnectivityMap(circuitJson);
|
|
3773
|
+
let fullConnectivityMap = connMap;
|
|
3630
3774
|
let traceWireSegmentsByNetAndLayer;
|
|
3631
3775
|
const getFullConnectivityMap = () => {
|
|
3632
3776
|
fullConnectivityMap ??= getFullConnectivityMapFromCircuitJson8(circuitJson);
|
|
@@ -5206,6 +5350,9 @@ function checkSchematicComponentPortsOutsideBody(circuitJson) {
|
|
|
5206
5350
|
return warnings;
|
|
5207
5351
|
}
|
|
5208
5352
|
|
|
5353
|
+
// lib/run-all-checks.ts
|
|
5354
|
+
import { getFullConnectivityMapFromCircuitJson as getFullConnectivityMapFromCircuitJson15 } from "circuit-json-to-connectivity-map";
|
|
5355
|
+
|
|
5209
5356
|
// lib/check-pcb-bus-length-skew.ts
|
|
5210
5357
|
var checkPcbBusLengthSkew = (circuitJson) => {
|
|
5211
5358
|
const buses = circuitJson.filter(
|
|
@@ -5731,20 +5878,25 @@ async function runAllPinSpecificationChecks(circuitJson) {
|
|
|
5731
5878
|
];
|
|
5732
5879
|
}
|
|
5733
5880
|
async function runAllRoutingChecks(circuitJson) {
|
|
5881
|
+
addStartAndEndPortIdsIfMissing(circuitJson);
|
|
5882
|
+
const connectivity = {
|
|
5883
|
+
connMap: getFullConnectivityMapFromCircuitJson15(circuitJson),
|
|
5884
|
+
pcbConnectivityMap: createIndexedPcbConnectivityMap(circuitJson)
|
|
5885
|
+
};
|
|
5734
5886
|
return [
|
|
5735
|
-
...checkEachPcbPortConnectedToPcbTraces(circuitJson),
|
|
5736
|
-
...checkSourceTracesHavePcbTraces(circuitJson),
|
|
5887
|
+
...checkEachPcbPortConnectedToPcbTraces(circuitJson, connectivity),
|
|
5888
|
+
...checkSourceTracesHavePcbTraces(circuitJson, connectivity),
|
|
5737
5889
|
...checkPcbTraceLengths(circuitJson),
|
|
5738
5890
|
...checkPcbBusLengthSkew(circuitJson),
|
|
5739
5891
|
...checkPcbTraceViaCounts(circuitJson),
|
|
5740
|
-
...checkEachPcbTraceNonOverlapping(circuitJson),
|
|
5741
|
-
...checkCopperPourShorts(circuitJson),
|
|
5742
|
-
...checkPadTraceClearance(circuitJson),
|
|
5743
|
-
...checkViaTraceClearance(circuitJson),
|
|
5744
|
-
...checkViaPadClearance(circuitJson),
|
|
5745
|
-
...checkSameNetViaSpacing(circuitJson),
|
|
5746
|
-
...checkDifferentNetViaSpacing(circuitJson),
|
|
5747
|
-
...checkTracesAreContiguous(circuitJson),
|
|
5892
|
+
...checkEachPcbTraceNonOverlapping(circuitJson, connectivity),
|
|
5893
|
+
...checkCopperPourShorts(circuitJson, connectivity),
|
|
5894
|
+
...checkPadTraceClearance(circuitJson, connectivity),
|
|
5895
|
+
...checkViaTraceClearance(circuitJson, connectivity),
|
|
5896
|
+
...checkViaPadClearance(circuitJson, connectivity),
|
|
5897
|
+
...checkSameNetViaSpacing(circuitJson, connectivity),
|
|
5898
|
+
...checkDifferentNetViaSpacing(circuitJson, connectivity),
|
|
5899
|
+
...checkTracesAreContiguous(circuitJson, connectivity),
|
|
5748
5900
|
...checkPcbTracesOutOfBoard(circuitJson)
|
|
5749
5901
|
];
|
|
5750
5902
|
}
|