@tscircuit/capacity-autorouter 0.0.227 → 0.0.229

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
@@ -32,7 +32,7 @@ interface SimpleRouteJson {
32
32
  nominalTraceWidth?: number;
33
33
  minViaDiameter?: number;
34
34
  defaultObstacleMargin?: number;
35
- obstacles: Obstacle[];
35
+ obstacles: Obstacle$1[];
36
36
  connections: Array<SimpleRouteConnection>;
37
37
  bounds: {
38
38
  minX: number;
@@ -45,8 +45,9 @@ interface SimpleRouteJson {
45
45
  y: number;
46
46
  }>;
47
47
  traces?: SimplifiedPcbTraces;
48
+ allowJumpers?: boolean;
48
49
  }
49
- interface Obstacle {
50
+ interface Obstacle$1 {
50
51
  obstacleId?: string;
51
52
  type: "rect";
52
53
  layers: string[];
@@ -247,6 +248,7 @@ type HighDensityIntraNodeRoute$1 = {
247
248
  x: number;
248
249
  y: number;
249
250
  }>;
251
+ jumpers?: Jumper[];
250
252
  };
251
253
  type HighDensityRoute$1 = HighDensityIntraNodeRoute$1;
252
254
  /**
@@ -896,10 +898,10 @@ declare class HighDensitySolver extends BaseSolver {
896
898
  declare class CapacityNodeTargetMerger extends BaseSolver {
897
899
  nodes: CapacityMeshNode[];
898
900
  connMap: ConnectivityMap;
899
- unprocessedObstacles: Obstacle[];
901
+ unprocessedObstacles: Obstacle$1[];
900
902
  newNodes: CapacityMeshNode[];
901
903
  removedNodeIds: Set<string>;
902
- constructor(nodes: CapacityMeshNode[], obstacles: Obstacle[], connMap: ConnectivityMap);
904
+ constructor(nodes: CapacityMeshNode[], obstacles: Obstacle$1[], connMap: ConnectivityMap);
903
905
  _step(): void;
904
906
  visualize(): GraphicsObject;
905
907
  }
@@ -1176,7 +1178,7 @@ declare class TraceSimplificationSolver extends BaseSolver {
1176
1178
  */
1177
1179
  constructor(simplificationConfig: {
1178
1180
  hdRoutes: HighDensityRoute$1[];
1179
- obstacles: Obstacle[];
1181
+ obstacles: Obstacle$1[];
1180
1182
  connMap: ConnectivityMap;
1181
1183
  colorMap: Record<string, string>;
1182
1184
  outline?: Array<{
@@ -1327,6 +1329,9 @@ interface PortPointPathingHyperParameters {
1327
1329
  RIPPING_ENABLED?: boolean;
1328
1330
  RIPPING_PF_THRESHOLD?: number;
1329
1331
  MAX_RIPS?: number;
1332
+ RANDOM_RIP_FRACTION?: number;
1333
+ /** When enabled, use jumper-based pf calculation for same-layer crossings on single layer nodes */
1334
+ JUMPER_PF_FN_ENABLED?: boolean;
1330
1335
  }
1331
1336
  /**
1332
1337
  * An input port point without connectionName assigned yet.
@@ -1418,6 +1423,17 @@ interface ConnectionPathResult {
1418
1423
  * - prevents node cycles in a candidate chain (keeps Pf math correct without needing per-node multi-visit tracking)
1419
1424
  */
1420
1425
  declare class PortPointPathingSolver extends BaseSolver {
1426
+ input: {
1427
+ simpleRouteJson: SimpleRouteJson;
1428
+ capacityMeshNodes: CapacityMeshNode[];
1429
+ inputNodes: InputNodeWithPortPoints[];
1430
+ colorMap?: Record<string, string>;
1431
+ nodeMemoryPfMap?: Map<CapacityMeshNodeId, number>;
1432
+ hyperParameters?: Partial<PortPointPathingHyperParameters>;
1433
+ precomputedInitialParams?: PrecomputedInitialParams;
1434
+ /** Pre-routed connections that should not be re-routed but should appear in results */
1435
+ fixedRoutes?: ConnectionPathResult[];
1436
+ };
1421
1437
  hyperParameters: Partial<PortPointPathingHyperParameters>;
1422
1438
  simpleRouteJson: SimpleRouteJson;
1423
1439
  inputNodes: InputNodeWithPortPoints[];
@@ -1468,6 +1484,10 @@ declare class PortPointPathingSolver extends BaseSolver {
1468
1484
  get RIPPING_ENABLED(): boolean;
1469
1485
  get RIPPING_PF_THRESHOLD(): number;
1470
1486
  get MAX_RIPS(): number;
1487
+ get RANDOM_RIP_FRACTION(): number;
1488
+ get JUMPER_PF_FN_ENABLED(): boolean;
1489
+ /** Number of jumpers that can fit per mm² of node area */
1490
+ jumpersPerMmSquared: number;
1471
1491
  /** Tracks which connections have been test-ripped for each node to avoid retesting */
1472
1492
  testedRipConnections: Map<CapacityMeshNodeId, Set<string>>;
1473
1493
  /** Tracks total number of connections that have been ripped/requeued */
@@ -1497,7 +1517,7 @@ declare class PortPointPathingSolver extends BaseSolver {
1497
1517
  offBoardNodes: InputNodeWithPortPoints[];
1498
1518
  /** Cache of base node cost (cost of node in current committed state) */
1499
1519
  private baseNodeCostCache;
1500
- constructor({ simpleRouteJson, inputNodes, capacityMeshNodes, colorMap, nodeMemoryPfMap, hyperParameters, precomputedInitialParams, fixedRoutes, }: {
1520
+ constructor(input: {
1501
1521
  simpleRouteJson: SimpleRouteJson;
1502
1522
  capacityMeshNodes: CapacityMeshNode[];
1503
1523
  inputNodes: InputNodeWithPortPoints[];
@@ -1508,6 +1528,17 @@ declare class PortPointPathingSolver extends BaseSolver {
1508
1528
  /** Pre-routed connections that should not be re-routed but should appear in results */
1509
1529
  fixedRoutes?: ConnectionPathResult[];
1510
1530
  });
1531
+ getConstructorParams(): {
1532
+ simpleRouteJson: SimpleRouteJson;
1533
+ capacityMeshNodes: CapacityMeshNode[];
1534
+ inputNodes: InputNodeWithPortPoints[];
1535
+ colorMap?: Record<string, string>;
1536
+ nodeMemoryPfMap?: Map<CapacityMeshNodeId, number>;
1537
+ hyperParameters?: Partial<PortPointPathingHyperParameters>;
1538
+ precomputedInitialParams?: PrecomputedInitialParams;
1539
+ /** Pre-routed connections that should not be re-routed but should appear in results */
1540
+ fixedRoutes?: ConnectionPathResult[];
1541
+ };
1511
1542
  private clearCostCaches;
1512
1543
  private clampPf;
1513
1544
  /** Convert Pf into an additive "failure cost" */
@@ -1649,6 +1680,11 @@ declare class PortPointPathingSolver extends BaseSolver {
1649
1680
  * test-rip connections until pf is below threshold.
1650
1681
  */
1651
1682
  processRippingForPath(path: PortPointCandidate[], justRoutedConnectionName: string): void;
1683
+ /**
1684
+ * Randomly rip a fraction of already-routed connections to help escape local minima.
1685
+ * Rips (RANDOM_RIP_FRACTION * 100)% of processed connections, with a minimum of 1.
1686
+ */
1687
+ private processRandomRipping;
1652
1688
  visualize(): GraphicsObject;
1653
1689
  }
1654
1690
 
@@ -1960,7 +1996,7 @@ interface CapacityMeshSolverOptions$3 {
1960
1996
  cacheProvider?: CacheProvider | null;
1961
1997
  effort?: number;
1962
1998
  }
1963
- type PipelineStep$3<T extends new (...args: any[]) => BaseSolver> = {
1999
+ type PipelineStep$4<T extends new (...args: any[]) => BaseSolver> = {
1964
2000
  solverName: string;
1965
2001
  solverClass: T;
1966
2002
  getConstructorParams: (instance: AutoroutingPipelineSolver2_PortPointPathing) => ConstructorParameters<T>;
@@ -1995,7 +2031,7 @@ declare class AutoroutingPipelineSolver2_PortPointPathing extends BaseSolver {
1995
2031
  capacityNodes: CapacityMeshNode[] | null;
1996
2032
  capacityEdges: CapacityMeshEdge[] | null;
1997
2033
  cacheProvider: CacheProvider | null;
1998
- pipelineDef: (PipelineStep$3<typeof NetToPointPairsSolver2_OffBoardConnection> | PipelineStep$3<typeof RectDiffPipeline> | PipelineStep$3<typeof CapacityMeshEdgeSolver2_NodeTreeOptimization> | PipelineStep$3<typeof AvailableSegmentPointSolver> | PipelineStep$3<typeof HyperPortPointPathingSolver> | PipelineStep$3<typeof MultiSectionPortPointOptimizer> | PipelineStep$3<typeof HighDensitySolver> | PipelineStep$3<typeof MultipleHighDensityRouteStitchSolver> | PipelineStep$3<typeof TraceSimplificationSolver>)[];
2034
+ pipelineDef: (PipelineStep$4<typeof NetToPointPairsSolver2_OffBoardConnection> | PipelineStep$4<typeof RectDiffPipeline> | PipelineStep$4<typeof CapacityMeshEdgeSolver2_NodeTreeOptimization> | PipelineStep$4<typeof AvailableSegmentPointSolver> | PipelineStep$4<typeof HyperPortPointPathingSolver> | PipelineStep$4<typeof MultiSectionPortPointOptimizer> | PipelineStep$4<typeof HighDensitySolver> | PipelineStep$4<typeof MultipleHighDensityRouteStitchSolver> | PipelineStep$4<typeof TraceSimplificationSolver>)[];
1999
2035
  constructor(srj: SimpleRouteJson, opts?: CapacityMeshSolverOptions$3);
2000
2036
  getConstructorParams(): readonly [SimpleRouteJson, CapacityMeshSolverOptions$3];
2001
2037
  currentPipelineStepIndex: number;
@@ -2818,7 +2854,7 @@ interface CapacityMeshSolverOptions$2 {
2818
2854
  targetMinCapacity?: number;
2819
2855
  cacheProvider?: CacheProvider | null;
2820
2856
  }
2821
- type PipelineStep$2<T extends new (...args: any[]) => BaseSolver> = {
2857
+ type PipelineStep$3<T extends new (...args: any[]) => BaseSolver> = {
2822
2858
  solverName: string;
2823
2859
  solverClass: T;
2824
2860
  getConstructorParams: (instance: AutoroutingPipeline1_OriginalUnravel) => ConstructorParameters<T>;
@@ -2855,7 +2891,7 @@ declare class AutoroutingPipeline1_OriginalUnravel extends BaseSolver {
2855
2891
  capacityNodes: CapacityMeshNode[] | null;
2856
2892
  capacityEdges: CapacityMeshEdge[] | null;
2857
2893
  cacheProvider: CacheProvider | null;
2858
- pipelineDef: (PipelineStep$2<typeof NetToPointPairsSolver2_OffBoardConnection> | PipelineStep$2<typeof RectDiffPipeline> | PipelineStep$2<typeof StrawSolver> | PipelineStep$2<typeof CapacityMeshEdgeSolver2_NodeTreeOptimization> | PipelineStep$2<typeof DeadEndSolver> | PipelineStep$2<typeof CapacityPathingGreedySolver> | PipelineStep$2<typeof CapacityPathingMultiSectionSolver> | PipelineStep$2<typeof CapacityEdgeToPortSegmentSolver> | PipelineStep$2<typeof CapacitySegmentToPointSolver> | PipelineStep$2<typeof UnravelMultiSectionSolver> | PipelineStep$2<typeof HighDensitySolver> | PipelineStep$2<typeof MultipleHighDensityRouteStitchSolver> | PipelineStep$2<typeof TraceSimplificationSolver>)[];
2894
+ pipelineDef: (PipelineStep$3<typeof NetToPointPairsSolver2_OffBoardConnection> | PipelineStep$3<typeof RectDiffPipeline> | PipelineStep$3<typeof StrawSolver> | PipelineStep$3<typeof CapacityMeshEdgeSolver2_NodeTreeOptimization> | PipelineStep$3<typeof DeadEndSolver> | PipelineStep$3<typeof CapacityPathingGreedySolver> | PipelineStep$3<typeof CapacityPathingMultiSectionSolver> | PipelineStep$3<typeof CapacityEdgeToPortSegmentSolver> | PipelineStep$3<typeof CapacitySegmentToPointSolver> | PipelineStep$3<typeof UnravelMultiSectionSolver> | PipelineStep$3<typeof HighDensitySolver> | PipelineStep$3<typeof MultipleHighDensityRouteStitchSolver> | PipelineStep$3<typeof TraceSimplificationSolver>)[];
2859
2895
  constructor(srj: SimpleRouteJson, opts?: CapacityMeshSolverOptions$2);
2860
2896
  getConstructorParams(): readonly [SimpleRouteJson, CapacityMeshSolverOptions$2];
2861
2897
  currentPipelineStepIndex: number;
@@ -3371,11 +3407,243 @@ declare class IntraNodeSolverWithJumpers extends BaseSolver {
3371
3407
  visualize(): GraphicsObject;
3372
3408
  }
3373
3409
 
3410
+ type BucketCoordinate$1 = `${number}x${number}`;
3411
+ declare class CapacityNodeTree {
3412
+ nodes: CapacityMeshNode[];
3413
+ buckets: Map<BucketCoordinate$1, CapacityMeshNode[]>;
3414
+ CELL_SIZE: number;
3415
+ constructor(nodes: CapacityMeshNode[]);
3416
+ getBucketKey(x: number, y: number): BucketCoordinate$1;
3417
+ getNodesInArea(centerX: number, centerY: number, width: number, height: number): CapacityMeshNode[];
3418
+ }
3419
+
3420
+ /**
3421
+ * This solver looks at every obstacle with off board connections (one per step),
3422
+ * then sets _offBoardConnectedCapacityMeshNodeIds on each capacity node that is
3423
+ * mutually connected via off board connections
3424
+ */
3425
+ declare class RelateNodesToOffBoardConnectionsSolver extends BaseSolver {
3426
+ input: {
3427
+ capacityMeshNodes: CapacityMeshNode[];
3428
+ srj: SimpleRouteJson;
3429
+ };
3430
+ unprocessedObstacles: Obstacle$1[];
3431
+ nodeTree: CapacityNodeTree;
3432
+ offBoardConnMap: ConnectivityMap$1;
3433
+ nodesInNet: Map<OffBoardConnectionId, CapacityMeshNode[]>;
3434
+ lastProcessedObstacle?: Obstacle$1;
3435
+ constructor(input: {
3436
+ capacityMeshNodes: CapacityMeshNode[];
3437
+ srj: SimpleRouteJson;
3438
+ });
3439
+ _step(): void;
3440
+ getOutput(): {
3441
+ capacityNodes: CapacityMeshNode[];
3442
+ };
3443
+ visualize(): GraphicsObject;
3444
+ }
3445
+
3446
+ type JumperFootprint = "0603" | "1206";
3447
+
3448
+ interface Obstacle {
3449
+ type: "rect";
3450
+ obstacleId: string;
3451
+ layers: string[];
3452
+ center: {
3453
+ x: number;
3454
+ y: number;
3455
+ };
3456
+ width: number;
3457
+ height: number;
3458
+ connectedTo: string[];
3459
+ offBoardConnectsTo?: string[];
3460
+ }
3461
+ interface PrepatternJumper {
3462
+ jumperId: string;
3463
+ start: {
3464
+ x: number;
3465
+ y: number;
3466
+ };
3467
+ end: {
3468
+ x: number;
3469
+ y: number;
3470
+ };
3471
+ footprint: JumperFootprint;
3472
+ offBoardConnectionId: string;
3473
+ }
3474
+ interface PatternResult {
3475
+ jumperPadObstacles: Obstacle[];
3476
+ prepatternJumpers: PrepatternJumper[];
3477
+ }
3478
+
3479
+ interface RemoveUnnecessaryJumpersSolverParams {
3480
+ /**
3481
+ * Input nodes from the PortPointPathingSolver
3482
+ */
3483
+ inputNodes: InputNodeWithPortPoints[];
3484
+ /**
3485
+ * Set of jumper off-board connection IDs that were actually used by routes
3486
+ */
3487
+ usedJumperOffBoardObstacleIds: Set<string>;
3488
+ /**
3489
+ * Connectivity map for off-board obstacles (used to check if a jumper net was used)
3490
+ */
3491
+ offBoardConnMap?: ConnectivityMap | null;
3492
+ }
3493
+ /**
3494
+ * RemoveUnnecessaryJumpersSolver removes jumpers that aren't needed because
3495
+ * there are no traces between the pads. It converts unused jumper nodes back
3496
+ * to regular nodes so the high density solver can route through them normally.
3497
+ *
3498
+ * This solver runs after PortPointPathingSolver and before HighDensitySolver.
3499
+ */
3500
+ declare class RemoveUnnecessaryJumpersSolver extends BaseSolver {
3501
+ inputNodes: InputNodeWithPortPoints[];
3502
+ usedJumperOffBoardObstacleIds: Set<string>;
3503
+ offBoardConnMap: ConnectivityMap | null;
3504
+ /**
3505
+ * Output nodes with unused jumper nodes converted to regular nodes
3506
+ */
3507
+ outputNodes: InputNodeWithPortPoints[];
3508
+ /**
3509
+ * Set of off-board connection IDs that were removed
3510
+ */
3511
+ removedOffBoardConnectionIds: Set<string>;
3512
+ constructor(params: RemoveUnnecessaryJumpersSolverParams);
3513
+ /**
3514
+ * Check if a jumper off-board connection ID was used
3515
+ */
3516
+ private isJumperUsed;
3517
+ _step(): void;
3518
+ getOutput(): InputNodeWithPortPoints[];
3519
+ visualize(): GraphicsObject;
3520
+ }
3521
+
3522
+ type PatternType = "alternating_grid" | "staggered_grid";
3523
+ interface JumperPrepatternSolverHyperParameters {
3524
+ /** Orientation of jumpers - "horizontal" or "vertical" */
3525
+ FIRST_ORIENTATION?: "horizontal" | "vertical";
3526
+ /** Jumper footprint size - defaults to "0603" */
3527
+ JUMPER_FOOTPRINT?: JumperFootprint;
3528
+ /** Pattern type for jumper placement - defaults to "alternating_grid" */
3529
+ PATTERN_TYPE?: PatternType;
3530
+ }
3531
+ interface JumperPrepatternSolverParams {
3532
+ nodeWithPortPoints: NodeWithPortPoints;
3533
+ colorMap?: Record<string, string>;
3534
+ traceWidth?: number;
3535
+ jumperFootprint?: JumperFootprint;
3536
+ hyperParameters?: JumperPrepatternSolverHyperParameters;
3537
+ connMap?: ConnectivityMap;
3538
+ }
3539
+ type PipelineStep$2<T extends new (...args: any[]) => BaseSolver> = {
3540
+ solverName: string;
3541
+ solverClass: T;
3542
+ getConstructorParams: (instance: JumperPrepatternSolver) => ConstructorParameters<T>;
3543
+ onSolved?: (instance: JumperPrepatternSolver) => void;
3544
+ };
3545
+ declare class JumperPrepatternSolver extends BaseSolver {
3546
+ nodeWithPortPoints: NodeWithPortPoints;
3547
+ colorMap: Record<string, string>;
3548
+ traceWidth: number;
3549
+ jumperFootprint: JumperFootprint;
3550
+ hyperParameters: JumperPrepatternSolverHyperParameters;
3551
+ connMap: ConnectivityMap;
3552
+ prepatternJumpers: PrepatternJumper[];
3553
+ patternResult: PatternResult | null;
3554
+ capacityNodes: CapacityMeshNode[];
3555
+ capacityEdges: CapacityMeshEdge[];
3556
+ inputNodes: InputNodeWithPortPoints[];
3557
+ connections: SimpleRouteConnection[];
3558
+ srjWithPointPairs: SimpleRouteJson;
3559
+ nodeSolver?: RectDiffPipeline;
3560
+ relateNodesToOffBoardConnections?: RelateNodesToOffBoardConnectionsSolver;
3561
+ edgeSolver?: CapacityMeshEdgeSolver2_NodeTreeOptimization;
3562
+ availableSegmentPointSolver?: AvailableSegmentPointSolver;
3563
+ portPointPathingSolver?: HyperPortPointPathingSolver;
3564
+ multiSectionPortPointOptimizer?: MultiSectionPortPointOptimizer;
3565
+ removeUnnecessaryJumpersSolver?: RemoveUnnecessaryJumpersSolver;
3566
+ highDensitySolver?: SimpleHighDensitySolver;
3567
+ highDensityStitchSolver?: MultipleHighDensityRouteStitchSolver;
3568
+ activeSubSolver?: BaseSolver | null;
3569
+ currentPipelineStepIndex: number;
3570
+ startTimeOfPhase: Record<string, number>;
3571
+ endTimeOfPhase: Record<string, number>;
3572
+ timeSpentOnPhase: Record<string, number>;
3573
+ solvedRoutes: HighDensityIntraNodeRouteWithJumpers[];
3574
+ usedJumperOffBoardObstacleIds: Set<string>;
3575
+ allUsedJumperOffBoardIds: Set<string>;
3576
+ offBoardConnMap: ConnectivityMap | null;
3577
+ pipelineDef: (PipelineStep$2<typeof RectDiffPipeline> | PipelineStep$2<typeof RelateNodesToOffBoardConnectionsSolver> | PipelineStep$2<typeof CapacityMeshEdgeSolver2_NodeTreeOptimization> | PipelineStep$2<typeof AvailableSegmentPointSolver> | PipelineStep$2<typeof HyperPortPointPathingSolver> | PipelineStep$2<typeof RemoveUnnecessaryJumpersSolver> | PipelineStep$2<typeof SimpleHighDensitySolver> | PipelineStep$2<typeof MultipleHighDensityRouteStitchSolver>)[];
3578
+ constructor(params: JumperPrepatternSolverParams);
3579
+ getCurrentStageName(): string;
3580
+ _step(): void;
3581
+ getCurrentPhase(): string;
3582
+ _createSimpleRouteJson(): SimpleRouteJson;
3583
+ _createJumperPadObstacles(): SimpleRouteJson["obstacles"];
3584
+ _addPortPointObstacles(obstacles: SimpleRouteJson["obstacles"]): void;
3585
+ _combineResults(): void;
3586
+ /**
3587
+ * Get all used jumpers converted to the Jumper type format
3588
+ */
3589
+ _getUsedJumpers(): Jumper[];
3590
+ getOutput(): HighDensityIntraNodeRouteWithJumpers[];
3591
+ /**
3592
+ * Draw the two pads of a jumper
3593
+ */
3594
+ private _drawJumperPads;
3595
+ visualize(): GraphicsObject;
3596
+ }
3597
+
3598
+ type JumperSolver = IntraNodeSolverWithJumpers | JumperPrepatternSolver;
3599
+ declare class HyperIntraNodeSolverWithJumpers extends HyperParameterSupervisorSolver<JumperSolver> {
3600
+ constructorParams: ConstructorParameters<typeof IntraNodeSolverWithJumpers>[0];
3601
+ solvedRoutes: HighDensityIntraNodeRouteWithJumpers[];
3602
+ nodeWithPortPoints: NodeWithPortPoints;
3603
+ connMap?: ConnectivityMap;
3604
+ constructor(opts: ConstructorParameters<typeof IntraNodeSolverWithJumpers>[0]);
3605
+ getConstructorParams(): {
3606
+ nodeWithPortPoints: NodeWithPortPoints;
3607
+ colorMap?: Record<string, string>;
3608
+ hyperParameters?: Partial<HighDensityHyperParameters>;
3609
+ connMap?: ConnectivityMap;
3610
+ traceWidth?: number;
3611
+ };
3612
+ getHyperParameterDefs(): ({
3613
+ name: string;
3614
+ possibleValues: {
3615
+ SHUFFLE_SEED: number;
3616
+ }[];
3617
+ } | {
3618
+ name: string;
3619
+ possibleValues: Array<{
3620
+ USE_JUMPER_PREPATTERN: true;
3621
+ } & JumperPrepatternSolverHyperParameters>;
3622
+ } | {
3623
+ name: string;
3624
+ possibleValues: {
3625
+ USE_JUMPER_PREPATTERN: boolean;
3626
+ FIRST_ORIENTATION: string;
3627
+ PATTERN_TYPE: string;
3628
+ }[];
3629
+ })[];
3630
+ getCombinationDefs(): string[][];
3631
+ _step(): void;
3632
+ computeG(solver: JumperSolver): number;
3633
+ computeH(solver: JumperSolver): number;
3634
+ generateSolver(hyperParameters: Partial<HighDensityHyperParameters> & {
3635
+ USE_JUMPER_PREPATTERN?: boolean;
3636
+ FIRST_ORIENTATION?: "horizontal" | "vertical";
3637
+ PATTERN_TYPE?: "alternating_grid" | "staggered_grid";
3638
+ }): JumperSolver;
3639
+ onSolve(solver: SupervisedSolver<JumperSolver>): void;
3640
+ visualize(): GraphicsObject;
3641
+ }
3642
+
3374
3643
  interface NodeAnalysis {
3375
3644
  node: NodeWithPortPoints;
3376
3645
  hasCrossings: boolean;
3377
3646
  numSameLayerCrossings: number;
3378
- isSingleLayer: boolean;
3379
3647
  }
3380
3648
  /**
3381
3649
  * HighDensitySolver intelligently selects the appropriate solver for each node:
@@ -3387,9 +3655,7 @@ interface NodeAnalysis {
3387
3655
  declare class JumperHighDensitySolver extends BaseSolver {
3388
3656
  allNodes: NodeWithPortPoints[];
3389
3657
  nodeAnalyses: NodeAnalysis[];
3390
- routes: (HighDensityIntraNodeRoute$1 & {
3391
- jumpers?: HighDensityIntraNodeRouteWithJumpers["jumpers"];
3392
- })[];
3658
+ routes: HighDensityIntraNodeRoute$1[];
3393
3659
  colorMap: Record<string, string>;
3394
3660
  traceWidth: number;
3395
3661
  viaDiameter: number;
@@ -3398,7 +3664,7 @@ declare class JumperHighDensitySolver extends BaseSolver {
3398
3664
  nodesWithoutCrossings: NodeWithPortPoints[];
3399
3665
  nodesWithCrossings: NodeWithPortPoints[];
3400
3666
  simpleHighDensitySolver?: SimpleHighDensitySolver;
3401
- jumperSolvers: IntraNodeSolverWithJumpers[];
3667
+ jumperSolvers: HyperIntraNodeSolverWithJumpers[];
3402
3668
  currentJumperSolverIndex: number;
3403
3669
  phase: "analyzing" | "simple" | "jumpers" | "done";
3404
3670
  constructor({ nodePortPoints, colorMap, traceWidth, viaDiameter, connMap, hyperParameters, }: {
@@ -3438,15 +3704,15 @@ declare class JumperHighDensitySolver extends BaseSolver {
3438
3704
  declare class ObstacleSpatialHashIndex {
3439
3705
  private idx;
3440
3706
  private storage;
3441
- constructor(implementation?: "native" | "rbush" | "flatbush", obstacles?: Obstacle[]);
3442
- insert(o: Obstacle): void;
3707
+ constructor(implementation?: "native" | "rbush" | "flatbush", obstacles?: Obstacle$1[]);
3708
+ insert(o: Obstacle$1): void;
3443
3709
  search(bbox: {
3444
3710
  minX: number;
3445
3711
  minY: number;
3446
3712
  maxX: number;
3447
3713
  maxY: number;
3448
- }): Obstacle[];
3449
- searchArea(centerX: number, centerY: number, width: number, height: number): Obstacle[];
3714
+ }): Obstacle$1[];
3715
+ searchArea(centerX: number, centerY: number, width: number, height: number): Obstacle$1[];
3450
3716
  }
3451
3717
 
3452
3718
  interface Point$1 {
@@ -3472,6 +3738,7 @@ type HighDensityIntraNodeRoute = {
3472
3738
  x: number;
3473
3739
  y: number;
3474
3740
  }>;
3741
+ jumpers?: Jumper[];
3475
3742
  };
3476
3743
  type HighDensityRoute = HighDensityIntraNodeRoute;
3477
3744
  declare class HighDensityRouteSpatialIndex {
@@ -3523,7 +3790,7 @@ interface Point3D$1 extends Point2D$1 {
3523
3790
  }
3524
3791
  interface TraceKeepoutSolverInput {
3525
3792
  hdRoutes: HighDensityRoute$1[];
3526
- obstacles: Obstacle[];
3793
+ obstacles: Obstacle$1[];
3527
3794
  connMap: ConnectivityMap;
3528
3795
  colorMap: Record<string, string>;
3529
3796
  keepoutRadiusSchedule?: number[];
@@ -3605,7 +3872,7 @@ interface Point3D extends Point2D {
3605
3872
  }
3606
3873
  interface TraceWidthSolverInput {
3607
3874
  hdRoutes: HighDensityRoute$1[];
3608
- obstacles?: Obstacle[];
3875
+ obstacles?: Obstacle$1[];
3609
3876
  connMap?: ConnectivityMap;
3610
3877
  colorMap?: Record<string, string>;
3611
3878
  nominalTraceWidth?: number;
@@ -3642,10 +3909,10 @@ declare class TraceWidthSolver extends BaseSolver {
3642
3909
  currentWalkMinClearance: number;
3643
3910
  bestMinClearance: number;
3644
3911
  bestWidth: number;
3645
- lastCollidingObstacles: Obstacle[];
3912
+ lastCollidingObstacles: Obstacle$1[];
3646
3913
  lastCollidingRoutes: HighDensityRoute$1[];
3647
3914
  lastClearance: number;
3648
- obstacles: Obstacle[];
3915
+ obstacles: Obstacle$1[];
3649
3916
  obstacleSHI?: ObstacleSpatialHashIndex;
3650
3917
  hdRouteSHI: HighDensityRouteSpatialIndex;
3651
3918
  connMap?: ConnectivityMap;
@@ -3731,7 +3998,7 @@ declare class PortPointOffboardPathFragmentSolver extends BaseSolver {
3731
3998
  currentObstacleIndex: number;
3732
3999
  /** Obstacles that have offBoardConnectsTo defined */
3733
4000
  offboardObstacles: Array<{
3734
- obstacle: Obstacle;
4001
+ obstacle: Obstacle$1;
3735
4002
  index: number;
3736
4003
  }>;
3737
4004
  /** Port points created at obstacle centers */
@@ -3748,7 +4015,7 @@ declare class PortPointOffboardPathFragmentSolver extends BaseSolver {
3748
4015
  currentFragmentIndex: number;
3749
4016
  /** Last processed obstacle (for visualization) */
3750
4017
  lastProcessedObstacle: {
3751
- obstacle: Obstacle;
4018
+ obstacle: Obstacle$1;
3752
4019
  index: number;
3753
4020
  } | null;
3754
4021
  /** Last created port point (for visualization) */
@@ -3770,42 +4037,6 @@ declare class PortPointOffboardPathFragmentSolver extends BaseSolver {
3770
4037
  visualize(): GraphicsObject;
3771
4038
  }
3772
4039
 
3773
- type BucketCoordinate$1 = `${number}x${number}`;
3774
- declare class CapacityNodeTree {
3775
- nodes: CapacityMeshNode[];
3776
- buckets: Map<BucketCoordinate$1, CapacityMeshNode[]>;
3777
- CELL_SIZE: number;
3778
- constructor(nodes: CapacityMeshNode[]);
3779
- getBucketKey(x: number, y: number): BucketCoordinate$1;
3780
- getNodesInArea(centerX: number, centerY: number, width: number, height: number): CapacityMeshNode[];
3781
- }
3782
-
3783
- /**
3784
- * This solver looks at every obstacle with off board connections (one per step),
3785
- * then sets _offBoardConnectedCapacityMeshNodeIds on each capacity node that is
3786
- * mutually connected via off board connections
3787
- */
3788
- declare class RelateNodesToOffBoardConnectionsSolver extends BaseSolver {
3789
- input: {
3790
- capacityMeshNodes: CapacityMeshNode[];
3791
- srj: SimpleRouteJson;
3792
- };
3793
- unprocessedObstacles: Obstacle[];
3794
- nodeTree: CapacityNodeTree;
3795
- offBoardConnMap: ConnectivityMap$1;
3796
- nodesInNet: Map<OffBoardConnectionId, CapacityMeshNode[]>;
3797
- lastProcessedObstacle?: Obstacle;
3798
- constructor(input: {
3799
- capacityMeshNodes: CapacityMeshNode[];
3800
- srj: SimpleRouteJson;
3801
- });
3802
- _step(): void;
3803
- getOutput(): {
3804
- capacityNodes: CapacityMeshNode[];
3805
- };
3806
- visualize(): GraphicsObject;
3807
- }
3808
-
3809
4040
  interface CapacityMeshSolverOptions$1 {
3810
4041
  capacityDepth?: number;
3811
4042
  targetMinCapacity?: number;
@@ -4050,7 +4281,7 @@ declare class CapacityMeshNodeSolver extends BaseSolver {
4050
4281
  opts: CapacityMeshNodeSolverOptions$2;
4051
4282
  unfinishedNodes: CapacityMeshNode[];
4052
4283
  finishedNodes: CapacityMeshNode[];
4053
- nodeToXYOverlappingObstaclesMap: Map<CapacityMeshNodeId, Obstacle[]>;
4284
+ nodeToXYOverlappingObstaclesMap: Map<CapacityMeshNodeId, Obstacle$1[]>;
4054
4285
  layerCount: number;
4055
4286
  protected outlinePolygon?: Polygon;
4056
4287
  MAX_DEPTH: number;
@@ -4077,8 +4308,8 @@ declare class CapacityMeshNodeSolver extends BaseSolver {
4077
4308
  getNextNodeId(): string;
4078
4309
  getCapacityFromDepth(depth: number): number;
4079
4310
  getTargetIfNodeContainsTarget(node: CapacityMeshNode): Target | null;
4080
- getXYOverlappingObstacles(node: CapacityMeshNode): Obstacle[];
4081
- getXYZOverlappingObstacles(node: CapacityMeshNode): Obstacle[];
4311
+ getXYOverlappingObstacles(node: CapacityMeshNode): Obstacle$1[];
4312
+ getXYZOverlappingObstacles(node: CapacityMeshNode): Obstacle$1[];
4082
4313
  /**
4083
4314
  * Checks if the given mesh node overlaps with any obstacle.
4084
4315
  * We treat both obstacles and nodes as axis‐aligned rectangles.
@@ -4218,8 +4449,8 @@ declare class SingleLayerNodeMergerSolver_OnlyMergeTargets extends BaseSolver {
4218
4449
  */
4219
4450
  declare class AssignableViaNodeMergerSolver extends BaseSolver {
4220
4451
  newNodes: CapacityMeshNode[];
4221
- obstacleToNodesMap: Map<Obstacle, CapacityMeshNode[]>;
4222
- obstaclesToProcess: Obstacle[];
4452
+ obstacleToNodesMap: Map<Obstacle$1, CapacityMeshNode[]>;
4453
+ obstaclesToProcess: Obstacle$1[];
4223
4454
  mergedNodeIds: Set<CapacityMeshNodeId>;
4224
4455
  constructor(nodes: CapacityMeshNode[]);
4225
4456
  _step(): void;
@@ -4238,7 +4469,7 @@ declare class SingleSimplifiedPathSolver extends BaseSolver {
4238
4469
  tailIndex: number;
4239
4470
  inputRoute: HighDensityIntraNodeRoute$1;
4240
4471
  otherHdRoutes: HighDensityIntraNodeRoute$1[];
4241
- obstacles: Obstacle[];
4472
+ obstacles: Obstacle$1[];
4242
4473
  connMap: ConnectivityMap;
4243
4474
  colorMap: Record<string, string>;
4244
4475
  outline?: Array<{
@@ -4248,7 +4479,7 @@ declare class SingleSimplifiedPathSolver extends BaseSolver {
4248
4479
  constructor(params: {
4249
4480
  inputRoute: HighDensityIntraNodeRoute$1;
4250
4481
  otherHdRoutes: HighDensityIntraNodeRoute$1[];
4251
- obstacles: Obstacle[];
4482
+ obstacles: Obstacle$1[];
4252
4483
  connMap: ConnectivityMap;
4253
4484
  colorMap: Record<string, string>;
4254
4485
  outline?: Array<{
@@ -4259,7 +4490,7 @@ declare class SingleSimplifiedPathSolver extends BaseSolver {
4259
4490
  getConstructorParams(): {
4260
4491
  inputRoute: HighDensityIntraNodeRoute$1;
4261
4492
  otherHdRoutes: HighDensityIntraNodeRoute$1[];
4262
- obstacles: Obstacle[];
4493
+ obstacles: Obstacle$1[];
4263
4494
  connMap: Record<string, string[]>;
4264
4495
  colorMap: Record<string, string>;
4265
4496
  outline: {
@@ -4278,7 +4509,7 @@ declare class MultiSimplifiedPathSolver extends BaseSolver {
4278
4509
  currentUnsimplifiedHdRouteIndex: number;
4279
4510
  activeSubSolver: SingleSimplifiedPathSolver | null;
4280
4511
  unsimplifiedHdRoutes: HighDensityIntraNodeRoute$1[];
4281
- obstacles: Obstacle[];
4512
+ obstacles: Obstacle$1[];
4282
4513
  connMap: ConnectivityMap;
4283
4514
  colorMap: Record<string, string>;
4284
4515
  outline?: Array<{
@@ -4288,7 +4519,7 @@ declare class MultiSimplifiedPathSolver extends BaseSolver {
4288
4519
  defaultViaDiameter: number;
4289
4520
  constructor(params: {
4290
4521
  unsimplifiedHdRoutes: HighDensityIntraNodeRoute$1[];
4291
- obstacles: Obstacle[];
4522
+ obstacles: Obstacle$1[];
4292
4523
  connMap?: ConnectivityMap;
4293
4524
  colorMap?: Record<string, string>;
4294
4525
  outline?: Array<{
@@ -4343,7 +4574,7 @@ declare class SingleRouteUselessViaRemovalSolver extends BaseSolver {
4343
4574
 
4344
4575
  interface UselessViaRemovalSolverInput {
4345
4576
  unsimplifiedHdRoutes: HighDensityRoute$1[];
4346
- obstacles: Obstacle[];
4577
+ obstacles: Obstacle$1[];
4347
4578
  colorMap: Record<string, string>;
4348
4579
  layerCount: number;
4349
4580
  }