@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 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
  }