@tscircuit/schematic-trace-solver 0.0.48 → 0.0.50

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 (168) hide show
  1. package/README.md +1 -1
  2. package/dist/index.d.ts +128 -1
  3. package/dist/index.js +1450 -42
  4. package/lib/solvers/AvailableNetOrientationSolver/AvailableNetOrientationSolver.ts +682 -0
  5. package/lib/solvers/AvailableNetOrientationSolver/constants.ts +6 -0
  6. package/lib/solvers/AvailableNetOrientationSolver/geometry.ts +192 -0
  7. package/lib/solvers/AvailableNetOrientationSolver/traces.ts +43 -0
  8. package/lib/solvers/AvailableNetOrientationSolver/types.ts +44 -0
  9. package/lib/solvers/AvailableNetOrientationSolver/visualize.ts +123 -0
  10. package/lib/solvers/Example28Solver/Example28Solver.ts +182 -0
  11. package/lib/solvers/Example28Solver/geometry.ts +246 -0
  12. package/lib/solvers/Example28Solver/labelMovement.ts +82 -0
  13. package/lib/solvers/Example28Solver/reroute.ts +368 -0
  14. package/lib/solvers/Example28Solver/types.ts +47 -0
  15. package/lib/solvers/Example28Solver/visualize.ts +96 -0
  16. package/lib/solvers/SchematicTracePipelineSolver/SchematicTracePipelineSolver.ts +30 -0
  17. package/package.json +1 -1
  18. package/site/SchematicTraceSingleLineSolver2/SchematicTraceSingleLineSolver2_01-example17-d1_1-u1_1.page.tsx +2 -0
  19. package/site/TraceCleanupSolver/TraceCleanupSolver.page.tsx +23 -0
  20. package/site/TraceLabelOverlapAvoidanceSolver/MergedNetLabelObstacles.page.tsx +18 -0
  21. package/site/TraceLabelOverlapAvoidanceSolver/OverlapAvoidanceStepSolver.page.tsx +24 -0
  22. package/site/TraceLabelOverlapAvoidanceSolver/SingleOverlapSolver.page.tsx +10 -0
  23. package/site/TraceLabelOverlapAvoidanceSolver/TraceLabelOverlapAvoidanceSolver.page.tsx +146 -0
  24. package/site/TraceLabelOverlapAvoidanceSolver/renderComparisonView01.page.tsx +32 -0
  25. package/site/TraceLabelOverlapAvoidanceSolver/renderComparisonView02.page.tsx +32 -0
  26. package/site/TraceLabelOverlapAvoidanceSolver/renderComparisonView03.page.tsx +35 -0
  27. package/site/examples/example01.page.tsx +6 -0
  28. package/site/examples/example02.page.tsx +4 -180
  29. package/site/examples/example03.page.tsx +3 -212
  30. package/site/examples/example04.page.tsx +6 -0
  31. package/site/examples/example05.page.tsx +3 -179
  32. package/site/examples/example06.page.tsx +3 -57
  33. package/site/examples/example07.page.tsx +3 -132
  34. package/site/examples/example08.page.tsx +3 -91
  35. package/site/examples/example09.page.tsx +3 -414
  36. package/site/examples/example10.page.tsx +3 -75
  37. package/site/examples/example11.page.tsx +3 -116
  38. package/site/examples/example12.page.tsx +3 -94
  39. package/site/examples/example13.page.tsx +3 -216
  40. package/site/examples/example14.page.tsx +3 -207
  41. package/site/examples/example15.page.tsx +6 -0
  42. package/site/examples/example16.page.tsx +6 -0
  43. package/site/examples/example17.page.tsx +6 -0
  44. package/site/examples/example18.page.tsx +3 -178
  45. package/site/examples/example19.page.tsx +3 -166
  46. package/site/examples/example20.page.tsx +3 -100
  47. package/site/examples/example21.page.tsx +3 -174
  48. package/site/examples/example22.page.tsx +3 -105
  49. package/site/examples/example23.page.tsx +3 -134
  50. package/site/examples/example24.page.tsx +3 -125
  51. package/site/examples/example25.page.tsx +2 -0
  52. package/site/examples/example26.page.tsx +2 -0
  53. package/site/examples/example27.page.tsx +2 -0
  54. package/site/examples/example28.page.tsx +3 -58
  55. package/site/examples/example29.page.tsx +6 -0
  56. package/site/examples/example30.page.tsx +6 -0
  57. package/site/examples/example31.page.tsx +4 -0
  58. package/tests/assets/example01.json +109 -0
  59. package/tests/assets/example02.json +178 -0
  60. package/tests/assets/example03.json +210 -0
  61. package/tests/assets/example04.json +41 -0
  62. package/tests/assets/example05.json +175 -0
  63. package/tests/assets/example06.json +55 -0
  64. package/tests/assets/example07.json +130 -0
  65. package/tests/assets/example08.json +89 -0
  66. package/tests/assets/example09.json +412 -0
  67. package/tests/assets/example10.json +73 -0
  68. package/tests/assets/example11.json +114 -0
  69. package/tests/assets/example12.json +92 -0
  70. package/tests/assets/example13.json +214 -0
  71. package/tests/assets/example14.json +205 -0
  72. package/tests/assets/example15.json +618 -0
  73. package/tests/assets/example16.json +102 -0
  74. package/tests/assets/example17.json +160 -0
  75. package/tests/assets/example18.json +176 -0
  76. package/tests/assets/example19.json +164 -0
  77. package/tests/assets/example20.json +98 -0
  78. package/tests/assets/example21.json +172 -0
  79. package/tests/assets/example22.json +103 -0
  80. package/tests/assets/example23.json +132 -0
  81. package/tests/assets/example24.json +123 -0
  82. package/tests/assets/example25.json +146 -33
  83. package/tests/assets/example26.json +51 -1134
  84. package/tests/assets/example27.json +151 -91
  85. package/tests/assets/example28.json +56 -0
  86. package/tests/assets/example29.json +1206 -0
  87. package/tests/assets/example30.json +168 -0
  88. package/tests/assets/example31.json +46 -0
  89. package/tests/examples/__snapshots__/example01.snap.svg +12 -6
  90. package/tests/examples/__snapshots__/example02.snap.svg +16 -8
  91. package/tests/examples/__snapshots__/example03.snap.svg +36 -18
  92. package/tests/examples/__snapshots__/example04.snap.svg +8 -4
  93. package/tests/examples/__snapshots__/example05.snap.svg +4 -2
  94. package/tests/examples/__snapshots__/example06.snap.svg +4 -2
  95. package/tests/examples/__snapshots__/example07.snap.svg +20 -10
  96. package/tests/examples/__snapshots__/example08.snap.svg +16 -8
  97. package/tests/examples/__snapshots__/example09.snap.svg +80 -40
  98. package/tests/examples/__snapshots__/example10.snap.svg +16 -8
  99. package/tests/examples/__snapshots__/example11.snap.svg +24 -12
  100. package/tests/examples/__snapshots__/example12.snap.svg +41 -30
  101. package/tests/examples/__snapshots__/example13.snap.svg +38 -16
  102. package/tests/examples/__snapshots__/example14.snap.svg +121 -48
  103. package/tests/examples/__snapshots__/example15.snap.svg +36 -18
  104. package/tests/examples/__snapshots__/example16.snap.svg +41 -27
  105. package/tests/examples/__snapshots__/example17.snap.svg +16 -8
  106. package/tests/examples/__snapshots__/example18.snap.svg +20 -10
  107. package/tests/examples/__snapshots__/example19.snap.svg +16 -8
  108. package/tests/examples/__snapshots__/example20.snap.svg +45 -131
  109. package/tests/examples/__snapshots__/example21.snap.svg +93 -65
  110. package/tests/examples/__snapshots__/example22.snap.svg +43 -23
  111. package/tests/examples/__snapshots__/example23.snap.svg +62 -26
  112. package/tests/examples/__snapshots__/example24.snap.svg +50 -28
  113. package/tests/examples/__snapshots__/example25.snap.svg +175 -49
  114. package/tests/examples/__snapshots__/example26.snap.svg +16 -8
  115. package/tests/examples/__snapshots__/example27.snap.svg +24 -12
  116. package/tests/examples/__snapshots__/example28.snap.svg +24 -18
  117. package/tests/examples/__snapshots__/example29.snap.svg +184 -92
  118. package/tests/examples/__snapshots__/example30.snap.svg +48 -24
  119. package/tests/examples/__snapshots__/example31.snap.svg +88 -0
  120. package/tests/examples/example01.test.ts +2 -2
  121. package/tests/examples/example02.test.ts +2 -2
  122. package/tests/examples/example03.test.ts +2 -2
  123. package/tests/examples/example04.test.ts +2 -2
  124. package/tests/examples/example05.test.ts +2 -2
  125. package/tests/examples/example06.test.ts +2 -2
  126. package/tests/examples/example07.test.ts +2 -2
  127. package/tests/examples/example08.test.ts +2 -2
  128. package/tests/examples/example09.test.ts +2 -2
  129. package/tests/examples/example10.test.ts +2 -2
  130. package/tests/examples/{example11.test.tsx → example11.test.ts} +2 -2
  131. package/tests/examples/{example12.test.tsx → example12.test.ts} +2 -2
  132. package/tests/examples/{example13.test.tsx → example13.test.ts} +2 -2
  133. package/tests/examples/example14.test.ts +12 -0
  134. package/tests/examples/example15.test.ts +12 -0
  135. package/tests/examples/example16.test.ts +12 -0
  136. package/tests/examples/example17.test.ts +12 -0
  137. package/tests/examples/example18.test.ts +12 -0
  138. package/tests/examples/example19.test.ts +12 -0
  139. package/tests/examples/example20.test.ts +12 -0
  140. package/tests/examples/example21.test.ts +12 -0
  141. package/tests/examples/example22.test.ts +12 -0
  142. package/tests/examples/example23.test.ts +12 -0
  143. package/tests/examples/example24.test.ts +12 -0
  144. package/tests/examples/example25.test.ts +12 -0
  145. package/tests/examples/example26.test.ts +12 -0
  146. package/tests/examples/example27.test.ts +3 -232
  147. package/tests/examples/example28.test.ts +2 -2
  148. package/tests/examples/example29.test.ts +1 -2
  149. package/tests/examples/example30.test.ts +2 -2
  150. package/tests/examples/example31.test.ts +12 -0
  151. package/site/examples/example01-basic.page.tsx +0 -105
  152. package/site/examples/example04-single-symbol.page.tsx +0 -46
  153. package/site/examples/example15-rp2040-caps.page.tsx +0 -623
  154. package/site/examples/example16-core-repro51.page.tsx +0 -107
  155. package/site/examples/example17-straight-line-trace.page.tsx +0 -165
  156. package/tests/examples/example14.test.tsx +0 -11
  157. package/tests/examples/example15.test.tsx +0 -629
  158. package/tests/examples/example16.test.tsx +0 -113
  159. package/tests/examples/example17.test.tsx +0 -171
  160. package/tests/examples/example18.test.tsx +0 -187
  161. package/tests/examples/example19.test.tsx +0 -175
  162. package/tests/examples/example20.test.tsx +0 -190
  163. package/tests/examples/example21.test.tsx +0 -183
  164. package/tests/examples/example22.test.tsx +0 -109
  165. package/tests/examples/example23.test.tsx +0 -109
  166. package/tests/examples/example24.test.tsx +0 -114
  167. package/tests/examples/example25.test.tsx +0 -143
  168. package/tests/examples/example26.test.tsx +0 -134
