@tscircuit/schematic-trace-solver 0.0.111 → 0.0.113
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 +5 -0
- package/dist/index.js +58 -7
- package/lib/solvers/SchematicTraceLinesSolver/SchematicTraceSingleLineSolver2/SchematicTraceSingleLineSolver2.ts +28 -2
- package/lib/solvers/SchematicTracePipelineSolver/SchematicTracePipelineSolver.ts +28 -3
- package/lib/solvers/TraceOverlapShiftSolver/TraceOverlapIssueSolver/TraceOverlapIssueSolver.ts +11 -1
- package/lib/solvers/TraceOverlapShiftSolver/TraceOverlapShiftSolver.ts +12 -0
- package/package.json +1 -1
- package/tests/bug-reports/bug-report-20260707T092615Z/__snapshots__/bug-report-20260707T092615Z.snap.svg +1 -1
- package/tests/repros/__snapshots__/repro-atmega328p-missing-gnd-netlabel.snap.svg +1 -1
- package/tests/repros/__snapshots__/repro-rp2040-usb-cc2-ground-overlap.snap.svg +70 -0
- package/tests/repros/assets/repro-rp2040-usb-cc2-ground-overlap.input.json +164 -0
- package/tests/repros/repro-rp2040-usb-cc2-ground-overlap.test.ts +95 -0
- package/tests/solvers/SchematicTraceSingleLineSolver2/SchematicTraceSingleLineSolver2_repro47-short-opposing-pins.test.ts +63 -0
- package/tests/solvers/SchematicTraceSingleLineSolver2/__snapshots__/SchematicTraceSingleLineSolver2_repro47-short-opposing-pins.snap.svg +46 -0
package/dist/index.d.ts
CHANGED
|
@@ -244,6 +244,7 @@ declare class TraceOverlapIssueSolver extends BaseSolver {
|
|
|
244
244
|
overlappingTraceSegments: OverlappingTraceSegmentLocator[];
|
|
245
245
|
interactionKind: TraceInteractionKind;
|
|
246
246
|
traceNetIslands: Record<ConnNetId$1, Array<SolvedTracePath>>;
|
|
247
|
+
traceIdsToShift?: Set<MspConnectionPairId>;
|
|
247
248
|
obstacleRects: ReturnType<typeof getObstacleRects>;
|
|
248
249
|
SHIFT_DISTANCE: number;
|
|
249
250
|
correctedTraceMap: Record<MspConnectionPairId, SolvedTracePath>;
|
|
@@ -252,6 +253,7 @@ declare class TraceOverlapIssueSolver extends BaseSolver {
|
|
|
252
253
|
overlappingTraceSegments: OverlappingTraceSegmentLocator[];
|
|
253
254
|
interactionKind: TraceInteractionKind;
|
|
254
255
|
traceNetIslands: Record<ConnNetId$1, Array<SolvedTracePath>>;
|
|
256
|
+
traceIdsToShift?: Set<MspConnectionPairId>;
|
|
255
257
|
});
|
|
256
258
|
_step(): void;
|
|
257
259
|
private applyOffsets;
|
|
@@ -284,6 +286,7 @@ declare class TraceOverlapShiftSolver extends BaseSolver {
|
|
|
284
286
|
inputProblem: InputProblem;
|
|
285
287
|
inputTracePaths: Array<SolvedTracePath>;
|
|
286
288
|
globalConnMap: ConnectivityMap;
|
|
289
|
+
traceIdsToShift?: Set<MspConnectionPairId>;
|
|
287
290
|
activeSubSolver: TraceOverlapIssueSolver | null;
|
|
288
291
|
/**
|
|
289
292
|
* A traceNetIsland is a set of traces that are connected via the globalConnMap
|
|
@@ -295,6 +298,7 @@ declare class TraceOverlapShiftSolver extends BaseSolver {
|
|
|
295
298
|
inputProblem: InputProblem;
|
|
296
299
|
inputTracePaths: Array<SolvedTracePath>;
|
|
297
300
|
globalConnMap: ConnectivityMap;
|
|
301
|
+
traceIdsToShift?: Set<MspConnectionPairId>;
|
|
298
302
|
});
|
|
299
303
|
getConstructorParams(): ConstructorParameters<typeof TraceOverlapShiftSolver>[0];
|
|
300
304
|
computeTraceNetIslands(): Record<ConnNetId, Array<SolvedTracePath>>;
|
|
@@ -1071,6 +1075,7 @@ declare class SchematicTracePipelineSolver extends BaseSolver {
|
|
|
1071
1075
|
traceCleanupSolver?: TraceCleanupSolver;
|
|
1072
1076
|
example28Solver?: Example28Solver;
|
|
1073
1077
|
availableNetOrientationSolver?: AvailableNetOrientationSolver;
|
|
1078
|
+
postLabelTraceOverlapShiftSolver?: TraceOverlapShiftSolver;
|
|
1074
1079
|
railNetLabelCornerPlacementSolver?: RailNetLabelCornerPlacementSolver;
|
|
1075
1080
|
traceAnchoredNetLabelOverlapSolver?: TraceAnchoredNetLabelOverlapSolver;
|
|
1076
1081
|
preAlignmentNetLabelTraceCollisionSolver?: NetLabelTraceCollisionSolver;
|
package/dist/index.js
CHANGED
|
@@ -1130,6 +1130,17 @@ var calculateElbowForPins = ({
|
|
|
1130
1130
|
},
|
|
1131
1131
|
{ overshoot }
|
|
1132
1132
|
);
|
|
1133
|
+
var pinsFaceEachOther = ({
|
|
1134
|
+
pin1,
|
|
1135
|
+
pin2
|
|
1136
|
+
}) => {
|
|
1137
|
+
const xDistance = pin2.x - pin1.x;
|
|
1138
|
+
const yDistance = pin2.y - pin1.y;
|
|
1139
|
+
if (Math.abs(xDistance) >= Math.abs(yDistance)) {
|
|
1140
|
+
return xDistance > 0 ? pin1._facingDirection === "x+" && pin2._facingDirection === "x-" : pin1._facingDirection === "x-" && pin2._facingDirection === "x+";
|
|
1141
|
+
}
|
|
1142
|
+
return yDistance > 0 ? pin1._facingDirection === "y+" && pin2._facingDirection === "y-" : pin1._facingDirection === "y-" && pin2._facingDirection === "y+";
|
|
1143
|
+
};
|
|
1133
1144
|
var SchematicTraceSingleLineSolver2 = class extends BaseSolver {
|
|
1134
1145
|
pins;
|
|
1135
1146
|
connectionPair;
|
|
@@ -1178,7 +1189,9 @@ var SchematicTraceSingleLineSolver2 = class extends BaseSolver {
|
|
|
1178
1189
|
pin2,
|
|
1179
1190
|
overshoot: Math.min(0.2, Math.max(0.02, routingDistance / 4))
|
|
1180
1191
|
});
|
|
1181
|
-
const
|
|
1192
|
+
const adaptiveElbowIsShorter = this.pathLength(adaptiveElbow) < this.pathLength(defaultElbow);
|
|
1193
|
+
const defaultElbowBacktracks = this.pathLength(defaultElbow) > routingDistance + 1e-9;
|
|
1194
|
+
const shouldUseAdaptiveElbow = findFirstCollision(adaptiveElbow, this.obstacles) === null && (pinsFaceEachOther({ pin1, pin2 }) && defaultElbowBacktracks && adaptiveElbowIsShorter || findFirstCollision(defaultElbow, this.obstacles) !== null);
|
|
1182
1195
|
this.baseElbow = defaultElbow;
|
|
1183
1196
|
if (shouldUseAdaptiveElbow) {
|
|
1184
1197
|
this.baseElbow = adaptiveElbow;
|
|
@@ -1731,6 +1744,7 @@ var TraceOverlapIssueSolver = class extends BaseSolver {
|
|
|
1731
1744
|
overlappingTraceSegments;
|
|
1732
1745
|
interactionKind;
|
|
1733
1746
|
traceNetIslands;
|
|
1747
|
+
traceIdsToShift;
|
|
1734
1748
|
obstacleRects;
|
|
1735
1749
|
SHIFT_DISTANCE = 0.1;
|
|
1736
1750
|
correctedTraceMap = {};
|
|
@@ -1739,6 +1753,7 @@ var TraceOverlapIssueSolver = class extends BaseSolver {
|
|
|
1739
1753
|
this.overlappingTraceSegments = params.overlappingTraceSegments;
|
|
1740
1754
|
this.interactionKind = params.interactionKind;
|
|
1741
1755
|
this.traceNetIslands = params.traceNetIslands;
|
|
1756
|
+
this.traceIdsToShift = params.traceIdsToShift;
|
|
1742
1757
|
this.obstacleRects = getObstacleRects(params.inputProblem);
|
|
1743
1758
|
for (const { connNetId, pathsWithOverlap } of this.overlappingTraceSegments) {
|
|
1744
1759
|
for (const {
|
|
@@ -1756,7 +1771,13 @@ var TraceOverlapIssueSolver = class extends BaseSolver {
|
|
|
1756
1771
|
return path.tracePath.length === 2;
|
|
1757
1772
|
});
|
|
1758
1773
|
const groupShouldStayInPlace = this.overlappingTraceSegments.map(
|
|
1759
|
-
|
|
1774
|
+
(group) => {
|
|
1775
|
+
if (!this.traceIdsToShift) return containsStraightPinToPinTrace(group);
|
|
1776
|
+
return group.pathsWithOverlap.every(({ solvedTracePathIndex }) => {
|
|
1777
|
+
const path = this.traceNetIslands[group.connNetId][solvedTracePathIndex];
|
|
1778
|
+
return !this.traceIdsToShift.has(path.mspPairId);
|
|
1779
|
+
});
|
|
1780
|
+
}
|
|
1760
1781
|
);
|
|
1761
1782
|
const someGroupCanShift = groupShouldStayInPlace.some(
|
|
1762
1783
|
(shouldStay) => !shouldStay
|
|
@@ -2036,6 +2057,7 @@ var TraceOverlapShiftSolver = class extends BaseSolver {
|
|
|
2036
2057
|
inputProblem;
|
|
2037
2058
|
inputTracePaths;
|
|
2038
2059
|
globalConnMap;
|
|
2060
|
+
traceIdsToShift;
|
|
2039
2061
|
/**
|
|
2040
2062
|
* A traceNetIsland is a set of traces that are connected via the globalConnMap
|
|
2041
2063
|
*/
|
|
@@ -2047,6 +2069,7 @@ var TraceOverlapShiftSolver = class extends BaseSolver {
|
|
|
2047
2069
|
this.inputProblem = params.inputProblem;
|
|
2048
2070
|
this.inputTracePaths = params.inputTracePaths;
|
|
2049
2071
|
this.globalConnMap = params.globalConnMap;
|
|
2072
|
+
this.traceIdsToShift = params.traceIdsToShift;
|
|
2050
2073
|
for (const tracePath of this.inputTracePaths) {
|
|
2051
2074
|
const { mspPairId } = tracePath;
|
|
2052
2075
|
this.correctedTraceMap[mspPairId] = tracePath;
|
|
@@ -2057,7 +2080,8 @@ var TraceOverlapShiftSolver = class extends BaseSolver {
|
|
|
2057
2080
|
return {
|
|
2058
2081
|
inputProblem: this.inputProblem,
|
|
2059
2082
|
inputTracePaths: this.inputTracePaths,
|
|
2060
|
-
globalConnMap: this.globalConnMap
|
|
2083
|
+
globalConnMap: this.globalConnMap,
|
|
2084
|
+
traceIdsToShift: this.traceIdsToShift
|
|
2061
2085
|
};
|
|
2062
2086
|
}
|
|
2063
2087
|
computeTraceNetIslands() {
|
|
@@ -2145,6 +2169,9 @@ var TraceOverlapShiftSolver = class extends BaseSolver {
|
|
|
2145
2169
|
if (!aVert && !aHorz) continue;
|
|
2146
2170
|
for (let pb = 0; pb < pathsB.length; pb++) {
|
|
2147
2171
|
const pathB = pathsB[pb];
|
|
2172
|
+
if (this.traceIdsToShift && !this.traceIdsToShift.has(pathA.mspPairId) && !this.traceIdsToShift.has(pathB.mspPairId)) {
|
|
2173
|
+
continue;
|
|
2174
|
+
}
|
|
2148
2175
|
const ptsB = pathB.tracePath;
|
|
2149
2176
|
for (let sb = 0; sb < ptsB.length - 1; sb++) {
|
|
2150
2177
|
const b1 = ptsB[sb];
|
|
@@ -2294,7 +2321,8 @@ var TraceOverlapShiftSolver = class extends BaseSolver {
|
|
|
2294
2321
|
inputProblem: this.inputProblem,
|
|
2295
2322
|
interactionKind,
|
|
2296
2323
|
overlappingTraceSegments,
|
|
2297
|
-
traceNetIslands: this.traceNetIslands
|
|
2324
|
+
traceNetIslands: this.traceNetIslands,
|
|
2325
|
+
traceIdsToShift: this.traceIdsToShift
|
|
2298
2326
|
});
|
|
2299
2327
|
}
|
|
2300
2328
|
visualize() {
|
|
@@ -10619,6 +10647,7 @@ var SchematicTracePipelineSolver = class extends BaseSolver {
|
|
|
10619
10647
|
traceCleanupSolver;
|
|
10620
10648
|
example28Solver;
|
|
10621
10649
|
availableNetOrientationSolver;
|
|
10650
|
+
postLabelTraceOverlapShiftSolver;
|
|
10622
10651
|
railNetLabelCornerPlacementSolver;
|
|
10623
10652
|
traceAnchoredNetLabelOverlapSolver;
|
|
10624
10653
|
preAlignmentNetLabelTraceCollisionSolver;
|
|
@@ -10794,6 +10823,22 @@ var SchematicTracePipelineSolver = class extends BaseSolver {
|
|
|
10794
10823
|
}
|
|
10795
10824
|
]
|
|
10796
10825
|
),
|
|
10826
|
+
definePipelineStep(
|
|
10827
|
+
"postLabelTraceOverlapShiftSolver",
|
|
10828
|
+
TraceOverlapShiftSolver,
|
|
10829
|
+
(instance) => [
|
|
10830
|
+
{
|
|
10831
|
+
inputProblem: instance.inputProblem,
|
|
10832
|
+
inputTracePaths: instance.availableNetOrientationSolver.traces,
|
|
10833
|
+
globalConnMap: instance.mspConnectionPairSolver.globalConnMap,
|
|
10834
|
+
traceIdsToShift: new Set(
|
|
10835
|
+
instance.availableNetOrientationSolver.traces.filter(
|
|
10836
|
+
(trace) => trace.mspPairId.startsWith("available-net-orientation-")
|
|
10837
|
+
).map((trace) => trace.mspPairId)
|
|
10838
|
+
)
|
|
10839
|
+
}
|
|
10840
|
+
]
|
|
10841
|
+
),
|
|
10797
10842
|
definePipelineStep(
|
|
10798
10843
|
"railNetLabelCornerPlacementSolver",
|
|
10799
10844
|
RailNetLabelCornerPlacementSolver,
|
|
@@ -10801,7 +10846,9 @@ var SchematicTracePipelineSolver = class extends BaseSolver {
|
|
|
10801
10846
|
return [
|
|
10802
10847
|
{
|
|
10803
10848
|
inputProblem: instance.inputProblem,
|
|
10804
|
-
traces:
|
|
10849
|
+
traces: Object.values(
|
|
10850
|
+
instance.postLabelTraceOverlapShiftSolver.correctedTraceMap
|
|
10851
|
+
),
|
|
10805
10852
|
netLabelPlacements: instance.availableNetOrientationSolver.outputNetLabelPlacements
|
|
10806
10853
|
}
|
|
10807
10854
|
];
|
|
@@ -10813,7 +10860,9 @@ var SchematicTracePipelineSolver = class extends BaseSolver {
|
|
|
10813
10860
|
(instance) => [
|
|
10814
10861
|
{
|
|
10815
10862
|
inputProblem: instance.inputProblem,
|
|
10816
|
-
traces:
|
|
10863
|
+
traces: Object.values(
|
|
10864
|
+
instance.postLabelTraceOverlapShiftSolver.correctedTraceMap
|
|
10865
|
+
),
|
|
10817
10866
|
netLabelPlacements: instance.railNetLabelCornerPlacementSolver.outputNetLabelPlacements
|
|
10818
10867
|
}
|
|
10819
10868
|
]
|
|
@@ -10824,7 +10873,9 @@ var SchematicTracePipelineSolver = class extends BaseSolver {
|
|
|
10824
10873
|
(instance) => [
|
|
10825
10874
|
{
|
|
10826
10875
|
inputProblem: instance.inputProblem,
|
|
10827
|
-
traces:
|
|
10876
|
+
traces: Object.values(
|
|
10877
|
+
instance.postLabelTraceOverlapShiftSolver.correctedTraceMap
|
|
10878
|
+
),
|
|
10828
10879
|
netLabelPlacements: instance.traceAnchoredNetLabelOverlapSolver.outputNetLabelPlacements
|
|
10829
10880
|
}
|
|
10830
10881
|
]
|
|
@@ -58,6 +58,25 @@ const calculateElbowForPins = ({
|
|
|
58
58
|
{ overshoot },
|
|
59
59
|
)
|
|
60
60
|
|
|
61
|
+
const pinsFaceEachOther = ({
|
|
62
|
+
pin1,
|
|
63
|
+
pin2,
|
|
64
|
+
}: {
|
|
65
|
+
pin1: MspConnectionPair["pins"][number]
|
|
66
|
+
pin2: MspConnectionPair["pins"][number]
|
|
67
|
+
}) => {
|
|
68
|
+
const xDistance = pin2.x - pin1.x
|
|
69
|
+
const yDistance = pin2.y - pin1.y
|
|
70
|
+
if (Math.abs(xDistance) >= Math.abs(yDistance)) {
|
|
71
|
+
return xDistance > 0
|
|
72
|
+
? pin1._facingDirection === "x+" && pin2._facingDirection === "x-"
|
|
73
|
+
: pin1._facingDirection === "x-" && pin2._facingDirection === "x+"
|
|
74
|
+
}
|
|
75
|
+
return yDistance > 0
|
|
76
|
+
? pin1._facingDirection === "y+" && pin2._facingDirection === "y-"
|
|
77
|
+
: pin1._facingDirection === "y-" && pin2._facingDirection === "y+"
|
|
78
|
+
}
|
|
79
|
+
|
|
61
80
|
export class SchematicTraceSingleLineSolver2 extends BaseSolver {
|
|
62
81
|
pins: MspConnectionPair["pins"]
|
|
63
82
|
connectionPair?: MspConnectionPair
|
|
@@ -130,9 +149,16 @@ export class SchematicTraceSingleLineSolver2 extends BaseSolver {
|
|
|
130
149
|
pin2,
|
|
131
150
|
overshoot: Math.min(0.2, Math.max(0.02, routingDistance / 4)),
|
|
132
151
|
})
|
|
152
|
+
const adaptiveElbowIsShorter =
|
|
153
|
+
this.pathLength(adaptiveElbow) < this.pathLength(defaultElbow)
|
|
154
|
+
const defaultElbowBacktracks =
|
|
155
|
+
this.pathLength(defaultElbow) > routingDistance + 1e-9
|
|
133
156
|
const shouldUseAdaptiveElbow =
|
|
134
|
-
findFirstCollision(
|
|
135
|
-
|
|
157
|
+
findFirstCollision(adaptiveElbow, this.obstacles) === null &&
|
|
158
|
+
((pinsFaceEachOther({ pin1, pin2 }) &&
|
|
159
|
+
defaultElbowBacktracks &&
|
|
160
|
+
adaptiveElbowIsShorter) ||
|
|
161
|
+
findFirstCollision(defaultElbow, this.obstacles) !== null)
|
|
136
162
|
|
|
137
163
|
// Build initial elbow path
|
|
138
164
|
this.baseElbow = defaultElbow
|
|
@@ -79,6 +79,7 @@ export class SchematicTracePipelineSolver extends BaseSolver {
|
|
|
79
79
|
traceCleanupSolver?: TraceCleanupSolver
|
|
80
80
|
example28Solver?: Example28Solver
|
|
81
81
|
availableNetOrientationSolver?: AvailableNetOrientationSolver
|
|
82
|
+
postLabelTraceOverlapShiftSolver?: TraceOverlapShiftSolver
|
|
82
83
|
railNetLabelCornerPlacementSolver?: RailNetLabelCornerPlacementSolver
|
|
83
84
|
traceAnchoredNetLabelOverlapSolver?: TraceAnchoredNetLabelOverlapSolver
|
|
84
85
|
preAlignmentNetLabelTraceCollisionSolver?: NetLabelTraceCollisionSolver
|
|
@@ -280,6 +281,24 @@ export class SchematicTracePipelineSolver extends BaseSolver {
|
|
|
280
281
|
},
|
|
281
282
|
],
|
|
282
283
|
),
|
|
284
|
+
definePipelineStep(
|
|
285
|
+
"postLabelTraceOverlapShiftSolver",
|
|
286
|
+
TraceOverlapShiftSolver,
|
|
287
|
+
(instance) => [
|
|
288
|
+
{
|
|
289
|
+
inputProblem: instance.inputProblem,
|
|
290
|
+
inputTracePaths: instance.availableNetOrientationSolver!.traces,
|
|
291
|
+
globalConnMap: instance.mspConnectionPairSolver!.globalConnMap,
|
|
292
|
+
traceIdsToShift: new Set(
|
|
293
|
+
instance
|
|
294
|
+
.availableNetOrientationSolver!.traces.filter((trace) =>
|
|
295
|
+
trace.mspPairId.startsWith("available-net-orientation-"),
|
|
296
|
+
)
|
|
297
|
+
.map((trace) => trace.mspPairId),
|
|
298
|
+
),
|
|
299
|
+
},
|
|
300
|
+
],
|
|
301
|
+
),
|
|
283
302
|
definePipelineStep(
|
|
284
303
|
"railNetLabelCornerPlacementSolver",
|
|
285
304
|
RailNetLabelCornerPlacementSolver,
|
|
@@ -287,7 +306,9 @@ export class SchematicTracePipelineSolver extends BaseSolver {
|
|
|
287
306
|
return [
|
|
288
307
|
{
|
|
289
308
|
inputProblem: instance.inputProblem,
|
|
290
|
-
traces:
|
|
309
|
+
traces: Object.values(
|
|
310
|
+
instance.postLabelTraceOverlapShiftSolver!.correctedTraceMap,
|
|
311
|
+
),
|
|
291
312
|
netLabelPlacements:
|
|
292
313
|
instance.availableNetOrientationSolver!.outputNetLabelPlacements,
|
|
293
314
|
},
|
|
@@ -300,7 +321,9 @@ export class SchematicTracePipelineSolver extends BaseSolver {
|
|
|
300
321
|
(instance) => [
|
|
301
322
|
{
|
|
302
323
|
inputProblem: instance.inputProblem,
|
|
303
|
-
traces:
|
|
324
|
+
traces: Object.values(
|
|
325
|
+
instance.postLabelTraceOverlapShiftSolver!.correctedTraceMap,
|
|
326
|
+
),
|
|
304
327
|
netLabelPlacements:
|
|
305
328
|
instance.railNetLabelCornerPlacementSolver!
|
|
306
329
|
.outputNetLabelPlacements,
|
|
@@ -313,7 +336,9 @@ export class SchematicTracePipelineSolver extends BaseSolver {
|
|
|
313
336
|
(instance) => [
|
|
314
337
|
{
|
|
315
338
|
inputProblem: instance.inputProblem,
|
|
316
|
-
traces:
|
|
339
|
+
traces: Object.values(
|
|
340
|
+
instance.postLabelTraceOverlapShiftSolver!.correctedTraceMap,
|
|
341
|
+
),
|
|
317
342
|
netLabelPlacements:
|
|
318
343
|
instance.traceAnchoredNetLabelOverlapSolver!
|
|
319
344
|
.outputNetLabelPlacements,
|
package/lib/solvers/TraceOverlapShiftSolver/TraceOverlapIssueSolver/TraceOverlapIssueSolver.ts
CHANGED
|
@@ -26,6 +26,7 @@ export class TraceOverlapIssueSolver extends BaseSolver {
|
|
|
26
26
|
overlappingTraceSegments: OverlappingTraceSegmentLocator[]
|
|
27
27
|
interactionKind: TraceInteractionKind
|
|
28
28
|
traceNetIslands: Record<ConnNetId, Array<SolvedTracePath>>
|
|
29
|
+
traceIdsToShift?: Set<MspConnectionPairId>
|
|
29
30
|
obstacleRects: ReturnType<typeof getObstacleRects>
|
|
30
31
|
|
|
31
32
|
SHIFT_DISTANCE = 0.1
|
|
@@ -37,11 +38,13 @@ export class TraceOverlapIssueSolver extends BaseSolver {
|
|
|
37
38
|
overlappingTraceSegments: OverlappingTraceSegmentLocator[]
|
|
38
39
|
interactionKind: TraceInteractionKind
|
|
39
40
|
traceNetIslands: Record<ConnNetId, Array<SolvedTracePath>>
|
|
41
|
+
traceIdsToShift?: Set<MspConnectionPairId>
|
|
40
42
|
}) {
|
|
41
43
|
super()
|
|
42
44
|
this.overlappingTraceSegments = params.overlappingTraceSegments
|
|
43
45
|
this.interactionKind = params.interactionKind
|
|
44
46
|
this.traceNetIslands = params.traceNetIslands
|
|
47
|
+
this.traceIdsToShift = params.traceIdsToShift
|
|
45
48
|
this.obstacleRects = getObstacleRects(params.inputProblem)
|
|
46
49
|
|
|
47
50
|
// Only add the relevant traces to the correctedTraceMap
|
|
@@ -76,7 +79,14 @@ export class TraceOverlapIssueSolver extends BaseSolver {
|
|
|
76
79
|
})
|
|
77
80
|
|
|
78
81
|
const groupShouldStayInPlace = this.overlappingTraceSegments.map(
|
|
79
|
-
|
|
82
|
+
(group) => {
|
|
83
|
+
if (!this.traceIdsToShift) return containsStraightPinToPinTrace(group)
|
|
84
|
+
return group.pathsWithOverlap.every(({ solvedTracePathIndex }) => {
|
|
85
|
+
const path =
|
|
86
|
+
this.traceNetIslands[group.connNetId][solvedTracePathIndex]!
|
|
87
|
+
return !this.traceIdsToShift!.has(path.mspPairId)
|
|
88
|
+
})
|
|
89
|
+
},
|
|
80
90
|
)
|
|
81
91
|
const someGroupCanShift = groupShouldStayInPlace.some(
|
|
82
92
|
(shouldStay) => !shouldStay,
|
|
@@ -34,6 +34,7 @@ export class TraceOverlapShiftSolver extends BaseSolver {
|
|
|
34
34
|
inputProblem: InputProblem
|
|
35
35
|
inputTracePaths: Array<SolvedTracePath>
|
|
36
36
|
globalConnMap: ConnectivityMap
|
|
37
|
+
traceIdsToShift?: Set<MspConnectionPairId>
|
|
37
38
|
|
|
38
39
|
declare activeSubSolver: TraceOverlapIssueSolver | null
|
|
39
40
|
|
|
@@ -50,11 +51,13 @@ export class TraceOverlapShiftSolver extends BaseSolver {
|
|
|
50
51
|
inputProblem: InputProblem
|
|
51
52
|
inputTracePaths: Array<SolvedTracePath>
|
|
52
53
|
globalConnMap: ConnectivityMap
|
|
54
|
+
traceIdsToShift?: Set<MspConnectionPairId>
|
|
53
55
|
}) {
|
|
54
56
|
super()
|
|
55
57
|
this.inputProblem = params.inputProblem
|
|
56
58
|
this.inputTracePaths = params.inputTracePaths
|
|
57
59
|
this.globalConnMap = params.globalConnMap
|
|
60
|
+
this.traceIdsToShift = params.traceIdsToShift
|
|
58
61
|
|
|
59
62
|
for (const tracePath of this.inputTracePaths) {
|
|
60
63
|
const { mspPairId } = tracePath
|
|
@@ -71,6 +74,7 @@ export class TraceOverlapShiftSolver extends BaseSolver {
|
|
|
71
74
|
inputProblem: this.inputProblem,
|
|
72
75
|
inputTracePaths: this.inputTracePaths,
|
|
73
76
|
globalConnMap: this.globalConnMap,
|
|
77
|
+
traceIdsToShift: this.traceIdsToShift,
|
|
74
78
|
}
|
|
75
79
|
}
|
|
76
80
|
|
|
@@ -211,6 +215,13 @@ export class TraceOverlapShiftSolver extends BaseSolver {
|
|
|
211
215
|
|
|
212
216
|
for (let pb = 0; pb < pathsB.length; pb++) {
|
|
213
217
|
const pathB = pathsB[pb]!
|
|
218
|
+
if (
|
|
219
|
+
this.traceIdsToShift &&
|
|
220
|
+
!this.traceIdsToShift.has(pathA.mspPairId) &&
|
|
221
|
+
!this.traceIdsToShift.has(pathB.mspPairId)
|
|
222
|
+
) {
|
|
223
|
+
continue
|
|
224
|
+
}
|
|
214
225
|
const ptsB = pathB.tracePath
|
|
215
226
|
for (let sb = 0; sb < ptsB.length - 1; sb++) {
|
|
216
227
|
const b1 = ptsB[sb]!
|
|
@@ -392,6 +403,7 @@ export class TraceOverlapShiftSolver extends BaseSolver {
|
|
|
392
403
|
interactionKind,
|
|
393
404
|
overlappingTraceSegments,
|
|
394
405
|
traceNetIslands: this.traceNetIslands,
|
|
406
|
+
traceIdsToShift: this.traceIdsToShift,
|
|
395
407
|
})
|
|
396
408
|
}
|
|
397
409
|
|
package/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
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="-4.3400000000000025,-7.364455349999998 -4.140000000000002,-7.364455349999998 -4.140000000000002,-6.844727674999999 -4.890000000000002,-6.844727674999999 -4.890000000000002,-6.324999999999998" data-type="line" data-label="" points="241.17494151286712,455.8294775149467 246.99766051468674,455.8294775149467 246.99766051468674,440.6983364699766 225.16246425786323,440.6983364699766 225.16246425786323,425.5671954250065" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-3.6400000000000023,-7.364455349999998 -4.3400000000000025,-7.364455349999998" data-type="line" data-label="" points="261.5544580192357,455.8294775149467 241.17494151286712,455.8294775149467" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-9.808910699999998,-1.705000000000001 -9.808910699999998,-1.9050000000000002 -10.4289107,-1.9050000000000002 -10.4289107,-4.214999999999999 -9.808910699999998,-4.214999999999999 -9.808910699999998,-4.015" data-type="line" data-label="" points="81.95529025214461,291.0623864829738 81.95529025214461,296.88510548479337 63.90486134650382,296.88510548479337 63.90486134650382,364.1375099558097 81.95529025214461,364.1375099558097 81.95529025214461,358.31479095399015" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-11.05,-8.129999999999999 -11.25,-8.129999999999999 -11.25,-7.227499999999999 -10.475,-7.227499999999999 -10.475,-6.324999999999999" data-type="line" data-label="" points="45.82271900181962,478.1172344164284 40,478.1172344164284 40,451.8422149207174 62.56303613205097,451.8422149207174 62.56303613205097,425.5671954250065" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-11.05,-8.329999999999998 -11.25,-8.329999999999998 -11.25,-8.129999999999999 -11.05,-8.129999999999999" data-type="line" data-label="" points="45.82271900181962,483.93995341824797 40,483.93995341824797 40,478.1172344164284 45.82271900181962,478.1172344164284" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-9.05,-8.129999999999999 -8.850000000000001,-8.129999999999999 -8.850000000000001,-8.329999999999998 -9.05,-8.329999999999998" data-type="line" data-label="" points="104.0499090200156,478.1172344164284 109.87262802183517,478.1172344164284 109.87262802183517,483.93995341824797 104.0499090200156,483.93995341824797" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-0.8300000000000005,-0.09999999999999959 -1.5050000000000008,-0.09999999999999964" data-type="line" data-label="" points="343.36365999480114,244.33506649337147 323.71198336366,244.33506649337147" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-3.130000000000001,3.2594553499999996 -2.505000000000001,3.2594553499999996 -2.505000000000001,2.7199999999999998 -1.8800000000000003,2.7199999999999998 -1.8800000000000003,2.92" data-type="line" data-label="" points="276.40239147387575,146.52924398232392 294.59838835456196,146.52924398232392 294.59838835456196,162.23472856771514 312.7943852352482,162.23472856771514 312.7943852352482,156.41200956589552" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.1699999999999995,0.10000000000000042 1.8449999999999998,0.10000000000000016" data-type="line" data-label="" points="401.5908500129972,238.51234749155188 421.2425266441383,238.51234749155188" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.1699999999999995,1.3500000000000003 1.1699999999999995,0.7250000000000003 1.3699999999999994,0.7250000000000003 1.3699999999999994,0.10000000000000042 1.1699999999999995,0.10000000000000042" data-type="line" data-label="" points="401.5908500129972,202.12035373017937 401.5908500129972,220.31635061086564 407.41356901481674,220.31635061086564 407.41356901481674,238.51234749155188 401.5908500129972,238.51234749155188" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-0.08000000000000074,1.6894553499999998 0.5449999999999994,1.6894553499999998 0.5449999999999994,1.1500000000000004 1.1699999999999995,1.1500000000000004 1.1699999999999995,1.3500000000000003" data-type="line" data-label="" points="365.19885625162465,192.23758814660778 383.3948531323109,192.23758814660778 383.3948531323109,207.943072731999 401.5908500129972,207.943072731999 401.5908500129972,202.12035373017937" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="4.210000000000001,-2.1794553499999987 4.210000000000001,-1.659727674999999 3.460000000000001,-1.659727674999999 3.460000000000001,-1.1399999999999992 3.660000000000001,-1.1399999999999992" data-type="line" data-label="" points="490.0961788406551,304.8754873927736 490.0961788406551,289.74434634780346 468.2609825838316,289.74434634780346 468.2609825838316,274.61320530283336 474.0837015856512,274.61320530283336" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.1699999999999982,-6.119999999999999 1.8449999999999984,-6.119999999999999" data-type="line" data-label="" points="401.5908500129971,419.5989084481414 421.24252664413825,419.5989084481414" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.1699999999999973,-7.469999999999999 1.1699999999999973,-6.794999999999999 1.3699999999999983,-6.794999999999999 1.3699999999999983,-6.119999999999999 1.1699999999999982,-6.119999999999999" data-type="line" data-label="" points="401.59085001299707,458.9022617104237 401.59085001299707,439.2505850792826 407.41356901481674,439.2505850792826 407.41356901481674,419.5989084481414 401.5908500129971,419.5989084481414" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="2.4199999999999973,-7.699455349999998 2.174727674999997,-7.699455349999998 2.174727674999997,-7.269999999999999 1.1699999999999973,-7.269999999999999 1.1699999999999973,-7.469999999999999" data-type="line" data-label="" points="437.9828437743696,465.5825318429945 430.84208463737974,465.5825318429945 430.84208463737974,453.0795427086041 401.59085001299707,453.0795427086041 401.59085001299707,458.9022617104237" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-3.3100000000000005,-0.09999999999999964 -2.6350000000000007,-0.09999999999999964" data-type="line" data-label="" points="271.1619443722381,244.33506649337147 290.81362100337924,244.33506649337147" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-3.660000000000001,1.6800000000000002 -2.9850000000000003,1.6800000000000002" data-type="line" data-label="" points="260.9721861190538,192.51286737717703 280.623862750195,192.51286737717703" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="2.9499999999999997,1.35 2.9499999999999997,0.7250000000000005 3.175,0.7250000000000005 3.175,0.10000000000000053 2.9749999999999996,0.10000000000000053" data-type="line" data-label="" points="453.41304912919156,202.12035373017937 453.41304912919156,220.3163506108656 459.96360800623864,220.3163506108656 459.96360800623864,238.51234749155188 454.140889004419,238.51234749155188" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="2.41,-2.92 2.4099999999999997,-2.244999999999999" data-type="line" data-label="" points="437.6917078242787,326.43540441902786 437.6917078242787,306.7837277878867" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="4.249999999999997,-6.119999999999999 2.9749999999999983,-6.119999999999999" data-type="line" data-label="" points="491.2607226410189,419.5989084481414 454.140889004419,419.5989084481414" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-7.200000000000001,-10.398910699999997 -7.400000000000001,-10.398910699999997 -7.400000000000001,-10.198910699999997 -7.200000000000001,-10.198910699999997" data-type="line" data-label="" points="157.9100597868469,544.1733816480373 152.08734078502727,544.1733816480373 152.08734078502727,538.3506626462179 157.9100597868469,538.3506626462179" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-5.200000000000001,-10.198910699999997 -5.000000000000001,-10.198910699999997 -5.000000000000001,-10.398910699999997 -5.200000000000001,-10.398910699999997" data-type="line" data-label="" points="216.13724980504287,538.3506626462179 221.9599688068625,538.3506626462179 221.9599688068625,544.1733816480373 216.13724980504287,544.1733816480373" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-4.760000000000001,1.6800000000000002 -4.960000000000001,1.6800000000000002 -4.960000000000001,-0.09999999999999964 -4.410000000000001,-0.09999999999999964" data-type="line" data-label="" points="228.947231609046,192.51286737717703 223.12451260722642,192.51286737717703 223.12451260722642,244.33506649337147 239.1369898622303,244.33506649337147" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.1699999999999995,2.45 1.1699999999999995,2.6500000000000004 2.9499999999999997,2.6500000000000004 2.9499999999999997,2.4500000000000006" data-type="line" data-label="" points="401.5908500129972,170.0953992201716 401.5908500129972,164.27268021835198 453.41304912919156,164.27268021835198 453.41304912919156,170.09539922017157" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-7.5994553499999995,-1.3305446499999976 -7.5994553499999995,-0.42804464999999814 -8.965,-0.42804464999999814 -8.965,0.4744553500000013 -7.965000000000001,0.4744553500000013" data-type="line" data-label="" points="146.28047850272944,280.1606450740837 146.28047850272944,253.88562557837272 106.52456459578895,253.88562557837272 106.52456459578895,227.6106060826618 135.63815960488694,227.6106060826618" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-6.3494553499999995,-4.019999999999998 -6.3494553499999995,-4.219999999999998 -7.5994553499999995,-4.219999999999998 -7.5994553499999995,-2.430544649999999" data-type="line" data-label="" points="182.67247226410194,358.4603589290356 182.67247226410194,364.2830779308552 146.28047850272944,364.2830779308552 146.28047850272944,312.1855995840915" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-6.65,-5.8199999999999985 -6.450000000000001,-5.8199999999999985 -6.450000000000001,-6.914727674999998 -7.950000000000001,-6.914727674999998 -7.950000000000001,-8.009455349999998 -7.750000000000001,-8.009455349999998" data-type="line" data-label="" points="173.9225370418508,410.864829945412 179.7452560436704,410.864829945412 179.7452560436704,442.73628812061344 136.07486353002338,442.73628812061344 136.07486353002338,474.6077462958149 141.897582531843,474.6077462958149" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-8.650000000000002,-5.8199999999999985 -9.5625,-5.8199999999999985 -9.5625,-5.024999999999999 -10.475,-5.024999999999999 -10.475,-5.224999999999998" data-type="line" data-label="" points="115.69534702365476,410.864829945412 89.12919157785291,410.864829945412 89.12919157785291,387.71952191317905 62.56303613205097,387.71952191317905 62.56303613205097,393.5422409149987" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.1699999999999982,-5.92 1.5074999999999983,-5.92 1.5074999999999983,-5.329999999999999 2.41,-5.329999999999999 2.41,-4.02" data-type="line" data-label="" points="401.5908500129971,413.77618944632184 411.4166883285677,413.77618944632184 411.4166883285677,396.599168390954 437.6917078242787,396.599168390954 437.6917078242787,358.46035892903564" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-4.890000000000002,-5.224999999999999 -4.890000000000002,-3.8324999999999996 -1.86945535,-3.8324999999999996 -1.86945535,-2.44" data-type="line" data-label="" points="225.16246425786323,393.54224091499873 225.16246425786323,353.00155986482974 313.10137790486095,353.00155986482974 313.10137790486095,312.4608788146608" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-9.808910699999998,-0.6049999999999982 -9.808910699999998,0.4744553500000017 -7.965000000000001,0.4744553500000017" data-type="line" data-label="" points="81.95529025214461,259.0374319729659 81.95529025214461,227.6106060826618 135.63815960488694,227.6106060826618" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-6.3494553499999995,-2.919999999999998 -6.3494553499999995,-1.6794553499999996 -4.2194553500000005,-1.6794553499999996" data-type="line" data-label="" points="182.67247226410194,326.4354044190278 182.67247226410194,290.31868988822464 244.68442963348065,290.31868988822464" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="7.0649999999999995,0.3272767499999982 7.265,0.3272767499999982 7.265,1.3167320999999976 5.765,1.3167320999999976 5.765,2.3061874499999973 5.965,2.3061874499999973" data-type="line" data-label="" points="573.2154925916299,231.89550423706794 579.0382115934494,231.89550423706794 579.0382115934494,203.08890189758262 535.3678190798025,203.08890189758262 535.3678190798025,174.28229955809732 541.1905380816221,174.28229955809732" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="7.0649999999999995,-1.6516339500000008 7.265,-1.6516339500000008 7.265,-0.6621786000000013 5.765,-0.6621786000000013 5.765,0.3272767499999982 5.965,0.3272767499999982" data-type="line" data-label="" points="573.2154925916299,289.50870891603853 579.0382115934494,289.50870891603853 579.0382115934494,260.7021065765532 535.3678190798025,260.7021065765532 535.3678190798025,231.89550423706794 541.1905380816221,231.89550423706794" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="7.0649999999999995,-3.63054465 7.265,-3.63054465 7.265,-2.6410893000000004 5.765,-2.6410893000000004 5.765,-1.6516339500000008 5.965,-1.6516339500000008" data-type="line" data-label="" points="573.2154925916299,347.1219135950091 579.0382115934494,347.1219135950091 579.0382115934494,318.31531125552385 535.3678190798025,318.31531125552385 535.3678190798025,289.50870891603853 541.1905380816221,289.50870891603853" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-3.119455350000001,-1.6794553499999991 -2.9194553500000007,-1.6794553499999991 -2.9194553500000007,-1.3399999999999994 -1.8694553500000004,-1.3399999999999994" data-type="line" data-label="" points="276.7093841434884,290.3186898882246 282.53210314530804,290.3186898882246 282.53210314530804,280.435924304653 313.10137790486095,280.435924304653" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="2.4099999999999997,-1.1149999999999993 2.4099999999999997,-0.9149999999999994 3.460000000000001,-0.9149999999999994 3.460000000000001,-1.1399999999999992" data-type="line" data-label="" points="437.6917078242787,273.88536542760596 437.6917078242787,268.06264642578634 468.2609825838316,268.06264642578634 468.2609825838316,274.61320530283336" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1.8694553500000004,-1.3399999999999994 -1.8694553500000004,-0.7199999999999995 -1.3050000000000008,-0.7199999999999995 -1.3050000000000008,-0.09999999999999964 -1.5050000000000008,-0.09999999999999964" data-type="line" data-label="" points="313.10137790486095,280.435924304653 313.10137790486095,262.38549539901226 329.5347023654796,262.38549539901226 329.5347023654796,244.33506649337147 323.71198336366,244.33506649337147" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.1699999999999995,-1.0999999999999996 1.9909999999999992,-1.0999999999999994 1.9909999999999992,-0.6999999999999995 1.1699999999999995,-0.6999999999999995" data-type="line" data-label="" points="401.5908500129972,273.44866150246946 425.4931115154666,273.44866150246946 425.4931115154666,261.8032234988303 401.5908500129972,261.8032234988303" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-0.8300000000000005,-0.8999999999999996 -1.0300000000000005,-0.8999999999999996 -1.0300000000000005,-0.49999999999999967 -0.8300000000000005,-0.49999999999999967" data-type="line" data-label="" points="343.36365999480114,267.6259425006499 337.5409409929816,267.6259425006499 337.5409409929816,255.98050449701068 343.36365999480114,255.98050449701068" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.1699999999999995,-0.2999999999999995 1.4699999999999998,-0.2999999999999995 1.4699999999999998,-3.1599999999999997 -1.7710000000000017,-3.1599999999999997 -1.7710000000000017,-6.019999999999999 -0.8300000000000018,-6.02" data-type="line" data-label="" points="401.5908500129972,250.15778549519106 410.3249285157266,250.15778549519106 410.3249285157266,333.4226672212113 315.9677670912399,333.4226672212113 315.9677670912399,416.68754894723156 343.36365999480114,416.6875489472316" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-0.8300000000000005,0.10000000000000042 -1.3425000000000005,0.10000000000000042 -1.3425000000000005,1.6800000000000002 -1.8550000000000004,1.6800000000000002" data-type="line" data-label="" points="343.36365999480114,238.51234749155188 328.44294255263844,238.51234749155188 328.44294255263844,192.51286737717703 313.5222251104757,192.51286737717703" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="4.760000000000001,-1.1399999999999992 5.549999999999997,-1.1399999999999992 5.549999999999997,-3.43054465 5.024,-3.43054465 5.024,-3.83054465 5.549999999999997,-3.83054465 5.549999999999997,-6.119999999999999 5.349999999999997,-6.119999999999999" data-type="line" data-label="" points="506.108656095659,274.61320530283336 529.1083961528464,274.61320530283336 529.1083961528464,341.29919459318955 513.7946451780608,341.29919459318955 513.7946451780608,352.94463259682874 529.1083961528464,352.94463259682874 529.1083961528464,419.5989084481414 523.2856771510267,419.5989084481414" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-8.850000000000001,-8.129999999999999 -8.59,-8.129999999999999 -8.59,-8.130999999999998" data-type="line" data-label="" points="109.87262802183517,478.1172344164284 117.4421627242007,478.1172344164284 117.4421627242007,478.14634801143745" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-5.965000000000001,0.4744553500000013 -5.7540000000000004,0.4744553500000013 -5.7540000000000004,0.27345535000000126" data-type="line" data-label="" points="193.86534962308292,227.6106060826618 200.0083181700026,227.6106060826618 200.0083181700026,233.4624386794905" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-3.6400000000000023,-7.564455349999998 -3.851000000000002,-7.564455349999998 -3.851000000000002,-7.765455349999998" data-type="line" data-label="" points="261.5544580192357,461.65219651676625 255.41148947231605,461.65219651676625 255.41148947231605,467.504029113595" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-9.808910699999998,-2.9149999999999983 -9.808910699999998,-1.763999999999998 -10.259910699999997,-1.763999999999998" data-type="line" data-label="" points="81.95529025214461,326.2898364439823 81.95529025214461,292.7800885885105 68.82505890304145,292.7800885885105" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1.8800000000000003,4.0200000000000005 -1.8800000000000003,5.321000000000001 -2.9310000000000005,5.321000000000001" data-type="line" data-label="" points="312.7943852352482,124.38705505588771 312.7943852352482,86.51026794905121 282.19599688068627,86.51026794905121" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.1699999999999973,-8.57 1.1699999999999973,-8.671 0.9689999999999974,-8.671" data-type="line" data-label="" points="401.59085001299707,490.92721622043155 401.59085001299707,493.8676893163504 395.7390174161684,493.8676893163504" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="4.210000000000001,-3.2794553499999983 4.210000000000001,-3.8304553499999985 4.159000000000001,-3.8304553499999985" data-type="line" data-label="" points="490.0961788406551,336.9004419027814 490.0961788406551,352.9420327527944 488.6113854951911,352.9420327527944" fill="none" stroke="purple" stroke-width="1px"/></g><g><rect data-type="rect" data-label="schematic_component_0" data-x="-6.200000000000001" data-y="-10.298910699999997" x="157.9100597868469" y="532.5279436443982" width="58.227190018195984" height="17.468157005458806" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_1" data-x="-10.05" data-y="-8.229999999999999" x="45.82271900181962" y="472.2945154146088" width="58.227190018195984" height="17.468157005458806" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_2" data-x="-7.650000000000001" data-y="-5.8199999999999985" x="115.69534702365476" y="405.04211094359243" width="58.22719001819604" height="11.645438003639129" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_3" data-x="-6.965000000000001" data-y="0.4744553500000013" x="135.63815960488694" y="221.7878870808422" width="58.227190018195984" height="11.645438003639185" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_4" data-x="-2.6400000000000023" data-y="-7.464455349999998" x="261.55445801923565" y="450.0067585131271" width="58.22719001819604" height="17.46815700545875" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_5" data-x="0.16999999999999948" data-y="-0.49999999999999956" x="343.3636599948011" y="232.68962848973229" width="58.22719001819604" height="46.5817520145568" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_6" data-x="0.16999999999999815" data-y="-6.02" x="343.36365999480114" y="405.04211094359243" width="58.227190018195984" height="23.29087600727837" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_7" data-x="-9.6714107" data-y="-3.464999999999999" x="69.72758034832336" y="326.28983644398227" width="32.46165843514433" height="32.02495451000783" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_8" data-x="-10.337499999999999" data-y="-5.774999999999999" x="50.33532622822983" y="393.54224091499873" width="32.46165843514433" height="32.02495451000783" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_9" data-x="-9.551410699999998" data-y="-1.154999999999999" x="69.72758034832344" y="259.0374319729659" width="39.448921237327795" height="32.02495451000783" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_10" data-x="-4.597500000000002" data-y="-5.774999999999999" x="219.50116995061086" y="393.54224091499873" width="28.35404169482706" height="32.024954510007774" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_11" data-x="-7.200000000000001" data-y="-8.009455349999998" x="141.897582531843" y="463.2693009617884" width="32.024954510007774" height="22.67689066805292" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_12" data-x="-7.306955349999999" data-y="-1.8805446499999983" x="140.6191841954771" y="280.1606450740836" width="28.35404169482706" height="32.02495451000783" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_13" data-x="-4.890000000000002" data-y="-7.364455349999998" x="209.14998700285935" y="443.32648838055627" width="32.0249545100078" height="25.005978268780837" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_14" data-x="6.515" data-y="-3.63054465" x="541.1905380816221" y="335.78346826098266" width="32.024954510007774" height="22.676890668052977" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_15" data-x="6.515" data-y="-1.6516339500000008" x="541.1905380816221" y="278.170263582012" width="32.024954510007774" height="22.676890668053034" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_16" data-x="6.515" data-y="0.3272767499999982" x="541.1905380816221" y="220.55705890304142" width="32.024954510007774" height="22.676890668053005" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_17" data-x="6.515" data-y="2.3061874499999973" x="541.1905380816221" y="162.94385422407083" width="32.024954510007774" height="22.676890668052977" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_18" data-x="-5.9969553499999995" data-y="-3.469999999999998" x="177.01117795684956" y="326.4354044190278" width="31.84767309591885" height="32.024954510007774" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_19" data-x="-3.6694553500000007" data-y="-1.6794553499999991" x="244.68442963348065" y="277.81570075383416" width="32.024954510007774" height="25.005978268780837" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_20" data-x="-3.6800000000000006" data-y="3.2594553499999996" x="244.37743696386798" y="134.0262548479335" width="32.024954510007774" height="25.005978268780837" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_21" data-x="-0.6300000000000008" data-y="1.6894553499999998" x="333.1739017416169" y="179.73459901221736" width="32.024954510007774" height="25.005978268780837" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_22" data-x="4.502500000000001" data-y="-2.7294553499999985" x="484.4348845334028" y="304.8754873927736" width="28.35404169482706" height="32.024954510007774" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_23" data-x="2.9699999999999975" data-y="-7.699455349999998" x="437.9828437743696" y="454.24408650896805" width="32.024954510007774" height="22.676890668052977" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_24" data-x="-1.5869553500000007" data-y="-1.8899999999999997" x="307.4400835976085" y="280.435924304653" width="27.771769794645138" height="32.02495451000783" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_25" data-x="-1.6475000000000004" data-y="3.47" x="307.1330909279959" y="124.38705505588773" width="24.860410293735356" height="32.0249545100078" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_26" data-x="1.4024999999999994" data-y="1.9000000000000004" x="395.92955570574475" y="170.0953992201716" width="24.860410293735356" height="32.024954510007774" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_27" data-x="4.210000000000001" data-y="-1.1399999999999992" x="474.0837015856512" y="262.11021616844295" width="32.024954510007774" height="25.005978268780837" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_28" data-x="1.4524999999999972" data-y="-8.02" x="395.9295557057447" y="458.9022617104238" width="27.771769794645138" height="32.02495451000783" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_29" data-x="-2.0700000000000007" data-y="-0.09999999999999964" x="290.81362100337924" y="227.15804543800363" width="32.89836236028077" height="34.35404211073566" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_30" data-x="-3.8600000000000008" data-y="-0.09999999999999962" x="239.13698986223034" y="232.99662115934495" width="32.0249545100078" height="22.676890668053005" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_31" data-x="-2.4200000000000004" data-y="1.6800000000000002" x="280.62386275019503" y="175.33584632180919" width="32.898362360280714" height="34.35404211073566" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_32" data-x="-4.210000000000001" data-y="1.6800000000000002" x="228.947231609046" y="181.17442204315054" width="32.024954510007774" height="22.676890668052977" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_33" data-x="2.4099999999999997" data-y="0.10000000000000009" x="421.24252664413837" y="221.33532643618406" width="32.898362360280714" height="34.354042110735634" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_34" data-x="3.2424999999999997" data-y="1.9000000000000004" x="447.75175482193924" y="170.0953992201716" width="28.354041694827117" height="32.0249545100078" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_35" data-x="2.6525" data-y="-1.6799999999999993" x="428.2297894463218" y="273.88536542760596" width="33.04393033532625" height="32.898362360280714" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_36" data-x="2.7525000000000004" data-y="-3.4699999999999998" x="432.0304135170263" y="326.43540441902786" width="31.2654011957369" height="32.024954510007774" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_37" data-x="2.4099999999999984" data-y="-6.119999999999999" x="421.24252664413825" y="402.42188739277356" width="32.89836236028077" height="34.354042110735634" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_38" data-x="4.799999999999997" data-y="-6.119999999999999" x="491.2607226410189" y="407.095919313751" width="32.024954510007774" height="25.005978268780837" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="MY_18650_02" data-x="-6.140000000000001" data-y="-10.728910699999997" x="169.5554977904861" y="551.1606444502208" width="38.429945412009374" height="5.240447101637756" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="J_BAT_POS" data-x="-6.260000000000001" data-y="-9.868910699999997" x="169.55549779048613" y="526.1229527423966" width="31.442682609825823" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="MY_18650_02" data-x="-9.99" data-y="-8.659999999999998" x="57.46815700545881" y="490.9272162204315" width="38.429945412009374" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="J_BAT_NEG" data-x="-10.11" data-y="-7.799999999999999" x="57.468157005458835" y="465.8895245126073" width="31.442682609825795" height="5.240447101637585" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="BAT54WS" data-x="-7.830000000000002" data-y="-6.149999999999999" x="127.34078502729396" y="417.8520927475955" width="24.4554198076423" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="D_PROT" data-x="-7.890000000000002" data-y="-5.489999999999998" x="127.34078502729398" y="398.63712004159083" width="20.96178840655051" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="BAT54WS" data-x="-7.145000000000001" data-y="0.14445535000000126" x="147.28359760852612" y="234.59786888484533" width="24.4554198076423" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="D_SENSE_CLAMP" data-x="-6.785000000000001" data-y="0.8044553500000013" x="147.28359760852612" y="215.38289617884064" width="45.41720821419287" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="LM4040D25FTA" data-x="-2.5200000000000022" data-y="-7.894455349999998" x="273.1998960228749" y="468.63945931894983" width="41.92357681310108" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="U_REF" data-x="-2.940000000000002" data-y="-7.034455349999998" x="273.1998960228749" y="443.6017676111255" width="17.46815700545875" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="LMV339IDR" data-x="0.10999999999999943" data-y="-1.4299999999999997" x="355.0090979984403" y="280.435924304653" width="31.44268260982585" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="U1" data-x="-0.3100000000000006" data-y="0.4300000000000005" x="355.0090979984403" y="226.2846375877307" width="6.987262802183523" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="LMV331IDBVR" data-x="0.22999999999999798" data-y="-6.55" x="355.0090979984403" y="429.49753075123476" width="38.42994541200932" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="U2" data-x="-0.31000000000000194" data-y="-5.489999999999999" x="355.0090979984403" y="398.6371200415909" width="6.987262802183523" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="netId: BAT_RAW
|
|
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="-4.3400000000000025,-7.364455349999998 -4.140000000000002,-7.364455349999998 -4.140000000000002,-6.844727674999999 -4.890000000000002,-6.844727674999999 -4.890000000000002,-6.324999999999998" data-type="line" data-label="" points="241.17494151286712,455.8294775149467 246.99766051468674,455.8294775149467 246.99766051468674,440.6983364699766 225.16246425786323,440.6983364699766 225.16246425786323,425.5671954250065" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-3.6400000000000023,-7.364455349999998 -4.3400000000000025,-7.364455349999998" data-type="line" data-label="" points="261.5544580192357,455.8294775149467 241.17494151286712,455.8294775149467" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-9.808910699999998,-1.705000000000001 -9.808910699999998,-1.9050000000000002 -10.4289107,-1.9050000000000002 -10.4289107,-4.214999999999999 -9.808910699999998,-4.214999999999999 -9.808910699999998,-4.015" data-type="line" data-label="" points="81.95529025214461,291.0623864829738 81.95529025214461,296.88510548479337 63.90486134650382,296.88510548479337 63.90486134650382,364.1375099558097 81.95529025214461,364.1375099558097 81.95529025214461,358.31479095399015" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-11.05,-8.129999999999999 -11.25,-8.129999999999999 -11.25,-7.227499999999999 -10.475,-7.227499999999999 -10.475,-6.324999999999999" data-type="line" data-label="" points="45.82271900181962,478.1172344164284 40,478.1172344164284 40,451.8422149207174 62.56303613205097,451.8422149207174 62.56303613205097,425.5671954250065" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-11.05,-8.329999999999998 -11.25,-8.329999999999998 -11.25,-8.129999999999999 -11.05,-8.129999999999999" data-type="line" data-label="" points="45.82271900181962,483.93995341824797 40,483.93995341824797 40,478.1172344164284 45.82271900181962,478.1172344164284" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-9.05,-8.129999999999999 -8.850000000000001,-8.129999999999999 -8.850000000000001,-8.329999999999998 -9.05,-8.329999999999998" data-type="line" data-label="" points="104.0499090200156,478.1172344164284 109.87262802183517,478.1172344164284 109.87262802183517,483.93995341824797 104.0499090200156,483.93995341824797" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-0.8300000000000005,-0.09999999999999959 -1.5050000000000008,-0.09999999999999964" data-type="line" data-label="" points="343.36365999480114,244.33506649337147 323.71198336366,244.33506649337147" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-3.130000000000001,3.2594553499999996 -2.505000000000001,3.2594553499999996 -2.505000000000001,2.7199999999999998 -1.8800000000000003,2.7199999999999998 -1.8800000000000003,2.92" data-type="line" data-label="" points="276.40239147387575,146.52924398232392 294.59838835456196,146.52924398232392 294.59838835456196,162.23472856771514 312.7943852352482,162.23472856771514 312.7943852352482,156.41200956589552" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.1699999999999995,0.10000000000000042 1.8449999999999998,0.10000000000000016" data-type="line" data-label="" points="401.5908500129972,238.51234749155188 421.2425266441383,238.51234749155188" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.1699999999999995,1.3500000000000003 1.1699999999999995,0.7250000000000003 1.3699999999999994,0.7250000000000003 1.3699999999999994,0.10000000000000042 1.1699999999999995,0.10000000000000042" data-type="line" data-label="" points="401.5908500129972,202.12035373017937 401.5908500129972,220.31635061086564 407.41356901481674,220.31635061086564 407.41356901481674,238.51234749155188 401.5908500129972,238.51234749155188" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-0.08000000000000074,1.6894553499999998 0.5449999999999994,1.6894553499999998 0.5449999999999994,1.1500000000000004 1.1699999999999995,1.1500000000000004 1.1699999999999995,1.3500000000000003" data-type="line" data-label="" points="365.19885625162465,192.23758814660778 383.3948531323109,192.23758814660778 383.3948531323109,207.943072731999 401.5908500129972,207.943072731999 401.5908500129972,202.12035373017937" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="4.210000000000001,-2.1794553499999987 4.210000000000001,-1.659727674999999 3.460000000000001,-1.659727674999999 3.460000000000001,-1.1399999999999992 3.660000000000001,-1.1399999999999992" data-type="line" data-label="" points="490.0961788406551,304.8754873927736 490.0961788406551,289.74434634780346 468.2609825838316,289.74434634780346 468.2609825838316,274.61320530283336 474.0837015856512,274.61320530283336" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.1699999999999982,-6.119999999999999 1.8449999999999984,-6.119999999999999" data-type="line" data-label="" points="401.5908500129971,419.5989084481414 421.24252664413825,419.5989084481414" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.1699999999999973,-7.469999999999999 1.1699999999999973,-6.794999999999999 1.3699999999999983,-6.794999999999999 1.3699999999999983,-6.119999999999999 1.1699999999999982,-6.119999999999999" data-type="line" data-label="" points="401.59085001299707,458.9022617104237 401.59085001299707,439.2505850792826 407.41356901481674,439.2505850792826 407.41356901481674,419.5989084481414 401.5908500129971,419.5989084481414" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="2.4199999999999973,-7.699455349999998 2.174727674999997,-7.699455349999998 2.174727674999997,-7.269999999999999 1.1699999999999973,-7.269999999999999 1.1699999999999973,-7.469999999999999" data-type="line" data-label="" points="437.9828437743696,465.5825318429945 430.84208463737974,465.5825318429945 430.84208463737974,453.0795427086041 401.59085001299707,453.0795427086041 401.59085001299707,458.9022617104237" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-3.3100000000000005,-0.09999999999999964 -2.6350000000000007,-0.09999999999999964" data-type="line" data-label="" points="271.1619443722381,244.33506649337147 290.81362100337924,244.33506649337147" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-3.660000000000001,1.6800000000000002 -2.9850000000000003,1.6800000000000002" data-type="line" data-label="" points="260.9721861190538,192.51286737717703 280.623862750195,192.51286737717703" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="2.9499999999999997,1.35 2.9499999999999997,0.7250000000000005 3.175,0.7250000000000005 3.175,0.10000000000000053 2.9749999999999996,0.10000000000000053" data-type="line" data-label="" points="453.41304912919156,202.12035373017937 453.41304912919156,220.3163506108656 459.96360800623864,220.3163506108656 459.96360800623864,238.51234749155188 454.140889004419,238.51234749155188" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="2.41,-2.92 2.4099999999999997,-2.244999999999999" data-type="line" data-label="" points="437.6917078242787,326.43540441902786 437.6917078242787,306.7837277878867" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="4.249999999999997,-6.119999999999999 2.9749999999999983,-6.119999999999999" data-type="line" data-label="" points="491.2607226410189,419.5989084481414 454.140889004419,419.5989084481414" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-7.200000000000001,-10.398910699999997 -7.400000000000001,-10.398910699999997 -7.400000000000001,-10.198910699999997 -7.200000000000001,-10.198910699999997" data-type="line" data-label="" points="157.9100597868469,544.1733816480373 152.08734078502727,544.1733816480373 152.08734078502727,538.3506626462179 157.9100597868469,538.3506626462179" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-5.200000000000001,-10.198910699999997 -5.000000000000001,-10.198910699999997 -5.000000000000001,-10.398910699999997 -5.200000000000001,-10.398910699999997" data-type="line" data-label="" points="216.13724980504287,538.3506626462179 221.9599688068625,538.3506626462179 221.9599688068625,544.1733816480373 216.13724980504287,544.1733816480373" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-4.760000000000001,1.6800000000000002 -4.960000000000001,1.6800000000000002 -4.960000000000001,-0.09999999999999964 -4.410000000000001,-0.09999999999999964" data-type="line" data-label="" points="228.947231609046,192.51286737717703 223.12451260722642,192.51286737717703 223.12451260722642,244.33506649337147 239.1369898622303,244.33506649337147" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.1699999999999995,2.45 1.1699999999999995,2.6500000000000004 2.9499999999999997,2.6500000000000004 2.9499999999999997,2.4500000000000006" data-type="line" data-label="" points="401.5908500129972,170.0953992201716 401.5908500129972,164.27268021835198 453.41304912919156,164.27268021835198 453.41304912919156,170.09539922017157" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-7.5994553499999995,-1.3305446499999976 -7.5994553499999995,-0.42804464999999814 -8.965,-0.42804464999999814 -8.965,0.4744553500000013 -7.965000000000001,0.4744553500000013" data-type="line" data-label="" points="146.28047850272944,280.1606450740837 146.28047850272944,253.88562557837272 106.52456459578895,253.88562557837272 106.52456459578895,227.6106060826618 135.63815960488694,227.6106060826618" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-6.3494553499999995,-4.019999999999998 -6.3494553499999995,-4.219999999999998 -7.5994553499999995,-4.219999999999998 -7.5994553499999995,-2.430544649999999" data-type="line" data-label="" points="182.67247226410194,358.4603589290356 182.67247226410194,364.2830779308552 146.28047850272944,364.2830779308552 146.28047850272944,312.1855995840915" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-6.65,-5.8199999999999985 -6.450000000000001,-5.8199999999999985 -6.450000000000001,-6.914727674999998 -7.950000000000001,-6.914727674999998 -7.950000000000001,-8.009455349999998 -7.750000000000001,-8.009455349999998" data-type="line" data-label="" points="173.9225370418508,410.864829945412 179.7452560436704,410.864829945412 179.7452560436704,442.73628812061344 136.07486353002338,442.73628812061344 136.07486353002338,474.6077462958149 141.897582531843,474.6077462958149" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-8.650000000000002,-5.8199999999999985 -9.5625,-5.8199999999999985 -9.5625,-5.024999999999999 -10.475,-5.024999999999999 -10.475,-5.224999999999998" data-type="line" data-label="" points="115.69534702365476,410.864829945412 89.12919157785291,410.864829945412 89.12919157785291,387.71952191317905 62.56303613205097,387.71952191317905 62.56303613205097,393.5422409149987" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.1699999999999982,-5.92 1.5074999999999983,-5.92 1.5074999999999983,-5.329999999999999 2.41,-5.329999999999999 2.41,-4.02" data-type="line" data-label="" points="401.5908500129971,413.77618944632184 411.4166883285677,413.77618944632184 411.4166883285677,396.599168390954 437.6917078242787,396.599168390954 437.6917078242787,358.46035892903564" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-4.890000000000002,-5.224999999999999 -4.890000000000002,-3.8324999999999996 -1.86945535,-3.8324999999999996 -1.86945535,-2.44" data-type="line" data-label="" points="225.16246425786323,393.54224091499873 225.16246425786323,353.00155986482974 313.10137790486095,353.00155986482974 313.10137790486095,312.4608788146608" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-9.808910699999998,-0.6049999999999982 -9.808910699999998,0.4744553500000017 -7.965000000000001,0.4744553500000017" data-type="line" data-label="" points="81.95529025214461,259.0374319729659 81.95529025214461,227.6106060826618 135.63815960488694,227.6106060826618" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-6.3494553499999995,-2.919999999999998 -6.3494553499999995,-1.6794553499999996 -4.2194553500000005,-1.6794553499999996" data-type="line" data-label="" points="182.67247226410194,326.4354044190278 182.67247226410194,290.31868988822464 244.68442963348065,290.31868988822464" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="7.0649999999999995,0.3272767499999982 7.265,0.3272767499999982 7.265,1.3167320999999976 5.765,1.3167320999999976 5.765,2.3061874499999973 5.965,2.3061874499999973" data-type="line" data-label="" points="573.2154925916299,231.89550423706794 579.0382115934494,231.89550423706794 579.0382115934494,203.08890189758262 535.3678190798025,203.08890189758262 535.3678190798025,174.28229955809732 541.1905380816221,174.28229955809732" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="7.0649999999999995,-1.6516339500000008 7.265,-1.6516339500000008 7.265,-0.6621786000000013 5.765,-0.6621786000000013 5.765,0.3272767499999982 5.965,0.3272767499999982" data-type="line" data-label="" points="573.2154925916299,289.50870891603853 579.0382115934494,289.50870891603853 579.0382115934494,260.7021065765532 535.3678190798025,260.7021065765532 535.3678190798025,231.89550423706794 541.1905380816221,231.89550423706794" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="7.0649999999999995,-3.63054465 7.265,-3.63054465 7.265,-2.6410893000000004 5.765,-2.6410893000000004 5.765,-1.6516339500000008 5.965,-1.6516339500000008" data-type="line" data-label="" points="573.2154925916299,347.1219135950091 579.0382115934494,347.1219135950091 579.0382115934494,318.31531125552385 535.3678190798025,318.31531125552385 535.3678190798025,289.50870891603853 541.1905380816221,289.50870891603853" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-3.119455350000001,-1.6794553499999991 -2.9194553500000007,-1.6794553499999991 -2.9194553500000007,-1.3399999999999994 -1.8694553500000004,-1.3399999999999994" data-type="line" data-label="" points="276.7093841434884,290.3186898882246 282.53210314530804,290.3186898882246 282.53210314530804,280.435924304653 313.10137790486095,280.435924304653" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="2.4099999999999997,-1.1149999999999993 2.4099999999999997,-0.9149999999999994 3.460000000000001,-0.9149999999999994 3.460000000000001,-1.1399999999999992" data-type="line" data-label="" points="437.6917078242787,273.88536542760596 437.6917078242787,268.06264642578634 468.2609825838316,268.06264642578634 468.2609825838316,274.61320530283336" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1.8694553500000004,-1.3399999999999994 -1.8694553500000004,-0.7199999999999995 -1.3050000000000008,-0.7199999999999995 -1.3050000000000008,-0.09999999999999964 -1.5050000000000008,-0.09999999999999964" data-type="line" data-label="" points="313.10137790486095,280.435924304653 313.10137790486095,262.38549539901226 329.5347023654796,262.38549539901226 329.5347023654796,244.33506649337147 323.71198336366,244.33506649337147" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.1699999999999995,-1.0999999999999996 1.9909999999999992,-1.0999999999999994 1.9909999999999992,-0.6999999999999995 1.1699999999999995,-0.6999999999999995" data-type="line" data-label="" points="401.5908500129972,273.44866150246946 425.4931115154666,273.44866150246946 425.4931115154666,261.8032234988303 401.5908500129972,261.8032234988303" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-0.8300000000000005,-0.8999999999999996 -1.0300000000000005,-0.8999999999999996 -1.0300000000000005,-0.49999999999999967 -0.8300000000000005,-0.49999999999999967" data-type="line" data-label="" points="343.36365999480114,267.6259425006499 337.5409409929816,267.6259425006499 337.5409409929816,255.98050449701068 343.36365999480114,255.98050449701068" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.1699999999999995,-0.2999999999999995 1.4699999999999998,-0.2999999999999995 1.4699999999999998,-3.1599999999999997 -1.7710000000000017,-3.1599999999999997 -1.7710000000000017,-6.019999999999999 -0.8300000000000018,-6.02" data-type="line" data-label="" points="401.5908500129972,250.15778549519106 410.3249285157266,250.15778549519106 410.3249285157266,333.4226672212113 315.9677670912399,333.4226672212113 315.9677670912399,416.68754894723156 343.36365999480114,416.6875489472316" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-0.8300000000000005,0.10000000000000042 -1.3425000000000005,0.10000000000000042 -1.3425000000000005,1.6800000000000002 -1.8550000000000004,1.6800000000000002" data-type="line" data-label="" points="343.36365999480114,238.51234749155188 328.44294255263844,238.51234749155188 328.44294255263844,192.51286737717703 313.5222251104757,192.51286737717703" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="4.760000000000001,-1.1399999999999992 5.549999999999997,-1.1399999999999992 5.549999999999997,-3.43054465 5.024,-3.43054465 5.024,-3.83054465 5.549999999999997,-3.83054465 5.549999999999997,-6.119999999999999 5.349999999999997,-6.119999999999999" data-type="line" data-label="" points="506.108656095659,274.61320530283336 529.1083961528464,274.61320530283336 529.1083961528464,341.29919459318955 513.7946451780608,341.29919459318955 513.7946451780608,352.94463259682874 529.1083961528464,352.94463259682874 529.1083961528464,419.5989084481414 523.2856771510267,419.5989084481414" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-8.850000000000001,-8.129999999999999 -8.59,-8.129999999999999 -8.59,-8.130999999999998" data-type="line" data-label="" points="109.87262802183517,478.1172344164284 117.4421627242007,478.1172344164284 117.4421627242007,478.14634801143745" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-5.965000000000001,0.4744553500000013 -5.7540000000000004,0.4744553500000013 -5.7540000000000004,0.27345535000000126" data-type="line" data-label="" points="193.86534962308292,227.6106060826618 200.0083181700026,227.6106060826618 200.0083181700026,233.4624386794905" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-3.6400000000000023,-7.564455349999998 -3.851000000000002,-7.564455349999998 -3.851000000000002,-7.765455349999998" data-type="line" data-label="" points="261.5544580192357,461.65219651676625 255.41148947231605,461.65219651676625 255.41148947231605,467.504029113595" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-9.808910699999998,-2.9149999999999983 -9.808910699999998,-2.814999999999998 -9.708910699999999,-2.814999999999998 -9.708910699999999,-1.763999999999998 -10.259910699999997,-1.763999999999998" data-type="line" data-label="" points="81.95529025214461,326.2898364439823 81.95529025214461,323.3784769430725 84.86664975305439,323.3784769430725 84.86664975305439,292.7800885885105 68.82505890304145,292.7800885885105" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1.8800000000000003,4.0200000000000005 -1.8800000000000003,5.321000000000001 -2.9310000000000005,5.321000000000001" data-type="line" data-label="" points="312.7943852352482,124.38705505588771 312.7943852352482,86.51026794905121 282.19599688068627,86.51026794905121" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.1699999999999973,-8.57 1.1699999999999973,-8.671 0.9689999999999974,-8.671" data-type="line" data-label="" points="401.59085001299707,490.92721622043155 401.59085001299707,493.8676893163504 395.7390174161684,493.8676893163504" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="4.210000000000001,-3.2794553499999983 4.210000000000001,-3.8304553499999985 4.159000000000001,-3.8304553499999985" data-type="line" data-label="" points="490.0961788406551,336.9004419027814 490.0961788406551,352.9420327527944 488.6113854951911,352.9420327527944" fill="none" stroke="purple" stroke-width="1px"/></g><g><rect data-type="rect" data-label="schematic_component_0" data-x="-6.200000000000001" data-y="-10.298910699999997" x="157.9100597868469" y="532.5279436443982" width="58.227190018195984" height="17.468157005458806" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_1" data-x="-10.05" data-y="-8.229999999999999" x="45.82271900181962" y="472.2945154146088" width="58.227190018195984" height="17.468157005458806" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_2" data-x="-7.650000000000001" data-y="-5.8199999999999985" x="115.69534702365476" y="405.04211094359243" width="58.22719001819604" height="11.645438003639129" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_3" data-x="-6.965000000000001" data-y="0.4744553500000013" x="135.63815960488694" y="221.7878870808422" width="58.227190018195984" height="11.645438003639185" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_4" data-x="-2.6400000000000023" data-y="-7.464455349999998" x="261.55445801923565" y="450.0067585131271" width="58.22719001819604" height="17.46815700545875" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_5" data-x="0.16999999999999948" data-y="-0.49999999999999956" x="343.3636599948011" y="232.68962848973229" width="58.22719001819604" height="46.5817520145568" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_6" data-x="0.16999999999999815" data-y="-6.02" x="343.36365999480114" y="405.04211094359243" width="58.227190018195984" height="23.29087600727837" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_7" data-x="-9.6714107" data-y="-3.464999999999999" x="69.72758034832336" y="326.28983644398227" width="32.46165843514433" height="32.02495451000783" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_8" data-x="-10.337499999999999" data-y="-5.774999999999999" x="50.33532622822983" y="393.54224091499873" width="32.46165843514433" height="32.02495451000783" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_9" data-x="-9.551410699999998" data-y="-1.154999999999999" x="69.72758034832344" y="259.0374319729659" width="39.448921237327795" height="32.02495451000783" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_10" data-x="-4.597500000000002" data-y="-5.774999999999999" x="219.50116995061086" y="393.54224091499873" width="28.35404169482706" height="32.024954510007774" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_11" data-x="-7.200000000000001" data-y="-8.009455349999998" x="141.897582531843" y="463.2693009617884" width="32.024954510007774" height="22.67689066805292" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_12" data-x="-7.306955349999999" data-y="-1.8805446499999983" x="140.6191841954771" y="280.1606450740836" width="28.35404169482706" height="32.02495451000783" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_13" data-x="-4.890000000000002" data-y="-7.364455349999998" x="209.14998700285935" y="443.32648838055627" width="32.0249545100078" height="25.005978268780837" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_14" data-x="6.515" data-y="-3.63054465" x="541.1905380816221" y="335.78346826098266" width="32.024954510007774" height="22.676890668052977" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_15" data-x="6.515" data-y="-1.6516339500000008" x="541.1905380816221" y="278.170263582012" width="32.024954510007774" height="22.676890668053034" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_16" data-x="6.515" data-y="0.3272767499999982" x="541.1905380816221" y="220.55705890304142" width="32.024954510007774" height="22.676890668053005" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_17" data-x="6.515" data-y="2.3061874499999973" x="541.1905380816221" y="162.94385422407083" width="32.024954510007774" height="22.676890668052977" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_18" data-x="-5.9969553499999995" data-y="-3.469999999999998" x="177.01117795684956" y="326.4354044190278" width="31.84767309591885" height="32.024954510007774" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_19" data-x="-3.6694553500000007" data-y="-1.6794553499999991" x="244.68442963348065" y="277.81570075383416" width="32.024954510007774" height="25.005978268780837" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_20" data-x="-3.6800000000000006" data-y="3.2594553499999996" x="244.37743696386798" y="134.0262548479335" width="32.024954510007774" height="25.005978268780837" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_21" data-x="-0.6300000000000008" data-y="1.6894553499999998" x="333.1739017416169" y="179.73459901221736" width="32.024954510007774" height="25.005978268780837" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_22" data-x="4.502500000000001" data-y="-2.7294553499999985" x="484.4348845334028" y="304.8754873927736" width="28.35404169482706" height="32.024954510007774" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_23" data-x="2.9699999999999975" data-y="-7.699455349999998" x="437.9828437743696" y="454.24408650896805" width="32.024954510007774" height="22.676890668052977" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_24" data-x="-1.5869553500000007" data-y="-1.8899999999999997" x="307.4400835976085" y="280.435924304653" width="27.771769794645138" height="32.02495451000783" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_25" data-x="-1.6475000000000004" data-y="3.47" x="307.1330909279959" y="124.38705505588773" width="24.860410293735356" height="32.0249545100078" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_26" data-x="1.4024999999999994" data-y="1.9000000000000004" x="395.92955570574475" y="170.0953992201716" width="24.860410293735356" height="32.024954510007774" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_27" data-x="4.210000000000001" data-y="-1.1399999999999992" x="474.0837015856512" y="262.11021616844295" width="32.024954510007774" height="25.005978268780837" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_28" data-x="1.4524999999999972" data-y="-8.02" x="395.9295557057447" y="458.9022617104238" width="27.771769794645138" height="32.02495451000783" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_29" data-x="-2.0700000000000007" data-y="-0.09999999999999964" x="290.81362100337924" y="227.15804543800363" width="32.89836236028077" height="34.35404211073566" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_30" data-x="-3.8600000000000008" data-y="-0.09999999999999962" x="239.13698986223034" y="232.99662115934495" width="32.0249545100078" height="22.676890668053005" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_31" data-x="-2.4200000000000004" data-y="1.6800000000000002" x="280.62386275019503" y="175.33584632180919" width="32.898362360280714" height="34.35404211073566" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_32" data-x="-4.210000000000001" data-y="1.6800000000000002" x="228.947231609046" y="181.17442204315054" width="32.024954510007774" height="22.676890668052977" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_33" data-x="2.4099999999999997" data-y="0.10000000000000009" x="421.24252664413837" y="221.33532643618406" width="32.898362360280714" height="34.354042110735634" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_34" data-x="3.2424999999999997" data-y="1.9000000000000004" x="447.75175482193924" y="170.0953992201716" width="28.354041694827117" height="32.0249545100078" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_35" data-x="2.6525" data-y="-1.6799999999999993" x="428.2297894463218" y="273.88536542760596" width="33.04393033532625" height="32.898362360280714" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_36" data-x="2.7525000000000004" data-y="-3.4699999999999998" x="432.0304135170263" y="326.43540441902786" width="31.2654011957369" height="32.024954510007774" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_37" data-x="2.4099999999999984" data-y="-6.119999999999999" x="421.24252664413825" y="402.42188739277356" width="32.89836236028077" height="34.354042110735634" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="schematic_component_38" data-x="4.799999999999997" data-y="-6.119999999999999" x="491.2607226410189" y="407.095919313751" width="32.024954510007774" height="25.005978268780837" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="MY_18650_02" data-x="-6.140000000000001" data-y="-10.728910699999997" x="169.5554977904861" y="551.1606444502208" width="38.429945412009374" height="5.240447101637756" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="J_BAT_POS" data-x="-6.260000000000001" data-y="-9.868910699999997" x="169.55549779048613" y="526.1229527423966" width="31.442682609825823" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="MY_18650_02" data-x="-9.99" data-y="-8.659999999999998" x="57.46815700545881" y="490.9272162204315" width="38.429945412009374" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="J_BAT_NEG" data-x="-10.11" data-y="-7.799999999999999" x="57.468157005458835" y="465.8895245126073" width="31.442682609825795" height="5.240447101637585" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="BAT54WS" data-x="-7.830000000000002" data-y="-6.149999999999999" x="127.34078502729396" y="417.8520927475955" width="24.4554198076423" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="D_PROT" data-x="-7.890000000000002" data-y="-5.489999999999998" x="127.34078502729398" y="398.63712004159083" width="20.96178840655051" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="BAT54WS" data-x="-7.145000000000001" data-y="0.14445535000000126" x="147.28359760852612" y="234.59786888484533" width="24.4554198076423" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="D_SENSE_CLAMP" data-x="-6.785000000000001" data-y="0.8044553500000013" x="147.28359760852612" y="215.38289617884064" width="45.41720821419287" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="LM4040D25FTA" data-x="-2.5200000000000022" data-y="-7.894455349999998" x="273.1998960228749" y="468.63945931894983" width="41.92357681310108" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="U_REF" data-x="-2.940000000000002" data-y="-7.034455349999998" x="273.1998960228749" y="443.6017676111255" width="17.46815700545875" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="LMV339IDR" data-x="0.10999999999999943" data-y="-1.4299999999999997" x="355.0090979984403" y="280.435924304653" width="31.44268260982585" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="U1" data-x="-0.3100000000000006" data-y="0.4300000000000005" x="355.0090979984403" y="226.2846375877307" width="6.987262802183523" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="LMV331IDBVR" data-x="0.22999999999999798" data-y="-6.55" x="355.0090979984403" y="429.49753075123476" width="38.42994541200932" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="U2" data-x="-0.31000000000000194" data-y="-5.489999999999999" x="355.0090979984403" y="398.6371200415909" width="6.987262802183523" height="5.240447101637642" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="netId: BAT_RAW
|
|
2
2
|
globalConnNetId: connectivity_net12" data-x="-7.880000000000001" data-y="-10.398910699999997" x="124.1382895762932" y="541.2620221471275" width="27.94905120873409" height="5.822719001819564" fill="hsl(80, 100%, 50%, 0.35)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="netId: BAT_RAW
|
|
3
3
|
globalConnNetId: connectivity_net12" data-x="-4.520000000000001" data-y="-10.198910699999997" x="221.95996880686243" y="535.439303145308" width="27.94905120873412" height="5.822719001819564" fill="hsl(80, 100%, 50%, 0.35)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="netId: BAT_RAW
|
|
4
4
|
globalConnNetId: connectivity_net12" data-x="-5.970000000000001" data-y="-5.8199999999999985" x="179.7452560436704" y="407.9534704445022" width="27.94905120873409" height="5.822719001819564" fill="hsl(80, 100%, 50%, 0.35)" stroke="black" stroke-width="0.03434821428571429"/></g><g><rect data-type="rect" data-label="netId: GND
|
|
@@ -1,4 +1,4 @@
|
|
|
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="13.45,16 8.9,14.5" data-type="line" data-label="" points="439.8389477922427,115.96732009126299 97.87142665414046,228.70386552140667" fill="none" stroke="hsl(16, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="14.55,16 8.9,15.1" data-type="line" data-label="" points="522.5124144410149,115.96732009126299 97.87142665414046,183.6092473493493" fill="none" stroke="hsl(16, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="13.45,14 11.1,13.1" data-type="line" data-label="" points="439.8389477922427,266.28271399812115 263.2183599516844,333.92464125620734" fill="none" stroke="hsl(160, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="8.9,15.1 8.9,14.7" data-type="line" data-label="" points="97.87142665414046,183.6092473493493 97.87142665414046,213.67232613072088" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,15.1 11.1,13.3" data-type="line" data-label="" points="97.87142665414046,183.6092473493493 263.2183599516844,318.89310186552143" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,15.1 14.55,14" data-type="line" data-label="" points="97.87142665414046,183.6092473493493 522.5124144410149,266.28271399812115" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,15.1 14.55,16" data-type="line" data-label="" points="97.87142665414046,183.6092473493493 522.5124144410149,115.96732009126299" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,14.7 11.1,13.3" data-type="line" data-label="" points="97.87142665414046,213.67232613072088 263.2183599516844,318.89310186552143" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,14.7 14.55,14" data-type="line" data-label="" points="97.87142665414046,213.67232613072088 522.5124144410149,266.28271399812115" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,14.7 14.55,16" data-type="line" data-label="" points="97.87142665414046,213.67232613072088 522.5124144410149,115.96732009126299" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="11.1,13.3 14.55,14" data-type="line" data-label="" points="263.2183599516844,318.89310186552143 522.5124144410149,266.28271399812115" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="11.1,13.3 14.55,16" data-type="line" data-label="" points="263.2183599516844,318.89310186552143 522.5124144410149,115.96732009126299" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="14.55,14 14.55,16" data-type="line" data-label="" points="522.5124144410149,266.28271399812115 522.5124144410149,115.96732009126299" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,14.9 8.9,14.5" data-type="line" data-label="" points="97.87142665414046,198.64078674003486 97.87142665414046,228.70386552140667" fill="none" stroke="hsl(23, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,14.9 11.1,12.7" data-type="line" data-label="" points="97.87142665414046,198.64078674003486 263.2183599516844,363.98772003757904" fill="none" stroke="hsl(23, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,14.9 13.14,10" data-type="line" data-label="" points="97.87142665414046,198.64078674003486 416.54006173667983,566.9135018118375" fill="none" stroke="hsl(23, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,14.9 13.45,16" data-type="line" data-label="" points="97.87142665414046,198.64078674003486 439.8389477922427,115.96732009126299" fill="none" stroke="hsl(23, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,14.5 11.1,12.7" data-type="line" data-label="" points="97.87142665414046,228.70386552140667 263.2183599516844,363.98772003757904" fill="none" stroke="hsl(23, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,14.5 13.14,10" data-type="line" data-label="" points="97.87142665414046,228.70386552140667 416.54006173667983,566.9135018118375" fill="none" stroke="hsl(23, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,14.5 13.45,16" data-type="line" data-label="" points="97.87142665414046,228.70386552140667 439.8389477922427,115.96732009126299" fill="none" stroke="hsl(23, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="11.1,12.7 13.14,10" data-type="line" data-label="" points="263.2183599516844,363.98772003757904 416.54006173667983,566.9135018118375" fill="none" stroke="hsl(23, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="11.1,12.7 13.45,16" data-type="line" data-label="" points="263.2183599516844,363.98772003757904 439.8389477922427,115.96732009126299" fill="none" stroke="hsl(23, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="13.14,10 13.45,16" data-type="line" data-label="" points="416.54006173667983,566.9135018118375 439.8389477922427,115.96732009126299" fill="none" stroke="hsl(23, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="11.1,15.5 14.86,10" data-type="line" data-label="" points="263.2183599516844,153.54616856797747 545.8113004965778,566.9135018118375" fill="none" stroke="hsl(50, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,14.5 8.600000000000001,14.5 8.600000000000001,14.9 8.9,14.9" data-type="line" data-label="" points="97.87142665414046,228.70386552140667 75.32411756811189,228.70386552140667 75.32411756811189,198.64078674003486 97.87142665414046,198.64078674003486" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="14.55,16 14.75,16 14.75,14 14.55,14" data-type="line" data-label="" points="522.5124144410149,115.96732009126299 537.5439538317005,115.96732009126299 537.5439538317005,266.28271399812115 522.5124144410149,266.28271399812115" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="8.9,14.7 8.8,14.7 8.8,15.1 8.9,15.1" data-type="line" data-label="" points="97.87142665414046,213.67232613072088 90.35565695879757,213.67232613072088 90.35565695879757,183.6092473493493 97.87142665414046,183.6092473493493" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="13.45,16 12.274999999999999,16 12.274999999999999,13.299999999999999 13.630999999999998,13.299999999999999 13.630999999999998,12.9 12.274999999999999,12.9 12.274999999999999,12.7 11.1,12.7" data-type="line" data-label="" points="439.8389477922427,115.96732009126299 351.52865387196346,115.96732009126299 351.52865387196346,318.89310186552154 453.4424909408133,318.89310186552154 453.4424909408133,348.95618064689313 351.52865387196346,348.95618064689313 351.52865387196346,363.98772003757904 263.2183599516844,363.98772003757904" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="14.75,16 15.010000000000002,16 15.010000000000002,15.999" data-type="line" data-label="" points="537.5439538317005,115.96732009126299 557.0849550395922,115.96732009126299 557.0849550395922,116.04247778821627" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="11.1,13.3 13.860999999999999,13.3 13.860999999999999,12.799000000000001" data-type="line" data-label="" points="263.2183599516844,318.89310186552143 470.72876124010213,318.89310186552143 470.72876124010213,356.5471080391894" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="8.600000000000001,14.5 8.34,14.5 8.34,14.501" data-type="line" data-label="" points="75.32411756811189,228.70386552140667 55.783116360220106,228.70386552140667 55.783116360220106,228.62870782445316" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="13.14,10 12.929,10 12.929,10.401" data-type="line" data-label="" points="416.54006173667983,566.9135018118375 400.6817876795062,566.9135018118375 400.6817876795062,536.7752653335124" fill="none" stroke="purple" stroke-width="1px"/></g><g><rect data-type="rect" data-label="schematic_component_0" data-x="10" data-y="14" x="97.87142665414046" y="138.51462917729174" width="165.34693329754396" height="255.53616964165883" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.013305357142857141"/></g><g><rect data-type="rect" data-label="schematic_component_1" data-x="14" data-y="14" x="439.83894779224266" y="219.68494188699515" width="82.6734666487722" height="93.19554422225201" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.013305357142857141"/></g><g><rect data-type="rect" data-label="schematic_component_2" data-x="14" data-y="10" x="416.5400617366798" y="537.6429346396459" width="129.27123875989798" height="58.54113434438318" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.013305357142857141"/></g><g><rect data-type="rect" data-label="schematic_component_3" data-x="14" data-y="16" x="439.83894779224266" y="69.36954798013699" width="82.6734666487722" height="93.19554422225201" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.013305357142857141"/></g><g><rect data-type="rect" data-label="ATMEGA328P_AU" data-x="10.080000000000002" data-y="12.17" x="127.93450543551216" y="397.05710669708776" width="117.24600724734955" height="13.528385451617169" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.013305357142857141"/></g><g><rect data-type="rect" data-label="U_MCU" data-x="9.600000000000001" data-y="15.83" x="127.93450543551222" y="121.97993584753738" width="45.094618172057494" height="13.528385451617169" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.013305357142857141"/></g><g><rect data-type="rect" data-label="netId: GND
|
|
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="13.45,16 8.9,14.5" data-type="line" data-label="" points="439.8389477922427,115.96732009126299 97.87142665414046,228.70386552140667" fill="none" stroke="hsl(16, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="14.55,16 8.9,15.1" data-type="line" data-label="" points="522.5124144410149,115.96732009126299 97.87142665414046,183.6092473493493" fill="none" stroke="hsl(16, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="13.45,14 11.1,13.1" data-type="line" data-label="" points="439.8389477922427,266.28271399812115 263.2183599516844,333.92464125620734" fill="none" stroke="hsl(160, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="8.9,15.1 8.9,14.7" data-type="line" data-label="" points="97.87142665414046,183.6092473493493 97.87142665414046,213.67232613072088" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,15.1 11.1,13.3" data-type="line" data-label="" points="97.87142665414046,183.6092473493493 263.2183599516844,318.89310186552143" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,15.1 14.55,14" data-type="line" data-label="" points="97.87142665414046,183.6092473493493 522.5124144410149,266.28271399812115" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,15.1 14.55,16" data-type="line" data-label="" points="97.87142665414046,183.6092473493493 522.5124144410149,115.96732009126299" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,14.7 11.1,13.3" data-type="line" data-label="" points="97.87142665414046,213.67232613072088 263.2183599516844,318.89310186552143" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,14.7 14.55,14" data-type="line" data-label="" points="97.87142665414046,213.67232613072088 522.5124144410149,266.28271399812115" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,14.7 14.55,16" data-type="line" data-label="" points="97.87142665414046,213.67232613072088 522.5124144410149,115.96732009126299" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="11.1,13.3 14.55,14" data-type="line" data-label="" points="263.2183599516844,318.89310186552143 522.5124144410149,266.28271399812115" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="11.1,13.3 14.55,16" data-type="line" data-label="" points="263.2183599516844,318.89310186552143 522.5124144410149,115.96732009126299" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="14.55,14 14.55,16" data-type="line" data-label="" points="522.5124144410149,266.28271399812115 522.5124144410149,115.96732009126299" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,14.9 8.9,14.5" data-type="line" data-label="" points="97.87142665414046,198.64078674003486 97.87142665414046,228.70386552140667" fill="none" stroke="hsl(23, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,14.9 11.1,12.7" data-type="line" data-label="" points="97.87142665414046,198.64078674003486 263.2183599516844,363.98772003757904" fill="none" stroke="hsl(23, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,14.9 13.14,10" data-type="line" data-label="" points="97.87142665414046,198.64078674003486 416.54006173667983,566.9135018118375" fill="none" stroke="hsl(23, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,14.9 13.45,16" data-type="line" data-label="" points="97.87142665414046,198.64078674003486 439.8389477922427,115.96732009126299" fill="none" stroke="hsl(23, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,14.5 11.1,12.7" data-type="line" data-label="" points="97.87142665414046,228.70386552140667 263.2183599516844,363.98772003757904" fill="none" stroke="hsl(23, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,14.5 13.14,10" data-type="line" data-label="" points="97.87142665414046,228.70386552140667 416.54006173667983,566.9135018118375" fill="none" stroke="hsl(23, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,14.5 13.45,16" data-type="line" data-label="" points="97.87142665414046,228.70386552140667 439.8389477922427,115.96732009126299" fill="none" stroke="hsl(23, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="11.1,12.7 13.14,10" data-type="line" data-label="" points="263.2183599516844,363.98772003757904 416.54006173667983,566.9135018118375" fill="none" stroke="hsl(23, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="11.1,12.7 13.45,16" data-type="line" data-label="" points="263.2183599516844,363.98772003757904 439.8389477922427,115.96732009126299" fill="none" stroke="hsl(23, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="13.14,10 13.45,16" data-type="line" data-label="" points="416.54006173667983,566.9135018118375 439.8389477922427,115.96732009126299" fill="none" stroke="hsl(23, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="11.1,15.5 14.86,10" data-type="line" data-label="" points="263.2183599516844,153.54616856797747 545.8113004965778,566.9135018118375" fill="none" stroke="hsl(50, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="8.9,14.5 8.600000000000001,14.5 8.600000000000001,14.9 8.9,14.9" data-type="line" data-label="" points="97.87142665414046,228.70386552140667 75.32411756811189,228.70386552140667 75.32411756811189,198.64078674003486 97.87142665414046,198.64078674003486" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="14.55,16 14.75,16 14.75,14 14.55,14" data-type="line" data-label="" points="522.5124144410149,115.96732009126299 537.5439538317005,115.96732009126299 537.5439538317005,266.28271399812115 522.5124144410149,266.28271399812115" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="8.9,14.7 8.8,14.7 8.8,15.1 8.9,15.1" data-type="line" data-label="" points="97.87142665414046,213.67232613072088 90.35565695879757,213.67232613072088 90.35565695879757,183.6092473493493 97.87142665414046,183.6092473493493" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="13.45,16 12.274999999999999,16 12.274999999999999,13.299999999999999 13.630999999999998,13.299999999999999 13.630999999999998,12.9 12.274999999999999,12.9 12.274999999999999,12.7 11.1,12.7" data-type="line" data-label="" points="439.8389477922427,115.96732009126299 351.52865387196346,115.96732009126299 351.52865387196346,318.89310186552154 453.4424909408133,318.89310186552154 453.4424909408133,348.95618064689313 351.52865387196346,348.95618064689313 351.52865387196346,363.98772003757904 263.2183599516844,363.98772003757904" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="14.75,16 15.010000000000002,16 15.010000000000002,15.999" data-type="line" data-label="" points="537.5439538317005,115.96732009126299 557.0849550395922,115.96732009126299 557.0849550395922,116.04247778821627" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="11.1,13.3 11.2,13.3 11.2,13.280000000000001 13.860999999999999,13.280000000000001 13.860999999999999,12.799000000000001" data-type="line" data-label="" points="263.2183599516844,318.89310186552143 270.7341296470273,318.89310186552143 270.7341296470273,320.39625580459006 470.72876124010213,320.39625580459006 470.72876124010213,356.5471080391894" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="8.600000000000001,14.5 8.34,14.5 8.34,14.501" data-type="line" data-label="" points="75.32411756811189,228.70386552140667 55.783116360220106,228.70386552140667 55.783116360220106,228.62870782445316" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="13.14,10 12.929,10 12.929,10.401" data-type="line" data-label="" points="416.54006173667983,566.9135018118375 400.6817876795062,566.9135018118375 400.6817876795062,536.7752653335124" fill="none" stroke="purple" stroke-width="1px"/></g><g><rect data-type="rect" data-label="schematic_component_0" data-x="10" data-y="14" x="97.87142665414046" y="138.51462917729174" width="165.34693329754396" height="255.53616964165883" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.013305357142857141"/></g><g><rect data-type="rect" data-label="schematic_component_1" data-x="14" data-y="14" x="439.83894779224266" y="219.68494188699515" width="82.6734666487722" height="93.19554422225201" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.013305357142857141"/></g><g><rect data-type="rect" data-label="schematic_component_2" data-x="14" data-y="10" x="416.5400617366798" y="537.6429346396459" width="129.27123875989798" height="58.54113434438318" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.013305357142857141"/></g><g><rect data-type="rect" data-label="schematic_component_3" data-x="14" data-y="16" x="439.83894779224266" y="69.36954798013699" width="82.6734666487722" height="93.19554422225201" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.013305357142857141"/></g><g><rect data-type="rect" data-label="ATMEGA328P_AU" data-x="10.080000000000002" data-y="12.17" x="127.93450543551216" y="397.05710669708776" width="117.24600724734955" height="13.528385451617169" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.013305357142857141"/></g><g><rect data-type="rect" data-label="U_MCU" data-x="9.600000000000001" data-y="15.83" x="127.93450543551222" y="121.97993584753738" width="45.094618172057494" height="13.528385451617169" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.013305357142857141"/></g><g><rect data-type="rect" data-label="netId: GND
|
|
2
2
|
globalConnNetId: connectivity_net1" data-x="15.010000000000002" data-y="15.759" x="541.301838679372" y="116.04247778821627" width="31.566232720440212" height="36.075694537646086" fill="#00000066" stroke="#000000" stroke-width="0.013305357142857141"/></g><g><rect data-type="rect" data-label="netId: GND
|
|
3
3
|
globalConnNetId: connectivity_net1" data-x="13.860999999999999" data-y="12.559000000000001" x="454.945644879882" y="356.54710803918937" width="31.566232720440212" height="36.07569453764597" fill="#00000066" stroke="#000000" stroke-width="0.013305357142857141"/></g><g><rect data-type="rect" data-label="netId: VCC_3V3
|
|
4
4
|
globalConnNetId: connectivity_net0" data-x="12.862499999999999" data-y="16.48" x="379.9006844718829" y="43.81593101597093" width="31.566232720440325" height="72.15138907529195" fill="#ef444466" stroke="#ef4444" stroke-width="0.013305357142857141"/></g><g><rect data-type="rect" data-label="netId: VCC_3V3
|
|
@@ -0,0 +1,70 @@
|
|
|
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="-11.342500000000001,-18.990000000000002 -9.797500000000001,-18.815" data-type="line" data-label="" points="428.00799467022,320.5969353764158 543.2911392405065,307.53897401732183" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-11.342500000000001,-18.990000000000002 -9.797500000000001,-20.625000000000004" data-type="line" data-label="" points="428.00799467022,320.5969353764158 543.2911392405065,442.5956029313793" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-9.797500000000001,-18.815 -9.797500000000001,-20.625000000000004" data-type="line" data-label="" points="543.2911392405065,307.53897401732183 543.2911392405065,442.5956029313793" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-11.342500000000001,-18.04 -9.797500000000001,-18.215" data-type="line" data-label="" points="428.00799467022,249.7108594270485 543.2911392405065,262.76882078614244" fill="none" stroke="hsl(273, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-11.342500000000001,-18.240000000000002 -9.797500000000001,-20.025000000000002" data-type="line" data-label="" points="428.00799467022,264.6342438374418 543.2911392405065,397.8254497001999" fill="none" stroke="hsl(274, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-9.797500000000001,-18.815 -9.797500000000001,-18.990000000000002 -11.342500000000001,-18.990000000000002" data-type="line" data-label="" points="543.2911392405065,307.53897401732183 543.2911392405065,320.5969353764158 428.00799467022,320.5969353764158" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-9.797500000000001,-20.625000000000004 -9.797500000000001,-20.825000000000003 -10.322500000000002,-20.825000000000003 -10.322500000000002,-19.015 -9.797500000000001,-19.015 -9.797500000000001,-18.815" data-type="line" data-label="" points="543.2911392405065,442.5956029313793 543.2911392405065,457.51898734177234 504.1172551632246,457.51898734177234 504.1172551632246,322.4623584277149 543.2911392405065,322.4623584277149 543.2911392405065,307.53897401732183" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-11.342500000000001,-18.04 -9.797500000000001,-18.04 -9.797500000000001,-18.215" data-type="line" data-label="" points="428.00799467022,249.7108594270485 543.2911392405065,249.7108594270485 543.2911392405065,262.76882078614244" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-11.342500000000001,-17.29 -11.041500000000001,-17.29 -11.041500000000001,-17.139" data-type="line" data-label="" points="428.00799467022,193.74816788807448 450.46768820786156,193.74816788807448 450.46768820786156,182.48101265822766" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-9.797500000000001,-20.025000000000002 -9.797500000000001,-19.925 -9.697500000000002,-19.925 -9.697500000000002,-18.874 -10.1485,-18.874" data-type="line" data-label="" points="543.2911392405065,397.8254497001999 543.2911392405065,390.36375749500326 550.752831445703,390.36375749500326 550.752831445703,311.9413724183876 517.1005996002667,311.9413724183876" fill="none" stroke="purple" stroke-width="1px"/></g><g><rect data-type="rect" data-label="schematic_component_16" data-x="-13.9425" data-y="-18.14" x="40.000000000000284" y="182.55562958027986" width="388.0079946702198" height="149.23384410393055" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.013401785714285713"/></g><g><rect data-type="rect" data-label="schematic_component_17" data-x="-9.580000000000002" data-y="-18.515" x="519.0406395736176" y="262.76882078614244" width="80.95936042638255" height="44.77015323117939" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.013401785714285713"/></g><g><rect data-type="rect" data-label="schematic_component_18" data-x="-9.580000000000002" data-y="-20.325000000000003" x="519.0406395736176" y="397.8254497001999" width="80.95936042638255" height="44.77015323117939" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.013401785714285713"/></g><g><rect data-type="rect" data-label="U3" data-x="-16.0225" data-y="-17.025000000000002" x="65.36975349766828" y="164.6475682878082" width="26.862091938707408" height="18.654230512991262" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.013401785714285713"/></g><g><rect data-type="rect" data-label="netId: VBUS
|
|
2
|
+
globalConnNetId: connectivity_net3" data-x="-11.041500000000001" data-y="-16.929" x="428.08261159227186" y="151.14190539640208" width="44.77015323117939" height="31.339107261825575" fill="#ef444466" stroke="#ef4444" stroke-width="0.013401785714285713"/></g><g><rect data-type="rect" data-label="netId: D_PLUS
|
|
3
|
+
globalConnNetId: connectivity_net2" data-x="-10.921500000000002" data-y="-17.490000000000002" x="428.08261159227186" y="201.20986009327112" width="62.67821452365092" height="14.923384410393282" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.013401785714285713"/></g><g><rect data-type="rect" data-label="netId: D_MINUS
|
|
4
|
+
globalConnNetId: connectivity_net1" data-x="-10.861500000000001" data-y="-17.69" x="428.08261159227186" y="216.13324450366417" width="71.6322451698868" height="14.923384410393282" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.013401785714285713"/></g><g><rect data-type="rect" data-label="netId: CC1
|
|
5
|
+
globalConnNetId: connectivity_net4" data-x="-9.557500000000001" data-y="-18.04" x="543.2911392405065" y="242.24916722185185" width="35.8161225849434" height="14.923384410393282" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.013401785714285713"/></g><g><rect data-type="rect" data-label="netId: CC2
|
|
6
|
+
globalConnNetId: connectivity_net5" data-x="-11.101500000000001" data-y="-18.240000000000002" x="428.0826115922719" y="257.17255163224513" width="35.8161225849434" height="14.923384410393282" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.013401785714285713"/></g><g><rect data-type="rect" data-label="netId: CC2
|
|
7
|
+
globalConnNetId: connectivity_net5" data-x="-10.3885" data-y="-18.874" x="481.28447701532326" y="304.47968021319093" width="35.8161225849434" height="14.923384410393282" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.013401785714285713"/></g><g><rect data-type="rect" data-label="netId: GND
|
|
8
|
+
globalConnNetId: connectivity_net0" data-x="-9.797500000000001" data-y="-21.035000000000004" x="525.3830779480347" y="457.51898734177234" width="35.8161225849434" height="31.339107261825575" fill="#00000066" stroke="#000000" stroke-width="0.013401785714285713"/></g><g><circle data-type="point" data-label="schematic_port_83
|
|
9
|
+
x+" data-x="-11.342500000000001" data-y="-17.29" cx="428.00799467022" cy="193.74816788807448" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_84
|
|
10
|
+
x+" data-x="-11.342500000000001" data-y="-17.490000000000002" cx="428.00799467022" cy="208.67155229846776" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_85
|
|
11
|
+
x+" data-x="-11.342500000000001" data-y="-17.69" cx="428.00799467022" cy="223.5949367088608" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_86
|
|
12
|
+
x+" data-x="-11.342500000000001" data-y="-18.04" cx="428.00799467022" cy="249.7108594270485" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_87
|
|
13
|
+
x+" data-x="-11.342500000000001" data-y="-18.240000000000002" cx="428.00799467022" cy="264.6342438374418" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_88
|
|
14
|
+
x+" data-x="-11.342500000000001" data-y="-18.59" cx="428.00799467022" cy="290.75016655562945" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_89
|
|
15
|
+
x+" data-x="-11.342500000000001" data-y="-18.79" cx="428.00799467022" cy="305.6735509660225" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_90
|
|
16
|
+
x+" data-x="-11.342500000000001" data-y="-18.990000000000002" cx="428.00799467022" cy="320.5969353764158" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_91
|
|
17
|
+
y+" data-x="-9.797500000000001" data-y="-18.215" cx="543.2911392405065" cy="262.76882078614244" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_92
|
|
18
|
+
y-" data-x="-9.797500000000001" data-y="-18.815" cx="543.2911392405065" cy="307.53897401732183" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_93
|
|
19
|
+
y+" data-x="-9.797500000000001" data-y="-20.025000000000002" cx="543.2911392405065" cy="397.8254497001999" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_94
|
|
20
|
+
y-" data-x="-9.797500000000001" data-y="-20.625000000000004" cx="543.2911392405065" cy="442.5956029313793" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="anchorPoint
|
|
21
|
+
orientation: y+" data-x="-11.041500000000001" data-y="-17.139" cx="450.46768820786156" cy="182.48101265822766" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
|
|
22
|
+
orientation: x+" data-x="-11.342500000000001" data-y="-17.490000000000002" cx="428.00799467022" cy="208.67155229846776" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
|
|
23
|
+
orientation: x+" data-x="-11.342500000000001" data-y="-17.69" cx="428.00799467022" cy="223.5949367088608" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
|
|
24
|
+
orientation: x+" data-x="-9.797500000000001" data-y="-18.04" cx="543.2911392405065" cy="249.7108594270485" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
|
|
25
|
+
orientation: x+" data-x="-11.342500000000001" data-y="-18.240000000000002" cx="428.00799467022" cy="264.6342438374418" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
|
|
26
|
+
orientation: x-" data-x="-10.1485" data-y="-18.874" cx="517.1005996002667" cy="311.9413724183876" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
|
|
27
|
+
orientation: y-" data-x="-9.797500000000001" data-y="-20.825000000000003" cx="543.2911392405065" cy="457.51898734177234" 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[
|
|
28
|
+
document.currentScript.parentElement.addEventListener('mousemove', (e) => {
|
|
29
|
+
const svg = e.currentTarget;
|
|
30
|
+
const rect = svg.getBoundingClientRect();
|
|
31
|
+
const x = e.clientX - rect.left;
|
|
32
|
+
const y = e.clientY - rect.top;
|
|
33
|
+
const crosshair = svg.getElementById('crosshair');
|
|
34
|
+
const h = svg.getElementById('crosshair-h');
|
|
35
|
+
const v = svg.getElementById('crosshair-v');
|
|
36
|
+
const coords = svg.getElementById('coordinates');
|
|
37
|
+
|
|
38
|
+
crosshair.style.display = 'block';
|
|
39
|
+
h.setAttribute('x1', '0');
|
|
40
|
+
h.setAttribute('x2', '640');
|
|
41
|
+
h.setAttribute('y1', y);
|
|
42
|
+
h.setAttribute('y2', y);
|
|
43
|
+
v.setAttribute('x1', x);
|
|
44
|
+
v.setAttribute('x2', x);
|
|
45
|
+
v.setAttribute('y1', '0');
|
|
46
|
+
v.setAttribute('y2', '640');
|
|
47
|
+
|
|
48
|
+
// Calculate real coordinates using inverse transformation
|
|
49
|
+
const matrix = {"a":74.61692205196536,"c":0,"e":1274.3504330446372,"b":0,"d":-74.61692205196536,"f":-1096.3784143904065};
|
|
50
|
+
// Manually invert and apply the affine transform
|
|
51
|
+
// Since we only use translate and scale, we can directly compute:
|
|
52
|
+
// x' = (x - tx) / sx
|
|
53
|
+
// y' = (y - ty) / sy
|
|
54
|
+
const sx = matrix.a;
|
|
55
|
+
const sy = matrix.d;
|
|
56
|
+
const tx = matrix.e;
|
|
57
|
+
const ty = matrix.f;
|
|
58
|
+
const realPoint = {
|
|
59
|
+
x: (x - tx) / sx,
|
|
60
|
+
y: (y - ty) / sy // Flip y back since we used negative scale
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
coords.textContent = `(${realPoint.x.toFixed(2)}, ${realPoint.y.toFixed(2)})`;
|
|
64
|
+
coords.setAttribute('x', (x + 5).toString());
|
|
65
|
+
coords.setAttribute('y', (y - 5).toString());
|
|
66
|
+
});
|
|
67
|
+
document.currentScript.parentElement.addEventListener('mouseleave', () => {
|
|
68
|
+
document.currentScript.parentElement.getElementById('crosshair').style.display = 'none';
|
|
69
|
+
});
|
|
70
|
+
]]></script></svg>
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
{
|
|
2
|
+
"chips": [
|
|
3
|
+
{
|
|
4
|
+
"chipId": "schematic_component_16",
|
|
5
|
+
"center": {
|
|
6
|
+
"x": -13.9425,
|
|
7
|
+
"y": -18.14
|
|
8
|
+
},
|
|
9
|
+
"width": 5.199999999999999,
|
|
10
|
+
"height": 2,
|
|
11
|
+
"pins": [
|
|
12
|
+
{
|
|
13
|
+
"pinId": "schematic_port_83",
|
|
14
|
+
"x": -11.342500000000001,
|
|
15
|
+
"y": -17.29
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"pinId": "schematic_port_84",
|
|
19
|
+
"x": -11.342500000000001,
|
|
20
|
+
"y": -17.490000000000002
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"pinId": "schematic_port_85",
|
|
24
|
+
"x": -11.342500000000001,
|
|
25
|
+
"y": -17.69
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"pinId": "schematic_port_86",
|
|
29
|
+
"x": -11.342500000000001,
|
|
30
|
+
"y": -18.04
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"pinId": "schematic_port_87",
|
|
34
|
+
"x": -11.342500000000001,
|
|
35
|
+
"y": -18.240000000000002
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"pinId": "schematic_port_88",
|
|
39
|
+
"x": -11.342500000000001,
|
|
40
|
+
"y": -18.59
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"pinId": "schematic_port_89",
|
|
44
|
+
"x": -11.342500000000001,
|
|
45
|
+
"y": -18.79
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"pinId": "schematic_port_90",
|
|
49
|
+
"x": -11.342500000000001,
|
|
50
|
+
"y": -18.990000000000002
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
"sectionId": "usb"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"chipId": "schematic_component_17",
|
|
57
|
+
"center": {
|
|
58
|
+
"x": -9.580000000000002,
|
|
59
|
+
"y": -18.515
|
|
60
|
+
},
|
|
61
|
+
"width": 1.084999999999999,
|
|
62
|
+
"height": 0.6000000000000014,
|
|
63
|
+
"pins": [
|
|
64
|
+
{
|
|
65
|
+
"pinId": "schematic_port_91",
|
|
66
|
+
"x": -9.797500000000001,
|
|
67
|
+
"y": -18.215,
|
|
68
|
+
"_facingDirection": "y+"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"pinId": "schematic_port_92",
|
|
72
|
+
"x": -9.797500000000001,
|
|
73
|
+
"y": -18.815,
|
|
74
|
+
"_facingDirection": "y-"
|
|
75
|
+
}
|
|
76
|
+
],
|
|
77
|
+
"sectionId": "usb"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"chipId": "schematic_component_18",
|
|
81
|
+
"center": {
|
|
82
|
+
"x": -9.580000000000002,
|
|
83
|
+
"y": -20.325000000000003
|
|
84
|
+
},
|
|
85
|
+
"width": 1.084999999999999,
|
|
86
|
+
"height": 0.6000000000000014,
|
|
87
|
+
"pins": [
|
|
88
|
+
{
|
|
89
|
+
"pinId": "schematic_port_93",
|
|
90
|
+
"x": -9.797500000000001,
|
|
91
|
+
"y": -20.025000000000002,
|
|
92
|
+
"_facingDirection": "y+"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"pinId": "schematic_port_94",
|
|
96
|
+
"x": -9.797500000000001,
|
|
97
|
+
"y": -20.625000000000004,
|
|
98
|
+
"_facingDirection": "y-"
|
|
99
|
+
}
|
|
100
|
+
],
|
|
101
|
+
"sectionId": "usb"
|
|
102
|
+
}
|
|
103
|
+
],
|
|
104
|
+
"directConnections": [],
|
|
105
|
+
"netConnections": [
|
|
106
|
+
{
|
|
107
|
+
"netId": "GND",
|
|
108
|
+
"netLabelWidth": 0.42,
|
|
109
|
+
"netLabelHeight": 0.48,
|
|
110
|
+
"pinIds": [
|
|
111
|
+
"schematic_port_90",
|
|
112
|
+
"schematic_port_92",
|
|
113
|
+
"schematic_port_94"
|
|
114
|
+
]
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"netId": "D_MINUS",
|
|
118
|
+
"netLabelWidth": 0.96,
|
|
119
|
+
"pinIds": ["schematic_port_85"]
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"netId": "D_PLUS",
|
|
123
|
+
"netLabelWidth": 0.84,
|
|
124
|
+
"pinIds": ["schematic_port_84"]
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"netId": "VBUS",
|
|
128
|
+
"netLabelWidth": 0.42,
|
|
129
|
+
"netLabelHeight": 0.6,
|
|
130
|
+
"pinIds": ["schematic_port_83"]
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"netId": "CC1",
|
|
134
|
+
"netLabelWidth": 0.48,
|
|
135
|
+
"pinIds": ["schematic_port_86", "schematic_port_91"]
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"netId": "CC2",
|
|
139
|
+
"netLabelWidth": 0.48,
|
|
140
|
+
"pinIds": ["schematic_port_87", "schematic_port_93"]
|
|
141
|
+
}
|
|
142
|
+
],
|
|
143
|
+
"textBoxes": [
|
|
144
|
+
{
|
|
145
|
+
"chipId": "schematic_component_16",
|
|
146
|
+
"center": {
|
|
147
|
+
"x": -16.0225,
|
|
148
|
+
"y": -17.025000000000002
|
|
149
|
+
},
|
|
150
|
+
"width": 0.35999999999999943,
|
|
151
|
+
"height": 0.25,
|
|
152
|
+
"text": "U3"
|
|
153
|
+
}
|
|
154
|
+
],
|
|
155
|
+
"availableNetLabelOrientations": {
|
|
156
|
+
"D_MINUS": ["x-", "x+"],
|
|
157
|
+
"D_PLUS": ["x-", "x+"],
|
|
158
|
+
"GND": ["y-"],
|
|
159
|
+
"VBUS": ["y+"],
|
|
160
|
+
"CC1": ["x-", "x+"],
|
|
161
|
+
"CC2": ["x-", "x+"]
|
|
162
|
+
},
|
|
163
|
+
"maxMspPairDistance": 2.4
|
|
164
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { expect, test } from "bun:test"
|
|
2
|
+
import { SchematicTracePipelineSolver } from "lib/solvers/SchematicTracePipelineSolver/SchematicTracePipelineSolver"
|
|
3
|
+
import type { SolvedTracePath } from "lib/solvers/SchematicTraceLinesSolver/SchematicTraceLinesSolver"
|
|
4
|
+
import inputProblem from "./assets/repro-rp2040-usb-cc2-ground-overlap.input.json"
|
|
5
|
+
|
|
6
|
+
const EPS = 1e-6
|
|
7
|
+
|
|
8
|
+
const pathsHavePositiveLengthCollinearOverlap = (
|
|
9
|
+
first: SolvedTracePath,
|
|
10
|
+
second: SolvedTracePath,
|
|
11
|
+
) => {
|
|
12
|
+
for (
|
|
13
|
+
let firstIndex = 0;
|
|
14
|
+
firstIndex < first.tracePath.length - 1;
|
|
15
|
+
firstIndex++
|
|
16
|
+
) {
|
|
17
|
+
const firstStart = first.tracePath[firstIndex]!
|
|
18
|
+
const firstEnd = first.tracePath[firstIndex + 1]!
|
|
19
|
+
const firstIsVertical = Math.abs(firstStart.x - firstEnd.x) < EPS
|
|
20
|
+
const firstIsHorizontal = Math.abs(firstStart.y - firstEnd.y) < EPS
|
|
21
|
+
|
|
22
|
+
for (
|
|
23
|
+
let secondIndex = 0;
|
|
24
|
+
secondIndex < second.tracePath.length - 1;
|
|
25
|
+
secondIndex++
|
|
26
|
+
) {
|
|
27
|
+
const secondStart = second.tracePath[secondIndex]!
|
|
28
|
+
const secondEnd = second.tracePath[secondIndex + 1]!
|
|
29
|
+
const secondIsVertical = Math.abs(secondStart.x - secondEnd.x) < EPS
|
|
30
|
+
const secondIsHorizontal = Math.abs(secondStart.y - secondEnd.y) < EPS
|
|
31
|
+
|
|
32
|
+
if (
|
|
33
|
+
firstIsVertical &&
|
|
34
|
+
secondIsVertical &&
|
|
35
|
+
Math.abs(firstStart.x - secondStart.x) < EPS
|
|
36
|
+
) {
|
|
37
|
+
const overlapLength =
|
|
38
|
+
Math.min(
|
|
39
|
+
Math.max(firstStart.y, firstEnd.y),
|
|
40
|
+
Math.max(secondStart.y, secondEnd.y),
|
|
41
|
+
) -
|
|
42
|
+
Math.max(
|
|
43
|
+
Math.min(firstStart.y, firstEnd.y),
|
|
44
|
+
Math.min(secondStart.y, secondEnd.y),
|
|
45
|
+
)
|
|
46
|
+
if (overlapLength > EPS) return true
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (
|
|
50
|
+
firstIsHorizontal &&
|
|
51
|
+
secondIsHorizontal &&
|
|
52
|
+
Math.abs(firstStart.y - secondStart.y) < EPS
|
|
53
|
+
) {
|
|
54
|
+
const overlapLength =
|
|
55
|
+
Math.min(
|
|
56
|
+
Math.max(firstStart.x, firstEnd.x),
|
|
57
|
+
Math.max(secondStart.x, secondEnd.x),
|
|
58
|
+
) -
|
|
59
|
+
Math.max(
|
|
60
|
+
Math.min(firstStart.x, firstEnd.x),
|
|
61
|
+
Math.min(secondStart.x, secondEnd.x),
|
|
62
|
+
)
|
|
63
|
+
if (overlapLength > EPS) return true
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return false
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
test("avoids RP2040 USB-C CC2 label connector overlapping GND", () => {
|
|
72
|
+
const solver = new SchematicTracePipelineSolver(inputProblem as any)
|
|
73
|
+
|
|
74
|
+
solver.solve()
|
|
75
|
+
expect(solver).toMatchSolverSnapshot(import.meta.path)
|
|
76
|
+
|
|
77
|
+
const traces = solver.netLabelTraceCollisionSolver!.getOutput().traces
|
|
78
|
+
const cc2LabelConnector = traces.find(
|
|
79
|
+
(trace) =>
|
|
80
|
+
trace.userNetId === "CC2" &&
|
|
81
|
+
trace.mspPairId.startsWith("available-net-orientation-"),
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
expect(cc2LabelConnector).toBeDefined()
|
|
85
|
+
|
|
86
|
+
const overlappingDifferentNetTraceIds = traces
|
|
87
|
+
.filter(
|
|
88
|
+
(trace) =>
|
|
89
|
+
trace.globalConnNetId !== cc2LabelConnector!.globalConnNetId &&
|
|
90
|
+
pathsHavePositiveLengthCollinearOverlap(trace, cc2LabelConnector!),
|
|
91
|
+
)
|
|
92
|
+
.map((trace) => trace.mspPairId)
|
|
93
|
+
|
|
94
|
+
expect(overlappingDifferentNetTraceIds).toEqual([])
|
|
95
|
+
})
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { expect, test } from "bun:test"
|
|
2
|
+
import { SchematicTraceSingleLineSolver2 } from "lib/solvers/SchematicTraceLinesSolver/SchematicTraceSingleLineSolver2/SchematicTraceSingleLineSolver2"
|
|
3
|
+
import type { InputChip, InputProblem } from "lib/types/InputProblem"
|
|
4
|
+
|
|
5
|
+
const getOrthogonalPathLength = (points: Array<{ x: number; y: number }>) =>
|
|
6
|
+
points.slice(0, -1).reduce((length, point, pointIndex) => {
|
|
7
|
+
const nextPoint = points[pointIndex + 1]!
|
|
8
|
+
return (
|
|
9
|
+
length + Math.abs(nextPoint.x - point.x) + Math.abs(nextPoint.y - point.y)
|
|
10
|
+
)
|
|
11
|
+
}, 0)
|
|
12
|
+
|
|
13
|
+
test("repro47 uses a minimal route between nearby opposing pins", async () => {
|
|
14
|
+
const diode: InputChip = {
|
|
15
|
+
chipId: "D2",
|
|
16
|
+
center: { x: 3.2, y: 0.095 },
|
|
17
|
+
width: 0.4,
|
|
18
|
+
height: 0.2,
|
|
19
|
+
pins: [{ pinId: "D2.cathode", x: 3.4, y: 0.095 }],
|
|
20
|
+
}
|
|
21
|
+
const pushButton: InputChip = {
|
|
22
|
+
chipId: "SW2",
|
|
23
|
+
center: { x: 3.81, y: 0.045 },
|
|
24
|
+
width: 0.4,
|
|
25
|
+
height: 0.2,
|
|
26
|
+
pins: [{ pinId: "SW2.pin1", x: 3.61, y: 0.045 }],
|
|
27
|
+
}
|
|
28
|
+
const pins: ConstructorParameters<
|
|
29
|
+
typeof SchematicTraceSingleLineSolver2
|
|
30
|
+
>[0]["pins"] = [
|
|
31
|
+
{
|
|
32
|
+
pinId: "D2.cathode",
|
|
33
|
+
chipId: diode.chipId,
|
|
34
|
+
x: 3.4,
|
|
35
|
+
y: 0.095,
|
|
36
|
+
_facingDirection: "x+" as const,
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
pinId: "SW2.pin1",
|
|
40
|
+
chipId: pushButton.chipId,
|
|
41
|
+
x: 3.61,
|
|
42
|
+
y: 0.045,
|
|
43
|
+
_facingDirection: "x-" as const,
|
|
44
|
+
},
|
|
45
|
+
]
|
|
46
|
+
const inputProblem: InputProblem = {
|
|
47
|
+
chips: [diode, pushButton],
|
|
48
|
+
directConnections: [{ pinIds: [pins[0].pinId, pins[1].pinId] }],
|
|
49
|
+
netConnections: [],
|
|
50
|
+
availableNetLabelOrientations: {},
|
|
51
|
+
}
|
|
52
|
+
const solver = new SchematicTraceSingleLineSolver2({
|
|
53
|
+
pins,
|
|
54
|
+
chipMap: { [diode.chipId]: diode, [pushButton.chipId]: pushButton },
|
|
55
|
+
inputProblem,
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
solver.solve()
|
|
59
|
+
|
|
60
|
+
expect(solver.solved).toBe(true)
|
|
61
|
+
expect(getOrthogonalPathLength(solver.solvedTracePath!)).toBeCloseTo(0.26)
|
|
62
|
+
await expect(solver).toMatchSolverSnapshot(import.meta.path)
|
|
63
|
+
})
|
|
@@ -0,0 +1,46 @@
|
|
|
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="3.4,0.095 3.61,0.045" data-type="line" data-label="" points="261.78217821782187,306.13861386138615 378.21782178217813,333.86138613861385" fill="none" stroke="hsl(112, 100%, 50%, 0.1)" stroke-width="1px"/></g><g><polyline data-points="3.4,0.095 3.465,0.095 3.505,0.095 3.505,0.045 3.545,0.045 3.61,0.045" data-type="line" data-label="" points="261.78217821782187,306.13861386138615 297.82178217821775,306.13861386138615 320,306.13861386138615 320,333.86138613861385 342.17821782178225,333.86138613861385 378.21782178217813,333.86138613861385" fill="none" stroke="red" stroke-width="1px" stroke-dasharray="4 4"/></g><g><polyline data-points="3.4,0.095 3.61,0.045" data-type="line" data-label="" points="261.78217821782187,306.13861386138615 378.21782178217813,333.86138613861385" fill="none" stroke="blue" stroke-width="1px" stroke-dasharray="5 5"/></g><g><polyline data-points="3.4,0.095 3.465,0.095 3.505,0.095 3.505,0.045 3.545,0.045 3.61,0.045" data-type="line" data-label="" points="261.78217821782187,306.13861386138615 297.82178217821775,306.13861386138615 320,306.13861386138615 320,333.86138613861385 342.17821782178225,333.86138613861385 378.21782178217813,333.86138613861385" fill="none" stroke="green" stroke-width="1px"/></g><g><rect data-type="rect" data-label="D2" data-x="3.2" data-y="0.095" x="40" y="250.69306930693068" width="221.7821782178221" height="110.89108910891093" fill="hsl(358, 100%, 50%, 0.1)" stroke="black" stroke-width="0.0018035714285714283"/></g><g><rect data-type="rect" data-label="SW2" data-x="3.81" data-y="0.045" x="378.21782178217825" y="278.41584158415844" width="221.78217821782187" height="110.89108910891088" fill="hsl(70, 100%, 50%, 0.1)" stroke="black" stroke-width="0.0018035714285714283"/></g><g><circle data-type="point" data-label="D2.cathode
|
|
2
|
+
x+" data-x="3.4" data-y="0.095" cx="261.78217821782187" cy="306.13861386138615" r="3" fill="hsl(22, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="SW2.pin1
|
|
3
|
+
x-" data-x="3.61" data-y="0.045" cx="378.21782178217813" cy="333.86138613861385" r="3" fill="hsl(12, 100%, 50%, 0.8)"/></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[
|
|
4
|
+
document.currentScript.parentElement.addEventListener('mousemove', (e) => {
|
|
5
|
+
const svg = e.currentTarget;
|
|
6
|
+
const rect = svg.getBoundingClientRect();
|
|
7
|
+
const x = e.clientX - rect.left;
|
|
8
|
+
const y = e.clientY - rect.top;
|
|
9
|
+
const crosshair = svg.getElementById('crosshair');
|
|
10
|
+
const h = svg.getElementById('crosshair-h');
|
|
11
|
+
const v = svg.getElementById('crosshair-v');
|
|
12
|
+
const coords = svg.getElementById('coordinates');
|
|
13
|
+
|
|
14
|
+
crosshair.style.display = 'block';
|
|
15
|
+
h.setAttribute('x1', '0');
|
|
16
|
+
h.setAttribute('x2', '640');
|
|
17
|
+
h.setAttribute('y1', y);
|
|
18
|
+
h.setAttribute('y2', y);
|
|
19
|
+
v.setAttribute('x1', x);
|
|
20
|
+
v.setAttribute('x2', x);
|
|
21
|
+
v.setAttribute('y1', '0');
|
|
22
|
+
v.setAttribute('y2', '640');
|
|
23
|
+
|
|
24
|
+
// Calculate real coordinates using inverse transformation
|
|
25
|
+
const matrix = {"a":554.4554455445545,"c":0,"e":-1623.3663366336636,"b":0,"d":-554.4554455445545,"f":358.81188118811883};
|
|
26
|
+
// Manually invert and apply the affine transform
|
|
27
|
+
// Since we only use translate and scale, we can directly compute:
|
|
28
|
+
// x' = (x - tx) / sx
|
|
29
|
+
// y' = (y - ty) / sy
|
|
30
|
+
const sx = matrix.a;
|
|
31
|
+
const sy = matrix.d;
|
|
32
|
+
const tx = matrix.e;
|
|
33
|
+
const ty = matrix.f;
|
|
34
|
+
const realPoint = {
|
|
35
|
+
x: (x - tx) / sx,
|
|
36
|
+
y: (y - ty) / sy // Flip y back since we used negative scale
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
coords.textContent = `(${realPoint.x.toFixed(2)}, ${realPoint.y.toFixed(2)})`;
|
|
40
|
+
coords.setAttribute('x', (x + 5).toString());
|
|
41
|
+
coords.setAttribute('y', (y - 5).toString());
|
|
42
|
+
});
|
|
43
|
+
document.currentScript.parentElement.addEventListener('mouseleave', () => {
|
|
44
|
+
document.currentScript.parentElement.getElementById('crosshair').style.display = 'none';
|
|
45
|
+
});
|
|
46
|
+
]]></script></svg>
|