@tscircuit/schematic-trace-solver 0.0.40 → 0.0.42

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.
Files changed (57) hide show
  1. package/dist/index.d.ts +155 -9
  2. package/dist/index.js +998 -479
  3. package/lib/solvers/LongDistancePairSolver/LongDistancePairSolver.ts +238 -0
  4. package/lib/solvers/SchematicTracePipelineSolver/SchematicTracePipelineSolver.ts +61 -26
  5. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/TraceLabelOverlapAvoidanceSolver.ts +94 -192
  6. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/rerouteCollidingTrace.ts +13 -24
  7. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/sub-solvers/LabelMergingSolver/LabelMergingSolver.ts +205 -0
  8. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/sub-solvers/OverlapAvoidanceStepSolver/OverlapAvoidanceStepSolver.ts +144 -0
  9. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/sub-solvers/SingleOverlapSolver/SingleOverlapSolver.ts +117 -0
  10. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/sub-solvers/TraceCleanupSolver/TraceCleanupSolver.ts +132 -0
  11. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/{balanceLShapes.ts → sub-solvers/TraceCleanupSolver/balanceLShapes.ts} +12 -10
  12. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/{hasCollisions.ts → sub-solvers/TraceCleanupSolver/hasCollisions.ts} +1 -1
  13. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/{hasCollisionsWithLabels.ts → sub-solvers/TraceCleanupSolver/hasCollisionsWithLabels.ts} +1 -1
  14. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/{minimizeTurnsWithFilteredLabels.ts → sub-solvers/TraceCleanupSolver/minimizeTurnsWithFilteredLabels.ts} +6 -6
  15. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/{simplifyPath.ts → sub-solvers/TraceCleanupSolver/simplifyPath.ts} +1 -1
  16. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/{turnMinimization.ts → sub-solvers/TraceCleanupSolver/turnMinimization.ts} +0 -2
  17. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/tryFourPointDetour.ts +104 -0
  18. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/trySnipAndReconnect.ts +24 -154
  19. package/lib/utils/does-trace-overlap-with-existing-traces.ts +33 -0
  20. package/package.json +1 -1
  21. package/site/examples/example25.page.tsx +4 -0
  22. package/tests/assets/1.input.json +379 -0
  23. package/tests/assets/2.input.json +330 -0
  24. package/tests/assets/3.input.json +388 -0
  25. package/tests/assets/MergedNetLabelObstacles.test.input.json +154 -0
  26. package/tests/assets/OverlapAvoidanceStepSolver.test.input.json +682 -0
  27. package/tests/assets/SingleOverlapSolver.test.input.json +170 -0
  28. package/tests/assets/TraceCleanupSolver.test.input.json +216 -0
  29. package/tests/assets/TraceLabelOverlapAvoidanceSolver.test.input.json +424 -0
  30. package/tests/assets/example25.json +96 -0
  31. package/tests/examples/__snapshots__/example03.snap.svg +67 -76
  32. package/tests/examples/__snapshots__/example10.snap.svg +24 -30
  33. package/tests/examples/__snapshots__/example13.snap.svg +81 -84
  34. package/tests/examples/__snapshots__/example15.snap.svg +5 -8
  35. package/tests/examples/__snapshots__/example21.snap.svg +68 -74
  36. package/tests/examples/__snapshots__/example25.snap.svg +3 -3
  37. package/tests/examples/__snapshots__/example26.snap.svg +3 -3
  38. package/tests/examples/__snapshots__/example28.snap.svg +273 -0
  39. package/tests/examples/example28.test.ts +13 -0
  40. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/TraceLabelOverlapAvoidanceSolver.test.ts +18 -0
  41. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/__snapshots__/TraceLabelOverlapAvoidanceSolver.snap.svg +243 -0
  42. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/renderComparisonView/__snapshots__/renderComparisonView01.snap.svg +223 -0
  43. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/renderComparisonView/__snapshots__/renderComparisonView02.snap.svg +205 -0
  44. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/renderComparisonView/__snapshots__/renderComparisonView03.snap.svg +184 -0
  45. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/renderComparisonView/renderComparisonView01.test.ts +29 -0
  46. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/renderComparisonView/renderComparisonView02.test.ts +27 -0
  47. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/renderComparisonView/renderComparisonView03.test.ts +39 -0
  48. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/MergedNetLabelObstacles.test.ts +14 -0
  49. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/OverlapAvoidanceStepSolver.test.ts +20 -0
  50. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/SingleOverlapSolver.test.ts +10 -0
  51. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/TraceCleanupSolver.test.ts +19 -0
  52. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/__snapshots__/MergedNetLabelObstacles.snap.svg +140 -0
  53. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/__snapshots__/OverlapAvoidanceStepSolver.snap.svg +216 -0
  54. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/__snapshots__/SingleOverlapSolver.snap.svg +125 -0
  55. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/__snapshots__/TraceCleanupSolver.snap.svg +119 -0
  56. /package/lib/solvers/TraceLabelOverlapAvoidanceSolver/{countTurns.ts → sub-solvers/TraceCleanupSolver/countTurns.ts} +0 -0
  57. /package/lib/solvers/TraceLabelOverlapAvoidanceSolver/{tryConnectPoints.ts → sub-solvers/TraceCleanupSolver/tryConnectPoints.ts} +0 -0
