@tscircuit/schematic-trace-solver 0.0.187 → 0.0.189

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 (60) hide show
  1. package/dist/index.d.ts +42 -23
  2. package/dist/index.js +1053 -316
  3. package/lib/solvers/InlineNetLabelSolver/InlineNetLabelSolver.ts +612 -230
  4. package/lib/solvers/InlineNetLabelSolver/alignPortOnlyInlineNetLabelStubs.ts +2 -6
  5. package/lib/solvers/InlineNetLabelSolver/getAnchoredNetLabelRenderedBounds.ts +13 -0
  6. package/lib/solvers/InlineNetLabelSolver/getInlineLabelObstacles.ts +64 -0
  7. package/lib/solvers/InlineNetLabelSolver/getLocalTraceLabelShifts.ts +407 -0
  8. package/lib/solvers/InlineNetLabelSolver/getOutputLabelCollisions.ts +145 -0
  9. package/lib/solvers/InlineNetLabelSolver/isLabelRepresentedInline.ts +15 -0
  10. package/lib/solvers/InlineNetLabelSolver/pushAnchoredNetLabelsAwayFromInlineLabels.ts +61 -31
  11. package/lib/solvers/NetLabelNetLabelCollisionSolver/NetLabelNetLabelCollisionSolver.ts +94 -16
  12. package/lib/solvers/NetLabelToTraceSolver/NetLabelToTraceSolver.ts +4 -3
  13. package/lib/solvers/SameNetJunctionAlignmentSolver/alignSameNetJunctions.ts +7 -7
  14. package/lib/solvers/SchematicTracePipelineSolver/SchematicTracePipelineSolver.ts +3 -0
  15. package/lib/solvers/TraceCleanupSolver/sub-solver/generateLShapeRerouteCandidates.ts +5 -1
  16. package/lib/types/InputProblem.ts +2 -2
  17. package/package.json +1 -1
  18. package/site/SchematicTracePipelineSolver/repro-robot-controller-imu-tof.page.tsx +7 -0
  19. package/site/bug-reports/bug-report-20260907T110144Z.page.tsx +4 -0
  20. package/site/bug-reports/bug-report-20260907T145640Z.page.tsx +4 -0
  21. package/tests/bug-reports/bug-report-20260730T061837Z/__snapshots__/bug-report-20260730T061837Z.snap.svg +2 -2
  22. package/tests/bug-reports/bug-report-20260806T093501Z/__snapshots__/bug-report-20260806T093501Z.snap.svg +2 -2
  23. package/tests/bug-reports/bug-report-20260811T075142Z/__snapshots__/bug-report-20260811T075142Z.snap.svg +18 -18
  24. package/tests/bug-reports/bug-report-20260819T091818Z/__snapshots__/bug-report-20260819T091818Z.snap.svg +2 -2
  25. package/tests/bug-reports/bug-report-20260819T091818Z/bug-report-20260819T091818Z.test.ts +21 -0
  26. package/tests/bug-reports/bug-report-20260825T103621Z/__snapshots__/bug-report-20260825T103621Z.snap.svg +5 -38
  27. package/tests/bug-reports/bug-report-20260826T072956Z/__snapshots__/bug-report-20260826T072956Z.snap.svg +3 -9
  28. package/tests/bug-reports/bug-report-20260901T055358Z/__snapshots__/bug-report-20260901T055358Z.snap.svg +18 -30
  29. package/tests/bug-reports/bug-report-20260901T055358Z/bug-report-20260901T055358Z.test.ts +33 -0
  30. package/tests/bug-reports/bug-report-20260907T110144Z/__snapshots__/bug-report-20260907T110144Z.snap.svg +282 -0
  31. package/tests/bug-reports/bug-report-20260907T110144Z/bug-report-20260907T110144Z.json +1073 -0
  32. package/tests/bug-reports/bug-report-20260907T110144Z/bug-report-20260907T110144Z.test.ts +12 -0
  33. package/tests/bug-reports/bug-report-20260907T145640Z/__snapshots__/bug-report-20260907T145640Z.snap.svg +1107 -0
  34. package/tests/bug-reports/bug-report-20260907T145640Z/bug-report-20260907T145640Z.json +3563 -0
  35. package/tests/bug-reports/bug-report-20260907T145640Z/bug-report-20260907T145640Z.test.ts +117 -0
  36. package/tests/repros/__snapshots__/repro-battery-management-bq24073.snap.svg +4 -4
  37. package/tests/repros/__snapshots__/repro-board-648-esp12f-section.snap.svg +2 -2
  38. package/tests/repros/__snapshots__/repro-core-tb67s579ftg-inline-label-routing.snap.svg +20 -20
  39. package/tests/repros/__snapshots__/repro-esp12f-section.snap.svg +37 -55
  40. package/tests/repros/__snapshots__/repro-hub-usb-sheet.snap.svg +44 -68
  41. package/tests/repros/__snapshots__/repro-mspm0l1306-capacitor-symmetry.snap.svg +3 -9
  42. package/tests/repros/__snapshots__/repro-robot-controller-imu-tof.snap.svg +199 -0
  43. package/tests/repros/__snapshots__/repro-robot-controller-imu-tof.source.svg +33 -0
  44. package/tests/repros/__snapshots__/repro-usb-power-vbus-label-detour.snap.svg +50 -74
  45. package/tests/repros/__snapshots__/repro48-555-timer-vcc-rail-label.snap.svg +2 -2
  46. package/tests/repros/__snapshots__/rp2040-robot-controller-disconnected-gnd.snap.svg +103 -0
  47. package/tests/repros/assets/repro-robot-controller-imu-tof.input.json +540 -0
  48. package/tests/repros/assets/rp2040-robot-controller.input.json +349 -0
  49. package/tests/repros/repro-battery-management-bq24073.test.ts +13 -1
  50. package/tests/repros/repro-hub-usb-sheet.test.ts +25 -0
  51. package/tests/repros/repro-robot-controller-imu-tof.test.ts +83 -0
  52. package/tests/repros/repro-usb-power-vbus-label-detour.test.ts +59 -13
  53. package/tests/repros/rp2040-robot-controller-disconnected-gnd.test.ts +59 -0
  54. package/tests/solvers/InlineNetLabelSolver/get-anchored-net-label-rendered-bounds.test.ts +24 -0
  55. package/tests/solvers/InlineNetLabelSolver/local-trace-label-shifts.test.ts +296 -0
  56. package/tests/solvers/InlineNetLabelSolver/multi-pin-connected-components.test.ts +7 -4
  57. package/tests/solvers/InlineNetLabelSolver/push-anchored-net-labels-away.test.ts +2 -1
  58. package/tests/solvers/InlineNetLabelSolver/shared-direct-and-named-connection.test.ts +62 -0
  59. package/tests/solvers/InlineNetLabelSolver/two-pin-terminal-stubs-atomic.test.ts +9 -3
  60. package/tests/solvers/TraceCleanupSolver/perpendicular-detours-preserve-endpoints.test.ts +60 -0
