@tscircuit/schematic-trace-solver 0.0.41 → 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 (46) hide show
  1. package/dist/index.d.ts +118 -7
  2. package/dist/index.js +760 -432
  3. package/lib/solvers/SchematicTracePipelineSolver/SchematicTracePipelineSolver.ts +30 -17
  4. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/TraceLabelOverlapAvoidanceSolver.ts +94 -192
  5. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/rerouteCollidingTrace.ts +13 -24
  6. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/sub-solvers/LabelMergingSolver/LabelMergingSolver.ts +205 -0
  7. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/sub-solvers/OverlapAvoidanceStepSolver/OverlapAvoidanceStepSolver.ts +144 -0
  8. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/sub-solvers/SingleOverlapSolver/SingleOverlapSolver.ts +117 -0
  9. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/sub-solvers/TraceCleanupSolver/TraceCleanupSolver.ts +132 -0
  10. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/{balanceLShapes.ts → sub-solvers/TraceCleanupSolver/balanceLShapes.ts} +12 -10
  11. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/{hasCollisions.ts → sub-solvers/TraceCleanupSolver/hasCollisions.ts} +1 -1
  12. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/{hasCollisionsWithLabels.ts → sub-solvers/TraceCleanupSolver/hasCollisionsWithLabels.ts} +1 -1
  13. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/{minimizeTurnsWithFilteredLabels.ts → sub-solvers/TraceCleanupSolver/minimizeTurnsWithFilteredLabels.ts} +6 -6
  14. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/{simplifyPath.ts → sub-solvers/TraceCleanupSolver/simplifyPath.ts} +1 -1
  15. package/lib/solvers/TraceLabelOverlapAvoidanceSolver/{turnMinimization.ts → sub-solvers/TraceCleanupSolver/turnMinimization.ts} +0 -2
  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/tests/assets/1.input.json +379 -0
  20. package/tests/assets/2.input.json +330 -0
  21. package/tests/assets/3.input.json +388 -0
  22. package/tests/assets/MergedNetLabelObstacles.test.input.json +154 -0
  23. package/tests/assets/OverlapAvoidanceStepSolver.test.input.json +682 -0
  24. package/tests/assets/SingleOverlapSolver.test.input.json +170 -0
  25. package/tests/assets/TraceCleanupSolver.test.input.json +216 -0
  26. package/tests/assets/TraceLabelOverlapAvoidanceSolver.test.input.json +424 -0
  27. package/tests/examples/__snapshots__/example25.snap.svg +3 -3
  28. package/tests/examples/__snapshots__/example26.snap.svg +3 -3
  29. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/TraceLabelOverlapAvoidanceSolver.test.ts +18 -0
  30. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/__snapshots__/TraceLabelOverlapAvoidanceSolver.snap.svg +243 -0
  31. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/renderComparisonView/__snapshots__/renderComparisonView01.snap.svg +223 -0
  32. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/renderComparisonView/__snapshots__/renderComparisonView02.snap.svg +205 -0
  33. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/renderComparisonView/__snapshots__/renderComparisonView03.snap.svg +184 -0
  34. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/renderComparisonView/renderComparisonView01.test.ts +29 -0
  35. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/renderComparisonView/renderComparisonView02.test.ts +27 -0
  36. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/renderComparisonView/renderComparisonView03.test.ts +39 -0
  37. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/MergedNetLabelObstacles.test.ts +14 -0
  38. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/OverlapAvoidanceStepSolver.test.ts +20 -0
  39. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/SingleOverlapSolver.test.ts +10 -0
  40. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/TraceCleanupSolver.test.ts +19 -0
  41. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/__snapshots__/MergedNetLabelObstacles.snap.svg +140 -0
  42. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/__snapshots__/OverlapAvoidanceStepSolver.snap.svg +216 -0
  43. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/__snapshots__/SingleOverlapSolver.snap.svg +125 -0
  44. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/__snapshots__/TraceCleanupSolver.snap.svg +119 -0
  45. /package/lib/solvers/TraceLabelOverlapAvoidanceSolver/{countTurns.ts → sub-solvers/TraceCleanupSolver/countTurns.ts} +0 -0
  46. /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(): {
@@ -455,7 +564,9 @@ declare class SchematicTracePipelineSolver extends BaseSolver {
455
564
  longDistancePairSolver?: LongDistancePairSolver;
456
565
  traceOverlapShiftSolver?: TraceOverlapShiftSolver;
457
566
  netLabelPlacementSolver?: NetLabelPlacementSolver;
567
+ labelMergingSolver?: MergedNetLabelObstacleSolver;
458
568
  traceLabelOverlapAvoidanceSolver?: TraceLabelOverlapAvoidanceSolver;
569
+ traceCleanupSolver?: TraceCleanupSolver;
459
570
  startTimeOfPhase: Record<string, number>;
460
571
  endTimeOfPhase: Record<string, number>;
461
572
  timeSpentOnPhase: Record<string, number>;