@tscircuit/schematic-trace-solver 0.0.117 → 0.0.119
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.
- package/dist/index.d.ts +9 -1
- package/dist/index.js +164 -5
- package/lib/solvers/AvailableNetOrientationSolver/AvailableNetOrientationSolver.ts +240 -7
- package/lib/solvers/AvailableNetOrientationSolver/types.ts +2 -0
- package/package.json +1 -1
- package/tests/bug-reports/bug-report-20260721T221026Z/__snapshots__/bug-report-20260721T221026Z.snap.svg +3 -3
- package/tests/bug-reports/bug-report-20260731T052229Z/__snapshots__/bug-report-20260731T052229Z.snap.svg +51 -51
- package/tests/bug-reports/bug-report-20260731T052229Z/bug-report-20260731T052229Z.test.ts +18 -0
- package/tests/repros/__snapshots__/repro-power-group-rail-labels.snap.svg +58 -0
- package/tests/repros/__snapshots__/repro-rp2040-v3v3-label-placement.snap.svg +96 -0
- package/tests/repros/repro-power-group-rail-labels.test.ts +95 -0
- package/tests/repros/repro-rp2040-v3v3-label-placement.test.ts +102 -0
|
@@ -1,53 +1,53 @@
|
|
|
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="
|
|
2
|
-
globalConnNetId: connectivity_net0" data-x="-2.4499999999999993" data-y="2.561000000000001" x="
|
|
3
|
-
globalConnNetId: connectivity_net1" data-x="-3.
|
|
4
|
-
globalConnNetId: connectivity_net2" data-x="-2.4499999999999993" data-y="1.961000000000001" x="
|
|
5
|
-
globalConnNetId: connectivity_net3" data-x="-2.
|
|
6
|
-
x-" data-x="-1.9" data-y="2.550000000000001" cx="
|
|
7
|
-
x-" data-x="-1.9" data-y="2.350000000000001" cx="
|
|
8
|
-
x+" data-x="1.9" data-y="1.7500000000000004" cx="
|
|
9
|
-
x+" data-x="1.9" data-y="1.5500000000000003" cx="
|
|
10
|
-
x+" data-x="1.9" data-y="1.3500000000000005" cx="
|
|
11
|
-
x+" data-x="1.9" data-y="1.1500000000000004" cx="
|
|
12
|
-
x+" data-x="1.9" data-y="0.9500000000000002" cx="
|
|
13
|
-
x+" data-x="1.9" data-y="0.75" cx="
|
|
14
|
-
x-" data-x="-1.9" data-y="0.7500000000000013" cx="
|
|
15
|
-
x+" data-x="1.9" data-y="0.5499999999999998" cx="
|
|
16
|
-
x+" data-x="1.9" data-y="0.34999999999999964" cx="
|
|
17
|
-
x+" data-x="1.9" data-y="0.14999999999999947" cx="
|
|
18
|
-
x+" data-x="1.9" data-y="-0.05000000000000071" cx="
|
|
19
|
-
x+" data-x="1.9" data-y="-0.2500000000000009" cx="
|
|
20
|
-
x+" data-x="1.9" data-y="-0.45000000000000107" cx="
|
|
21
|
-
x+" data-x="1.9" data-y="-0.6500000000000012" cx="
|
|
22
|
-
x-" data-x="-1.9" data-y="0.5500000000000014" cx="
|
|
23
|
-
x-" data-x="-1.9" data-y="1.950000000000001" cx="
|
|
24
|
-
x-" data-x="-1.9" data-y="0.15000000000000124" cx="
|
|
25
|
-
x-" data-x="-1.9" data-y="-0.049999999999998934" cx="
|
|
26
|
-
x-" data-x="-1.9" data-y="-0.2499999999999991" cx="
|
|
27
|
-
x-" data-x="-1.9" data-y="-0.4499999999999993" cx="
|
|
28
|
-
x-" data-x="-1.9" data-y="-0.6499999999999995" cx="
|
|
29
|
-
x-" data-x="-1.9" data-y="-0.8499999999999996" cx="
|
|
30
|
-
x+" data-x="1.9" data-y="2.150000000000001" cx="
|
|
31
|
-
x-" data-x="-1.9" data-y="-1.65" cx="
|
|
32
|
-
x-" data-x="-1.9" data-y="-2.2500000000000004" cx="
|
|
33
|
-
x-" data-x="-1.9" data-y="1.1500000000000012" cx="
|
|
34
|
-
x-" data-x="-1.9" data-y="1.750000000000001" cx="
|
|
35
|
-
x-" data-x="-1.9" data-y="-2.650000000000001" cx="
|
|
36
|
-
x-" data-x="-1.9" data-y="1.5500000000000012" cx="
|
|
37
|
-
x-" data-x="-1.9" data-y="-1.0499999999999998" cx="
|
|
38
|
-
x-" data-x="-1.9" data-y="-1.25" cx="
|
|
39
|
-
x-" data-x="-1.9" data-y="2.1500000000000012" cx="
|
|
40
|
-
x+" data-x="1.9" data-y="-1.0500000000000012" cx="
|
|
41
|
-
x+" data-x="1.9" data-y="-1.6500000000000012" cx="
|
|
42
|
-
x+" data-x="1.9" data-y="-2.050000000000001" cx="
|
|
43
|
-
x-" data-x="-1.9" data-y="1.3500000000000012" cx="
|
|
44
|
-
x+" data-x="1.9" data-y="2.550000000000001" cx="
|
|
45
|
-
x+" data-x="1.9" data-y="-2.450000000000001" cx="
|
|
46
|
-
x+" data-x="1.9" data-y="-2.6500000000000012" cx="
|
|
47
|
-
orientation: y+" data-x="-2.4499999999999993" data-y="2.351000000000001" cx="
|
|
48
|
-
orientation: y+" data-x="-3.
|
|
49
|
-
orientation: y+" data-x="-2.4499999999999993" data-y="1.751000000000001" cx="
|
|
50
|
-
orientation: y+" data-x="-2.
|
|
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="219.27392739273924,85.28052805280515 219.27392739273924,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="219.27392739273924,85.28052805280515 219.27392739273924,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="219.27392739273924,103.76237623762367 219.27392739273924,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="219.27392739273924,251.6171617161715 219.27392739273924,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="219.27392739273924,140.72607260726062 219.27392739273924,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="219.27392739273924,140.72607260726062 219.27392739273924,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="219.27392739273924,140.72607260726062 219.27392739273924,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="219.27392739273924,159.2079207920791 219.27392739273924,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="219.27392739273924,159.2079207920791 219.27392739273924,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="219.27392739273924,177.68976897689757 219.27392739273924,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="219.27392739273924,103.76237623762367 200.79207920792078,103.76237623762367 200.79207920792078,85.28052805280515 219.27392739273924,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="219.27392739273924,122.24422442244213 200.79207920792078,122.24422442244213 200.79207920792078,103.76237623762367 219.27392739273924,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="219.27392739273924,251.6171617161715 200.79207920792078,251.6171617161715 200.79207920792078,270.09900990099 219.27392739273924,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="219.27392739273924,159.2079207920791 200.79207920792078,159.2079207920791 200.79207920792078,140.72607260726062 219.27392739273924,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="219.27392739273924,177.68976897689757 200.79207920792078,177.68976897689757 200.79207920792078,159.2079207920791 219.27392739273924,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="219.27392739273924,196.17161716171606 200.79207920792078,196.17161716171606 200.79207920792078,177.68976897689757 219.27392739273924,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="200.79207920792078,103.76237623762367 168.44884488448847,103.76237623762367 168.44884488448847,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="200.79207920792078,159.2079207920791 168.44884488448847,159.2079207920791 168.44884488448847,159.115511551155" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1.9,1.1500000000000012 -2.4499999999999993,1.1500000000000012 -2.4499999999999993,1.1510000000000011" data-type="line" data-label="" points="219.27392739273924,214.65346534653452 168.44884488448847,214.65346534653452 168.44884488448847,214.56105610561045" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-2.0999999999999996,0.7500000000000013 -3.1599999999999993,0.7500000000000013 -3.1599999999999993,0.8010000000000014" data-type="line" data-label="" points="200.79207920792078,251.6171617161715 102.83828382838288,251.6171617161715 102.83828382838288,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="219.2739273927392" y="62.1782178217822" width="351.15511551155123" 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="256.2376237623762" 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="250.69306930693068" 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="140.72607260726076" 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.1599999999999993" data-y="1.0110000000000015" x="69.57095709570964" y="208.09240924092393" width="66.53465346534648" 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="140.72607260726076" 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.4499999999999993" data-y="1.361000000000001" x="140.72607260726076" y="175.74917491749164" width="55.44554455445541" height="38.811881188118804" 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="219.27392739273924" 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="219.27392739273924" 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="570.4290429042904" 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="570.4290429042904" 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="570.4290429042904" 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="570.4290429042904" 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="570.4290429042904" 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="570.4290429042904" 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="219.27392739273924" 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="570.4290429042904" 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="570.4290429042904" 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="570.4290429042904" 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="570.4290429042904" 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="570.4290429042904" 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="570.4290429042904" 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="570.4290429042904" 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="219.27392739273924" 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="219.27392739273924" 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="219.27392739273924" 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="219.27392739273924" 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="219.27392739273924" 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="219.27392739273924" 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="219.27392739273924" 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="219.27392739273924" 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="570.4290429042904" 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="219.27392739273924" 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="219.27392739273924" 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="219.27392739273924" 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="219.27392739273924" 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="219.27392739273924" 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="219.27392739273924" 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="219.27392739273924" 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="219.27392739273924" 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="219.27392739273924" 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="570.4290429042904" 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="570.4290429042904" 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="570.4290429042904" 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="219.27392739273924" 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="570.4290429042904" 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="570.4290429042904" 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="570.4290429042904" 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="168.44884488448847" 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.1599999999999993" data-y="0.8010000000000014" cx="102.83828382838288" 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="168.44884488448847" 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.4499999999999993" data-y="1.1510000000000011" cx="168.44884488448847" cy="214.56105610561045" 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
51
|
document.currentScript.parentElement.addEventListener('mousemove', (e) => {
|
|
52
52
|
const svg = e.currentTarget;
|
|
53
53
|
const rect = svg.getBoundingClientRect();
|
|
@@ -69,7 +69,7 @@ orientation: y+" data-x="-2.401" data-y="1.2010000000000012" cx="170.66666666666
|
|
|
69
69
|
v.setAttribute('y2', '640');
|
|
70
70
|
|
|
71
71
|
// Calculate real coordinates using inverse transformation
|
|
72
|
-
const matrix = {"a":92.40924092409242,"c":0,"e":
|
|
72
|
+
const matrix = {"a":92.40924092409242,"c":0,"e":394.8514851485148,"b":0,"d":-92.40924092409242,"f":320.9240924092409};
|
|
73
73
|
// Manually invert and apply the affine transform
|
|
74
74
|
// Since we only use translate and scale, we can directly compute:
|
|
75
75
|
// x' = (x - tx) / sx
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { expect, test } from "bun:test"
|
|
2
|
+
import { LABEL_SEARCH_STEP } from "lib/solvers/AvailableNetOrientationSolver/constants"
|
|
2
3
|
import { segmentIntersectsRect } from "lib/solvers/NetLabelPlacementSolver/SingleNetLabelPlacementSolver/collisions"
|
|
3
4
|
import { getRectBounds } from "lib/solvers/NetLabelPlacementSolver/SingleNetLabelPlacementSolver/geometry"
|
|
4
5
|
import { SchematicTracePipelineSolver } from "lib/solvers/SchematicTracePipelineSolver/SchematicTracePipelineSolver"
|
|
@@ -34,8 +35,25 @@ test("bug-report-20260731T052229Z", () => {
|
|
|
34
35
|
trace.userNetId === "VDDD" &&
|
|
35
36
|
trace.mspPairId.startsWith("available-net-orientation-"),
|
|
36
37
|
)!
|
|
38
|
+
const alignedLabelXs = ["VDDR", "VDDS", "VDDD"].map(
|
|
39
|
+
(netId) =>
|
|
40
|
+
output.netLabelPlacements.find((placement) => placement.netId === netId)!
|
|
41
|
+
.anchorPoint.x,
|
|
42
|
+
)
|
|
43
|
+
const vddioLabel = output.netLabelPlacements.find(
|
|
44
|
+
(placement) => placement.netId === "VDDIO",
|
|
45
|
+
)!
|
|
46
|
+
const vddioBounds = getRectBounds(
|
|
47
|
+
vddioLabel.center,
|
|
48
|
+
vddioLabel.width,
|
|
49
|
+
vddioLabel.height,
|
|
50
|
+
)
|
|
37
51
|
|
|
38
52
|
expect(vdddLabel.orientation).toBe("y+")
|
|
53
|
+
expect(new Set(alignedLabelXs)).toHaveLength(1)
|
|
54
|
+
expect(vdddBounds.minX - vddioBounds.maxX).toBeGreaterThanOrEqual(
|
|
55
|
+
LABEL_SEARCH_STEP,
|
|
56
|
+
)
|
|
39
57
|
expect(intersectingDifferentNetTraceIds).toEqual([])
|
|
40
58
|
expect(vdddConnector.tracePath).toHaveLength(3)
|
|
41
59
|
expect(vdddConnector.tracePath[0]!.y).toBe(vdddConnector.tracePath[1]!.y)
|
|
@@ -0,0 +1,58 @@
|
|
|
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,0.5 -1,0.25" data-type="line" data-label="" points="189.74358974358972,229.74358974358975 189.74358974358972,281.02564102564105" fill="none" stroke="hsl(271, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-1,0.5 -1,0" data-type="line" data-label="" points="189.74358974358972,229.74358974358975 189.74358974358972,332.3076923076923" fill="none" stroke="hsl(271, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-1,0.25 -1,0" data-type="line" data-label="" points="189.74358974358972,281.02564102564105 189.74358974358972,332.3076923076923" fill="none" stroke="hsl(271, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-1,-0.25 -1,-0.5" data-type="line" data-label="" points="189.74358974358972,383.5897435897436 189.74358974358972,434.8717948717949" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-1,0.25 -1.2,0.25 -1.2,0.5 -1,0.5" data-type="line" data-label="" points="189.74358974358972,281.02564102564105 148.7179487179487,281.02564102564105 148.7179487179487,229.74358974358975 189.74358974358972,229.74358974358975" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1,0 -1.2,0 -1.2,0.25 -1,0.25" data-type="line" data-label="" points="189.74358974358972,332.3076923076923 148.7179487179487,332.3076923076923 148.7179487179487,281.02564102564105 189.74358974358972,281.02564102564105" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1,-0.25 -1.2,-0.25 -1.2,-0.5 -1,-0.5" data-type="line" data-label="" points="189.74358974358972,383.5897435897436 148.7179487179487,383.5897435897436 148.7179487179487,434.8717948717949 189.74358974358972,434.8717948717949" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1.2,0.5 -1.49,0.5" data-type="line" data-label="" points="148.7179487179487,229.74358974358975 89.23076923076923,229.74358974358975" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1.2,-0.5 -1.49,-0.5" data-type="line" data-label="" points="148.7179487179487,434.8717948717949 89.23076923076923,434.8717948717949" fill="none" stroke="purple" stroke-width="1px"/></g><g><rect data-type="rect" data-label="U1" data-x="0" data-y="0" x="189.74358974358972" y="188.71794871794873" width="410.2564102564103" height="287.1794871794872" fill="hsl(164, 100%, 50%, 0.8)" stroke="black" stroke-width="0.004875"/></g><g><rect data-type="rect" data-label="U1 Power" data-x="-0.25" data-y="0.85" x="271.7948717948718" y="137.43589743589746" width="143.5897435897436" height="41.025641025640994" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.004875"/></g><g><rect data-type="rect" data-label="netId: VBAT
|
|
2
|
+
globalConnNetId: connectivity_net0" data-x="-1.49" data-y="0.74" x="40" y="131.2820512820513" width="98.46153846153845" height="98.46153846153845" fill="#ef444466" stroke="#ef4444" stroke-width="0.004875"/></g><g><rect data-type="rect" data-label="netId: GND
|
|
3
|
+
globalConnNetId: connectivity_net1" data-x="-1.49" data-y="-0.6799999999999999" x="40" y="434.8717948717949" width="98.46153846153845" height="73.84615384615387" fill="#00000066" stroke="#000000" stroke-width="0.004875"/></g><g><circle data-type="point" data-label="U1.1
|
|
4
|
+
x-" data-x="-1" data-y="0.5" cx="189.74358974358972" cy="229.74358974358975" r="3" fill="hsl(319, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.2
|
|
5
|
+
x-" data-x="-1" data-y="0.25" cx="189.74358974358972" cy="281.02564102564105" r="3" fill="hsl(320, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.3
|
|
6
|
+
x-" data-x="-1" data-y="0" cx="189.74358974358972" cy="332.3076923076923" r="3" fill="hsl(321, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.4
|
|
7
|
+
x-" data-x="-1" data-y="-0.25" cx="189.74358974358972" cy="383.5897435897436" r="3" fill="hsl(322, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.5
|
|
8
|
+
x-" data-x="-1" data-y="-0.5" cx="189.74358974358972" cy="434.8717948717949" r="3" fill="hsl(323, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.6
|
|
9
|
+
x+" data-x="1" data-y="0.5" cx="600" cy="229.74358974358975" r="3" fill="hsl(324, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.7
|
|
10
|
+
x+" data-x="1" data-y="0.25" cx="600" cy="281.02564102564105" r="3" fill="hsl(325, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.8
|
|
11
|
+
x+" data-x="1" data-y="0" cx="600" cy="332.3076923076923" r="3" fill="hsl(326, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.9
|
|
12
|
+
x+" data-x="1" data-y="-0.25" cx="600" cy="383.5897435897436" r="3" fill="hsl(327, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.10
|
|
13
|
+
x+" data-x="1" data-y="-0.5" cx="600" cy="434.8717948717949" r="3" fill="hsl(217, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="anchorPoint
|
|
14
|
+
orientation: y+" data-x="-1.49" data-y="0.5" cx="89.23076923076923" cy="229.74358974358975" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
|
|
15
|
+
orientation: y-" data-x="-1.49" data-y="-0.5" cx="89.23076923076923" cy="434.8717948717949" 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[
|
|
16
|
+
document.currentScript.parentElement.addEventListener('mousemove', (e) => {
|
|
17
|
+
const svg = e.currentTarget;
|
|
18
|
+
const rect = svg.getBoundingClientRect();
|
|
19
|
+
const x = e.clientX - rect.left;
|
|
20
|
+
const y = e.clientY - rect.top;
|
|
21
|
+
const crosshair = svg.getElementById('crosshair');
|
|
22
|
+
const h = svg.getElementById('crosshair-h');
|
|
23
|
+
const v = svg.getElementById('crosshair-v');
|
|
24
|
+
const coords = svg.getElementById('coordinates');
|
|
25
|
+
|
|
26
|
+
crosshair.style.display = 'block';
|
|
27
|
+
h.setAttribute('x1', '0');
|
|
28
|
+
h.setAttribute('x2', '640');
|
|
29
|
+
h.setAttribute('y1', y);
|
|
30
|
+
h.setAttribute('y2', y);
|
|
31
|
+
v.setAttribute('x1', x);
|
|
32
|
+
v.setAttribute('x2', x);
|
|
33
|
+
v.setAttribute('y1', '0');
|
|
34
|
+
v.setAttribute('y2', '640');
|
|
35
|
+
|
|
36
|
+
// Calculate real coordinates using inverse transformation
|
|
37
|
+
const matrix = {"a":205.12820512820514,"c":0,"e":394.87179487179486,"b":0,"d":-205.12820512820514,"f":332.3076923076923};
|
|
38
|
+
// Manually invert and apply the affine transform
|
|
39
|
+
// Since we only use translate and scale, we can directly compute:
|
|
40
|
+
// x' = (x - tx) / sx
|
|
41
|
+
// y' = (y - ty) / sy
|
|
42
|
+
const sx = matrix.a;
|
|
43
|
+
const sy = matrix.d;
|
|
44
|
+
const tx = matrix.e;
|
|
45
|
+
const ty = matrix.f;
|
|
46
|
+
const realPoint = {
|
|
47
|
+
x: (x - tx) / sx,
|
|
48
|
+
y: (y - ty) / sy // Flip y back since we used negative scale
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
coords.textContent = `(${realPoint.x.toFixed(2)}, ${realPoint.y.toFixed(2)})`;
|
|
52
|
+
coords.setAttribute('x', (x + 5).toString());
|
|
53
|
+
coords.setAttribute('y', (y - 5).toString());
|
|
54
|
+
});
|
|
55
|
+
document.currentScript.parentElement.addEventListener('mouseleave', () => {
|
|
56
|
+
document.currentScript.parentElement.getElementById('crosshair').style.display = 'none';
|
|
57
|
+
});
|
|
58
|
+
]]></script></svg>
|
|
@@ -0,0 +1,96 @@
|
|
|
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.35,0.9999999999999998 -1.35,2.8" data-type="line" data-label="" points="198.84615384615384,241.02564102564105 198.84615384615384,79.48717948717953" fill="none" stroke="hsl(68, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-1.35,0.9999999999999998 -1.35,-1.4000000000000004" data-type="line" data-label="" points="198.84615384615384,241.02564102564105 198.84615384615384,456.41025641025647" fill="none" stroke="hsl(68, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-1.35,2.8 -1.35,-1.4000000000000004" data-type="line" data-label="" points="198.84615384615384,79.48717948717953 198.84615384615384,456.41025641025647" fill="none" stroke="hsl(68, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="1.35,0.9999999999999998 1.35,2.8" data-type="line" data-label="" points="441.1538461538462,241.02564102564105 441.1538461538462,79.48717948717953" fill="none" stroke="hsl(271, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="1.35,0.9999999999999998 1.35,-1.4000000000000004" data-type="line" data-label="" points="441.1538461538462,241.02564102564105 441.1538461538462,456.41025641025647" fill="none" stroke="hsl(271, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="1.35,2.8 1.35,-1.4000000000000004" data-type="line" data-label="" points="441.1538461538462,79.48717948717953 441.1538461538462,456.41025641025647" fill="none" stroke="hsl(271, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-1.35,0.9999999999999998 -1.55,0.9999999999999998 -1.55,2.8 -1.35,2.8" data-type="line" data-label="" points="198.84615384615384,241.02564102564105 180.8974358974359,241.02564102564105 180.8974358974359,79.48717948717953 198.84615384615384,79.48717948717953" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.35,0.9999999999999998 1.55,0.9999999999999998 1.55,2.8 1.35,2.8" data-type="line" data-label="" points="441.1538461538462,241.02564102564105 459.1025641025641,241.02564102564105 459.1025641025641,79.48717948717953 441.1538461538462,79.48717948717953" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1.55,2.8 -1.9000000000000001,2.8" data-type="line" data-label="" points="180.8974358974359,79.48717948717953 149.48717948717947,79.48717948717953" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1.35,-1.4000000000000004 -1.701,-1.4000000000000004 -1.701,-1.3490000000000004" data-type="line" data-label="" points="198.84615384615384,456.41025641025647 167.34615384615384,456.41025641025647 167.34615384615384,451.83333333333337" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.55,2.8 1.9000000000000001,2.8" data-type="line" data-label="" points="459.1025641025641,79.48717948717953 490.51282051282055,79.48717948717953" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.35,-1.4000000000000004 1.701,-1.4000000000000004 1.701,-1.3490000000000004" data-type="line" data-label="" points="441.1538461538462,456.41025641025647 472.6538461538462,456.41025641025647 472.6538461538462,451.83333333333337" fill="none" stroke="purple" stroke-width="1px"/></g><g><rect data-type="rect" data-label="U1" data-x="0" data-y="0" x="198.8461538461538" y="61.53846153846155" width="242.30769230769235" height="538.4615384615385" fill="hsl(164, 100%, 50%, 0.8)" stroke="black" stroke-width="0.011142857142857144"/></g><g><rect data-type="rect" data-label="U1" data-x="-0.83" data-y="3.115" x="229.35897435897436" y="40" width="32.30769230769232" height="22.43589743589746" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.011142857142857144"/></g><g><rect data-type="rect" data-label="netId: V3V3_LEFT
|
|
2
|
+
globalConnNetId: connectivity_net0" data-x="-1.9000000000000001" data-y="3.01" x="122.56410256410255" y="41.79487179487184" width="53.84615384615384" height="37.69230769230771" fill="#ef444466" stroke="#ef4444" stroke-width="0.011142857142857144"/></g><g><rect data-type="rect" data-label="netId: V3V3_LEFT
|
|
3
|
+
globalConnNetId: connectivity_net0" data-x="-1.701" data-y="-1.1390000000000005" x="140.4230769230769" y="414.14102564102575" width="53.84615384615384" height="37.69230769230768" fill="#ef444466" stroke="#ef4444" stroke-width="0.011142857142857144"/></g><g><rect data-type="rect" data-label="netId: V3V3_RIGHT
|
|
4
|
+
globalConnNetId: connectivity_net1" data-x="1.9000000000000001" data-y="3.01" x="463.58974358974365" y="41.79487179487184" width="53.84615384615387" height="37.69230769230771" fill="#ef444466" stroke="#ef4444" stroke-width="0.011142857142857144"/></g><g><rect data-type="rect" data-label="netId: V3V3_RIGHT
|
|
5
|
+
globalConnNetId: connectivity_net1" data-x="1.701" data-y="-1.1390000000000005" x="445.7307692307693" y="414.14102564102575" width="53.84615384615387" height="37.69230769230768" fill="#ef444466" stroke="#ef4444" stroke-width="0.011142857142857144"/></g><g><circle data-type="point" data-label="U1.left.1
|
|
6
|
+
x-" data-x="-1.35" data-y="2.8" cx="198.84615384615384" cy="79.48717948717953" r="3" fill="hsl(12, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.left.2
|
|
7
|
+
x-" data-x="-1.35" data-y="2.5999999999999996" cx="198.84615384615384" cy="97.43589743589749" r="3" fill="hsl(13, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.left.3
|
|
8
|
+
x-" data-x="-1.35" data-y="2.4" cx="198.84615384615384" cy="115.38461538461542" r="3" fill="hsl(14, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.left.4
|
|
9
|
+
x-" data-x="-1.35" data-y="2.1999999999999997" cx="198.84615384615384" cy="133.33333333333337" r="3" fill="hsl(15, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.left.5
|
|
10
|
+
x-" data-x="-1.35" data-y="1.9999999999999998" cx="198.84615384615384" cy="151.28205128205133" r="3" fill="hsl(16, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.left.6
|
|
11
|
+
x-" data-x="-1.35" data-y="1.7999999999999998" cx="198.84615384615384" cy="169.23076923076925" r="3" fill="hsl(17, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.left.7
|
|
12
|
+
x-" data-x="-1.35" data-y="1.5999999999999996" cx="198.84615384615384" cy="187.17948717948724" r="3" fill="hsl(18, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.left.8
|
|
13
|
+
x-" data-x="-1.35" data-y="1.3999999999999997" cx="198.84615384615384" cy="205.12820512820517" r="3" fill="hsl(19, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.left.9
|
|
14
|
+
x-" data-x="-1.35" data-y="1.1999999999999997" cx="198.84615384615384" cy="223.0769230769231" r="3" fill="hsl(20, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.left.10
|
|
15
|
+
x-" data-x="-1.35" data-y="0.9999999999999998" cx="198.84615384615384" cy="241.02564102564105" r="3" fill="hsl(60, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.left.11
|
|
16
|
+
x-" data-x="-1.35" data-y="0.7999999999999998" cx="198.84615384615384" cy="258.974358974359" r="3" fill="hsl(61, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.left.12
|
|
17
|
+
x-" data-x="-1.35" data-y="0.5999999999999996" cx="198.84615384615384" cy="276.92307692307696" r="3" fill="hsl(62, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.left.13
|
|
18
|
+
x-" data-x="-1.35" data-y="0.39999999999999947" cx="198.84615384615384" cy="294.8717948717949" r="3" fill="hsl(63, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.left.14
|
|
19
|
+
x-" data-x="-1.35" data-y="0.19999999999999973" cx="198.84615384615384" cy="312.8205128205129" r="3" fill="hsl(64, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.left.15
|
|
20
|
+
x-" data-x="-1.35" data-y="-4.440892098500626e-16" cx="198.84615384615384" cy="330.76923076923083" r="3" fill="hsl(65, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.left.16
|
|
21
|
+
x-" data-x="-1.35" data-y="-0.20000000000000018" cx="198.84615384615384" cy="348.71794871794873" r="3" fill="hsl(66, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.left.17
|
|
22
|
+
x-" data-x="-1.35" data-y="-0.40000000000000036" cx="198.84615384615384" cy="366.6666666666667" r="3" fill="hsl(67, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.left.18
|
|
23
|
+
x-" data-x="-1.35" data-y="-0.6000000000000005" cx="198.84615384615384" cy="384.61538461538464" r="3" fill="hsl(68, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.left.19
|
|
24
|
+
x-" data-x="-1.35" data-y="-0.8000000000000003" cx="198.84615384615384" cy="402.5641025641026" r="3" fill="hsl(69, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.left.20
|
|
25
|
+
x-" data-x="-1.35" data-y="-1.0000000000000004" cx="198.84615384615384" cy="420.51282051282055" r="3" fill="hsl(91, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.left.21
|
|
26
|
+
x-" data-x="-1.35" data-y="-1.2000000000000002" cx="198.84615384615384" cy="438.46153846153845" r="3" fill="hsl(92, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.left.22
|
|
27
|
+
x-" data-x="-1.35" data-y="-1.4000000000000004" cx="198.84615384615384" cy="456.41025641025647" r="3" fill="hsl(93, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.right.1
|
|
28
|
+
x+" data-x="1.35" data-y="2.8" cx="441.1538461538462" cy="79.48717948717953" r="3" fill="hsl(277, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.right.2
|
|
29
|
+
x+" data-x="1.35" data-y="2.5999999999999996" cx="441.1538461538462" cy="97.43589743589749" r="3" fill="hsl(278, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.right.3
|
|
30
|
+
x+" data-x="1.35" data-y="2.4" cx="441.1538461538462" cy="115.38461538461542" r="3" fill="hsl(279, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.right.4
|
|
31
|
+
x+" data-x="1.35" data-y="2.1999999999999997" cx="441.1538461538462" cy="133.33333333333337" r="3" fill="hsl(280, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.right.5
|
|
32
|
+
x+" data-x="1.35" data-y="1.9999999999999998" cx="441.1538461538462" cy="151.28205128205133" r="3" fill="hsl(281, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.right.6
|
|
33
|
+
x+" data-x="1.35" data-y="1.7999999999999998" cx="441.1538461538462" cy="169.23076923076925" r="3" fill="hsl(282, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.right.7
|
|
34
|
+
x+" data-x="1.35" data-y="1.5999999999999996" cx="441.1538461538462" cy="187.17948717948724" r="3" fill="hsl(283, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.right.8
|
|
35
|
+
x+" data-x="1.35" data-y="1.3999999999999997" cx="441.1538461538462" cy="205.12820512820517" r="3" fill="hsl(284, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.right.9
|
|
36
|
+
x+" data-x="1.35" data-y="1.1999999999999997" cx="441.1538461538462" cy="223.0769230769231" r="3" fill="hsl(285, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.right.10
|
|
37
|
+
x+" data-x="1.35" data-y="0.9999999999999998" cx="441.1538461538462" cy="241.02564102564105" r="3" fill="hsl(352, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.right.11
|
|
38
|
+
x+" data-x="1.35" data-y="0.7999999999999998" cx="441.1538461538462" cy="258.974358974359" r="3" fill="hsl(352, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.right.12
|
|
39
|
+
x+" data-x="1.35" data-y="0.5999999999999996" cx="441.1538461538462" cy="276.92307692307696" r="3" fill="hsl(352, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.right.13
|
|
40
|
+
x+" data-x="1.35" data-y="0.39999999999999947" cx="441.1538461538462" cy="294.8717948717949" r="3" fill="hsl(352, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.right.14
|
|
41
|
+
x+" data-x="1.35" data-y="0.19999999999999973" cx="441.1538461538462" cy="312.8205128205129" r="3" fill="hsl(352, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.right.15
|
|
42
|
+
x+" data-x="1.35" data-y="-4.440892098500626e-16" cx="441.1538461538462" cy="330.76923076923083" r="3" fill="hsl(0, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.right.16
|
|
43
|
+
x+" data-x="1.35" data-y="-0.20000000000000018" cx="441.1538461538462" cy="348.71794871794873" r="3" fill="hsl(0, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.right.17
|
|
44
|
+
x+" data-x="1.35" data-y="-0.40000000000000036" cx="441.1538461538462" cy="366.6666666666667" r="3" fill="hsl(0, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.right.18
|
|
45
|
+
x+" data-x="1.35" data-y="-0.6000000000000005" cx="441.1538461538462" cy="384.61538461538464" r="3" fill="hsl(0, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.right.19
|
|
46
|
+
x+" data-x="1.35" data-y="-0.8000000000000003" cx="441.1538461538462" cy="402.5641025641026" r="3" fill="hsl(0, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.right.20
|
|
47
|
+
x+" data-x="1.35" data-y="-1.0000000000000004" cx="441.1538461538462" cy="420.51282051282055" r="3" fill="hsl(24, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.right.21
|
|
48
|
+
x+" data-x="1.35" data-y="-1.2000000000000002" cx="441.1538461538462" cy="438.46153846153845" r="3" fill="hsl(24, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.right.22
|
|
49
|
+
x+" data-x="1.35" data-y="-1.4000000000000004" cx="441.1538461538462" cy="456.41025641025647" r="3" fill="hsl(24, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="anchorPoint
|
|
50
|
+
orientation: y+" data-x="-1.9000000000000001" data-y="2.8" cx="149.48717948717947" cy="79.48717948717953" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
|
|
51
|
+
orientation: y+" data-x="-1.701" data-y="-1.3490000000000004" cx="167.34615384615384" cy="451.83333333333337" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
|
|
52
|
+
orientation: y+" data-x="1.9000000000000001" data-y="2.8" cx="490.51282051282055" cy="79.48717948717953" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
|
|
53
|
+
orientation: y+" data-x="1.701" data-y="-1.3490000000000004" cx="472.6538461538462" cy="451.83333333333337" 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[
|
|
54
|
+
document.currentScript.parentElement.addEventListener('mousemove', (e) => {
|
|
55
|
+
const svg = e.currentTarget;
|
|
56
|
+
const rect = svg.getBoundingClientRect();
|
|
57
|
+
const x = e.clientX - rect.left;
|
|
58
|
+
const y = e.clientY - rect.top;
|
|
59
|
+
const crosshair = svg.getElementById('crosshair');
|
|
60
|
+
const h = svg.getElementById('crosshair-h');
|
|
61
|
+
const v = svg.getElementById('crosshair-v');
|
|
62
|
+
const coords = svg.getElementById('coordinates');
|
|
63
|
+
|
|
64
|
+
crosshair.style.display = 'block';
|
|
65
|
+
h.setAttribute('x1', '0');
|
|
66
|
+
h.setAttribute('x2', '640');
|
|
67
|
+
h.setAttribute('y1', y);
|
|
68
|
+
h.setAttribute('y2', y);
|
|
69
|
+
v.setAttribute('x1', x);
|
|
70
|
+
v.setAttribute('x2', x);
|
|
71
|
+
v.setAttribute('y1', '0');
|
|
72
|
+
v.setAttribute('y2', '640');
|
|
73
|
+
|
|
74
|
+
// Calculate real coordinates using inverse transformation
|
|
75
|
+
const matrix = {"a":89.74358974358974,"c":0,"e":320,"b":0,"d":-89.74358974358974,"f":330.7692307692308};
|
|
76
|
+
// Manually invert and apply the affine transform
|
|
77
|
+
// Since we only use translate and scale, we can directly compute:
|
|
78
|
+
// x' = (x - tx) / sx
|
|
79
|
+
// y' = (y - ty) / sy
|
|
80
|
+
const sx = matrix.a;
|
|
81
|
+
const sy = matrix.d;
|
|
82
|
+
const tx = matrix.e;
|
|
83
|
+
const ty = matrix.f;
|
|
84
|
+
const realPoint = {
|
|
85
|
+
x: (x - tx) / sx,
|
|
86
|
+
y: (y - ty) / sy // Flip y back since we used negative scale
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
coords.textContent = `(${realPoint.x.toFixed(2)}, ${realPoint.y.toFixed(2)})`;
|
|
90
|
+
coords.setAttribute('x', (x + 5).toString());
|
|
91
|
+
coords.setAttribute('y', (y - 5).toString());
|
|
92
|
+
});
|
|
93
|
+
document.currentScript.parentElement.addEventListener('mouseleave', () => {
|
|
94
|
+
document.currentScript.parentElement.getElementById('crosshair').style.display = 'none';
|
|
95
|
+
});
|
|
96
|
+
]]></script></svg>
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { expect, test } from "bun:test"
|
|
2
|
+
import { SchematicTracePipelineSolver } from "lib/solvers/SchematicTracePipelineSolver/SchematicTracePipelineSolver"
|
|
3
|
+
import type { InputProblem } from "lib/types/InputProblem"
|
|
4
|
+
import "tests/fixtures/matcher"
|
|
5
|
+
|
|
6
|
+
const inputProblem: InputProblem = {
|
|
7
|
+
chips: [
|
|
8
|
+
{
|
|
9
|
+
chipId: "U1",
|
|
10
|
+
center: { x: 0, y: 0 },
|
|
11
|
+
width: 2,
|
|
12
|
+
height: 1.4,
|
|
13
|
+
pins: [
|
|
14
|
+
...[0.5, 0.25, 0, -0.25, -0.5].map((y, index) => ({
|
|
15
|
+
pinId: `U1.${index + 1}`,
|
|
16
|
+
x: -1,
|
|
17
|
+
y,
|
|
18
|
+
_facingDirection: "x-" as const,
|
|
19
|
+
})),
|
|
20
|
+
...[0.5, 0.25, 0, -0.25, -0.5].map((y, index) => ({
|
|
21
|
+
pinId: `U1.${index + 6}`,
|
|
22
|
+
x: 1,
|
|
23
|
+
y,
|
|
24
|
+
_facingDirection: "x+" as const,
|
|
25
|
+
})),
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
directConnections: [],
|
|
30
|
+
netConnections: [
|
|
31
|
+
{
|
|
32
|
+
netId: "VBAT",
|
|
33
|
+
pinIds: ["U1.1", "U1.2", "U1.3"],
|
|
34
|
+
netLabelWidth: 0.48,
|
|
35
|
+
netLabelHeight: 0.48,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
netId: "GND",
|
|
39
|
+
pinIds: ["U1.4", "U1.5"],
|
|
40
|
+
netLabelWidth: 0.36,
|
|
41
|
+
netLabelHeight: 0.48,
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
textBoxes: [
|
|
45
|
+
{
|
|
46
|
+
chipId: "U1",
|
|
47
|
+
center: { x: -0.25, y: 0.85 },
|
|
48
|
+
width: 0.7,
|
|
49
|
+
height: 0.2,
|
|
50
|
+
text: "U1 Power",
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
availableNetLabelOrientations: {
|
|
54
|
+
VBAT: ["y+"],
|
|
55
|
+
GND: ["y-"],
|
|
56
|
+
},
|
|
57
|
+
maxMspPairDistance: 2.4,
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
test("places same-side VBAT and GND labels at opposite rail ends", () => {
|
|
61
|
+
const solver = new SchematicTracePipelineSolver(inputProblem)
|
|
62
|
+
|
|
63
|
+
solver.solve()
|
|
64
|
+
|
|
65
|
+
const outputLabels =
|
|
66
|
+
solver.netLabelNetLabelCollisionSolver!.getOutput().netLabelPlacements
|
|
67
|
+
const u1 = solver.inputProblem.chips.find((chip) => chip.chipId === "U1")!
|
|
68
|
+
const chipLeft = u1.center.x - u1.width / 2
|
|
69
|
+
|
|
70
|
+
for (const expected of [
|
|
71
|
+
{ netId: "VBAT", orientation: "y+" as const, anchorY: 0.5 },
|
|
72
|
+
{ netId: "GND", orientation: "y-" as const, anchorY: -0.5 },
|
|
73
|
+
]) {
|
|
74
|
+
const label = outputLabels.find(
|
|
75
|
+
(candidate) => candidate.netId === expected.netId,
|
|
76
|
+
)!
|
|
77
|
+
const connector = solver.availableNetOrientationSolver!.traces.find(
|
|
78
|
+
(trace) =>
|
|
79
|
+
trace.userNetId === expected.netId &&
|
|
80
|
+
trace.mspPairId.startsWith("available-net-orientation-"),
|
|
81
|
+
)!
|
|
82
|
+
const [connectorSource, connectorTarget] = connector.tracePath
|
|
83
|
+
const labelRight = label.center.x + label.width / 2
|
|
84
|
+
|
|
85
|
+
expect(label.orientation).toBe(expected.orientation)
|
|
86
|
+
expect(label.anchorPoint.y).toBeCloseTo(expected.anchorY)
|
|
87
|
+
expect(labelRight).toBeLessThan(chipLeft)
|
|
88
|
+
expect(connector.tracePath).toHaveLength(2)
|
|
89
|
+
expect(connectorSource!.y).toBeCloseTo(connectorTarget!.y)
|
|
90
|
+
expect(connectorTarget!.x).toBeLessThan(connectorSource!.x)
|
|
91
|
+
expect(connectorSource!.x - connectorTarget!.x).toBeLessThan(0.5)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
expect(solver).toMatchSolverSnapshot(import.meta.path)
|
|
95
|
+
})
|