package/dist/index.d.ts CHANGED
@@ -161,8 +161,8 @@ interface InputNetConnection {
161
161
  * When true, a named net may use inline labels. Each routed connected
162
162
  * component gets a label along its representative trace, while each
163
163
  * disconnected endpoint gets an outward inline-label stub. Conversion is
164
- * atomic for the whole net so inline and anchored representations are not
165
- * mixed when any label cannot be placed.
164
+ * atomic within each routed component. An obstructed component retains its
165
+ * anchored label without preventing inline labels on disconnected components.
166
166
  */
167
167
  allowInlineNetLabel?: boolean;
168
168
  /** Extent of the inline text along the generated trace stub. */
@@ -1144,11 +1144,18 @@ type Candidate = {
1144
1144
  status: CandidateStatus | null;
1145
1145
  };
1146
1146
  interface NetLabelNetLabelCollisionSolverParams {
1147
+ /** Use the final horizontal tag envelope after inline conversion. */
1148
+ useRenderedLabelBounds?: boolean;
1149
+ /** Already placed labels that are obstacles, but must not be moved. */
1150
+ fixedNetLabelPlacements?: NetLabelPlacement[];
1151
+ /** Existing connector identities from AvailableNetOrientationSolver. */
1152
+ netLabelConnectorTraceIds?: ReadonlySet<MspConnectionPairId>;
1147
1153
  inputProblem: InputProblem;
1148
1154
  traces: SolvedTracePath[];
1149
1155
  netLabelPlacements: NetLabelPlacement[];
1150
1156
  }
1151
1157
  declare class NetLabelNetLabelCollisionSolver extends BaseSolver {
1158
+ private params;
1152
1159
  inputProblem: InputProblem;
1153
1160
  traces: SolvedTracePath[];
1154
1161
  netLabelPlacements: NetLabelPlacement[];
@@ -1175,6 +1182,8 @@ declare class NetLabelNetLabelCollisionSolver extends BaseSolver {
1175
1182
  private buildCandidatesForLabel;
1176
1183
  private checkCandidate;
1177
1184
  private beginSearchForLabel;
1185
+ /** Reuse the normal anchor search for a local trace-clearance proposal. */
1186
+ getNearbyValidPlacements(label: NetLabelPlacement, maxDistance: number): NetLabelPlacement[];
1178
1187
  private clearActiveSearch;
1179
1188
  _step(): void;
1180
1189
  visualize(): GraphicsObject;
@@ -1256,7 +1265,8 @@ declare class TraceElbowTransitionSimplificationSolver extends BaseSolver {
1256
1265
 
1257
1266
  declare const DEFAULT_INLINE_NET_LABEL_HEIGHT = 0.18;
1258
1267
  /**
1259
- * Gap between the trace and the near edge of the inline label text.
1268
+ * Preferred gap between a trace and its inline text. A tighter parallel-wire
1269
+ * slot may use a smaller, evenly divided gap if the full text still fits.
1260
1270
  */
1261
1271
  declare const INLINE_NET_LABEL_TRACE_MARGIN = 0.05;
1262
1272
  /** Clearance between a generated terminal stub and an unrelated trace. */
@@ -1310,17 +1320,22 @@ interface InlineNetLabelPlacement {
1310
1320
  side: "x+" | "x-" | "y+" | "y-";
1311
1321
  }
1312
1322
  interface InlineNetLabelSolverInput {
1323
+ /** Exact connector IDs supplied by their producer; IDs are never parsed. */
1324
+ netLabelConnectorTraceIds?: ReadonlySet<string>;
1325
+ resolveTraceCollisions?: boolean;
1313
1326
  inputProblem: InputProblem;
1314
1327
  traces: SolvedTracePath[];
1315
1328
  netLabelPlacements: NetLabelPlacement[];
1316
1329
  completedReroutes?: CompletedTraceReroute[];
1317
1330
  }
1318
1331
  interface InlineNetLabelOutput {
1332
+ netLabelConnectorTraceIds?: ReadonlySet<string>;
1319
1333
  inputProblem: InputProblem;
1320
1334
  traces: SolvedTracePath[];
1321
1335
  netLabelPlacements: NetLabelPlacement[];
1322
1336
  inlineNetLabelPlacements: InlineNetLabelPlacement[];
1323
1337
  }
1338
+ type InlineOutput = Omit<InlineNetLabelOutput, "inputProblem">;
1324
1339
  type QueuedInlineConnection = {
1325
1340
  kind: "direct_connection";
1326
1341
  connection: InputDirectConnection;
@@ -1332,10 +1347,11 @@ type QueuedInlineConnection = {
1332
1347
  * Places "inline net labels" - net names drawn alongside the trace they belong
1333
1348
  * to - for connections that opted in via `allowInlineNetLabel`.
1334
1349
  *
1335
- * Any regular (anchored) net label placement for the same net is dropped, so a
1336
- * net is never labeled twice.
1350
+ * Anchored labels are removed only for the connected components represented
1351
+ * inline. A blocked component keeps its label without undoing clear ones.
1337
1352
  */
1338
1353
  declare class InlineNetLabelSolver extends BaseSolver {
1354
+ private readonly input;
1339
1355
  inputProblem: InputProblem;
1340
1356
  traces: SolvedTracePath[];
1341
1357
  inputNetLabelPlacements: NetLabelPlacement[];
@@ -1343,18 +1359,23 @@ declare class InlineNetLabelSolver extends BaseSolver {
1343
1359
  inlineNetLabelPlacements: InlineNetLabelPlacement[];
1344
1360
  /** Eligible connections still waiting to be processed. */
1345
1361
  queuedConnections: QueuedInlineConnection[];
1362
+ private readonly netLabelConnectorTraceIds;
1346
1363
  private tracesByPinPairKey;
1347
1364
  private globalConnMap;
1348
- private supersededTraceIdsByGlobalConnNetId;
1365
+ private inlineConversions;
1349
1366
  private hasAlignedPortOnlyStubs;
1350
1367
  private postProcessedOutput?;
1368
+ activeSubSolver: InlineNetLabelSolver | null;
1369
+ private refinementComplete;
1370
+ private refinement?;
1371
+ private currentProposal?;
1351
1372
  constructor(input: InlineNetLabelSolverInput);
1352
1373
  getConstructorParams(): [InlineNetLabelSolverInput];
1353
1374
  _step(): void;
1354
1375
  /**
1355
1376
  * Plans all opted-in multi-pin nets together. Short routed components can
1356
1377
  * mutually block the outward endpoint stubs that replace them, so tentative
1357
- * replacements are ignored as obstacles only while their owning net still
1378
+ * replacements are ignored as obstacles only while their connected component still
1358
1379
  * converts successfully. Failed conversions retain both their traces and
1359
1380
  * their conventional labels, and the remaining conversions are retried.
1360
1381
  */
@@ -1370,14 +1391,15 @@ declare class InlineNetLabelSolver extends BaseSolver {
1370
1391
  * Converts every conventional label representation for an opted-in named
1371
1392
  * net. Routed connected components become labels on their representative
1372
1393
  * trace; disconnected pins become outward terminal stubs. The conversion is
1373
- * atomic so one blocked candidate cannot leave mixed label styles on a net.
1394
+ * atomic within each routed component, so replacing its traces cannot strand
1395
+ * a pin. Disconnected components can keep their own label style.
1374
1396
  */
1375
1397
  private computeNetConnectionInlinePlacements;
1398
+ /** Prefer the normal gap, then center text in a tighter parallel-wire slot. */
1399
+ private getInlineOffsets;
1376
1400
  /**
1377
- * Converts one conventional endpoint placement into an inline label on a
1378
- * generated outward stub. The stub follows the pin's true facing direction;
1379
- * an anchored label may finish in another direction after an elbow, which is
1380
- * not the direction a terminal stub should leave the pin.
1401
+ * Converts one conventional endpoint placement into an inline label on an
1402
+ * outward stub that follows the pin's true facing direction.
1381
1403
  */
1382
1404
  private computeTerminalInlinePlacement;
1383
1405
  private computeInlinePlacement;
@@ -1393,19 +1415,15 @@ declare class InlineNetLabelSolver extends BaseSolver {
1393
1415
  * trace belonging to another net.
1394
1416
  */
1395
1417
  private isObstructed;
1396
- /**
1397
- * Net label placements superseded by an inline label. A net gets one label or
1398
- * the other, never both.
1399
- */
1400
- private getSupersededNetLabelKeys;
1401
1418
  private getOutputTraces;
1402
- private getInlineGlobalsOverlappingAnchoredLabels;
1419
+ private getBlockedInlinePlacements;
1403
1420
  private buildPostProcessedOutput;
1404
- getOutput(): {
1405
- traces: SolvedTracePath[];
1406
- netLabelPlacements: NetLabelPlacement[];
1407
- inlineNetLabelPlacements: InlineNetLabelPlacement[];
1408
- };
1421
+ /** Enumerate nearby moves in the existing order; collect one proposal per step. */
1422
+ private getTraceRefinementProposals;
1423
+ private createRefinementCandidate;
1424
+ private acceptRefinementCandidate;
1425
+ private stepTraceRefinement;
1426
+ getOutput(): InlineOutput;
1409
1427
  visualize(): GraphicsObject;
1410
1428
  }
1411
1429
  declare const visualizeInlineNetLabelOutput: ({ inputProblem, traces, netLabelPlacements, inlineNetLabelPlacements, }: InlineNetLabelOutput) => GraphicsObject;
@@ -1420,6 +1438,7 @@ declare class NetLabelToTraceSolver extends BaseSolver {
1420
1438
  inputProblem: InputProblem;
1421
1439
  outputTraces: SolvedTracePath[];
1422
1440
  outputNetLabelPlacements: NetLabelPlacement[];
1441
+ private readonly recoveredTraceIds;
1423
1442
  private chipMap;
1424
1443
  private pinMap;
1425
1444
  private queuedCandidates;