package/README.md CHANGED
@@ -100,7 +100,7 @@ only appear at certain iterations.
100
100
  2. Set `DEBUG=Group_doInitialSchematicTraceRender`
101
101
  3. Run the test with `bun test`
102
102
  4. The console output will show the location of the input problem
103
- 5. Copy the input problem and [paste it into the input debugger](https://schematic-trace-solver.vercel.app/?fixture=%7B%22path%22%3A%22site%2Fexamples%2Fexample01-basic.page.tsx%22%7D)
103
+ 5. Copy the input problem and [paste it into the input debugger](https://schematic-trace-solver.vercel.app/?fixture=%7B%22path%22%3A%22site%2Fexamples%2Fexample01.page.tsx%22%7D)
104
104
  6. Download the `page.tsx` or `test.tsx` file and put it in the `site` or `tests` directories.
105
105
 
106
106
  <img width="1288" height="1128" alt="image" src="https://github.com/user-attachments/assets/c067f7f9-c46c-4600-a0a4-5112440bd2f4" />
package/dist/index.d.ts CHANGED
@@ -581,6 +581,131 @@ declare class TraceCleanupSolver extends BaseSolver {
581
581
  visualize(): GraphicsObject;
582
582
  }
583
583
 
584
+ interface TraceLabelOverlap {
585
+ trace: SolvedTracePath;
586
+ label: NetLabelPlacement;
587
+ }
588
+
589
+ interface Example28SolverParams {
590
+ inputProblem: InputProblem;
591
+ traces: SolvedTracePath[];
592
+ netLabelPlacements: NetLabelPlacement[];
593
+ }
594
+ type TracePathScore = {
595
+ labelIntersections: number;
596
+ labelHugDistance: number;
597
+ traceIntersections: number;
598
+ pathLength: number;
599
+ };
600
+ type RerouteCandidateResult = {
601
+ path: Point[];
602
+ score?: TracePathScore;
603
+ status: "valid" | "duplicate" | "chip-collision";
604
+ selected: boolean;
605
+ };
606
+
607
+ declare class Example28Solver extends BaseSolver {
608
+ inputProblem: InputProblem;
609
+ traces: SolvedTracePath[];
610
+ netLabelPlacements: NetLabelPlacement[];
611
+ outputTraces: SolvedTracePath[];
612
+ outputNetLabelPlacements: NetLabelPlacement[];
613
+ queuedOverlaps: TraceLabelOverlap[];
614
+ currentOverlap: TraceLabelOverlap | null;
615
+ currentCandidateResults: RerouteCandidateResult[];
616
+ private chipObstacles;
617
+ constructor(params: Example28SolverParams);
618
+ getConstructorParams(): ConstructorParameters<typeof Example28Solver>[0];
619
+ _step(): void;
620
+ private finish;
621
+ private initializeQueuedOverlaps;
622
+ private getTraceLabelOverlaps;
623
+ private shouldRerouteOverlap;
624
+ private isXFacingLabel;
625
+ private hasExplicitOrientationConstraint;
626
+ private getOverlapKey;
627
+ private isOverlapStillPresent;
628
+ private getCurrentTrace;
629
+ private rerouteOverlappingTrace;
630
+ visualize(): GraphicsObject;
631
+ }
632
+
633
+ interface AvailableNetOrientationSolverParams {
634
+ inputProblem: InputProblem;
635
+ traces: SolvedTracePath[];
636
+ netLabelPlacements: NetLabelPlacement[];
637
+ }
638
+ type CandidateLabel = {
639
+ orientation: FacingDirection;
640
+ anchorPoint: Point;
641
+ center: Point;
642
+ width: number;
643
+ height: number;
644
+ };
645
+ type CandidateStatus = "valid" | "chip-collision" | "trace-collision" | "netlabel-collision";
646
+ type CandidatePhase = "rotate" | "shift";
647
+ type EvaluatedCandidate = CandidateLabel & {
648
+ status: CandidateStatus;
649
+ selected: boolean;
650
+ phase: CandidatePhase;
651
+ distance?: number;
652
+ outwardDistance?: number;
653
+ };
654
+
655
+ declare class AvailableNetOrientationSolver extends BaseSolver {
656
+ inputProblem: InputProblem;
657
+ traces: SolvedTracePath[];
658
+ netLabelPlacements: NetLabelPlacement[];
659
+ outputNetLabelPlacements: NetLabelPlacement[];
660
+ queuedLabelIndices: number[];
661
+ currentLabelIndex: number | null;
662
+ currentLabel: NetLabelPlacement | null;
663
+ currentCandidateResults: EvaluatedCandidate[];
664
+ private traceMap;
665
+ private chipObstacleSpatialIndex;
666
+ private maxSearchDistance;
667
+ private pinMap;
668
+ constructor(params: AvailableNetOrientationSolverParams);
669
+ getConstructorParams(): ConstructorParameters<typeof AvailableNetOrientationSolver>[0];
670
+ _step(): void;
671
+ getOutput(): {
672
+ traces: SolvedTracePath[];
673
+ netLabelPlacements: NetLabelPlacement[];
674
+ };
675
+ private getProcessableLabelIndices;
676
+ private shouldProcessLabel;
677
+ private processLabel;
678
+ private applyCandidate;
679
+ private addConnectorTrace;
680
+ private finish;
681
+ private setCurrentLabel;
682
+ private findCorrectedCandidate;
683
+ private findValidRotatedCandidate;
684
+ private getAvailableOrientations;
685
+ private findValidShiftedCandidate;
686
+ private findValidCandidateInShiftColumn;
687
+ private evaluateCandidate;
688
+ private getSearchStartAnchor;
689
+ private getWickOffsetAnchor;
690
+ private getSideOffsetAnchor;
691
+ private getSearchDistanceLimit;
692
+ private createCandidate;
693
+ private getNetLabelWidth;
694
+ private isLabelPlacementValid;
695
+ private isCandidateValidWithOffset;
696
+ private getCandidateStatus;
697
+ private getBoundsStatus;
698
+ private getOffsetCollisionBounds;
699
+ private intersectsAnyOtherNetLabel;
700
+ private sharesChipBoundary;
701
+ private getChipSideForPoint;
702
+ private getPerpendicularOutwardDirection;
703
+ private getContainingChipSide;
704
+ private getOutsideChipSide;
705
+ private getNearestChipSide;
706
+ visualize(): GraphicsObject;
707
+ }
708
+
584
709
  /**
585
710
  * Pipeline solver that runs a series of solvers to find the best schematic layout.
586
711
  * Coordinates the entire layout process from chip partitioning through final packing.
@@ -606,12 +731,14 @@ declare class SchematicTracePipelineSolver extends BaseSolver {
606
731
  labelMergingSolver?: MergedNetLabelObstacleSolver;
607
732
  traceLabelOverlapAvoidanceSolver?: TraceLabelOverlapAvoidanceSolver;
608
733
  traceCleanupSolver?: TraceCleanupSolver;
734
+ example28Solver?: Example28Solver;
735
+ availableNetOrientationSolver?: AvailableNetOrientationSolver;
609
736
  startTimeOfPhase: Record<string, number>;
610
737
  endTimeOfPhase: Record<string, number>;
611
738
  timeSpentOnPhase: Record<string, number>;
612
739
  firstIterationOfPhase: Record<string, number>;
613
740
  inputProblem: InputProblem;
614
- pipelineDef: (PipelineStep<typeof MspConnectionPairSolver> | PipelineStep<typeof SchematicTraceLinesSolver> | PipelineStep<typeof LongDistancePairSolver> | PipelineStep<typeof TraceOverlapShiftSolver> | PipelineStep<typeof NetLabelPlacementSolver> | PipelineStep<typeof TraceLabelOverlapAvoidanceSolver> | PipelineStep<typeof TraceCleanupSolver>)[];
741
+ pipelineDef: (PipelineStep<typeof MspConnectionPairSolver> | PipelineStep<typeof SchematicTraceLinesSolver> | PipelineStep<typeof LongDistancePairSolver> | PipelineStep<typeof TraceOverlapShiftSolver> | PipelineStep<typeof NetLabelPlacementSolver> | PipelineStep<typeof TraceLabelOverlapAvoidanceSolver> | PipelineStep<typeof TraceCleanupSolver> | PipelineStep<typeof Example28Solver> | PipelineStep<typeof AvailableNetOrientationSolver>)[];
615
742
  constructor(inputProblem: InputProblem);
616
743
  getConstructorParams(): ConstructorParameters<typeof SchematicTracePipelineSolver>[0];
617
744
  currentPipelineStepIndex: number;