@tscircuit/core 0.0.2005 → 0.0.2007

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
@@ -63,6 +63,8 @@ type Obstacle = {
63
63
  componentId?: string;
64
64
  /** True when this obstacle replaces one completed fanout source footprint. */
65
65
  isFanoutSourceKeepout?: boolean;
66
+ /** Non-plated hole geometry, with no electrical connections. */
67
+ isNonPlatedHole?: boolean;
66
68
  /** Circuit JSON provenance carried through SRJ but forbidden for routing. */
67
69
  circuitJsonMetadata?: CircuitJsonMetadata;
68
70
  shape?: "circle";
@@ -224,6 +226,7 @@ type SimpleRouteJson = Omit<SimpleRouteJson$1, "connections" | "traces" | "obsta
224
226
  min_via_pad_diameter?: number;
225
227
  defaultObstacleMargin?: number;
226
228
  minTraceToPadEdgeClearance?: number;
229
+ minTraceToHoleEdgeClearance?: number;
227
230
  minViaEdgeToPadEdgeClearance?: number;
228
231
  minViaHoleEdgeToViaHoleEdgeClearance?: number;
229
232
  minPlatedHoleDrillEdgeToDrillEdgeClearance?: number;
@@ -381,9 +384,9 @@ interface IIsolatedCircuit {
381
384
  interface IRootCircuit extends IIsolatedCircuit {
382
385
  }
383
386
 
384
- declare const orderedRenderPhases: readonly ["ReactSubtreesRender", "RenderIsolatedSubcircuits", "InflateSubcircuitCircuitJson", "SourceNameDuplicateComponentRemoval", "PcbFootprintStringRender", "FetchPartFootprint", "ResolveFootprintPinLabels", "InitializePortsFromChildren", "CreateNetsFromProps", "AssignFallbackProps", "CreateTracesFromProps", "CreateTracesFromNetLabels", "CreateTraceHintsFromProps", "CreateAutoplacedBreakoutPoints", "SourceGroupRender", "AssignNameToUnnamedComponents", "SourceRender", "CheckRefDesConvention", "SourceComponentPropertyValidation", "SourceParentAttachment", "PortMatching", "OptimizeSelectorCache", "SourceTraceRender", "SourceAddConnectivityMapKey", "SourceDesignRuleChecks", "SimulationRender", "SchematicComponentRender", "SchematicPortRender", "SymbolContainerRender", "SchematicPrimitiveRender", "SchematicSymbolResize", "SchematicComponentSizeCalculation", "SchematicLayout", "SchematicSectionRender", "SchematicTraceRender", "SchematicSheetRender", "SchematicReplaceNetLabelsWithSymbols", "SchematicLabelNetsWithConflictingNames", "PanelBoardLayout", "ValidatePcbCoordinates", "PcbComponentRender", "PcbPrimitiveRender", "PcbFootprintLayout", "PcbPortRender", "PcbPortAttachment", "PcbComponentSizeCalculation", "PcbComponentAnchorAlignment", "PcbCalcPlacementResolution", "PcbLayout", "PcbBoardAutoSize", "PanelLayout", "PcbFlexRender", "PcbAutoplaceBreakoutPoints", "PcbTraceHintRender", "PcbManualTraceRender", "PcbPlacementDesignRuleChecks", "PcbTraceRender", "PcbRouteNetIslands", "PcbCopperPourRender", "PcbViaStitchRender", "PcbCopperPourCleanup", "PcbDesignRuleChecks", "SilkscreenOverlapAdjustment", "CadModelRender", "PartsEngineRender", "PartOrientationAnalysis", "SupplierFootprintMismatchWarning", "SimulationSpiceEngineRender"];
387
+ declare const orderedRenderPhases: readonly ["ReactSubtreesRender", "RenderIsolatedSubcircuits", "InflateSubcircuitCircuitJson", "SourceNameDuplicateComponentRemoval", "PcbFootprintStringRender", "FetchPartFootprint", "ResolveFootprintPinLabels", "InitializePortsFromChildren", "CreateNetsFromProps", "AssignFallbackProps", "CreateTracesFromProps", "CreateTracesFromNetLabels", "CreateTraceHintsFromProps", "CreateAutoplacedBreakoutPoints", "SourceGroupRender", "AssignNameToUnnamedComponents", "SourceRender", "CheckRefDesConvention", "SourceComponentPropertyValidation", "SourceParentAttachment", "PortMatching", "OptimizeSelectorCache", "SourceTraceRender", "SourceAddConnectivityMapKey", "SourceDesignRuleChecks", "SimulationRender", "SchematicComponentRender", "SchematicPortRender", "SymbolContainerRender", "SchematicPrimitiveRender", "SchematicSymbolResize", "SchematicComponentSizeCalculation", "SchematicLayout", "SchematicSectionRender", "SchematicTraceRender", "SchematicSheetRender", "SchematicReplaceNetLabelsWithSymbols", "SchematicLabelNetsWithConflictingNames", "PanelBoardLayout", "ValidatePcbCoordinates", "PcbComponentRender", "PcbPrimitiveRender", "PcbFootprintLayout", "PcbPortRender", "PcbPortAttachment", "PcbComponentSizeCalculation", "PcbComponentAnchorAlignment", "PcbCalcPlacementResolution", "PcbLayout", "PcbBoardAutoSize", "PanelLayout", "PcbFlexRender", "PcbAutoplaceBreakoutPoints", "PcbTraceHintRender", "PcbManualTraceRender", "PcbPlacementDesignRuleChecks", "PcbTraceRender", "PcbRouteNetIslands", "PcbTraceTeardropRender", "PcbCopperPourRender", "PcbViaStitchRender", "PcbCopperPourCleanup", "PcbDesignRuleChecks", "SilkscreenOverlapAdjustment", "CadModelRender", "PartsEngineRender", "PartOrientationAnalysis", "SupplierFootprintMismatchWarning", "SimulationSpiceEngineRender"];
385
388
  type RenderPhase = (typeof orderedRenderPhases)[number];
386
- declare const renderPhaseIndexMap: Map<"ReactSubtreesRender" | "RenderIsolatedSubcircuits" | "InflateSubcircuitCircuitJson" | "SourceNameDuplicateComponentRemoval" | "PcbFootprintStringRender" | "FetchPartFootprint" | "ResolveFootprintPinLabels" | "InitializePortsFromChildren" | "CreateNetsFromProps" | "AssignFallbackProps" | "CreateTracesFromProps" | "CreateTracesFromNetLabels" | "CreateTraceHintsFromProps" | "CreateAutoplacedBreakoutPoints" | "SourceGroupRender" | "AssignNameToUnnamedComponents" | "SourceRender" | "CheckRefDesConvention" | "SourceComponentPropertyValidation" | "SourceParentAttachment" | "PortMatching" | "OptimizeSelectorCache" | "SourceTraceRender" | "SourceAddConnectivityMapKey" | "SourceDesignRuleChecks" | "SimulationRender" | "SchematicComponentRender" | "SchematicPortRender" | "SymbolContainerRender" | "SchematicPrimitiveRender" | "SchematicSymbolResize" | "SchematicComponentSizeCalculation" | "SchematicLayout" | "SchematicSectionRender" | "SchematicTraceRender" | "SchematicSheetRender" | "SchematicReplaceNetLabelsWithSymbols" | "SchematicLabelNetsWithConflictingNames" | "PanelBoardLayout" | "ValidatePcbCoordinates" | "PcbComponentRender" | "PcbPrimitiveRender" | "PcbFootprintLayout" | "PcbPortRender" | "PcbPortAttachment" | "PcbComponentSizeCalculation" | "PcbComponentAnchorAlignment" | "PcbCalcPlacementResolution" | "PcbLayout" | "PcbBoardAutoSize" | "PanelLayout" | "PcbFlexRender" | "PcbAutoplaceBreakoutPoints" | "PcbTraceHintRender" | "PcbManualTraceRender" | "PcbPlacementDesignRuleChecks" | "PcbTraceRender" | "PcbRouteNetIslands" | "PcbCopperPourRender" | "PcbViaStitchRender" | "PcbCopperPourCleanup" | "PcbDesignRuleChecks" | "SilkscreenOverlapAdjustment" | "CadModelRender" | "PartsEngineRender" | "PartOrientationAnalysis" | "SupplierFootprintMismatchWarning" | "SimulationSpiceEngineRender", number>;
389
+ declare const renderPhaseIndexMap: Map<"ReactSubtreesRender" | "RenderIsolatedSubcircuits" | "InflateSubcircuitCircuitJson" | "SourceNameDuplicateComponentRemoval" | "PcbFootprintStringRender" | "FetchPartFootprint" | "ResolveFootprintPinLabels" | "InitializePortsFromChildren" | "CreateNetsFromProps" | "AssignFallbackProps" | "CreateTracesFromProps" | "CreateTracesFromNetLabels" | "CreateTraceHintsFromProps" | "CreateAutoplacedBreakoutPoints" | "SourceGroupRender" | "AssignNameToUnnamedComponents" | "SourceRender" | "CheckRefDesConvention" | "SourceComponentPropertyValidation" | "SourceParentAttachment" | "PortMatching" | "OptimizeSelectorCache" | "SourceTraceRender" | "SourceAddConnectivityMapKey" | "SourceDesignRuleChecks" | "SimulationRender" | "SchematicComponentRender" | "SchematicPortRender" | "SymbolContainerRender" | "SchematicPrimitiveRender" | "SchematicSymbolResize" | "SchematicComponentSizeCalculation" | "SchematicLayout" | "SchematicSectionRender" | "SchematicTraceRender" | "SchematicSheetRender" | "SchematicReplaceNetLabelsWithSymbols" | "SchematicLabelNetsWithConflictingNames" | "PanelBoardLayout" | "ValidatePcbCoordinates" | "PcbComponentRender" | "PcbPrimitiveRender" | "PcbFootprintLayout" | "PcbPortRender" | "PcbPortAttachment" | "PcbComponentSizeCalculation" | "PcbComponentAnchorAlignment" | "PcbCalcPlacementResolution" | "PcbLayout" | "PcbBoardAutoSize" | "PanelLayout" | "PcbFlexRender" | "PcbAutoplaceBreakoutPoints" | "PcbTraceHintRender" | "PcbManualTraceRender" | "PcbPlacementDesignRuleChecks" | "PcbTraceRender" | "PcbRouteNetIslands" | "PcbTraceTeardropRender" | "PcbCopperPourRender" | "PcbViaStitchRender" | "PcbCopperPourCleanup" | "PcbDesignRuleChecks" | "SilkscreenOverlapAdjustment" | "CadModelRender" | "PartsEngineRender" | "PartOrientationAnalysis" | "SupplierFootprintMismatchWarning" | "SimulationSpiceEngineRender", number>;
387
390
  type RenderPhaseFn<K extends RenderPhase = RenderPhase> = `doInitial${K}` | `update${K}` | `remove${K}`;
388
391
  type RenderPhaseStates = Record<RenderPhase, {
389
392
  initialized: boolean;
@@ -737,6 +740,7 @@ declare class AutoroutingPhase extends PrimitiveComponent<typeof autoroutingPhas
737
740
  minViaEdgeToPadEdgeClearance: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
738
741
  minPlatedHoleDrillEdgeToDrillEdgeClearance: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
739
742
  minTraceToPadEdgeClearance: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
743
+ minTraceToHoleEdgeClearance: zod.ZodOptional<zod.ZodEffects<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>, number, string | number>>;
740
744
  minPadEdgeToPadEdgeClearance: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
741
745
  minBoardEdgeClearance: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
742
746
  minViaHoleDiameter: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
@@ -906,6 +910,7 @@ declare class AutoroutingPhase extends PrimitiveComponent<typeof autoroutingPhas
906
910
  minViaEdgeToPadEdgeClearance?: number | undefined;
907
911
  minPlatedHoleDrillEdgeToDrillEdgeClearance?: number | undefined;
908
912
  minTraceToPadEdgeClearance?: number | undefined;
913
+ minTraceToHoleEdgeClearance?: number | undefined;
909
914
  minPadEdgeToPadEdgeClearance?: number | undefined;
910
915
  minBoardEdgeClearance?: number | undefined;
911
916
  minViaHoleDiameter?: number | undefined;
@@ -961,6 +966,7 @@ declare class AutoroutingPhase extends PrimitiveComponent<typeof autoroutingPhas
961
966
  minViaEdgeToPadEdgeClearance?: string | number | undefined;
962
967
  minPlatedHoleDrillEdgeToDrillEdgeClearance?: string | number | undefined;
963
968
  minTraceToPadEdgeClearance?: string | number | undefined;
969
+ minTraceToHoleEdgeClearance?: string | number | undefined;
964
970
  minPadEdgeToPadEdgeClearance?: string | number | undefined;
965
971
  minBoardEdgeClearance?: string | number | undefined;
966
972
  minViaHoleDiameter?: string | number | undefined;
@@ -1026,6 +1032,7 @@ declare class AutoroutingPhase extends PrimitiveComponent<typeof autoroutingPhas
1026
1032
  minViaEdgeToPadEdgeClearance?: number | undefined;
1027
1033
  minPlatedHoleDrillEdgeToDrillEdgeClearance?: number | undefined;
1028
1034
  minTraceToPadEdgeClearance?: number | undefined;
1035
+ minTraceToHoleEdgeClearance?: number | undefined;
1029
1036
  minPadEdgeToPadEdgeClearance?: number | undefined;
1030
1037
  minBoardEdgeClearance?: number | undefined;
1031
1038
  minViaHoleDiameter?: number | undefined;
@@ -1081,6 +1088,7 @@ declare class AutoroutingPhase extends PrimitiveComponent<typeof autoroutingPhas
1081
1088
  minViaEdgeToPadEdgeClearance?: string | number | undefined;
1082
1089
  minPlatedHoleDrillEdgeToDrillEdgeClearance?: string | number | undefined;
1083
1090
  minTraceToPadEdgeClearance?: string | number | undefined;
1091
+ minTraceToHoleEdgeClearance?: string | number | undefined;
1084
1092
  minPadEdgeToPadEdgeClearance?: string | number | undefined;
1085
1093
  minBoardEdgeClearance?: string | number | undefined;
1086
1094
  minViaHoleDiameter?: string | number | undefined;
@@ -2038,6 +2046,8 @@ declare class Trace extends PrimitiveComponent<typeof traceProps> implements Tra
2038
2046
  doInitialSourceTraceRender(): void;
2039
2047
  _insertErrorIfTraceIsOutsideBoard(mergedRoute: PcbTraceRoutePoint[], ports: Port[]): void;
2040
2048
  doInitialPcbManualTraceRender(): void;
2049
+ doInitialPcbTraceTeardropRender(): void;
2050
+ updatePcbTraceTeardropRender(): void;
2041
2051
  doInitialPcbTraceRender(): void;
2042
2052
  _doInitialSchematicTraceRenderWithDisplayLabel(): void;
2043
2053
  _isSymbolToChipConnection(): boolean | undefined;
@@ -2113,6 +2123,7 @@ interface RoutingPhaseDrcTolerances {
2113
2123
  minViaHoleEdgeToViaHoleEdgeClearance?: number;
2114
2124
  minPlatedHoleDrillEdgeToDrillEdgeClearance?: number;
2115
2125
  minTraceToPadEdgeClearance?: number;
2126
+ minTraceToHoleEdgeClearance?: number;
2116
2127
  minPadEdgeToPadEdgeClearance?: number;
2117
2128
  minBoardEdgeClearance?: number;
2118
2129
  minViaEdgeToPadEdgeClearance?: number;
@@ -5730,6 +5741,7 @@ declare class Board extends Group<typeof boardProps> implements BoardI, Subcircu
5730
5741
  minViaEdgeToPadEdgeClearance: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
5731
5742
  minPlatedHoleDrillEdgeToDrillEdgeClearance: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
5732
5743
  minTraceToPadEdgeClearance: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
5744
+ minTraceToHoleEdgeClearance: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>, number, string | number>>;
5733
5745
  minPadEdgeToPadEdgeClearance: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
5734
5746
  minBoardEdgeClearance: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
5735
5747
  minViaHoleDiameter: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
@@ -6260,6 +6272,7 @@ declare class Board extends Group<typeof boardProps> implements BoardI, Subcircu
6260
6272
  minViaEdgeToPadEdgeClearance?: number | undefined;
6261
6273
  minPlatedHoleDrillEdgeToDrillEdgeClearance?: number | undefined;
6262
6274
  minTraceToPadEdgeClearance?: number | undefined;
6275
+ minTraceToHoleEdgeClearance?: number | undefined;
6263
6276
  minPadEdgeToPadEdgeClearance?: number | undefined;
6264
6277
  minBoardEdgeClearance?: number | undefined;
6265
6278
  minViaHoleDiameter?: number | undefined;
@@ -6607,6 +6620,7 @@ declare class Board extends Group<typeof boardProps> implements BoardI, Subcircu
6607
6620
  minViaEdgeToPadEdgeClearance?: string | number | undefined;
6608
6621
  minPlatedHoleDrillEdgeToDrillEdgeClearance?: string | number | undefined;
6609
6622
  minTraceToPadEdgeClearance?: string | number | undefined;
6623
+ minTraceToHoleEdgeClearance?: string | number | undefined;
6610
6624
  minPadEdgeToPadEdgeClearance?: string | number | undefined;
6611
6625
  minBoardEdgeClearance?: string | number | undefined;
6612
6626
  minViaHoleDiameter?: string | number | undefined;
@@ -7407,6 +7421,7 @@ declare class MountedBoard extends Subcircuit implements BoardI {
7407
7421
  minViaEdgeToPadEdgeClearance: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
7408
7422
  minPlatedHoleDrillEdgeToDrillEdgeClearance: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
7409
7423
  minTraceToPadEdgeClearance: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
7424
+ minTraceToHoleEdgeClearance: zod.ZodOptional<zod.ZodEffects<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>, number, string | number>>;
7410
7425
  minPadEdgeToPadEdgeClearance: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
7411
7426
  minBoardEdgeClearance: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
7412
7427
  minViaHoleDiameter: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
@@ -7953,6 +7968,7 @@ declare class MountedBoard extends Subcircuit implements BoardI {
7953
7968
  minViaEdgeToPadEdgeClearance?: number | undefined;
7954
7969
  minPlatedHoleDrillEdgeToDrillEdgeClearance?: number | undefined;
7955
7970
  minTraceToPadEdgeClearance?: number | undefined;
7971
+ minTraceToHoleEdgeClearance?: number | undefined;
7956
7972
  minPadEdgeToPadEdgeClearance?: number | undefined;
7957
7973
  minBoardEdgeClearance?: number | undefined;
7958
7974
  minViaHoleDiameter?: number | undefined;
@@ -8314,6 +8330,7 @@ declare class MountedBoard extends Subcircuit implements BoardI {
8314
8330
  minViaEdgeToPadEdgeClearance?: string | number | undefined;
8315
8331
  minPlatedHoleDrillEdgeToDrillEdgeClearance?: string | number | undefined;
8316
8332
  minTraceToPadEdgeClearance?: string | number | undefined;
8333
+ minTraceToHoleEdgeClearance?: string | number | undefined;
8317
8334
  minPadEdgeToPadEdgeClearance?: string | number | undefined;
8318
8335
  minBoardEdgeClearance?: string | number | undefined;
8319
8336
  minViaHoleDiameter?: string | number | undefined;
@@ -97054,6 +97071,7 @@ declare class Breakout extends Group<typeof breakoutProps> {
97054
97071
  minViaEdgeToPadEdgeClearance: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
97055
97072
  minPlatedHoleDrillEdgeToDrillEdgeClearance: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
97056
97073
  minTraceToPadEdgeClearance: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
97074
+ minTraceToHoleEdgeClearance: zod.ZodOptional<zod.ZodEffects<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>, number, string | number>>;
97057
97075
  minPadEdgeToPadEdgeClearance: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
97058
97076
  minBoardEdgeClearance: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
97059
97077
  minViaHoleDiameter: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
@@ -97655,6 +97673,7 @@ declare class Breakout extends Group<typeof breakoutProps> {
97655
97673
  minViaEdgeToPadEdgeClearance?: number | undefined;
97656
97674
  minPlatedHoleDrillEdgeToDrillEdgeClearance?: number | undefined;
97657
97675
  minTraceToPadEdgeClearance?: number | undefined;
97676
+ minTraceToHoleEdgeClearance?: number | undefined;
97658
97677
  minPadEdgeToPadEdgeClearance?: number | undefined;
97659
97678
  minBoardEdgeClearance?: number | undefined;
97660
97679
  minViaHoleDiameter?: number | undefined;
@@ -98006,6 +98025,7 @@ declare class Breakout extends Group<typeof breakoutProps> {
98006
98025
  minViaEdgeToPadEdgeClearance?: string | number | undefined;
98007
98026
  minPlatedHoleDrillEdgeToDrillEdgeClearance?: string | number | undefined;
98008
98027
  minTraceToPadEdgeClearance?: string | number | undefined;
98028
+ minTraceToHoleEdgeClearance?: string | number | undefined;
98009
98029
  minPadEdgeToPadEdgeClearance?: string | number | undefined;
98010
98030
  minBoardEdgeClearance?: string | number | undefined;
98011
98031
  minViaHoleDiameter?: string | number | undefined;
@@ -196001,13 +196021,14 @@ type FanoutPourNetMap = Readonly<Record<string, string | readonly string[]>>;
196001
196021
  /**
196002
196022
  * This function can only be called in the PcbTraceRender phase or later
196003
196023
  */
196004
- declare const getSimpleRouteJsonFromCircuitJson: ({ db, circuitJson, subcircuit_id, minTraceWidth, minTraceToPadEdgeClearance, minViaEdgeToPadEdgeClearance, minViaHoleEdgeToViaHoleEdgeClearance, minPlatedHoleDrillEdgeToDrillEdgeClearance, minPadEdgeToPadEdgeClearance, minBoardEdgeClearance, minViaHoleDiameter, minViaPadDiameter, nominalTraceWidth, subcircuitComponent, routingPcbGroupId, fanoutPourNetMap, ignoreExistingTopLevelPcbRouteState, }: {
196024
+ declare const getSimpleRouteJsonFromCircuitJson: ({ db, circuitJson, subcircuit_id, minTraceWidth, minTraceToPadEdgeClearance, minTraceToHoleEdgeClearance, minViaEdgeToPadEdgeClearance, minViaHoleEdgeToViaHoleEdgeClearance, minPlatedHoleDrillEdgeToDrillEdgeClearance, minPadEdgeToPadEdgeClearance, minBoardEdgeClearance, minViaHoleDiameter, minViaPadDiameter, nominalTraceWidth, subcircuitComponent, routingPcbGroupId, fanoutPourNetMap, ignoreExistingTopLevelPcbRouteState, }: {
196005
196025
  db?: CircuitJsonUtilObjects;
196006
196026
  circuitJson?: AnyCircuitElement[];
196007
196027
  subcircuit_id?: string | null;
196008
196028
  minTraceWidth?: number;
196009
196029
  nominalTraceWidth?: number;
196010
196030
  minTraceToPadEdgeClearance?: number;
196031
+ minTraceToHoleEdgeClearance?: number;
196011
196032
  minViaEdgeToPadEdgeClearance?: number;
196012
196033
  minViaHoleEdgeToViaHoleEdgeClearance?: number;
196013
196034
  minPlatedHoleDrillEdgeToDrillEdgeClearance?: number;
package/dist/index.js CHANGED
@@ -482,6 +482,10 @@ var getRoutePointPositions = (point6) => {
482
482
  // lib/utils/reverse-pcb-trace-route.ts
483
483
  var reversePcbTraceRoute = (route, routeThicknessMode = "constant") => {
484
484
  const reversedRoute = route.slice().reverse().map((point6) => {
485
+ if (point6.route_type === "wire") {
486
+ const { start_width, end_width, width_interpolation_mode, ...wire } = point6;
487
+ return wire;
488
+ }
485
489
  if (point6.route_type !== "through_pad") return { ...point6 };
486
490
  return {
487
491
  ...point6,
@@ -491,39 +495,54 @@ var reversePcbTraceRoute = (route, routeThicknessMode = "constant") => {
491
495
  end_layer: point6.start_layer
492
496
  };
493
497
  });
494
- if (routeThicknessMode === "interpolated") return reversedRoute;
495
- for (let reversedIndex = 0; reversedIndex < reversedRoute.length - 1; reversedIndex++) {
496
- const reversedStart = reversedRoute[reversedIndex];
497
- const reversedEnd = reversedRoute[reversedIndex + 1];
498
- if (reversedStart?.route_type !== "wire" || reversedEnd?.route_type !== "wire" || reversedStart.layer !== reversedEnd.layer) {
499
- continue;
500
- }
501
- const originalSegmentStart = route[route.length - reversedIndex - 2];
502
- if (originalSegmentStart?.route_type === "wire") {
503
- reversedStart.width = originalSegmentStart.width;
504
- }
505
- }
506
- for (let reversedIndex = 0; reversedIndex < reversedRoute.length; reversedIndex++) {
507
- const reversedPoint = reversedRoute[reversedIndex];
508
- if (reversedPoint?.route_type !== "wire") continue;
509
- const nextReversedPoint = reversedRoute[reversedIndex + 1];
510
- if (nextReversedPoint?.route_type === "wire" && nextReversedPoint.layer === reversedPoint.layer) {
511
- continue;
512
- }
513
- let originalRunEndIndex = route.length - reversedIndex - 1;
514
- while (originalRunEndIndex < route.length - 1) {
515
- const originalRunPoint = route[originalRunEndIndex];
516
- const nextOriginalRunPoint = route[originalRunEndIndex + 1];
517
- if (originalRunPoint?.route_type !== "wire" || nextOriginalRunPoint?.route_type !== "wire" || originalRunPoint.layer !== nextOriginalRunPoint.layer) {
518
- break;
498
+ if (routeThicknessMode === "constant") {
499
+ for (let reversedIndex = 0; reversedIndex < reversedRoute.length - 1; reversedIndex++) {
500
+ const reversedStart = reversedRoute[reversedIndex];
501
+ const reversedEnd = reversedRoute[reversedIndex + 1];
502
+ if (reversedStart?.route_type !== "wire" || reversedEnd?.route_type !== "wire" || reversedStart.layer !== reversedEnd.layer) {
503
+ continue;
504
+ }
505
+ const originalSegmentStart = route[route.length - reversedIndex - 2];
506
+ if (originalSegmentStart?.route_type === "wire") {
507
+ reversedStart.width = originalSegmentStart.width;
519
508
  }
520
- originalRunEndIndex++;
521
509
  }
522
- const originalRunEnd = route[originalRunEndIndex];
523
- if (originalRunEnd?.route_type === "wire") {
524
- reversedPoint.width = originalRunEnd.width;
510
+ for (let reversedIndex = 0; reversedIndex < reversedRoute.length; reversedIndex++) {
511
+ const reversedPoint = reversedRoute[reversedIndex];
512
+ if (reversedPoint?.route_type !== "wire") continue;
513
+ const nextReversedPoint = reversedRoute[reversedIndex + 1];
514
+ if (nextReversedPoint?.route_type === "wire" && nextReversedPoint.layer === reversedPoint.layer) {
515
+ continue;
516
+ }
517
+ let originalRunEndIndex = route.length - reversedIndex - 1;
518
+ while (originalRunEndIndex < route.length - 1) {
519
+ const originalRunPoint = route[originalRunEndIndex];
520
+ const nextOriginalRunPoint = route[originalRunEndIndex + 1];
521
+ if (originalRunPoint?.route_type !== "wire" || nextOriginalRunPoint?.route_type !== "wire" || originalRunPoint.layer !== nextOriginalRunPoint.layer) {
522
+ break;
523
+ }
524
+ originalRunEndIndex++;
525
+ }
526
+ const originalRunEnd = route[originalRunEndIndex];
527
+ if (originalRunEnd?.route_type === "wire") {
528
+ reversedPoint.width = originalRunEnd.width;
529
+ }
525
530
  }
526
531
  }
532
+ for (let index = 0; index < route.length - 1; index++) {
533
+ const start = route[index];
534
+ const end = route[index + 1];
535
+ if (start.route_type !== "wire" || !start.width_interpolation_mode) continue;
536
+ if (end.route_type !== "wire" || end.layer !== start.layer) continue;
537
+ const reversedStart = reversedRoute[route.length - index - 2];
538
+ if (reversedStart.route_type !== "wire") continue;
539
+ Object.assign(reversedStart, {
540
+ width: start.end_width,
541
+ start_width: start.end_width,
542
+ end_width: start.start_width,
543
+ width_interpolation_mode: start.width_interpolation_mode
544
+ });
545
+ }
527
546
  return reversedRoute;
528
547
  };
529
548
 
@@ -685,6 +704,7 @@ var orderedRenderPhases = [
685
704
  "PcbPlacementDesignRuleChecks",
686
705
  "PcbTraceRender",
687
706
  "PcbRouteNetIslands",
707
+ "PcbTraceTeardropRender",
688
708
  "PcbCopperPourRender",
689
709
  "PcbViaStitchRender",
690
710
  "PcbCopperPourCleanup",
@@ -734,12 +754,14 @@ var asyncPhaseDependencies = {
734
754
  PcbBoardAutoSize: ["PcbFootprintStringRender", "FetchPartFootprint"],
735
755
  PcbTraceHintRender: ["PcbFootprintStringRender", "FetchPartFootprint"],
736
756
  PcbManualTraceRender: ["PcbFootprintStringRender", "FetchPartFootprint"],
757
+ PcbTraceTeardropRender: ["PcbTraceRender", "PcbRouteNetIslands"],
737
758
  PcbCopperPourRender: [
738
759
  "PcbFootprintStringRender",
739
760
  "FetchPartFootprint",
740
761
  "PcbPlacementDesignRuleChecks",
741
762
  "PcbTraceRender",
742
- "PcbRouteNetIslands"
763
+ "PcbRouteNetIslands",
764
+ "PcbTraceTeardropRender"
743
765
  ],
744
766
  PcbViaStitchRender: [
745
767
  "PcbFootprintStringRender",
@@ -3503,8 +3525,9 @@ var getObstaclesFromCircuitJson = (circuitJson, connMap) => {
3503
3525
  if (element.hole_shape === "oval") {
3504
3526
  obstacles.push({
3505
3527
  componentId: pcbComponentId,
3506
- // @ts-ignore
3507
- type: "oval",
3528
+ obstacleId: element.pcb_hole_id,
3529
+ isNonPlatedHole: true,
3530
+ type: "rect",
3508
3531
  layers: everyLayer,
3509
3532
  center: {
3510
3533
  x: element.x,
@@ -3517,6 +3540,8 @@ var getObstaclesFromCircuitJson = (circuitJson, connMap) => {
3517
3540
  } else if (element.hole_shape === "pill" || element.hole_shape === "rotated_pill") {
3518
3541
  obstacles.push({
3519
3542
  componentId: pcbComponentId,
3543
+ obstacleId: element.pcb_hole_id,
3544
+ isNonPlatedHole: true,
3520
3545
  type: "rect",
3521
3546
  layers: everyLayer,
3522
3547
  center: {
@@ -3531,6 +3556,8 @@ var getObstaclesFromCircuitJson = (circuitJson, connMap) => {
3531
3556
  } else if (element.hole_shape === "rect") {
3532
3557
  obstacles.push({
3533
3558
  componentId: pcbComponentId,
3559
+ obstacleId: element.pcb_hole_id,
3560
+ isNonPlatedHole: true,
3534
3561
  type: "rect",
3535
3562
  layers: everyLayer,
3536
3563
  center: {
@@ -3544,6 +3571,8 @@ var getObstaclesFromCircuitJson = (circuitJson, connMap) => {
3544
3571
  } else if (element.hole_shape === "square") {
3545
3572
  obstacles.push({
3546
3573
  componentId: pcbComponentId,
3574
+ obstacleId: element.pcb_hole_id,
3575
+ isNonPlatedHole: true,
3547
3576
  type: "rect",
3548
3577
  layers: everyLayer,
3549
3578
  center: {
@@ -3560,7 +3589,10 @@ var getObstaclesFromCircuitJson = (circuitJson, connMap) => {
3560
3589
  ) {
3561
3590
  obstacles.push({
3562
3591
  componentId: pcbComponentId,
3592
+ obstacleId: element.pcb_hole_id,
3593
+ isNonPlatedHole: true,
3563
3594
  type: "rect",
3595
+ shape: "circle",
3564
3596
  layers: everyLayer,
3565
3597
  center: {
3566
3598
  x: element.x,
@@ -5684,6 +5716,7 @@ var jlcMinTolerances = {
5684
5716
  min_trace_width: 0.1,
5685
5717
  min_via_hole_edge_to_via_hole_edge_clearance: 0.1,
5686
5718
  min_plated_hole_drill_edge_to_drill_edge_clearance: 0.15,
5719
+ min_trace_to_hole_edge_clearance: 0.2,
5687
5720
  min_trace_to_pad_edge_clearance: 0.1,
5688
5721
  min_pad_edge_to_pad_edge_clearance: 0.1,
5689
5722
  min_board_edge_clearance: 0.2,
@@ -6062,6 +6095,236 @@ function Trace_doInitialPcbManualTraceRender(trace) {
6062
6095
  trace._insertErrorIfTraceIsOutsideBoard(route, ports);
6063
6096
  }
6064
6097
 
6098
+ // lib/utils/autorouting/add-trace-teardrops.ts
6099
+ function addTraceTeardrops(route, contacts) {
6100
+ const result = [];
6101
+ const contactDiameter = (point6) => {
6102
+ let diameter = 0;
6103
+ for (const contact of contacts) {
6104
+ if (contact.layer === point6.layer && Math.hypot(contact.x - point6.x, contact.y - point6.y) < 1e-6)
6105
+ diameter = Math.max(diameter, contact.diameter);
6106
+ }
6107
+ return diameter;
6108
+ };
6109
+ for (let index = 0; index < route.length; index++) {
6110
+ const start = route[index];
6111
+ const end = route[index + 1];
6112
+ if (start.route_type !== "wire" || end?.route_type !== "wire" || start.layer !== end.layer || start.width_interpolation_mode) {
6113
+ result.push(start);
6114
+ continue;
6115
+ }
6116
+ const length8 = Math.hypot(end.x - start.x, end.y - start.y);
6117
+ const startDiameter = contactDiameter(start);
6118
+ const endDiameter = contactDiameter(end);
6119
+ const size = (diameter) => {
6120
+ const width = diameter * 0.8;
6121
+ const taperLength = Math.min(diameter * 1.5, length8 * 0.45);
6122
+ return width > start.width && taperLength > diameter / 2 ? { width, length: taperLength } : void 0;
6123
+ };
6124
+ const startTaper = size(startDiameter);
6125
+ const endTaper = size(endDiameter);
6126
+ if (!startTaper && !endTaper) {
6127
+ result.push(start);
6128
+ continue;
6129
+ }
6130
+ const atDistance = (distance23) => ({
6131
+ route_type: "wire",
6132
+ x: start.x + (end.x - start.x) * distance23 / length8,
6133
+ y: start.y + (end.y - start.y) * distance23 / length8,
6134
+ width: start.width,
6135
+ layer: start.layer
6136
+ });
6137
+ if (startTaper) {
6138
+ result.push({
6139
+ ...start,
6140
+ width: startTaper.width,
6141
+ start_width: startTaper.width,
6142
+ end_width: start.width,
6143
+ width_interpolation_mode: "quadratic"
6144
+ });
6145
+ result.push(atDistance(startTaper.length));
6146
+ } else result.push(start);
6147
+ if (endTaper) {
6148
+ result.push({
6149
+ ...atDistance(length8 - endTaper.length),
6150
+ start_width: start.width,
6151
+ end_width: endTaper.width,
6152
+ width_interpolation_mode: "quadratic"
6153
+ });
6154
+ }
6155
+ }
6156
+ return result;
6157
+ }
6158
+
6159
+ // lib/utils/autorouting/resolve-saved-trace-route-widths.ts
6160
+ function resolveSavedTraceRouteWidths(route) {
6161
+ return route.map((point6, index) => {
6162
+ if (point6.route_type !== "wire" || !point6.width_interpolation_mode)
6163
+ return { ...point6 };
6164
+ const next = route[index + 1];
6165
+ if (next?.route_type !== "wire" || next.layer !== point6.layer || next.x === point6.x && next.y === point6.y) {
6166
+ throw new Error(
6167
+ "Width interpolation requires a distinct next wire point on the same layer"
6168
+ );
6169
+ }
6170
+ return { ...point6, start_width: point6.width, end_width: next.width };
6171
+ });
6172
+ }
6173
+ function getSavedTraceViaContactWidths(route, viaIndex, fallbackWidth) {
6174
+ let before;
6175
+ let after;
6176
+ for (let index = viaIndex - 1; index >= 0; index--) {
6177
+ const point6 = route[index];
6178
+ if (point6.route_type === "wire") {
6179
+ before = point6.width;
6180
+ break;
6181
+ }
6182
+ }
6183
+ for (let index = viaIndex + 1; index < route.length; index++) {
6184
+ const point6 = route[index];
6185
+ if (point6.route_type === "wire") {
6186
+ after = point6.width;
6187
+ break;
6188
+ }
6189
+ }
6190
+ return {
6191
+ fromWidth: before ?? after ?? fallbackWidth,
6192
+ toWidth: after ?? before ?? fallbackWidth
6193
+ };
6194
+ }
6195
+
6196
+ // lib/components/primitive-components/Trace/Trace_doInitialPcbTraceTeardropRender.ts
6197
+ var generatedRoutes = /* @__PURE__ */ new WeakMap();
6198
+ function hasSameGeneratedGeometry(current, generated) {
6199
+ if (current === generated) return true;
6200
+ if (current.length !== generated.length) return false;
6201
+ const geometry = (point6) => {
6202
+ const { is_inside_copper_pour, copper_pour_id, ...rest } = point6;
6203
+ return JSON.stringify(rest);
6204
+ };
6205
+ return current.every(
6206
+ (point6, index) => geometry(point6) === geometry(generated[index])
6207
+ );
6208
+ }
6209
+ function getPadDiameter(pad) {
6210
+ if (pad.shape === "polygon") return 0;
6211
+ if (pad.shape === "circle") return pad.radius * 2;
6212
+ return Math.min(pad.width, pad.height);
6213
+ }
6214
+ function Trace_doInitialPcbTraceTeardropRender(trace) {
6215
+ if (!trace.root || trace.root.pcbDisabled || !trace.source_trace_id) return;
6216
+ const { db } = trace.root;
6217
+ const props = trace._parsedProps;
6218
+ const previous = generatedRoutes.get(trace);
6219
+ for (const [id, routes] of previous ?? []) {
6220
+ const current = db.pcb_trace.get(id);
6221
+ if (current && hasSameGeneratedGeometry(current.route, routes.generated))
6222
+ db.pcb_trace.update(id, { route: routes.original });
6223
+ }
6224
+ generatedRoutes.delete(trace);
6225
+ if (!props.pcbTeardrops && !props.pcbTeardropStart && !props.pcbTeardropEnd)
6226
+ return;
6227
+ const connected = trace._findConnectedPorts();
6228
+ if (!connected.allPortsFound) return;
6229
+ const selectors = trace._getTracePortOrNetSelectorListFromProps();
6230
+ const enabledPorts = connected.portsWithSelectors.map(
6231
+ ({ port, selector }) => ({
6232
+ port,
6233
+ enabled: selector === selectors[0] ? props.pcbTeardropStart ?? props.pcbTeardrops ?? false : selector === selectors.at(-1) ? props.pcbTeardropEnd ?? props.pcbTeardrops ?? false : props.pcbTeardrops ?? false
6234
+ })
6235
+ );
6236
+ const padContacts = [];
6237
+ for (const { port, enabled } of enabledPorts) {
6238
+ if (!enabled || !port.pcb_port_id) continue;
6239
+ for (const pad of db.pcb_smtpad.list({ pcb_port_id: port.pcb_port_id })) {
6240
+ if (pad.shape === "polygon") continue;
6241
+ padContacts.push({
6242
+ x: pad.x,
6243
+ y: pad.y,
6244
+ layer: pad.layer,
6245
+ diameter: getPadDiameter(pad)
6246
+ });
6247
+ }
6248
+ for (const hole of db.pcb_plated_hole.list({
6249
+ pcb_port_id: port.pcb_port_id
6250
+ })) {
6251
+ if (hole.shape !== "circle") continue;
6252
+ for (const layer of hole.layers)
6253
+ padContacts.push({
6254
+ x: hole.x,
6255
+ y: hole.y,
6256
+ layer,
6257
+ diameter: hole.outer_diameter
6258
+ });
6259
+ }
6260
+ }
6261
+ const outputs = /* @__PURE__ */ new Map();
6262
+ for (const pcbTrace of db.pcb_trace.list({
6263
+ source_trace_id: trace.source_trace_id
6264
+ })) {
6265
+ const contacts = [...padContacts];
6266
+ for (const via of db.pcb_via.list({
6267
+ pcb_trace_id: pcbTrace.pcb_trace_id
6268
+ })) {
6269
+ const endpoint = enabledPorts.find(({ port }) => {
6270
+ const position = port._getGlobalPcbPositionAfterLayout();
6271
+ return Math.hypot(position.x - via.x, position.y - via.y) < 1e-6;
6272
+ });
6273
+ if (!(endpoint ? endpoint.enabled : props.pcbTeardrops)) continue;
6274
+ for (const layer of via.layers)
6275
+ contacts.push({
6276
+ x: via.x,
6277
+ y: via.y,
6278
+ layer,
6279
+ diameter: via.outer_diameter
6280
+ });
6281
+ }
6282
+ const wireContacts = pcbTrace.route.flatMap(
6283
+ (point6, index) => {
6284
+ if (point6.route_type !== "via" || !contacts.some(
6285
+ (contact) => Math.hypot(contact.x - point6.x, contact.y - point6.y) < 1e-6
6286
+ ))
6287
+ return [point6];
6288
+ const { fromWidth, toWidth } = getSavedTraceViaContactWidths(
6289
+ pcbTrace.route,
6290
+ index,
6291
+ 0
6292
+ );
6293
+ if (!fromWidth || !toWidth) return [point6];
6294
+ const before = pcbTrace.route[index - 1];
6295
+ const after = pcbTrace.route[index + 1];
6296
+ const result = [];
6297
+ if (!(before?.route_type === "wire" && before.x === point6.x && before.y === point6.y && before.layer === point6.from_layer))
6298
+ result.push({
6299
+ route_type: "wire",
6300
+ x: point6.x,
6301
+ y: point6.y,
6302
+ width: fromWidth,
6303
+ layer: point6.from_layer
6304
+ });
6305
+ result.push(point6);
6306
+ if (!(after?.route_type === "wire" && after.x === point6.x && after.y === point6.y && after.layer === point6.to_layer))
6307
+ result.push({
6308
+ route_type: "wire",
6309
+ x: point6.x,
6310
+ y: point6.y,
6311
+ width: toWidth,
6312
+ layer: point6.to_layer
6313
+ });
6314
+ return result;
6315
+ }
6316
+ );
6317
+ const route = addTraceTeardrops(wireContacts, contacts);
6318
+ if (route.length === pcbTrace.route.length) continue;
6319
+ outputs.set(pcbTrace.pcb_trace_id, {
6320
+ original: pcbTrace.route,
6321
+ generated: route
6322
+ });
6323
+ db.pcb_trace.update(pcbTrace.pcb_trace_id, { route });
6324
+ }
6325
+ generatedRoutes.set(trace, outputs);
6326
+ }
6327
+
6065
6328
  // lib/components/primitive-components/Trace/Trace_doInitialPcbTraceRender.ts
6066
6329
  import { MultilayerIjump } from "@tscircuit/infgrid-ijump-astar";
6067
6330
  import "circuit-json";
@@ -7810,6 +8073,12 @@ var Trace = class extends PrimitiveComponent2 {
7810
8073
  doInitialPcbManualTraceRender() {
7811
8074
  Trace_doInitialPcbManualTraceRender(this);
7812
8075
  }
8076
+ doInitialPcbTraceTeardropRender() {
8077
+ Trace_doInitialPcbTraceTeardropRender(this);
8078
+ }
8079
+ updatePcbTraceTeardropRender() {
8080
+ Trace_doInitialPcbTraceTeardropRender(this);
8081
+ }
7813
8082
  doInitialPcbTraceRender() {
7814
8083
  Trace_doInitialPcbTraceRender(this);
7815
8084
  }
@@ -18957,7 +19226,7 @@ function getSavedAutoroutingPhaseTracesFromPaths({
18957
19226
  `Saved phase path "${path.connection}" starts at an endpoint already joined by another path`
18958
19227
  );
18959
19228
  const transform = getSavedPcbTracePathTransform(group, port);
18960
- const route = path.route.map((point6) => ({
19229
+ const route = resolveSavedTraceRouteWidths(path.route).map((point6) => ({
18961
19230
  ...point6,
18962
19231
  ...applyToPoint27(transform, point6)
18963
19232
  }));
@@ -19005,15 +19274,20 @@ function getSavedAutoroutingPhaseTracesFromPaths({
19005
19274
  pointId: `${pcbTraceId}_exit`
19006
19275
  };
19007
19276
  }
19008
- const width = route.find((point6) => point6.route_type === "wire")?.width ?? input.minTraceWidth;
19009
- const routeWithViaContacts = route.flatMap(
19010
- (point6) => point6.route_type === "via" ? [
19277
+ const routeWithViaContacts = route.flatMap((point6, index) => {
19278
+ if (point6.route_type !== "via") return [point6];
19279
+ const { fromWidth, toWidth } = getSavedTraceViaContactWidths(
19280
+ route,
19281
+ index,
19282
+ input.minTraceWidth
19283
+ );
19284
+ return [
19011
19285
  {
19012
19286
  route_type: "wire",
19013
19287
  x: point6.x,
19014
19288
  y: point6.y,
19015
19289
  layer: point6.from_layer,
19016
- width
19290
+ width: fromWidth
19017
19291
  },
19018
19292
  point6,
19019
19293
  {
@@ -19021,17 +19295,22 @@ function getSavedAutoroutingPhaseTracesFromPaths({
19021
19295
  x: point6.x,
19022
19296
  y: point6.y,
19023
19297
  layer: point6.to_layer,
19024
- width
19298
+ width: toWidth
19025
19299
  }
19026
- ] : [point6]
19027
- );
19300
+ ];
19301
+ });
19028
19302
  if (last.route_type === "via") {
19303
+ const { toWidth } = getSavedTraceViaContactWidths(
19304
+ route,
19305
+ route.length - 1,
19306
+ input.minTraceWidth
19307
+ );
19029
19308
  routeWithViaContacts.push({
19030
19309
  route_type: "wire",
19031
19310
  x: last.x,
19032
19311
  y: last.y,
19033
19312
  layer: last.to_layer,
19034
- width
19313
+ width: toWidth
19035
19314
  });
19036
19315
  }
19037
19316
  coveredConnections.add(connection);
@@ -55163,6 +55442,7 @@ var getSimpleRouteJsonFromCircuitJson = ({
55163
55442
  subcircuit_id,
55164
55443
  minTraceWidth,
55165
55444
  minTraceToPadEdgeClearance,
55445
+ minTraceToHoleEdgeClearance,
55166
55446
  minViaEdgeToPadEdgeClearance,
55167
55447
  minViaHoleEdgeToViaHoleEdgeClearance,
55168
55448
  minPlatedHoleDrillEdgeToDrillEdgeClearance,
@@ -55706,6 +55986,7 @@ var getSimpleRouteJsonFromCircuitJson = ({
55706
55986
  }
55707
55987
  const resolvedMinViaHoleDiameter = minViaHoleDiameter ?? board?.min_via_hole_diameter;
55708
55988
  const resolvedMinViaPadDiameter = minViaPadDiameter ?? board?.min_via_pad_diameter;
55989
+ const resolvedMinTraceToHoleEdgeClearance = minTraceToHoleEdgeClearance ?? board?.min_trace_to_hole_edge_clearance;
55709
55990
  const resolvedMinTraceToPadEdgeClearance = minTraceToPadEdgeClearance ?? board?.min_trace_to_pad_edge_clearance;
55710
55991
  const resolvedMinViaEdgeToPadEdgeClearance = minViaEdgeToPadEdgeClearance ?? board?.min_via_edge_to_pad_edge_clearance;
55711
55992
  const resolvedMinViaHoleEdgeToViaHoleEdgeClearance = minViaHoleEdgeToViaHoleEdgeClearance ?? board?.min_via_hole_edge_to_via_hole_edge_clearance;
@@ -55732,6 +56013,7 @@ var getSimpleRouteJsonFromCircuitJson = ({
55732
56013
  min_via_hole_diameter: resolvedMinViaHoleDiameter,
55733
56014
  min_via_pad_diameter: resolvedMinViaPadDiameter,
55734
56015
  minTraceToPadEdgeClearance: resolvedMinTraceToPadEdgeClearance,
56016
+ minTraceToHoleEdgeClearance: resolvedMinTraceToHoleEdgeClearance,
55735
56017
  minViaEdgeToPadEdgeClearance: resolvedMinViaEdgeToPadEdgeClearance,
55736
56018
  minViaHoleEdgeToViaHoleEdgeClearance: resolvedMinViaHoleEdgeToViaHoleEdgeClearance,
55737
56019
  minPlatedHoleDrillEdgeToDrillEdgeClearance: resolvedMinPlatedHoleDrillEdgeToDrillEdgeClearance,
@@ -63687,7 +63969,7 @@ function getSavedFanoutTraces(breakout, input) {
63687
63969
  translate14(-localExit.x, -localExit.y)
63688
63970
  );
63689
63971
  const originalExit = applyToPoint33(transform, localExit);
63690
- const route = path.route.map((point6) => {
63972
+ const route = resolveSavedTraceRouteWidths(path.route).map((point6) => {
63691
63973
  const position = applyToPoint33(transform, point6);
63692
63974
  return {
63693
63975
  ...point6,
@@ -63722,21 +64004,30 @@ function getSavedFanoutTraces(breakout, input) {
63722
64004
  throw new Error(
63723
64005
  `Saved fanout path "${path.connection}" does not cover its connection endpoints`
63724
64006
  );
63725
- const width = route.find((point6) => point6.route_type === "wire")?.width ?? input.minTraceWidth;
64007
+ const startContactWidths = getSavedTraceViaContactWidths(
64008
+ route,
64009
+ 0,
64010
+ input.minTraceWidth
64011
+ );
64012
+ const endContactWidths = getSavedTraceViaContactWidths(
64013
+ route,
64014
+ route.length - 1,
64015
+ input.minTraceWidth
64016
+ );
63726
64017
  if (first.route_type === "via") {
63727
64018
  route.splice(1, 0, {
63728
64019
  route_type: "wire",
63729
64020
  x: first.x,
63730
64021
  y: first.y,
63731
64022
  layer: first.to_layer,
63732
- width
64023
+ width: startContactWidths.toWidth
63733
64024
  });
63734
64025
  route.unshift({
63735
64026
  route_type: "wire",
63736
64027
  x: first.x,
63737
64028
  y: first.y,
63738
64029
  layer: first.from_layer,
63739
- width
64030
+ width: startContactWidths.fromWidth
63740
64031
  });
63741
64032
  }
63742
64033
  if (last.route_type === "via") {
@@ -63745,14 +64036,14 @@ function getSavedFanoutTraces(breakout, input) {
63745
64036
  x: last.x,
63746
64037
  y: last.y,
63747
64038
  layer: last.from_layer,
63748
- width
64039
+ width: endContactWidths.fromWidth
63749
64040
  });
63750
64041
  route.push({
63751
64042
  route_type: "wire",
63752
64043
  x: last.x,
63753
64044
  y: last.y,
63754
64045
  layer: last.to_layer,
63755
- width
64046
+ width: endContactWidths.toWidth
63756
64047
  });
63757
64048
  }
63758
64049
  if (last.route_type === "via") {
@@ -63761,7 +64052,7 @@ function getSavedFanoutTraces(breakout, input) {
63761
64052
  x: last.x,
63762
64053
  y: last.y,
63763
64054
  layer: last.to_layer,
63764
- width
64055
+ width: endContactWidths.toWidth
63765
64056
  });
63766
64057
  }
63767
64058
  coveredConnections.add(connection);
@@ -63896,13 +64187,14 @@ function getDrcTolerancesFromAutoroutingPhaseProps(phaseProps) {
63896
64187
  minViaHoleEdgeToViaHoleEdgeClearance,
63897
64188
  minPlatedHoleDrillEdgeToDrillEdgeClearance,
63898
64189
  minTraceToPadEdgeClearance,
64190
+ minTraceToHoleEdgeClearance,
63899
64191
  minPadEdgeToPadEdgeClearance,
63900
64192
  minBoardEdgeClearance,
63901
64193
  minViaEdgeToPadEdgeClearance,
63902
64194
  minViaHoleDiameter,
63903
64195
  minViaPadDiameter
63904
64196
  } = phaseProps;
63905
- if (minTraceWidth === void 0 && minViaHoleEdgeToViaHoleEdgeClearance === void 0 && minPlatedHoleDrillEdgeToDrillEdgeClearance === void 0 && minTraceToPadEdgeClearance === void 0 && minPadEdgeToPadEdgeClearance === void 0 && minBoardEdgeClearance === void 0 && minViaEdgeToPadEdgeClearance === void 0 && minViaHoleDiameter === void 0 && minViaPadDiameter === void 0) {
64197
+ if (minTraceWidth === void 0 && minViaHoleEdgeToViaHoleEdgeClearance === void 0 && minPlatedHoleDrillEdgeToDrillEdgeClearance === void 0 && minTraceToPadEdgeClearance === void 0 && minTraceToHoleEdgeClearance === void 0 && minPadEdgeToPadEdgeClearance === void 0 && minBoardEdgeClearance === void 0 && minViaEdgeToPadEdgeClearance === void 0 && minViaHoleDiameter === void 0 && minViaPadDiameter === void 0) {
63906
64198
  return void 0;
63907
64199
  }
63908
64200
  return {
@@ -63914,6 +64206,7 @@ function getDrcTolerancesFromAutoroutingPhaseProps(phaseProps) {
63914
64206
  minPlatedHoleDrillEdgeToDrillEdgeClearance
63915
64207
  ),
63916
64208
  minTraceToPadEdgeClearance: toParsedDistance(minTraceToPadEdgeClearance),
64209
+ minTraceToHoleEdgeClearance: toParsedDistance(minTraceToHoleEdgeClearance),
63917
64210
  minPadEdgeToPadEdgeClearance: toParsedDistance(
63918
64211
  minPadEdgeToPadEdgeClearance
63919
64212
  ),
@@ -64162,7 +64455,7 @@ function Group_getRoutingPhasePlans(group) {
64162
64455
  var package_default = {
64163
64456
  name: "@tscircuit/core",
64164
64457
  type: "module",
64165
- version: "0.0.2004",
64458
+ version: "0.0.2006",
64166
64459
  types: "dist/index.d.ts",
64167
64460
  main: "dist/index.js",
64168
64461
  module: "dist/index.js",
@@ -64201,7 +64494,7 @@ var package_default = {
64201
64494
  "@tscircuit/checks": "^0.0.224",
64202
64495
  "@tscircuit/circuit-json-util": "^0.0.116",
64203
64496
  "@tscircuit/common": "^0.0.20",
64204
- "@tscircuit/copper-pour-solver": "^0.0.57",
64497
+ "@tscircuit/copper-pour-solver": "^0.0.62",
64205
64498
  "@tscircuit/create-fdm-enclosure": "0.0.4",
64206
64499
  "@tscircuit/fanout-solver": "0.0.78",
64207
64500
  "@tscircuit/flex-utils": "https://jscdn.tscircuit.com/@tscircuit/flex-utils/0.0.5.tgz",
@@ -64210,14 +64503,14 @@ var package_default = {
64210
64503
  "@tscircuit/implicit-copper-pour-solver": "github:tscircuit/implicit-copper-pour-solver#a5cbbda0cd65fd4707c5c1af25779837c25aba92",
64211
64504
  "@tscircuit/infer-cable-insertion-point": "^0.0.4",
64212
64505
  "@tscircuit/infgrid-ijump-astar": "^0.0.35",
64213
- "@tscircuit/jlcpcb-manufacturing-specs": "git+https://github.com/tscircuit/jlcpcb-manufacturing-specs#e08af159db01a37db007e33f0a7268d0e4a279a5",
64506
+ "@tscircuit/jlcpcb-manufacturing-specs": "git+https://github.com/tscircuit/jlcpcb-manufacturing-specs#23260504fceffff2d64bf11720f74e974d1d9321",
64214
64507
  "@tscircuit/krt-wasm": "^0.1.1",
64215
64508
  "@tscircuit/log-soup": "^1.0.2",
64216
64509
  "@tscircuit/matchpack": "^0.0.97",
64217
64510
  "@tscircuit/math-utils": "^0.0.36",
64218
64511
  "@tscircuit/miniflex": "^0.0.4",
64219
64512
  "@tscircuit/ngspice-spice-engine": "^0.0.20",
64220
- "@tscircuit/props": "^0.0.666",
64513
+ "@tscircuit/props": "^0.0.667",
64221
64514
  "@tscircuit/schematic-match-adapt": "^0.0.18",
64222
64515
  "@tscircuit/schematic-trace-solver": "^0.0.212",
64223
64516
  "@tscircuit/solver-utils": "^0.0.16",
@@ -64233,12 +64526,12 @@ var package_default = {
64233
64526
  "bun-match-svg": "0.0.12",
64234
64527
  "calculate-elbow": "^0.0.12",
64235
64528
  "chokidar-cli": "^3.0.0",
64236
- "circuit-json": "^0.0.504",
64529
+ "circuit-json": "^0.0.506",
64237
64530
  "circuit-json-to-bpc": "^0.0.13",
64238
64531
  "circuit-json-to-connectivity-map": "^0.0.30",
64239
64532
  "circuit-json-to-gltf": "^0.0.133",
64240
64533
  "circuit-json-to-spice": "^0.0.45",
64241
- "circuit-to-svg": "^0.0.430",
64534
+ "circuit-to-svg": "^0.0.433",
64242
64535
  concurrently: "^9.1.2",
64243
64536
  "connectivity-map": "^1.0.0",
64244
64537
  debug: "^4.3.6",
@@ -64296,8 +64589,8 @@ var package_default = {
64296
64589
  },
64297
64590
  overrides: {
64298
64591
  "@tscircuit/circuit-json-util": "^0.0.116",
64299
- "@tscircuit/props": "^0.0.666",
64300
- "circuit-json": "^0.0.504"
64592
+ "@tscircuit/props": "^0.0.667",
64593
+ "circuit-json": "^0.0.506"
64301
64594
  }
64302
64595
  };
64303
64596
 
@@ -64496,6 +64789,7 @@ function Group_applyDrcTolerancesToSimpleRouteJson(simpleRouteJson, drcTolerance
64496
64789
  const minTraceWidth = drcTolerances.minTraceWidth ?? simpleRouteJson.minTraceWidth;
64497
64790
  const minViaHoleDiameter = drcTolerances.minViaHoleDiameter ?? simpleRouteJson.minViaHoleDiameter;
64498
64791
  const minViaPadDiameter = drcTolerances.minViaPadDiameter ?? simpleRouteJson.minViaPadDiameter;
64792
+ const minTraceToHoleEdgeClearance = drcTolerances.minTraceToHoleEdgeClearance ?? simpleRouteJson.minTraceToHoleEdgeClearance;
64499
64793
  const minTraceToPadEdgeClearance = drcTolerances.minTraceToPadEdgeClearance ?? simpleRouteJson.minTraceToPadEdgeClearance;
64500
64794
  const minViaEdgeToPadEdgeClearance = drcTolerances.minViaEdgeToPadEdgeClearance ?? simpleRouteJson.minViaEdgeToPadEdgeClearance;
64501
64795
  const minViaHoleEdgeToViaHoleEdgeClearance = drcTolerances.minViaHoleEdgeToViaHoleEdgeClearance ?? simpleRouteJson.minViaHoleEdgeToViaHoleEdgeClearance;
@@ -64515,6 +64809,7 @@ function Group_applyDrcTolerancesToSimpleRouteJson(simpleRouteJson, drcTolerance
64515
64809
  min_via_hole_diameter: minViaHoleDiameter,
64516
64810
  min_via_pad_diameter: minViaPadDiameter,
64517
64811
  minTraceToPadEdgeClearance,
64812
+ minTraceToHoleEdgeClearance,
64518
64813
  minViaEdgeToPadEdgeClearance,
64519
64814
  minViaHoleEdgeToViaHoleEdgeClearance,
64520
64815
  minPlatedHoleDrillEdgeToDrillEdgeClearance,
@@ -70119,6 +70414,7 @@ var Board = class extends Group5 {
70119
70414
  min_via_pad_diameter: resolvedMinViaPadDiameter,
70120
70415
  min_via_hole_edge_to_via_hole_edge_clearance: subcircuitProps2.minViaHoleEdgeToViaHoleEdgeClearance ?? jlcMinTolerances.min_via_hole_edge_to_via_hole_edge_clearance,
70121
70416
  min_via_edge_to_pad_edge_clearance: subcircuitProps2.minViaEdgeToPadEdgeClearance ?? jlcMinTolerances.min_via_edge_to_pad_edge_clearance,
70417
+ min_trace_to_hole_edge_clearance: subcircuitProps2.minTraceToHoleEdgeClearance ?? jlcMinTolerances.min_trace_to_hole_edge_clearance,
70122
70418
  min_trace_to_pad_edge_clearance: subcircuitProps2.minTraceToPadEdgeClearance ?? jlcMinTolerances.min_trace_to_pad_edge_clearance,
70123
70419
  min_pad_edge_to_pad_edge_clearance: subcircuitProps2.minPadEdgeToPadEdgeClearance ?? jlcMinTolerances.min_pad_edge_to_pad_edge_clearance,
70124
70420
  min_plated_hole_drill_edge_to_drill_edge_clearance: subcircuitProps2.minPlatedHoleDrillEdgeToDrillEdgeClearance ?? jlcMinTolerances.min_plated_hole_drill_edge_to_drill_edge_clearance,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tscircuit/core",
3
3
  "type": "module",
4
- "version": "0.0.2005",
4
+ "version": "0.0.2007",
5
5
  "types": "dist/index.d.ts",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",
@@ -40,7 +40,7 @@
40
40
  "@tscircuit/checks": "^0.0.224",
41
41
  "@tscircuit/circuit-json-util": "^0.0.116",
42
42
  "@tscircuit/common": "^0.0.20",
43
- "@tscircuit/copper-pour-solver": "^0.0.57",
43
+ "@tscircuit/copper-pour-solver": "^0.0.62",
44
44
  "@tscircuit/create-fdm-enclosure": "0.0.4",
45
45
  "@tscircuit/fanout-solver": "0.0.78",
46
46
  "@tscircuit/flex-utils": "https://jscdn.tscircuit.com/@tscircuit/flex-utils/0.0.5.tgz",
@@ -49,14 +49,14 @@
49
49
  "@tscircuit/implicit-copper-pour-solver": "github:tscircuit/implicit-copper-pour-solver#a5cbbda0cd65fd4707c5c1af25779837c25aba92",
50
50
  "@tscircuit/infer-cable-insertion-point": "^0.0.4",
51
51
  "@tscircuit/infgrid-ijump-astar": "^0.0.35",
52
- "@tscircuit/jlcpcb-manufacturing-specs": "git+https://github.com/tscircuit/jlcpcb-manufacturing-specs#e08af159db01a37db007e33f0a7268d0e4a279a5",
52
+ "@tscircuit/jlcpcb-manufacturing-specs": "git+https://github.com/tscircuit/jlcpcb-manufacturing-specs#23260504fceffff2d64bf11720f74e974d1d9321",
53
53
  "@tscircuit/krt-wasm": "^0.1.1",
54
54
  "@tscircuit/log-soup": "^1.0.2",
55
55
  "@tscircuit/matchpack": "^0.0.97",
56
56
  "@tscircuit/math-utils": "^0.0.36",
57
57
  "@tscircuit/miniflex": "^0.0.4",
58
58
  "@tscircuit/ngspice-spice-engine": "^0.0.20",
59
- "@tscircuit/props": "^0.0.666",
59
+ "@tscircuit/props": "^0.0.667",
60
60
  "@tscircuit/schematic-match-adapt": "^0.0.18",
61
61
  "@tscircuit/schematic-trace-solver": "^0.0.212",
62
62
  "@tscircuit/solver-utils": "^0.0.16",
@@ -72,12 +72,12 @@
72
72
  "bun-match-svg": "0.0.12",
73
73
  "calculate-elbow": "^0.0.12",
74
74
  "chokidar-cli": "^3.0.0",
75
- "circuit-json": "^0.0.504",
75
+ "circuit-json": "^0.0.506",
76
76
  "circuit-json-to-bpc": "^0.0.13",
77
77
  "circuit-json-to-connectivity-map": "^0.0.30",
78
78
  "circuit-json-to-gltf": "^0.0.133",
79
79
  "circuit-json-to-spice": "^0.0.45",
80
- "circuit-to-svg": "^0.0.430",
80
+ "circuit-to-svg": "^0.0.433",
81
81
  "concurrently": "^9.1.2",
82
82
  "connectivity-map": "^1.0.0",
83
83
  "debug": "^4.3.6",
@@ -135,7 +135,7 @@
135
135
  },
136
136
  "overrides": {
137
137
  "@tscircuit/circuit-json-util": "^0.0.116",
138
- "@tscircuit/props": "^0.0.666",
139
- "circuit-json": "^0.0.504"
138
+ "@tscircuit/props": "^0.0.667",
139
+ "circuit-json": "^0.0.506"
140
140
  }
141
141
  }