@tscircuit/schematic-trace-solver 0.0.117 → 0.0.118
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 +2 -0
- package/dist/index.js +29 -1
- package/lib/solvers/AvailableNetOrientationSolver/AvailableNetOrientationSolver.ts +40 -1
- package/package.json +1 -1
- 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/dist/index.d.ts
CHANGED
|
@@ -744,6 +744,8 @@ declare class AvailableNetOrientationSolver extends BaseSolver {
|
|
|
744
744
|
currentLabelIndex: number | null;
|
|
745
745
|
currentLabel: NetLabelPlacement | null;
|
|
746
746
|
currentCandidateResults: EvaluatedCandidate[];
|
|
747
|
+
blockedStandaloneLabelIndex: number | null;
|
|
748
|
+
blockedStandaloneLabelTargetAnchorX: number | null;
|
|
747
749
|
private traceMap;
|
|
748
750
|
private chipObstacleSpatialIndex;
|
|
749
751
|
private maxSearchDistance;
|
package/dist/index.js
CHANGED
|
@@ -7848,6 +7848,8 @@ var AvailableNetOrientationSolver = class extends BaseSolver {
|
|
|
7848
7848
|
currentLabelIndex = null;
|
|
7849
7849
|
currentLabel = null;
|
|
7850
7850
|
currentCandidateResults = [];
|
|
7851
|
+
blockedStandaloneLabelIndex = null;
|
|
7852
|
+
blockedStandaloneLabelTargetAnchorX = null;
|
|
7851
7853
|
traceMap;
|
|
7852
7854
|
chipObstacleSpatialIndex;
|
|
7853
7855
|
maxSearchDistance;
|
|
@@ -7901,6 +7903,8 @@ var AvailableNetOrientationSolver = class extends BaseSolver {
|
|
|
7901
7903
|
return this.isPortOnlyLabel(label) && this.isStandaloneSinglePinNetLabel(label) && orientations.length === 1 && isYOrientation(orientations[0]) && this.labelIntersectsDifferentNetTrace(label);
|
|
7902
7904
|
});
|
|
7903
7905
|
if (blockedStandaloneLabelIndex === void 0) return indices;
|
|
7906
|
+
this.blockedStandaloneLabelIndex = blockedStandaloneLabelIndex;
|
|
7907
|
+
this.blockedStandaloneLabelTargetAnchorX = null;
|
|
7904
7908
|
const blockedLabel = this.outputNetLabelPlacements[blockedStandaloneLabelIndex];
|
|
7905
7909
|
const requiredOrientation = this.getAvailableOrientations(blockedLabel)[0];
|
|
7906
7910
|
const chipSide = this.getChipSideForPoint(blockedLabel.anchorPoint);
|
|
@@ -7920,6 +7924,22 @@ var AvailableNetOrientationSolver = class extends BaseSolver {
|
|
|
7920
7924
|
const bY = this.outputNetLabelPlacements[b].anchorPoint.y;
|
|
7921
7925
|
return requiredOrientation === "y+" ? bY - aY : aY - bY;
|
|
7922
7926
|
});
|
|
7927
|
+
const blockedLabelWidth = this.getNetLabelWidth(blockedLabel);
|
|
7928
|
+
let columnLabelIndex;
|
|
7929
|
+
if (blockedLabelWidth !== void 0) {
|
|
7930
|
+
columnLabelIndex = labelsToOrder.find((index) => {
|
|
7931
|
+
if (index === blockedStandaloneLabelIndex) return false;
|
|
7932
|
+
const label = this.outputNetLabelPlacements[index];
|
|
7933
|
+
return this.getNetLabelWidth(label) === blockedLabelWidth;
|
|
7934
|
+
});
|
|
7935
|
+
}
|
|
7936
|
+
if (columnLabelIndex !== void 0) {
|
|
7937
|
+
const columnLabel = this.outputNetLabelPlacements[columnLabelIndex];
|
|
7938
|
+
this.blockedStandaloneLabelTargetAnchorX = this.getSearchStartAnchor(
|
|
7939
|
+
columnLabel,
|
|
7940
|
+
requiredOrientation
|
|
7941
|
+
).x;
|
|
7942
|
+
}
|
|
7923
7943
|
for (let i = 0; i < affectedSlots.length; i++) {
|
|
7924
7944
|
indices[affectedSlots[i]] = labelsToOrder[i];
|
|
7925
7945
|
}
|
|
@@ -8270,13 +8290,17 @@ var AvailableNetOrientationSolver = class extends BaseSolver {
|
|
|
8270
8290
|
netLabelWidth: this.getNetLabelWidth(label),
|
|
8271
8291
|
netLabelHeight: this.getNetLabelHeight(label)
|
|
8272
8292
|
});
|
|
8273
|
-
|
|
8293
|
+
const searchStartAnchor = this.getSideOffsetAnchor({
|
|
8274
8294
|
anchorPoint,
|
|
8275
8295
|
labelAnchorPoint: label.anchorPoint,
|
|
8276
8296
|
orientation,
|
|
8277
8297
|
width,
|
|
8278
8298
|
height
|
|
8279
8299
|
});
|
|
8300
|
+
if (this.blockedStandaloneLabelIndex !== null && label === this.outputNetLabelPlacements[this.blockedStandaloneLabelIndex] && isYOrientation(orientation) && this.blockedStandaloneLabelTargetAnchorX !== null) {
|
|
8301
|
+
searchStartAnchor.x = this.blockedStandaloneLabelTargetAnchorX;
|
|
8302
|
+
}
|
|
8303
|
+
return searchStartAnchor;
|
|
8280
8304
|
}
|
|
8281
8305
|
getWickOffsetAnchor(anchorPoint, orientation) {
|
|
8282
8306
|
const direction = dir(orientation);
|
|
@@ -8536,6 +8560,10 @@ var AvailableNetOrientationSolver = class extends BaseSolver {
|
|
|
8536
8560
|
if (i === labelIndex) continue;
|
|
8537
8561
|
const label = this.outputNetLabelPlacements[i];
|
|
8538
8562
|
const otherBounds = getRectBounds(label.center, label.width, label.height);
|
|
8563
|
+
if (i === this.blockedStandaloneLabelIndex && isYOrientation(label.orientation)) {
|
|
8564
|
+
otherBounds.minX -= LABEL_SEARCH_STEP;
|
|
8565
|
+
otherBounds.maxX += LABEL_SEARCH_STEP;
|
|
8566
|
+
}
|
|
8539
8567
|
if (rectsOverlap2(bounds, otherBounds)) return true;
|
|
8540
8568
|
}
|
|
8541
8569
|
return false;
|
|
@@ -51,6 +51,8 @@ export class AvailableNetOrientationSolver extends BaseSolver {
|
|
|
51
51
|
currentLabel: NetLabelPlacement | null = null
|
|
52
52
|
currentCandidateResults: EvaluatedCandidate[] = []
|
|
53
53
|
|
|
54
|
+
blockedStandaloneLabelIndex: number | null = null
|
|
55
|
+
blockedStandaloneLabelTargetAnchorX: number | null = null
|
|
54
56
|
private traceMap: Record<string, SolvedTracePath>
|
|
55
57
|
private chipObstacleSpatialIndex: ChipObstacleSpatialIndex
|
|
56
58
|
private maxSearchDistance: number
|
|
@@ -122,6 +124,8 @@ export class AvailableNetOrientationSolver extends BaseSolver {
|
|
|
122
124
|
)
|
|
123
125
|
})
|
|
124
126
|
if (blockedStandaloneLabelIndex === undefined) return indices
|
|
127
|
+
this.blockedStandaloneLabelIndex = blockedStandaloneLabelIndex
|
|
128
|
+
this.blockedStandaloneLabelTargetAnchorX = null
|
|
125
129
|
|
|
126
130
|
const blockedLabel =
|
|
127
131
|
this.outputNetLabelPlacements[blockedStandaloneLabelIndex]!
|
|
@@ -152,6 +156,23 @@ export class AvailableNetOrientationSolver extends BaseSolver {
|
|
|
152
156
|
const bY = this.outputNetLabelPlacements[b]!.anchorPoint.y
|
|
153
157
|
return requiredOrientation === "y+" ? bY - aY : aY - bY
|
|
154
158
|
})
|
|
159
|
+
const blockedLabelWidth = this.getNetLabelWidth(blockedLabel)
|
|
160
|
+
let columnLabelIndex: number | undefined
|
|
161
|
+
if (blockedLabelWidth !== undefined) {
|
|
162
|
+
columnLabelIndex = labelsToOrder.find((index) => {
|
|
163
|
+
if (index === blockedStandaloneLabelIndex) return false
|
|
164
|
+
const label = this.outputNetLabelPlacements[index]!
|
|
165
|
+
return this.getNetLabelWidth(label) === blockedLabelWidth
|
|
166
|
+
})
|
|
167
|
+
}
|
|
168
|
+
if (columnLabelIndex !== undefined) {
|
|
169
|
+
const columnLabel = this.outputNetLabelPlacements[columnLabelIndex]!
|
|
170
|
+
// Reuse the established same-width column instead of a nearby search step.
|
|
171
|
+
this.blockedStandaloneLabelTargetAnchorX = this.getSearchStartAnchor(
|
|
172
|
+
columnLabel,
|
|
173
|
+
requiredOrientation,
|
|
174
|
+
).x
|
|
175
|
+
}
|
|
155
176
|
for (let i = 0; i < affectedSlots.length; i++) {
|
|
156
177
|
indices[affectedSlots[i]!] = labelsToOrder[i]!
|
|
157
178
|
}
|
|
@@ -637,13 +658,23 @@ export class AvailableNetOrientationSolver extends BaseSolver {
|
|
|
637
658
|
netLabelHeight: this.getNetLabelHeight(label),
|
|
638
659
|
})
|
|
639
660
|
|
|
640
|
-
|
|
661
|
+
const searchStartAnchor = this.getSideOffsetAnchor({
|
|
641
662
|
anchorPoint,
|
|
642
663
|
labelAnchorPoint: label.anchorPoint,
|
|
643
664
|
orientation,
|
|
644
665
|
width,
|
|
645
666
|
height,
|
|
646
667
|
})
|
|
668
|
+
if (
|
|
669
|
+
this.blockedStandaloneLabelIndex !== null &&
|
|
670
|
+
label ===
|
|
671
|
+
this.outputNetLabelPlacements[this.blockedStandaloneLabelIndex] &&
|
|
672
|
+
isYOrientation(orientation) &&
|
|
673
|
+
this.blockedStandaloneLabelTargetAnchorX !== null
|
|
674
|
+
) {
|
|
675
|
+
searchStartAnchor.x = this.blockedStandaloneLabelTargetAnchorX
|
|
676
|
+
}
|
|
677
|
+
return searchStartAnchor
|
|
647
678
|
}
|
|
648
679
|
|
|
649
680
|
private getWickOffsetAnchor(
|
|
@@ -1007,6 +1038,14 @@ export class AvailableNetOrientationSolver extends BaseSolver {
|
|
|
1007
1038
|
if (i === labelIndex) continue
|
|
1008
1039
|
const label = this.outputNetLabelPlacements[i]!
|
|
1009
1040
|
const otherBounds = getRectBounds(label.center, label.width, label.height)
|
|
1041
|
+
if (
|
|
1042
|
+
i === this.blockedStandaloneLabelIndex &&
|
|
1043
|
+
isYOrientation(label.orientation)
|
|
1044
|
+
) {
|
|
1045
|
+
// Keep later labels one search step away from the blocked label.
|
|
1046
|
+
otherBounds.minX -= LABEL_SEARCH_STEP
|
|
1047
|
+
otherBounds.maxX += LABEL_SEARCH_STEP
|
|
1048
|
+
}
|
|
1010
1049
|
if (rectsOverlap(bounds, otherBounds)) return true
|
|
1011
1050
|
}
|
|
1012
1051
|
return false
|
package/package.json
CHANGED
|
@@ -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)
|