@tscircuit/schematic-trace-solver 0.0.41 → 0.0.43

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 (58) hide show
  1. package/dist/index.d.ts +118 -8
  2. package/dist/index.js +1067 -748
  3. package/lib/solvers/SchematicTracePipelineSolver/SchematicTracePipelineSolver.ts +48 -16
  4. package/lib/solvers/TraceCleanupSolver/TraceCleanupSolver.ts +133 -0
  5. package/lib/solvers/TraceCleanupSolver/balanceZShapes.ts +200 -0
  6. package/lib/solvers/{TraceLabelOverlapAvoidanceSolver → TraceCleanupSolver}/hasCollisions.ts +1 -1
  7. package/lib/solvers/{TraceLabelOverlapAvoidanceSolver → TraceCleanupSolver}/hasCollisionsWithLabels.ts +1 -1
  8. package/lib/solvers/TraceCleanupSolver/minimizeTurnsWithFilteredLabels.ts +76 -0
  9. package/lib/solvers/{TraceLabelOverlapAvoidanceSolver → TraceCleanupSolver}/simplifyPath.ts +1 -1
  10. package/lib/solvers/{TraceLabelOverlapAvoidanceSolver → TraceCleanupSolver}/turnMinimization.ts +0 -2
  11. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/TraceLabelOverlapAvoidanceSolver.ts +74 -192
  12. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/rerouteCollidingTrace.ts +13 -24
  13. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/sub-solvers/LabelMergingSolver/LabelMergingSolver.ts +205 -0
  14. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/sub-solvers/OverlapAvoidanceStepSolver/OverlapAvoidanceStepSolver.ts +144 -0
  15. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/sub-solvers/SingleOverlapSolver/SingleOverlapSolver.ts +117 -0
  16. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/tryFourPointDetour.ts +104 -0
  17. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/trySnipAndReconnect.ts +24 -154
  18. package/package.json +1 -1
  19. package/site/examples/example26.page.tsx +4 -0
  20. package/tests/assets/1.input.json +379 -0
  21. package/tests/assets/2.input.json +330 -0
  22. package/tests/assets/3.input.json +388 -0
  23. package/tests/assets/MergedNetLabelObstacles.test.input.json +154 -0
  24. package/tests/assets/OverlapAvoidanceStepSolver.test.input.json +682 -0
  25. package/tests/assets/SingleOverlapSolver.test.input.json +170 -0
  26. package/tests/assets/TraceCleanupSolver.test.input.json +216 -0
  27. package/tests/assets/TraceLabelOverlapAvoidanceSolver.test.input.json +424 -0
  28. package/tests/assets/example26.json +1206 -0
  29. package/tests/examples/__snapshots__/example02.snap.svg +1 -1
  30. package/tests/examples/__snapshots__/example09.snap.svg +34 -34
  31. package/tests/examples/__snapshots__/example11.snap.svg +13 -13
  32. package/tests/examples/__snapshots__/example12.snap.svg +3 -3
  33. package/tests/examples/__snapshots__/example13.snap.svg +12 -12
  34. package/tests/examples/__snapshots__/example16.snap.svg +4 -4
  35. package/tests/examples/__snapshots__/example19.snap.svg +9 -9
  36. package/tests/examples/__snapshots__/example28.snap.svg +3 -3
  37. package/tests/examples/__snapshots__/example29.snap.svg +1208 -0
  38. package/tests/examples/example29.test.ts +13 -0
  39. package/tests/solvers/TraceCleanupSolver/TraceCleanupSolver.test.ts +19 -0
  40. package/tests/solvers/TraceCleanupSolver/__snapshots__/TraceCleanupSolver.snap.svg +119 -0
  41. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/TraceLabelOverlapAvoidanceSolver.test.ts +18 -0
  42. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/__snapshots__/TraceLabelOverlapAvoidanceSolver.snap.svg +243 -0
  43. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/renderComparisonView/__snapshots__/renderComparisonView01.snap.svg +223 -0
  44. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/renderComparisonView/__snapshots__/renderComparisonView02.snap.svg +205 -0
  45. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/renderComparisonView/__snapshots__/renderComparisonView03.snap.svg +184 -0
  46. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/renderComparisonView/renderComparisonView01.test.ts +29 -0
  47. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/renderComparisonView/renderComparisonView02.test.ts +27 -0
  48. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/renderComparisonView/renderComparisonView03.test.ts +39 -0
  49. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/MergedNetLabelObstacles.test.ts +14 -0
  50. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/OverlapAvoidanceStepSolver.test.ts +20 -0
  51. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/SingleOverlapSolver.test.ts +10 -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/lib/solvers/TraceLabelOverlapAvoidanceSolver/balanceLShapes.ts +0 -207
  56. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/minimizeTurnsWithFilteredLabels.ts +0 -66
  57. /package/lib/solvers/{TraceLabelOverlapAvoidanceSolver → TraceCleanupSolver}/countTurns.ts +0 -0
  58. /package/lib/solvers/{TraceLabelOverlapAvoidanceSolver → 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,100 @@ 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 SingleOverlapSolverInput {
410
+ trace: SolvedTracePath;
411
+ label: NetLabelPlacement;
412
+ problem: InputProblem;
413
+ paddingBuffer: number;
414
+ detourCount: number;
415
+ }
416
+ /**
417
+ * This solver attempts to find a valid rerouting for a single trace that is
418
+ * overlapping with a net label. It tries various candidate paths until it
419
+ * finds one that does not introduce new collisions.
420
+ */
421
+ declare class SingleOverlapSolver extends BaseSolver {
422
+ queuedCandidatePaths: Point[][];
423
+ solvedTracePath: Point[] | null;
424
+ initialTrace: SolvedTracePath;
425
+ problem: InputProblem;
426
+ obstacles: ReturnType<typeof getObstacleRects>;
427
+ label: NetLabelPlacement;
428
+ constructor(solverInput: SingleOverlapSolverInput);
429
+ _step(): void;
430
+ visualize(): GraphicsObject;
431
+ }
432
+
433
+ interface OverlapCollectionSolverInput {
434
+ inputProblem: InputProblem;
435
+ traces: SolvedTracePath[];
436
+ netLabelPlacements: NetLabelPlacement[];
437
+ mergedLabelNetIdMap: Record<string, Set<string>>;
438
+ }
439
+ /**
440
+ * This is an internal solver that manages the step-by-step process of avoiding
441
+ * multiple overlaps. It follows the pattern of SchematicTraceLinesSolver.
442
+ */
443
+ declare class OverlapAvoidanceStepSolver extends BaseSolver {
444
+ inputProblem: InputProblem;
445
+ netLabelPlacements: NetLabelPlacement[];
446
+ mergedLabelNetIdMap: Record<string, Set<string>>;
447
+ allTraces: SolvedTracePath[];
448
+ modifiedTraces: SolvedTracePath[];
396
449
  private detourCountByLabel;
397
450
  private readonly PADDING_BUFFER;
451
+ activeSubSolver: SingleOverlapSolver | null;
452
+ private overlapQueue;
453
+ private recentlyFailed;
454
+ constructor(solverInput: OverlapCollectionSolverInput);
455
+ _step(): void;
456
+ getOutput(): {
457
+ allTraces: SolvedTracePath[];
458
+ modifiedTraces: SolvedTracePath[];
459
+ };
460
+ visualize(): GraphicsObject;
461
+ }
462
+
463
+ interface TraceLabelOverlapAvoidanceSolverInput {
464
+ inputProblem: InputProblem;
465
+ traces: SolvedTracePath[];
466
+ netLabelPlacements: NetLabelPlacement[];
467
+ }
468
+ /**
469
+ * This solver is a pipeline that runs a series of sub-solvers to resolve
470
+ * trace-label overlaps and clean up the resulting traces.
471
+ */
472
+ declare class TraceLabelOverlapAvoidanceSolver extends BaseSolver {
473
+ inputProblem: InputProblem;
474
+ traces: SolvedTracePath[];
475
+ netLabelPlacements: NetLabelPlacement[];
476
+ labelMergingSolver?: MergedNetLabelObstacleSolver;
477
+ overlapAvoidanceSolver?: OverlapAvoidanceStepSolver;
478
+ pipelineStepIndex: number;
398
479
  constructor(solverInput: TraceLabelOverlapAvoidanceSolverInput);
399
480
  _step(): void;
400
481
  getOutput(): {
@@ -433,6 +514,33 @@ declare class LongDistancePairSolver extends BaseSolver {
433
514
  };
434
515
  }
435
516
 
517
+ interface TraceCleanupSolverInput {
518
+ inputProblem: InputProblem;
519
+ allTraces: SolvedTracePath[];
520
+ targetTraceIds: Set<string>;
521
+ allLabelPlacements: NetLabelPlacement[];
522
+ mergedLabelNetIdMap: Record<string, Set<string>>;
523
+ paddingBuffer: number;
524
+ }
525
+ /**
526
+ * Cleans up traces by minimizing turns and balancing L-shapes to improve
527
+ * the overall aesthetics and readability of the schematic.
528
+ */
529
+ declare class TraceCleanupSolver extends BaseSolver {
530
+ private input;
531
+ private outputTraces;
532
+ private traceIdQueue;
533
+ private tracesMap;
534
+ private pipelineStep;
535
+ private activeTraceId;
536
+ constructor(solverInput: TraceCleanupSolverInput);
537
+ _step(): void;
538
+ getOutput(): {
539
+ traces: SolvedTracePath[];
540
+ };
541
+ visualize(): GraphicsObject;
542
+ }
543
+
436
544
  /**
437
545
  * Pipeline solver that runs a series of solvers to find the best schematic layout.
438
546
  * Coordinates the entire layout process from chip partitioning through final packing.
@@ -455,13 +563,15 @@ declare class SchematicTracePipelineSolver extends BaseSolver {
455
563
  longDistancePairSolver?: LongDistancePairSolver;
456
564
  traceOverlapShiftSolver?: TraceOverlapShiftSolver;
457
565
  netLabelPlacementSolver?: NetLabelPlacementSolver;
566
+ labelMergingSolver?: MergedNetLabelObstacleSolver;
458
567
  traceLabelOverlapAvoidanceSolver?: TraceLabelOverlapAvoidanceSolver;
568
+ traceCleanupSolver?: TraceCleanupSolver;
459
569
  startTimeOfPhase: Record<string, number>;
460
570
  endTimeOfPhase: Record<string, number>;
461
571
  timeSpentOnPhase: Record<string, number>;
462
572
  firstIterationOfPhase: Record<string, number>;
463
573
  inputProblem: InputProblem;
464
- pipelineDef: (PipelineStep<typeof MspConnectionPairSolver> | PipelineStep<typeof SchematicTraceLinesSolver> | PipelineStep<typeof LongDistancePairSolver> | PipelineStep<typeof TraceOverlapShiftSolver> | PipelineStep<typeof NetLabelPlacementSolver> | PipelineStep<typeof TraceLabelOverlapAvoidanceSolver>)[];
574
+ pipelineDef: (PipelineStep<typeof MspConnectionPairSolver> | PipelineStep<typeof SchematicTraceLinesSolver> | PipelineStep<typeof LongDistancePairSolver> | PipelineStep<typeof TraceOverlapShiftSolver> | PipelineStep<typeof NetLabelPlacementSolver> | PipelineStep<typeof TraceLabelOverlapAvoidanceSolver> | PipelineStep<typeof TraceCleanupSolver>)[];
465
575
  constructor(inputProblem: InputProblem);
466
576
  getConstructorParams(): ConstructorParameters<typeof SchematicTracePipelineSolver>[0];
467
577
  currentPipelineStepIndex: number;