@tscircuit/schematic-trace-solver 0.0.115 → 0.0.117

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 (22) hide show
  1. package/dist/index.d.ts +22 -1
  2. package/dist/index.js +281 -0
  3. package/lib/solvers/AvailableNetOrientationSolver/AvailableNetOrientationSolver.ts +75 -0
  4. package/lib/solvers/SameNetJunctionAlignmentSolver/SameNetJunctionAlignmentSolver.ts +71 -0
  5. package/lib/solvers/SameNetJunctionAlignmentSolver/alignSameNetJunctions.ts +223 -0
  6. package/lib/solvers/SameNetJunctionAlignmentSolver/pathIntersectsAnyNetLabel.ts +22 -0
  7. package/lib/solvers/SchematicTracePipelineSolver/SchematicTracePipelineSolver.ts +17 -0
  8. package/package.json +1 -1
  9. package/site/bug-reports/bug-report-20260730T061837Z.page.tsx +4 -0
  10. package/site/bug-reports/bug-report-20260731T052229Z.page.tsx +4 -0
  11. package/tests/bug-reports/bug-report-20260721T221026Z/__snapshots__/bug-report-20260721T221026Z.snap.svg +1 -1
  12. package/tests/bug-reports/bug-report-20260728T144234Z/__snapshots__/bug-report-20260728T144234Z.snap.svg +1 -1
  13. package/tests/bug-reports/bug-report-20260728T144234Z/bug-report-20260728T144234Z.test.ts +6 -0
  14. package/tests/bug-reports/bug-report-20260730T061837Z/__snapshots__/bug-report-20260730T061837Z.snap.svg +123 -0
  15. package/tests/bug-reports/bug-report-20260730T061837Z/bug-report-20260730T061837Z.json +614 -0
  16. package/tests/bug-reports/bug-report-20260730T061837Z/bug-report-20260730T061837Z.test.ts +34 -0
  17. package/tests/bug-reports/bug-report-20260731T052229Z/__snapshots__/bug-report-20260731T052229Z.snap.svg +93 -0
  18. package/tests/bug-reports/bug-report-20260731T052229Z/bug-report-20260731T052229Z.json +299 -0
  19. package/tests/bug-reports/bug-report-20260731T052229Z/bug-report-20260731T052229Z.test.ts +43 -0
  20. package/tests/repros/__snapshots__/board-15984-same-net-junction.snap.svg +110 -0
  21. package/tests/repros/assets/board-15984-schematic-trace-input.json +518 -0
  22. package/tests/repros/board-15984-same-net-junction.test.ts +30 -0