package/dist/index.d.ts CHANGED
@@ -129,6 +129,7 @@ type ChipWithBounds = {
129
129
  maxX: number;
130
130
  maxY: number;
131
131
  };
132
+ declare const getObstacleRects: (problem: InputProblem) => ChipWithBounds[];
132
133
 
133
134
  declare class SchematicTraceSingleLineSolver2 extends BaseSolver {
134
135
  pins: MspConnectionPair["pins"];
@@ -381,20 +382,128 @@ declare class NetLabelPlacementSolver extends BaseSolver {
381
382
  visualize(): GraphicsObject;
382
383
  }
383
384
 
384
- interface TraceLabelOverlapAvoidanceSolverInput {
385
+ interface LabelMergingSolverInput {
386
+ netLabelPlacements: NetLabelPlacement[];
385
387
  inputProblem: InputProblem;
386
388
  traces: SolvedTracePath[];
389
+ }
390
+ interface LabelMergingSolverOutput {
387
391
  netLabelPlacements: NetLabelPlacement[];
392
+ mergedLabelNetIdMap: Record<string, Set<string>>;
388
393
  }
389
- declare class TraceLabelOverlapAvoidanceSolver extends BaseSolver {
390
- private problem;
394
+ /**
395
+ * Merges multiple net labels into a single, larger label if they are on the
396
+ * same side of the same chip, reducing schematic clutter.
397
+ */
398
+ declare class MergedNetLabelObstacleSolver extends BaseSolver {
399
+ private input;
400
+ private output;
401
+ private inputProblem;
391
402
  private traces;
392
- private netTempLabelPlacements;
393
- private netLabelPlacements;
394
- private updatedTraces;
395
- private mergedLabelNetIdMap;
403
+ constructor(solverInput: LabelMergingSolverInput);
404
+ _step(): void;
405
+ getOutput(): LabelMergingSolverOutput;
406
+ visualize(): GraphicsObject;
407
+ }
408
+
409
+ interface TraceCleanupSolverInput {
410
+ inputProblem: InputProblem;
411
+ allTraces: SolvedTracePath[];
412
+ targetTraceIds: Set<string>;
413
+ allLabelPlacements: NetLabelPlacement[];
414
+ mergedLabelNetIdMap: Record<string, Set<string>>;
415
+ paddingBuffer: number;
416
+ }
417
+ /**
418
+ * Cleans up traces by minimizing turns and balancing L-shapes to improve
419
+ * the overall aesthetics and readability of the schematic.
420
+ */
421
+ declare class TraceCleanupSolver extends BaseSolver {
422
+ private input;
423
+ private outputTraces;
424
+ private pipelineStepIndex;
425
+ private tracesToProcess;
426
+ private minimizedTraces;
427
+ private balancedTraces;
428
+ constructor(solverInput: TraceCleanupSolverInput);
429
+ _step(): void;
430
+ getOutput(): {
431
+ traces: SolvedTracePath[];
432
+ };
433
+ visualize(): GraphicsObject;
434
+ }
435
+
436
+ interface SingleOverlapSolverInput {
437
+ trace: SolvedTracePath;
438
+ label: NetLabelPlacement;
439
+ problem: InputProblem;
440
+ paddingBuffer: number;
441
+ detourCount: number;
442
+ }
443
+ /**
444
+ * This solver attempts to find a valid rerouting for a single trace that is
445
+ * overlapping with a net label. It tries various candidate paths until it
446
+ * finds one that does not introduce new collisions.
447
+ */
448
+ declare class SingleOverlapSolver extends BaseSolver {
449
+ queuedCandidatePaths: Point[][];
450
+ solvedTracePath: Point[] | null;
451
+ initialTrace: SolvedTracePath;
452
+ problem: InputProblem;
453
+ obstacles: ReturnType<typeof getObstacleRects>;
454
+ label: NetLabelPlacement;
455
+ constructor(solverInput: SingleOverlapSolverInput);
456
+ _step(): void;
457
+ visualize(): GraphicsObject;
458
+ }
459
+
460
+ interface OverlapCollectionSolverInput {
461
+ inputProblem: InputProblem;
462
+ traces: SolvedTracePath[];
463
+ netLabelPlacements: NetLabelPlacement[];
464
+ mergedLabelNetIdMap: Record<string, Set<string>>;
465
+ }
466
+ /**
467
+ * This is an internal solver that manages the step-by-step process of avoiding
468
+ * multiple overlaps. It follows the pattern of SchematicTraceLinesSolver.
469
+ */
470
+ declare class OverlapAvoidanceStepSolver extends BaseSolver {
471
+ inputProblem: InputProblem;
472
+ netLabelPlacements: NetLabelPlacement[];
473
+ mergedLabelNetIdMap: Record<string, Set<string>>;
474
+ allTraces: SolvedTracePath[];
475
+ modifiedTraces: SolvedTracePath[];
396
476
  private detourCountByLabel;
397
477
  private readonly PADDING_BUFFER;
478
+ activeSubSolver: SingleOverlapSolver | null;
479
+ private overlapQueue;
480
+ private recentlyFailed;
481
+ constructor(solverInput: OverlapCollectionSolverInput);
482
+ _step(): void;
483
+ getOutput(): {
484
+ allTraces: SolvedTracePath[];
485
+ modifiedTraces: SolvedTracePath[];
486
+ };
487
+ visualize(): GraphicsObject;
488
+ }
489
+
490
+ interface TraceLabelOverlapAvoidanceSolverInput {
491
+ inputProblem: InputProblem;
492
+ traces: SolvedTracePath[];
493
+ netLabelPlacements: NetLabelPlacement[];
494
+ }
495
+ /**
496
+ * This solver is a pipeline that runs a series of sub-solvers to resolve
497
+ * trace-label overlaps and clean up the resulting traces.
498
+ */
499
+ declare class TraceLabelOverlapAvoidanceSolver extends BaseSolver {
500
+ inputProblem: InputProblem;
501
+ traces: SolvedTracePath[];
502
+ netLabelPlacements: NetLabelPlacement[];
503
+ labelMergingSolver?: MergedNetLabelObstacleSolver;
504
+ overlapAvoidanceSolver?: OverlapAvoidanceStepSolver;
505
+ traceCleanupSolver?: TraceCleanupSolver;
506
+ pipelineStepIndex: number;
398
507
  constructor(solverInput: TraceLabelOverlapAvoidanceSolverInput);
399
508
  _step(): void;
400
509
  getOutput(): {
@@ -404,6 +513,35 @@ declare class TraceLabelOverlapAvoidanceSolver extends BaseSolver {
404
513
  visualize(): GraphicsObject;
405
514
  }
406
515
 
516
+ declare class LongDistancePairSolver extends BaseSolver {
517
+ private params;
518
+ solvedLongDistanceTraces: SolvedTracePath[];
519
+ private queuedCandidatePairs;
520
+ private currentCandidatePair;
521
+ private subSolver;
522
+ private chipMap;
523
+ private inputProblem;
524
+ private netConnMap;
525
+ private newlyConnectedPinIds;
526
+ private allSolvedTraces;
527
+ constructor(params: {
528
+ inputProblem: InputProblem;
529
+ alreadySolvedTraces: SolvedTracePath[];
530
+ primaryMspConnectionPairs: MspConnectionPair[];
531
+ });
532
+ getConstructorParams(): {
533
+ inputProblem: InputProblem;
534
+ alreadySolvedTraces: SolvedTracePath[];
535
+ primaryMspConnectionPairs: MspConnectionPair[];
536
+ };
537
+ _step(): void;
538
+ visualize(): graphics_debug.GraphicsObject;
539
+ getOutput(): {
540
+ newTraces: SolvedTracePath[];
541
+ allTracesMerged: SolvedTracePath[];
542
+ };
543
+ }
544
+
407
545
  /**
408
546
  * Pipeline solver that runs a series of solvers to find the best schematic layout.
409
547
  * Coordinates the entire layout process from chip partitioning through final packing.
@@ -414,19 +552,27 @@ type PipelineStep<T extends new (...args: any[]) => BaseSolver> = {
414
552
  solverClass: T;
415
553
  getConstructorParams: (instance: SchematicTracePipelineSolver) => ConstructorParameters<T>;
416
554
  onSolved?: (instance: SchematicTracePipelineSolver) => void;
555
+ shouldSkip?: (instance: SchematicTracePipelineSolver) => boolean;
417
556
  };
557
+ interface SchematicTracePipelineSolverParams {
558
+ inputProblem: InputProblem;
559
+ allowLongDistanceTraces?: boolean;
560
+ }
418
561
  declare class SchematicTracePipelineSolver extends BaseSolver {
419
562
  mspConnectionPairSolver?: MspConnectionPairSolver;
420
563
  schematicTraceLinesSolver?: SchematicTraceLinesSolver;
564
+ longDistancePairSolver?: LongDistancePairSolver;
421
565
  traceOverlapShiftSolver?: TraceOverlapShiftSolver;
422
566
  netLabelPlacementSolver?: NetLabelPlacementSolver;
567
+ labelMergingSolver?: MergedNetLabelObstacleSolver;
423
568
  traceLabelOverlapAvoidanceSolver?: TraceLabelOverlapAvoidanceSolver;
569
+ traceCleanupSolver?: TraceCleanupSolver;
424
570
  startTimeOfPhase: Record<string, number>;
425
571
  endTimeOfPhase: Record<string, number>;
426
572
  timeSpentOnPhase: Record<string, number>;
427
573
  firstIterationOfPhase: Record<string, number>;
428
574
  inputProblem: InputProblem;
429
- pipelineDef: (PipelineStep<typeof MspConnectionPairSolver> | PipelineStep<typeof SchematicTraceLinesSolver> | PipelineStep<typeof TraceOverlapShiftSolver> | PipelineStep<typeof NetLabelPlacementSolver> | PipelineStep<typeof TraceLabelOverlapAvoidanceSolver>)[];
575
+ pipelineDef: (PipelineStep<typeof MspConnectionPairSolver> | PipelineStep<typeof SchematicTraceLinesSolver> | PipelineStep<typeof LongDistancePairSolver> | PipelineStep<typeof TraceOverlapShiftSolver> | PipelineStep<typeof NetLabelPlacementSolver> | PipelineStep<typeof TraceLabelOverlapAvoidanceSolver>)[];
430
576
  constructor(inputProblem: InputProblem);
431
577
  getConstructorParams(): ConstructorParameters<typeof SchematicTracePipelineSolver>[0];
432
578
  currentPipelineStepIndex: number;
@@ -442,4 +588,4 @@ declare class SchematicTracePipelineSolver extends BaseSolver {
442
588
  preview(): GraphicsObject;
443
589
  }
444
590
 
445
- export { type ChipId, type InputChip, type InputDirectConnection, type InputNetConnection, type InputPin, type InputProblem, type NetId, type PinId, SchematicTracePipelineSolver, SchematicTraceSingleLineSolver2 };
591
+ export { type ChipId, type InputChip, type InputDirectConnection, type InputNetConnection, type InputPin, type InputProblem, type NetId, type PinId, SchematicTracePipelineSolver, type SchematicTracePipelineSolverParams, SchematicTraceSingleLineSolver2 };