@tscircuit/checks 0.0.200 → 0.0.202
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 +6 -6
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as circuit_json from 'circuit-json';
|
|
2
|
-
import { AnyCircuitElement, PcbPlacementError, PcbPortNotConnectedError, PcbTraceError, PcbComponentOutsideBoardError, PcbViaClearanceError, PcbTraceWarning, PcbTraceMissingError, PcbFootprintOverlapError, PcbPadPadClearanceError, PcbCourtyardOverlapError, PcbComponentMissingCourtyardWarning, PcbTraceTooLongError, PcbPadTraceClearanceError, PcbViaTraceClearanceError, SourceComponentMisconfiguredError, SourceComponentPinsUnderspecifiedWarning, SourceNoPowerPinDefinedWarning, SourceNoGroundPinDefinedWarning, SchematicComponentStylingWarning, PcbConnectorNotInAccessibleOrientationWarning, SourceConfusingNetNameWarning, PcbBusLengthSkewError } from 'circuit-json';
|
|
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
3
|
import { ConnectivityMap } from 'circuit-json-to-connectivity-map';
|
|
4
4
|
|
|
5
5
|
/** Detect accidental copper contact, rather than enforcing a clearance margin. */
|
|
@@ -10,7 +10,7 @@ declare function checkEachPcbPortConnectedToPcbTraces(circuitJson: AnyCircuitEle
|
|
|
10
10
|
declare function checkEachPcbTraceNonOverlapping(circuitJson: AnyCircuitElement[], { connMap, minClearance, }?: {
|
|
11
11
|
connMap?: ConnectivityMap;
|
|
12
12
|
minClearance?: number;
|
|
13
|
-
}): PcbTraceError[];
|
|
13
|
+
}): (PcbTraceError | PcbKeepoutOverlapWarning)[];
|
|
14
14
|
|
|
15
15
|
declare class NetManager {
|
|
16
16
|
private networks;
|
|
@@ -44,7 +44,7 @@ declare function checkPcbComponentsOutOfBoard(circuitJson: AnyCircuitElement[]):
|
|
|
44
44
|
*/
|
|
45
45
|
declare function checkPcbComponentOverCutout(circuitJson: AnyCircuitElement[]): PcbPlacementError[];
|
|
46
46
|
|
|
47
|
-
declare function checkPcbCopperOverKeepout(circuitJson: AnyCircuitElement[]): PcbPlacementError[];
|
|
47
|
+
declare function checkPcbCopperOverKeepout(circuitJson: AnyCircuitElement[]): (PcbPlacementError | PcbKeepoutOverlapWarning)[];
|
|
48
48
|
|
|
49
49
|
declare function checkSameNetViaSpacing(circuitJson: AnyCircuitElement[], { connMap, minClearance, }?: {
|
|
50
50
|
connMap?: ConnectivityMap;
|
|
@@ -204,7 +204,7 @@ declare function checkSchematicComponentPortsOutsideBody(circuitJson: AnyCircuit
|
|
|
204
204
|
|
|
205
205
|
declare function runAllPlacementChecks(circuitJson: AnyCircuitElement[], { consolidateOverlaps }?: {
|
|
206
206
|
consolidateOverlaps?: boolean | undefined;
|
|
207
|
-
}): Promise<(circuit_json.PcbPlacementError | circuit_json.PcbComponentOutsideBoardError | PcbComponentOverlapError | circuit_json.PcbPadPadClearanceError | circuit_json.PcbCourtyardOverlapError | circuit_json.PcbComponentMissingCourtyardWarning | circuit_json.PcbConnectorNotInAccessibleOrientationWarning)[]>;
|
|
207
|
+
}): Promise<(circuit_json.PcbPlacementError | circuit_json.PcbKeepoutOverlapWarning | circuit_json.PcbComponentOutsideBoardError | PcbComponentOverlapError | circuit_json.PcbPadPadClearanceError | circuit_json.PcbCourtyardOverlapError | circuit_json.PcbComponentMissingCourtyardWarning | circuit_json.PcbConnectorNotInAccessibleOrientationWarning)[]>;
|
|
208
208
|
declare function runAllNetlistChecks(circuitJson: AnyCircuitElement[]): Promise<({
|
|
209
209
|
type: "source_pin_must_be_connected_error";
|
|
210
210
|
source_pin_must_be_connected_error_id: string;
|
|
@@ -216,8 +216,8 @@ declare function runAllNetlistChecks(circuitJson: AnyCircuitElement[]): Promise<
|
|
|
216
216
|
} | circuit_json.SourceComponentMisconfiguredError | circuit_json.SourceConfusingNetNameWarning)[]>;
|
|
217
217
|
declare function runAllSchematicChecks(circuitJson: AnyCircuitElement[]): Promise<circuit_json.SchematicComponentStylingWarning[]>;
|
|
218
218
|
declare function runAllPinSpecificationChecks(circuitJson: AnyCircuitElement[]): Promise<(circuit_json.SourceComponentPinsUnderspecifiedWarning | circuit_json.SourceNoPowerPinDefinedWarning | circuit_json.SourceNoGroundPinDefinedWarning)[]>;
|
|
219
|
-
declare function runAllRoutingChecks(circuitJson: AnyCircuitElement[]): Promise<(circuit_json.PcbPlacementError | circuit_json.PcbPortNotConnectedError | circuit_json.PcbTraceError | circuit_json.PcbViaClearanceError | circuit_json.PcbTraceMissingError | circuit_json.PcbPadPadClearanceError | circuit_json.PcbTraceTooLongError | circuit_json.PcbPadTraceClearanceError | circuit_json.PcbViaTraceClearanceError | circuit_json.PcbBusLengthSkewError)[]>;
|
|
220
|
-
declare function runAllChecks(circuitJson: AnyCircuitElement[]): Promise<(circuit_json.PcbPlacementError | circuit_json.PcbPortNotConnectedError | circuit_json.PcbTraceError | circuit_json.PcbComponentOutsideBoardError | circuit_json.PcbViaClearanceError | circuit_json.PcbTraceMissingError | PcbComponentOverlapError | circuit_json.PcbPadPadClearanceError | circuit_json.PcbCourtyardOverlapError | circuit_json.PcbComponentMissingCourtyardWarning | circuit_json.PcbTraceTooLongError | circuit_json.PcbPadTraceClearanceError | circuit_json.PcbViaTraceClearanceError | {
|
|
219
|
+
declare function runAllRoutingChecks(circuitJson: AnyCircuitElement[]): Promise<(circuit_json.PcbPlacementError | circuit_json.PcbPortNotConnectedError | circuit_json.PcbTraceError | circuit_json.PcbKeepoutOverlapWarning | circuit_json.PcbViaClearanceError | circuit_json.PcbTraceMissingError | circuit_json.PcbPadPadClearanceError | circuit_json.PcbTraceTooLongError | circuit_json.PcbPadTraceClearanceError | circuit_json.PcbViaTraceClearanceError | circuit_json.PcbBusLengthSkewError)[]>;
|
|
220
|
+
declare function runAllChecks(circuitJson: AnyCircuitElement[]): Promise<(circuit_json.PcbPlacementError | circuit_json.PcbPortNotConnectedError | circuit_json.PcbTraceError | circuit_json.PcbKeepoutOverlapWarning | circuit_json.PcbComponentOutsideBoardError | circuit_json.PcbViaClearanceError | circuit_json.PcbTraceMissingError | PcbComponentOverlapError | circuit_json.PcbPadPadClearanceError | circuit_json.PcbCourtyardOverlapError | circuit_json.PcbComponentMissingCourtyardWarning | circuit_json.PcbTraceTooLongError | circuit_json.PcbPadTraceClearanceError | circuit_json.PcbViaTraceClearanceError | {
|
|
221
221
|
type: "source_pin_must_be_connected_error";
|
|
222
222
|
source_pin_must_be_connected_error_id: string;
|
|
223
223
|
error_type: "source_pin_must_be_connected_error";
|
package/dist/index.js
CHANGED
|
@@ -2431,6 +2431,22 @@ function checkEachPcbTraceNonOverlapping(circuitJson, {
|
|
|
2431
2431
|
const pcb_trace_error_id = `overlap_${segmentA.pcb_trace_id}_${primaryObjId}`;
|
|
2432
2432
|
if (errorIds.has(pcb_trace_error_id)) continue;
|
|
2433
2433
|
errorIds.add(pcb_trace_error_id);
|
|
2434
|
+
if (obj.type === "pcb_keepout" && obj.warning_only) {
|
|
2435
|
+
errors.push({
|
|
2436
|
+
type: "pcb_keepout_overlap_warning",
|
|
2437
|
+
warning_type: "pcb_keepout_overlap_warning",
|
|
2438
|
+
pcb_keepout_overlap_warning_id: `pcb_keepout_overlap_warning_${pcb_trace_error_id}`,
|
|
2439
|
+
pcb_keepout_id: obj.pcb_keepout_id,
|
|
2440
|
+
pcb_trace_ids: [segmentA.pcb_trace_id],
|
|
2441
|
+
message: `PCB trace ${getReadableName(segmentA.pcb_trace_id)} violates advisory PCB keepout "${obj.description ?? obj.pcb_keepout_id}"`,
|
|
2442
|
+
center: getClosestPointBetweenSegmentAndBounds(
|
|
2443
|
+
segmentA,
|
|
2444
|
+
getCollidableBounds(obj)
|
|
2445
|
+
),
|
|
2446
|
+
subcircuit_id: segmentA._pcbTrace.subcircuit_id ?? obj.subcircuit_id
|
|
2447
|
+
});
|
|
2448
|
+
continue;
|
|
2449
|
+
}
|
|
2434
2450
|
errors.push({
|
|
2435
2451
|
type: "pcb_trace_error",
|
|
2436
2452
|
error_type: "pcb_trace_error",
|
|
@@ -3001,6 +3017,30 @@ function checkPcbCopperOverKeepout(circuitJson) {
|
|
|
3001
3017
|
if (getPadToPadGap(copperElement, keepout) > EPSILON) continue;
|
|
3002
3018
|
const ownerId = getErrorOwnerId(copperElement);
|
|
3003
3019
|
const errorId = `copper_over_keepout_${ownerId}_${keepout.pcb_keepout_id}`;
|
|
3020
|
+
if (keepout.warning_only) {
|
|
3021
|
+
const copperIdField = copperElement.type === "pcb_smtpad" ? "pcb_smtpad_ids" : copperElement.type === "pcb_plated_hole" ? "pcb_plated_hole_ids" : "pcb_via_ids";
|
|
3022
|
+
const existing = errors.get(errorId);
|
|
3023
|
+
if (existing?.type === "pcb_keepout_overlap_warning") {
|
|
3024
|
+
existing[copperIdField] = Array.from(
|
|
3025
|
+
/* @__PURE__ */ new Set([
|
|
3026
|
+
...existing[copperIdField] ?? [],
|
|
3027
|
+
getPrimaryId3(copperElement)
|
|
3028
|
+
])
|
|
3029
|
+
);
|
|
3030
|
+
} else {
|
|
3031
|
+
errors.set(errorId, {
|
|
3032
|
+
type: "pcb_keepout_overlap_warning",
|
|
3033
|
+
warning_type: "pcb_keepout_overlap_warning",
|
|
3034
|
+
pcb_keepout_overlap_warning_id: `pcb_keepout_overlap_warning_${errorId}`,
|
|
3035
|
+
pcb_keepout_id: keepout.pcb_keepout_id,
|
|
3036
|
+
message: `Copper for ${getReadableCopperName(circuitJson, copperElement)} overlaps advisory PCB keepout "${keepout.description ?? keepout.pcb_keepout_id}"`,
|
|
3037
|
+
...copperComponentId ? { pcb_component_ids: [copperComponentId] } : {},
|
|
3038
|
+
[copperIdField]: [getPrimaryId3(copperElement)],
|
|
3039
|
+
subcircuit_id: copperElement.subcircuit_id ?? keepout.subcircuit_id
|
|
3040
|
+
});
|
|
3041
|
+
}
|
|
3042
|
+
continue;
|
|
3043
|
+
}
|
|
3004
3044
|
if (errors.has(errorId)) continue;
|
|
3005
3045
|
errors.set(errorId, {
|
|
3006
3046
|
type: "pcb_placement_error",
|
|
@@ -3983,6 +4023,11 @@ var formatOverlapElementDescription = (circuitJson, element) => {
|
|
|
3983
4023
|
};
|
|
3984
4024
|
function checkPcbComponentOverlap(circuitJson) {
|
|
3985
4025
|
const errors = [];
|
|
4026
|
+
const doNotPlaceComponentIds = new Set(
|
|
4027
|
+
circuitJson.flatMap(
|
|
4028
|
+
(element) => element.type === "pcb_component" && element.do_not_place ? [element.pcb_component_id] : []
|
|
4029
|
+
)
|
|
4030
|
+
);
|
|
3986
4031
|
const connMap = getFullConnectivityMapFromCircuitJson9(circuitJson);
|
|
3987
4032
|
const smtPads = cju6(circuitJson).pcb_smtpad.list();
|
|
3988
4033
|
const platedHoles = cju6(circuitJson).pcb_plated_hole.list();
|
|
@@ -4038,6 +4083,7 @@ function checkPcbComponentOverlap(circuitJson) {
|
|
|
4038
4083
|
for (let j = i + 1; j < componentsWithElements.length; j++) {
|
|
4039
4084
|
const comp1 = componentsWithElements[i];
|
|
4040
4085
|
const comp2 = componentsWithElements[j];
|
|
4086
|
+
const pairIncludesDoNotPlaceComponent = doNotPlaceComponentIds.has(comp1.component_id) || doNotPlaceComponentIds.has(comp2.component_id);
|
|
4041
4087
|
if (!comp1.bounds || !comp2.bounds) {
|
|
4042
4088
|
continue;
|
|
4043
4089
|
}
|
|
@@ -4048,6 +4094,9 @@ function checkPcbComponentOverlap(circuitJson) {
|
|
|
4048
4094
|
for (const elem2 of comp2.elements) {
|
|
4049
4095
|
const id1 = getPrimaryId5(elem1);
|
|
4050
4096
|
const id2 = getPrimaryId5(elem2);
|
|
4097
|
+
if (pairIncludesDoNotPlaceComponent && (isCourtyardElement2(elem1) || isCourtyardElement2(elem2))) {
|
|
4098
|
+
continue;
|
|
4099
|
+
}
|
|
4051
4100
|
if ((isCourtyardElement2(elem1) || isCourtyardElement2(elem2)) && !isHoleElement(elem1) && !isHoleElement(elem2)) {
|
|
4052
4101
|
continue;
|
|
4053
4102
|
}
|