@@ -0,0 +1,93 @@
1
+ <svg width="640" height="640" viewBox="0 0 640 640" xmlns="http://www.w3.org/2000/svg"><rect width="100%" height="100%" fill="white"/><g><polyline data-points="-1.9,2.550000000000001 -1.9,2.350000000000001" data-type="line" data-label="" points="216.96369636963695,85.28052805280515 216.96369636963695,103.76237623762367" fill="none" stroke="hsl(124, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-1.9,2.550000000000001 -1.9,2.1500000000000012" data-type="line" data-label="" points="216.96369636963695,85.28052805280515 216.96369636963695,122.24422442244213" fill="none" stroke="hsl(124, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-1.9,2.350000000000001 -1.9,2.1500000000000012" data-type="line" data-label="" points="216.96369636963695,103.76237623762367 216.96369636963695,122.24422442244213" fill="none" stroke="hsl(124, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-1.9,0.7500000000000013 -1.9,0.5500000000000014" data-type="line" data-label="" points="216.96369636963695,251.6171617161715 216.96369636963695,270.09900990099" fill="none" stroke="hsl(44, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-1.9,1.950000000000001 -1.9,1.750000000000001" data-type="line" data-label="" points="216.96369636963695,140.72607260726062 216.96369636963695,159.2079207920791" fill="none" stroke="hsl(125, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-1.9,1.950000000000001 -1.9,1.5500000000000012" data-type="line" data-label="" points="216.96369636963695,140.72607260726062 216.96369636963695,177.68976897689757" fill="none" stroke="hsl(125, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-1.9,1.950000000000001 -1.9,1.3500000000000012" data-type="line" data-label="" points="216.96369636963695,140.72607260726062 216.96369636963695,196.17161716171606" fill="none" stroke="hsl(125, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-1.9,1.750000000000001 -1.9,1.5500000000000012" data-type="line" data-label="" points="216.96369636963695,159.2079207920791 216.96369636963695,177.68976897689757" fill="none" stroke="hsl(125, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-1.9,1.750000000000001 -1.9,1.3500000000000012" data-type="line" data-label="" points="216.96369636963695,159.2079207920791 216.96369636963695,196.17161716171606" fill="none" stroke="hsl(125, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-1.9,1.5500000000000012 -1.9,1.3500000000000012" data-type="line" data-label="" points="216.96369636963695,177.68976897689757 216.96369636963695,196.17161716171606" fill="none" stroke="hsl(125, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-1.9,2.350000000000001 -2.0999999999999996,2.350000000000001 -2.0999999999999996,2.550000000000001 -1.9,2.550000000000001" data-type="line" data-label="" points="216.96369636963695,103.76237623762367 198.4818481848185,103.76237623762367 198.4818481848185,85.28052805280515 216.96369636963695,85.28052805280515" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1.9,2.1500000000000012 -2.0999999999999996,2.1500000000000012 -2.0999999999999996,2.350000000000001 -1.9,2.350000000000001" data-type="line" data-label="" points="216.96369636963695,122.24422442244213 198.4818481848185,122.24422442244213 198.4818481848185,103.76237623762367 216.96369636963695,103.76237623762367" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1.9,0.7500000000000013 -2.0999999999999996,0.7500000000000013 -2.0999999999999996,0.5500000000000014 -1.9,0.5500000000000014" data-type="line" data-label="" points="216.96369636963695,251.6171617161715 198.4818481848185,251.6171617161715 198.4818481848185,270.09900990099 216.96369636963695,270.09900990099" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1.9,1.750000000000001 -2.0999999999999996,1.750000000000001 -2.0999999999999996,1.950000000000001 -1.9,1.950000000000001" data-type="line" data-label="" points="216.96369636963695,159.2079207920791 198.4818481848185,159.2079207920791 198.4818481848185,140.72607260726062 216.96369636963695,140.72607260726062" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1.9,1.5500000000000012 -2.0999999999999996,1.5500000000000012 -2.0999999999999996,1.750000000000001 -1.9,1.750000000000001" data-type="line" data-label="" points="216.96369636963695,177.68976897689757 198.4818481848185,177.68976897689757 198.4818481848185,159.2079207920791 216.96369636963695,159.2079207920791" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1.9,1.3500000000000012 -2.0999999999999996,1.3500000000000012 -2.0999999999999996,1.5500000000000012 -1.9,1.5500000000000012" data-type="line" data-label="" points="216.96369636963695,196.17161716171606 198.4818481848185,196.17161716171606 198.4818481848185,177.68976897689757 216.96369636963695,177.68976897689757" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-2.0999999999999996,2.350000000000001 -2.4499999999999993,2.350000000000001 -2.4499999999999993,2.351000000000001" data-type="line" data-label="" points="198.4818481848185,103.76237623762367 166.13861386138618,103.76237623762367 166.13861386138618,103.66996699669957" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-2.0999999999999996,1.750000000000001 -2.4499999999999993,1.750000000000001 -2.4499999999999993,1.751000000000001" data-type="line" data-label="" points="198.4818481848185,159.2079207920791 166.13861386138618,159.2079207920791 166.13861386138618,159.115511551155" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1.9,1.1500000000000012 -2.401,1.1500000000000012 -2.401,1.2010000000000012" data-type="line" data-label="" points="216.96369636963695,214.65346534653452 170.66666666666666,214.65346534653452 170.66666666666666,209.94059405940584" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-2.0999999999999996,0.7500000000000013 -3.1099999999999994,0.7500000000000013 -3.1099999999999994,0.8010000000000014" data-type="line" data-label="" points="198.4818481848185,251.6171617161715 105.14851485148517,251.6171617161715 105.14851485148517,246.90429042904276" fill="none" stroke="purple" stroke-width="1px"/></g><g><rect data-type="rect" data-label="schematic_component_0" data-x="0" data-y="0" x="216.96369636963698" y="62.1782178217822" width="351.1551155115511" height="517.4917491749175" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.01082142857142857"/></g><g><rect data-type="rect" data-label="CC2745R10E0WRHARQ1" data-x="-0.41999999999999993" data-y="-2.9299999999999997" x="253.92739273927387" y="583.3663366336633" width="199.60396039603967" height="16.633663366336577" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.01082142857142857"/></g><g><rect data-type="rect" data-label="U1" data-x="-1.38" data-y="2.915" x="248.3828382838284" y="39.99999999999997" width="33.2673267326733" height="23.10231023102307" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.01082142857142857"/></g><g><rect data-type="rect" data-label="netId: VDDR
2
+ globalConnNetId: connectivity_net0" data-x="-2.4499999999999993" data-y="2.561000000000001" x="138.41584158415847" y="64.85808580858078" width="55.44554455445541" height="38.811881188118804" fill="#ef444466" stroke="#ef4444" stroke-width="0.01082142857142857"/></g><g><rect data-type="rect" data-label="netId: VDDIO
3
+ globalConnNetId: connectivity_net1" data-x="-3.1099999999999994" data-y="1.0110000000000015" x="71.8811881188119" y="208.09240924092393" width="66.53465346534654" height="38.811881188118804" fill="#ef444466" stroke="#ef4444" stroke-width="0.01082142857142857"/></g><g><rect data-type="rect" data-label="netId: VDDS
4
+ globalConnNetId: connectivity_net2" data-x="-2.4499999999999993" data-y="1.961000000000001" x="138.41584158415847" y="120.3036303630362" width="55.44554455445541" height="38.81188118811883" fill="#ef444466" stroke="#ef4444" stroke-width="0.01082142857142857"/></g><g><rect data-type="rect" data-label="netId: VDDD
5
+ globalConnNetId: connectivity_net3" data-x="-2.401" data-y="1.4110000000000011" x="142.94389438943895" y="171.128712871287" width="55.44554455445541" height="38.81188118811883" fill="#ef444466" stroke="#ef4444" stroke-width="0.01082142857142857"/></g><g><circle data-type="point" data-label="schematic_port_0
6
+ x-" data-x="-1.9" data-y="2.550000000000001" cx="216.96369636963695" cy="85.28052805280515" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_1
7
+ x-" data-x="-1.9" data-y="2.350000000000001" cx="216.96369636963695" cy="103.76237623762367" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_2
8
+ x+" data-x="1.9" data-y="1.7500000000000004" cx="568.1188118811881" cy="159.20792079207916" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_3
9
+ x+" data-x="1.9" data-y="1.5500000000000003" cx="568.1188118811881" cy="177.68976897689765" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_4
10
+ x+" data-x="1.9" data-y="1.3500000000000005" cx="568.1188118811881" cy="196.1716171617161" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_5
11
+ x+" data-x="1.9" data-y="1.1500000000000004" cx="568.1188118811881" cy="214.65346534653463" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_6
12
+ x+" data-x="1.9" data-y="0.9500000000000002" cx="568.1188118811881" cy="233.13531353135312" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_7
13
+ x+" data-x="1.9" data-y="0.75" cx="568.1188118811881" cy="251.6171617161716" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_8
14
+ x-" data-x="-1.9" data-y="0.7500000000000013" cx="216.96369636963695" cy="251.6171617161715" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_9
15
+ x+" data-x="1.9" data-y="0.5499999999999998" cx="568.1188118811881" cy="270.0990099009901" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_10
16
+ x+" data-x="1.9" data-y="0.34999999999999964" cx="568.1188118811881" cy="288.5808580858086" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_11
17
+ x+" data-x="1.9" data-y="0.14999999999999947" cx="568.1188118811881" cy="307.06270627062713" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_12
18
+ x+" data-x="1.9" data-y="-0.05000000000000071" cx="568.1188118811881" cy="325.5445544554456" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_13
19
+ x+" data-x="1.9" data-y="-0.2500000000000009" cx="568.1188118811881" cy="344.0264026402641" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_14
20
+ x+" data-x="1.9" data-y="-0.45000000000000107" cx="568.1188118811881" cy="362.5082508250826" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_15
21
+ x+" data-x="1.9" data-y="-0.6500000000000012" cx="568.1188118811881" cy="380.9900990099011" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_16
22
+ x-" data-x="-1.9" data-y="0.5500000000000014" cx="216.96369636963695" cy="270.09900990099" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_17
23
+ x-" data-x="-1.9" data-y="1.950000000000001" cx="216.96369636963695" cy="140.72607260726062" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_18
24
+ x-" data-x="-1.9" data-y="0.15000000000000124" cx="216.96369636963695" cy="307.06270627062696" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_19
25
+ x-" data-x="-1.9" data-y="-0.049999999999998934" cx="216.96369636963695" cy="325.54455445544545" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_20
26
+ x-" data-x="-1.9" data-y="-0.2499999999999991" cx="216.96369636963695" cy="344.02640264026394" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_21
27
+ x-" data-x="-1.9" data-y="-0.4499999999999993" cx="216.96369636963695" cy="362.5082508250824" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_22
28
+ x-" data-x="-1.9" data-y="-0.6499999999999995" cx="216.96369636963695" cy="380.990099009901" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_23
29
+ x-" data-x="-1.9" data-y="-0.8499999999999996" cx="216.96369636963695" cy="399.47194719471946" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_24
30
+ x+" data-x="1.9" data-y="2.150000000000001" cx="568.1188118811881" cy="122.24422442244216" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_25
31
+ x-" data-x="-1.9" data-y="-1.65" cx="216.96369636963695" cy="473.3993399339934" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_26
32
+ x-" data-x="-1.9" data-y="-2.2500000000000004" cx="216.96369636963695" cy="528.8448844884489" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_27
33
+ x-" data-x="-1.9" data-y="1.1500000000000012" cx="216.96369636963695" cy="214.65346534653452" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_28
34
+ x-" data-x="-1.9" data-y="1.750000000000001" cx="216.96369636963695" cy="159.2079207920791" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_29
35
+ x-" data-x="-1.9" data-y="-2.650000000000001" cx="216.96369636963695" cy="565.8085808580859" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_30
36
+ x-" data-x="-1.9" data-y="1.5500000000000012" cx="216.96369636963695" cy="177.68976897689757" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_31
37
+ x-" data-x="-1.9" data-y="-1.0499999999999998" cx="216.96369636963695" cy="417.95379537953795" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_32
38
+ x-" data-x="-1.9" data-y="-1.25" cx="216.96369636963695" cy="436.43564356435644" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_33
39
+ x-" data-x="-1.9" data-y="2.1500000000000012" cx="216.96369636963695" cy="122.24422442244213" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_34
40
+ x+" data-x="1.9" data-y="-1.0500000000000012" cx="568.1188118811881" cy="417.95379537953806" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_35
41
+ x+" data-x="1.9" data-y="-1.6500000000000012" cx="568.1188118811881" cy="473.39933993399353" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_36
42
+ x+" data-x="1.9" data-y="-2.050000000000001" cx="568.1188118811881" cy="510.36303630363045" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_37
43
+ x-" data-x="-1.9" data-y="1.3500000000000012" cx="216.96369636963695" cy="196.17161716171606" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_38
44
+ x+" data-x="1.9" data-y="2.550000000000001" cx="568.1188118811881" cy="85.28052805280515" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_39
45
+ x+" data-x="1.9" data-y="-2.450000000000001" cx="568.1188118811881" cy="547.3267326732674" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_40
46
+ x+" data-x="1.9" data-y="-2.6500000000000012" cx="568.1188118811881" cy="565.808580858086" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="anchorPoint
47
+ orientation: y+" data-x="-2.4499999999999993" data-y="2.351000000000001" cx="166.13861386138618" cy="103.66996699669957" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
48
+ orientation: y+" data-x="-3.1099999999999994" data-y="0.8010000000000014" cx="105.14851485148517" cy="246.90429042904276" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
49
+ orientation: y+" data-x="-2.4499999999999993" data-y="1.751000000000001" cx="166.13861386138618" cy="159.115511551155" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
50
+ orientation: y+" data-x="-2.401" data-y="1.2010000000000012" cx="170.66666666666666" cy="209.94059405940584" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g id="crosshair" style="display: none"><line id="crosshair-h" y1="0" y2="640" stroke="#666" stroke-width="0.5"/><line id="crosshair-v" x1="0" x2="640" stroke="#666" stroke-width="0.5"/><text id="coordinates" font-family="monospace" font-size="12" fill="#666"></text></g><script><![CDATA[
51
+ document.currentScript.parentElement.addEventListener('mousemove', (e) => {
52
+ const svg = e.currentTarget;
53
+ const rect = svg.getBoundingClientRect();
54
+ const x = e.clientX - rect.left;
55
+ const y = e.clientY - rect.top;
56
+ const crosshair = svg.getElementById('crosshair');
57
+ const h = svg.getElementById('crosshair-h');
58
+ const v = svg.getElementById('crosshair-v');
59
+ const coords = svg.getElementById('coordinates');
60
+
61
+ crosshair.style.display = 'block';
62
+ h.setAttribute('x1', '0');
63
+ h.setAttribute('x2', '640');
64
+ h.setAttribute('y1', y);
65
+ h.setAttribute('y2', y);
66
+ v.setAttribute('x1', x);
67
+ v.setAttribute('x2', x);
68
+ v.setAttribute('y1', '0');
69
+ v.setAttribute('y2', '640');
70
+
71
+ // Calculate real coordinates using inverse transformation
72
+ const matrix = {"a":92.40924092409242,"c":0,"e":392.54125412541254,"b":0,"d":-92.40924092409242,"f":320.9240924092409};
73
+ // Manually invert and apply the affine transform
74
+ // Since we only use translate and scale, we can directly compute:
75
+ // x' = (x - tx) / sx
76
+ // y' = (y - ty) / sy
77
+ const sx = matrix.a;
78
+ const sy = matrix.d;
79
+ const tx = matrix.e;
80
+ const ty = matrix.f;
81
+ const realPoint = {
82
+ x: (x - tx) / sx,
83
+ y: (y - ty) / sy // Flip y back since we used negative scale
84
+ }
85
+
86
+ coords.textContent = `(${realPoint.x.toFixed(2)}, ${realPoint.y.toFixed(2)})`;
87
+ coords.setAttribute('x', (x + 5).toString());
88
+ coords.setAttribute('y', (y - 5).toString());
89
+ });
90
+ document.currentScript.parentElement.addEventListener('mouseleave', () => {
91
+ document.currentScript.parentElement.getElementById('crosshair').style.display = 'none';
92
+ });
93
+ ]]></script></svg>
@@ -0,0 +1,299 @@
1
+ {
2
+ "chips": [
3
+ {
4
+ "chipId": "schematic_component_0",
5
+ "center": {
6
+ "x": 0,
7
+ "y": 0
8
+ },
9
+ "width": 3.8,
10
+ "height": 5.6,
11
+ "pins": [
12
+ {
13
+ "pinId": "schematic_port_0",
14
+ "x": -1.9,
15
+ "y": 2.550000000000001
16
+ },
17
+ {
18
+ "pinId": "schematic_port_1",
19
+ "x": -1.9,
20
+ "y": 2.350000000000001
21
+ },
22
+ {
23
+ "pinId": "schematic_port_2",
24
+ "x": 1.9,
25
+ "y": 1.7500000000000004
26
+ },
27
+ {
28
+ "pinId": "schematic_port_3",
29
+ "x": 1.9,
30
+ "y": 1.5500000000000003
31
+ },
32
+ {
33
+ "pinId": "schematic_port_4",
34
+ "x": 1.9,
35
+ "y": 1.3500000000000005
36
+ },
37
+ {
38
+ "pinId": "schematic_port_5",
39
+ "x": 1.9,
40
+ "y": 1.1500000000000004
41
+ },
42
+ {
43
+ "pinId": "schematic_port_6",
44
+ "x": 1.9,
45
+ "y": 0.9500000000000002
46
+ },
47
+ {
48
+ "pinId": "schematic_port_7",
49
+ "x": 1.9,
50
+ "y": 0.75
51
+ },
52
+ {
53
+ "pinId": "schematic_port_8",
54
+ "x": -1.9,
55
+ "y": 0.7500000000000013
56
+ },
57
+ {
58
+ "pinId": "schematic_port_9",
59
+ "x": 1.9,
60
+ "y": 0.5499999999999998
61
+ },
62
+ {
63
+ "pinId": "schematic_port_10",
64
+ "x": 1.9,
65
+ "y": 0.34999999999999964
66
+ },
67
+ {
68
+ "pinId": "schematic_port_11",
69
+ "x": 1.9,
70
+ "y": 0.14999999999999947
71
+ },
72
+ {
73
+ "pinId": "schematic_port_12",
74
+ "x": 1.9,
75
+ "y": -0.05000000000000071
76
+ },
77
+ {
78
+ "pinId": "schematic_port_13",
79
+ "x": 1.9,
80
+ "y": -0.2500000000000009
81
+ },
82
+ {
83
+ "pinId": "schematic_port_14",
84
+ "x": 1.9,
85
+ "y": -0.45000000000000107
86
+ },
87
+ {
88
+ "pinId": "schematic_port_15",
89
+ "x": 1.9,
90
+ "y": -0.6500000000000012
91
+ },
92
+ {
93
+ "pinId": "schematic_port_16",
94
+ "x": -1.9,
95
+ "y": 0.5500000000000014
96
+ },
97
+ {
98
+ "pinId": "schematic_port_17",
99
+ "x": -1.9,
100
+ "y": 1.950000000000001
101
+ },
102
+ {
103
+ "pinId": "schematic_port_18",
104
+ "x": -1.9,
105
+ "y": 0.15000000000000124
106
+ },
107
+ {
108
+ "pinId": "schematic_port_19",
109
+ "x": -1.9,
110
+ "y": -0.049999999999998934
111
+ },
112
+ {
113
+ "pinId": "schematic_port_20",
114
+ "x": -1.9,
115
+ "y": -0.2499999999999991
116
+ },
117
+ {
118
+ "pinId": "schematic_port_21",
119
+ "x": -1.9,
120
+ "y": -0.4499999999999993
121
+ },
122
+ {
123
+ "pinId": "schematic_port_22",
124
+ "x": -1.9,
125
+ "y": -0.6499999999999995
126
+ },
127
+ {
128
+ "pinId": "schematic_port_23",
129
+ "x": -1.9,
130
+ "y": -0.8499999999999996
131
+ },
132
+ {
133
+ "pinId": "schematic_port_24",
134
+ "x": 1.9,
135
+ "y": 2.150000000000001
136
+ },
137
+ {
138
+ "pinId": "schematic_port_25",
139
+ "x": -1.9,
140
+ "y": -1.65
141
+ },
142
+ {
143
+ "pinId": "schematic_port_26",
144
+ "x": -1.9,
145
+ "y": -2.2500000000000004
146
+ },
147
+ {
148
+ "pinId": "schematic_port_27",
149
+ "x": -1.9,
150
+ "y": 1.1500000000000012
151
+ },
152
+ {
153
+ "pinId": "schematic_port_28",
154
+ "x": -1.9,
155
+ "y": 1.750000000000001
156
+ },
157
+ {
158
+ "pinId": "schematic_port_29",
159
+ "x": -1.9,
160
+ "y": -2.650000000000001
161
+ },
162
+ {
163
+ "pinId": "schematic_port_30",
164
+ "x": -1.9,
165
+ "y": 1.5500000000000012
166
+ },
167
+ {
168
+ "pinId": "schematic_port_31",
169
+ "x": -1.9,
170
+ "y": -1.0499999999999998
171
+ },
172
+ {
173
+ "pinId": "schematic_port_32",
174
+ "x": -1.9,
175
+ "y": -1.25
176
+ },
177
+ {
178
+ "pinId": "schematic_port_33",
179
+ "x": -1.9,
180
+ "y": 2.1500000000000012
181
+ },
182
+ {
183
+ "pinId": "schematic_port_34",
184
+ "x": 1.9,
185
+ "y": -1.0500000000000012
186
+ },
187
+ {
188
+ "pinId": "schematic_port_35",
189
+ "x": 1.9,
190
+ "y": -1.6500000000000012
191
+ },
192
+ {
193
+ "pinId": "schematic_port_36",
194
+ "x": 1.9,
195
+ "y": -2.050000000000001
196
+ },
197
+ {
198
+ "pinId": "schematic_port_37",
199
+ "x": -1.9,
200
+ "y": 1.3500000000000012
201
+ },
202
+ {
203
+ "pinId": "schematic_port_38",
204
+ "x": 1.9,
205
+ "y": 2.550000000000001
206
+ },
207
+ {
208
+ "pinId": "schematic_port_39",
209
+ "x": 1.9,
210
+ "y": -2.450000000000001
211
+ },
212
+ {
213
+ "pinId": "schematic_port_40",
214
+ "x": 1.9,
215
+ "y": -2.6500000000000012
216
+ }
217
+ ]
218
+ }
219
+ ],
220
+ "directConnections": [],
221
+ "netConnections": [
222
+ {
223
+ "netId": "VDDR",
224
+ "netLabelWidth": 0.42,
225
+ "netLabelHeight": 0.6,
226
+ "pinIds": [
227
+ "schematic_port_0",
228
+ "schematic_port_1",
229
+ "schematic_port_33"
230
+ ]
231
+ },
232
+ {
233
+ "netId": "VDDIO",
234
+ "netLabelWidth": 0.42,
235
+ "netLabelHeight": 0.72,
236
+ "pinIds": [
237
+ "schematic_port_8",
238
+ "schematic_port_16"
239
+ ]
240
+ },
241
+ {
242
+ "netId": "VDDS",
243
+ "netLabelWidth": 0.42,
244
+ "netLabelHeight": 0.6,
245
+ "pinIds": [
246
+ "schematic_port_17",
247
+ "schematic_port_28",
248
+ "schematic_port_30",
249
+ "schematic_port_37"
250
+ ]
251
+ },
252
+ {
253
+ "netId": "VDDD",
254
+ "netLabelWidth": 0.42,
255
+ "netLabelHeight": 0.6,
256
+ "pinIds": [
257
+ "schematic_port_27"
258
+ ]
259
+ }
260
+ ],
261
+ "textBoxes": [
262
+ {
263
+ "chipId": "schematic_component_0",
264
+ "center": {
265
+ "x": -0.41999999999999993,
266
+ "y": -2.9299999999999997
267
+ },
268
+ "width": 2.16,
269
+ "height": 0.17999999999999972,
270
+ "text": "CC2745R10E0WRHARQ1"
271
+ },
272
+ {
273
+ "chipId": "schematic_component_0",
274
+ "center": {
275
+ "x": -1.38,
276
+ "y": 2.915
277
+ },
278
+ "width": 0.3600000000000001,
279
+ "height": 0.24999999999999956,
280
+ "text": "U1"
281
+ }
282
+ ],
283
+ "availableNetLabelOrientations": {
284
+ "VDDR": [
285
+ "y+"
286
+ ],
287
+ "VDDS": [
288
+ "y+"
289
+ ],
290
+ "VDDD": [
291
+ "y+"
292
+ ],
293
+ "VDDIO": [
294
+ "y+"
295
+ ]
296
+ },
297
+ "maxMspPairDistance": 2.4,
298
+ "_hideRatsNet": false
299
+ }
@@ -0,0 +1,43 @@
1
+ import { expect, test } from "bun:test"
2
+ import { segmentIntersectsRect } from "lib/solvers/NetLabelPlacementSolver/SingleNetLabelPlacementSolver/collisions"
3
+ import { getRectBounds } from "lib/solvers/NetLabelPlacementSolver/SingleNetLabelPlacementSolver/geometry"
4
+ import { SchematicTracePipelineSolver } from "lib/solvers/SchematicTracePipelineSolver/SchematicTracePipelineSolver"
5
+ import inputProblem from "./bug-report-20260731T052229Z.json"
6
+ import "tests/fixtures/matcher"
7
+
8
+ test("bug-report-20260731T052229Z", () => {
9
+ const solver = new SchematicTracePipelineSolver(inputProblem as any)
10
+
11
+ solver.solve()
12
+
13
+ const output = solver.sameNetJunctionAlignmentSolver!.getOutput()
14
+ const vdddLabel = output.netLabelPlacements.find(
15
+ (placement) => placement.netId === "VDDD",
16
+ )!
17
+ const vdddBounds = getRectBounds(
18
+ vdddLabel.center,
19
+ vdddLabel.width,
20
+ vdddLabel.height,
21
+ )
22
+ const intersectingDifferentNetTraceIds = output.traces
23
+ .filter((trace) => trace.globalConnNetId !== vdddLabel.globalConnNetId)
24
+ .filter((trace) =>
25
+ trace.tracePath.some(
26
+ (point, index) =>
27
+ index < trace.tracePath.length - 1 &&
28
+ segmentIntersectsRect(point, trace.tracePath[index + 1]!, vdddBounds),
29
+ ),
30
+ )
31
+ .map((trace) => trace.mspPairId)
32
+ const vdddConnector = output.traces.find(
33
+ (trace) =>
34
+ trace.userNetId === "VDDD" &&
35
+ trace.mspPairId.startsWith("available-net-orientation-"),
36
+ )!
37
+
38
+ expect(vdddLabel.orientation).toBe("y+")
39
+ expect(intersectingDifferentNetTraceIds).toEqual([])
40
+ expect(vdddConnector.tracePath).toHaveLength(3)
41
+ expect(vdddConnector.tracePath[0]!.y).toBe(vdddConnector.tracePath[1]!.y)
42
+ expect(solver).toMatchSolverSnapshot(import.meta.path)
43
+ })