@tscircuit/schematic-trace-solver 0.0.161 → 0.0.162
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -0
- package/dist/index.js +50 -21
- package/lib/solvers/MspConnectionPairSolver/MspConnectionPairSolver.ts +28 -21
- package/lib/solvers/MspConnectionPairSolver/getMspConnectionPairsFromPins.ts +3 -3
- package/lib/solvers/MspConnectionPairSolver/shouldSeparateGroundNetRows.ts +40 -0
- package/lib/types/InputProblem.ts +3 -0
- package/package.json +1 -1
- package/tests/repros/__snapshots__/repro-bluetooth-controller-ground-decoupling-groups.snap.svg +41 -32
- package/tests/solvers/MspConnectionPairSolver/msp-connection-pair-solver-ground-net-rows.test.ts +57 -0
package/dist/index.d.ts
CHANGED
|
@@ -141,6 +141,8 @@ interface InputDirectConnection {
|
|
|
141
141
|
interface InputNetConnection {
|
|
142
142
|
netId: string;
|
|
143
143
|
pinIds: Array<PinId>;
|
|
144
|
+
/** True when the authoritative source net is electrical ground. */
|
|
145
|
+
isGround?: boolean;
|
|
144
146
|
/**
|
|
145
147
|
* User-facing text to render for this net label. `netId` remains the stable
|
|
146
148
|
* connectivity identifier and may be an internal id. When this is omitted
|
package/dist/index.js
CHANGED
|
@@ -539,6 +539,30 @@ var getLabeledConnectionRouteReason = ({
|
|
|
539
539
|
};
|
|
540
540
|
var isLabeledPeripheralConnection = (params) => getLabeledConnectionRouteReason(params) !== null;
|
|
541
541
|
|
|
542
|
+
// lib/solvers/MspConnectionPairSolver/shouldSeparateGroundNetRows.ts
|
|
543
|
+
var SAME_RAIL_Y_TOLERANCE = 1e-6;
|
|
544
|
+
var MIN_GROUPED_RAIL_PIN_COUNT = 3;
|
|
545
|
+
function isGroupedHorizontalRail({
|
|
546
|
+
pin,
|
|
547
|
+
netPins
|
|
548
|
+
}) {
|
|
549
|
+
const sameRailPins = netPins.filter(
|
|
550
|
+
(otherPin) => Math.abs(otherPin.y - pin.y) <= SAME_RAIL_Y_TOLERANCE
|
|
551
|
+
);
|
|
552
|
+
const railChipIds = new Set(sameRailPins.map((railPin) => railPin.chipId));
|
|
553
|
+
return railChipIds.size >= MIN_GROUPED_RAIL_PIN_COUNT;
|
|
554
|
+
}
|
|
555
|
+
function shouldSeparateGroundNetRows({
|
|
556
|
+
netConnection,
|
|
557
|
+
netPins,
|
|
558
|
+
pin1,
|
|
559
|
+
pin2
|
|
560
|
+
}) {
|
|
561
|
+
if (!netConnection?.isGround || pin1.chipId === pin2.chipId) return false;
|
|
562
|
+
if (Math.abs(pin1.y - pin2.y) <= SAME_RAIL_Y_TOLERANCE) return false;
|
|
563
|
+
return isGroupedHorizontalRail({ pin: pin1, netPins }) && isGroupedHorizontalRail({ pin: pin2, netPins });
|
|
564
|
+
}
|
|
565
|
+
|
|
542
566
|
// lib/solvers/MspConnectionPairSolver/MspConnectionPairSolver.ts
|
|
543
567
|
var DEFAULT_MAX_MSP_PAIR_DISTANCE = 1;
|
|
544
568
|
var getPinPairKey = (pinIds) => [...pinIds].sort().join("::");
|
|
@@ -643,36 +667,41 @@ var MspConnectionPairSolver = class extends BaseSolver {
|
|
|
643
667
|
return;
|
|
644
668
|
}
|
|
645
669
|
const globalConnNetId = this.globalConnMap.getNetConnectedToId(pin1);
|
|
646
|
-
const
|
|
670
|
+
const userNetId2 = this.userNetIdByPinId[pin1] ?? this.userNetIdByPinId[pin2];
|
|
647
671
|
const suppressNetLabel = pairDistance > this.maxMspPairDistance && labeledConnectionRouteReason === "overlapping-fallback-labels";
|
|
648
672
|
this.addMspConnectionPair({
|
|
649
673
|
mspPairId: `${pin1}-${pin2}`,
|
|
650
674
|
dcConnNetId: dcNetId,
|
|
651
675
|
globalConnNetId,
|
|
652
|
-
userNetId,
|
|
676
|
+
userNetId: userNetId2,
|
|
653
677
|
suppressNetLabel,
|
|
654
678
|
pins: [p1, p2]
|
|
655
679
|
});
|
|
656
680
|
return;
|
|
657
681
|
}
|
|
658
682
|
const pinIdMap = new Map(Object.entries(this.pinMap));
|
|
659
|
-
const
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
683
|
+
const userNetId = this.userNetIdByPinId[directlyConnectedPins[0]];
|
|
684
|
+
const netConnection = this.inputProblem.netConnections.find(
|
|
685
|
+
(connection) => connection.netId === userNetId
|
|
686
|
+
);
|
|
687
|
+
const directlyConnectedPinObjects = directlyConnectedPins.map(
|
|
688
|
+
(pinId) => this.pinMap[pinId]
|
|
689
|
+
);
|
|
690
|
+
const msp = getOrthogonalMinimumSpanningTree(directlyConnectedPinObjects, {
|
|
691
|
+
maxDistance: this.maxMspPairDistance,
|
|
692
|
+
forbidEdge: (a, b) => !this.canRouteGroundPair(a.pinId, b.pinId) || shouldSeparateGroundNetRows({
|
|
693
|
+
netConnection,
|
|
694
|
+
netPins: directlyConnectedPinObjects,
|
|
695
|
+
pin1: a,
|
|
696
|
+
pin2: b
|
|
697
|
+
}) || arePinsInDifferentSchematicSections(this.inputProblem, a, b) || doesPairCrossRestrictedCenterLines({
|
|
698
|
+
inputProblem: this.inputProblem,
|
|
699
|
+
chipMap: this.chipMap,
|
|
700
|
+
pinIdMap,
|
|
701
|
+
p1: a,
|
|
702
|
+
p2: b
|
|
703
|
+
})
|
|
704
|
+
});
|
|
676
705
|
for (const [pin1, pin2] of msp) {
|
|
677
706
|
const p1Obj = this.pinMap[pin1];
|
|
678
707
|
const p2Obj = this.pinMap[pin2];
|
|
@@ -689,12 +718,12 @@ var MspConnectionPairSolver = class extends BaseSolver {
|
|
|
689
718
|
continue;
|
|
690
719
|
}
|
|
691
720
|
const globalConnNetId = this.globalConnMap.getNetConnectedToId(pin1);
|
|
692
|
-
const
|
|
721
|
+
const pairUserNetId = this.userNetIdByPinId[pin1] ?? this.userNetIdByPinId[pin2];
|
|
693
722
|
this.addMspConnectionPair({
|
|
694
723
|
mspPairId: `${pin1}-${pin2}`,
|
|
695
724
|
dcConnNetId: dcNetId,
|
|
696
725
|
globalConnNetId,
|
|
697
|
-
userNetId,
|
|
726
|
+
userNetId: pairUserNetId,
|
|
698
727
|
pins: [p1Obj, p2Obj]
|
|
699
728
|
});
|
|
700
729
|
}
|
|
@@ -16,6 +16,7 @@ import { getConnectivityMapsFromInputProblem } from "./getConnectivityMapFromInp
|
|
|
16
16
|
import { getGroundConnectionPolicy } from "./getGroundConnectionPolicy"
|
|
17
17
|
import { getOrthogonalMinimumSpanningTree } from "./getMspConnectionPairsFromPins"
|
|
18
18
|
import { getLabeledConnectionRouteReason } from "./isLabeledPeripheralConnection"
|
|
19
|
+
import { shouldSeparateGroundNetRows } from "./shouldSeparateGroundNetRows"
|
|
19
20
|
|
|
20
21
|
export type MspConnectionPairId = string
|
|
21
22
|
export const DEFAULT_MAX_MSP_PAIR_DISTANCE = 1
|
|
@@ -194,26 +195,32 @@ export class MspConnectionPairSolver extends BaseSolver {
|
|
|
194
195
|
PinId,
|
|
195
196
|
InputPin & { chipId: string }
|
|
196
197
|
>
|
|
197
|
-
const
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
maxDistance: this.maxMspPairDistance,
|
|
201
|
-
forbidEdge: (a, b) =>
|
|
202
|
-
!this.canRouteGroundPair(a.pinId, b.pinId) ||
|
|
203
|
-
arePinsInDifferentSchematicSections(
|
|
204
|
-
this.inputProblem,
|
|
205
|
-
a as InputPin & { chipId: string },
|
|
206
|
-
b as InputPin & { chipId: string },
|
|
207
|
-
) ||
|
|
208
|
-
doesPairCrossRestrictedCenterLines({
|
|
209
|
-
inputProblem: this.inputProblem,
|
|
210
|
-
chipMap: this.chipMap,
|
|
211
|
-
pinIdMap,
|
|
212
|
-
p1: a as InputPin & { chipId: string },
|
|
213
|
-
p2: b as InputPin & { chipId: string },
|
|
214
|
-
}),
|
|
215
|
-
},
|
|
198
|
+
const userNetId = this.userNetIdByPinId[directlyConnectedPins[0]!]
|
|
199
|
+
const netConnection = this.inputProblem.netConnections.find(
|
|
200
|
+
(connection) => connection.netId === userNetId,
|
|
216
201
|
)
|
|
202
|
+
const directlyConnectedPinObjects = directlyConnectedPins.map(
|
|
203
|
+
(pinId) => this.pinMap[pinId]!,
|
|
204
|
+
)
|
|
205
|
+
const msp = getOrthogonalMinimumSpanningTree(directlyConnectedPinObjects, {
|
|
206
|
+
maxDistance: this.maxMspPairDistance,
|
|
207
|
+
forbidEdge: (a, b) =>
|
|
208
|
+
!this.canRouteGroundPair(a.pinId, b.pinId) ||
|
|
209
|
+
shouldSeparateGroundNetRows({
|
|
210
|
+
netConnection,
|
|
211
|
+
netPins: directlyConnectedPinObjects,
|
|
212
|
+
pin1: a,
|
|
213
|
+
pin2: b,
|
|
214
|
+
}) ||
|
|
215
|
+
arePinsInDifferentSchematicSections(this.inputProblem, a, b) ||
|
|
216
|
+
doesPairCrossRestrictedCenterLines({
|
|
217
|
+
inputProblem: this.inputProblem,
|
|
218
|
+
chipMap: this.chipMap,
|
|
219
|
+
pinIdMap,
|
|
220
|
+
p1: a,
|
|
221
|
+
p2: b,
|
|
222
|
+
}),
|
|
223
|
+
})
|
|
217
224
|
|
|
218
225
|
for (const [pin1, pin2] of msp) {
|
|
219
226
|
const p1Obj = this.pinMap[pin1!]!
|
|
@@ -237,13 +244,13 @@ export class MspConnectionPairSolver extends BaseSolver {
|
|
|
237
244
|
}
|
|
238
245
|
|
|
239
246
|
const globalConnNetId = this.globalConnMap.getNetConnectedToId(pin1!)!
|
|
240
|
-
const
|
|
247
|
+
const pairUserNetId =
|
|
241
248
|
this.userNetIdByPinId[pin1!] ?? this.userNetIdByPinId[pin2!]
|
|
242
249
|
this.addMspConnectionPair({
|
|
243
250
|
mspPairId: `${pin1}-${pin2}`,
|
|
244
251
|
dcConnNetId: dcNetId,
|
|
245
252
|
globalConnNetId,
|
|
246
|
-
userNetId,
|
|
253
|
+
userNetId: pairUserNetId,
|
|
247
254
|
pins: [p1Obj, p2Obj],
|
|
248
255
|
})
|
|
249
256
|
}
|
|
@@ -16,11 +16,11 @@ import type { InputPin, PinId } from "lib/types/InputProblem"
|
|
|
16
16
|
* - When multiple candidates have the same distance, we pick the one
|
|
17
17
|
* whose pinId is lexicographically smallest (for stable output).
|
|
18
18
|
*/
|
|
19
|
-
export function getOrthogonalMinimumSpanningTree(
|
|
20
|
-
pins:
|
|
19
|
+
export function getOrthogonalMinimumSpanningTree<Pin extends InputPin>(
|
|
20
|
+
pins: Pin[],
|
|
21
21
|
opts: {
|
|
22
22
|
maxDistance?: number
|
|
23
|
-
forbidEdge?: (a:
|
|
23
|
+
forbidEdge?: (a: Pin, b: Pin) => boolean
|
|
24
24
|
} = {},
|
|
25
25
|
): Array<[PinId, PinId]> {
|
|
26
26
|
const n = pins.length
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { InputNetConnection, InputPin } from "lib/types/InputProblem"
|
|
2
|
+
|
|
3
|
+
const SAME_RAIL_Y_TOLERANCE = 1e-6
|
|
4
|
+
const MIN_GROUPED_RAIL_PIN_COUNT = 3
|
|
5
|
+
|
|
6
|
+
function isGroupedHorizontalRail({
|
|
7
|
+
pin,
|
|
8
|
+
netPins,
|
|
9
|
+
}: {
|
|
10
|
+
pin: InputPin & { chipId: string }
|
|
11
|
+
netPins: Array<InputPin & { chipId: string }>
|
|
12
|
+
}) {
|
|
13
|
+
// Multiple pins from one symbol do not establish a grouped component rail.
|
|
14
|
+
const sameRailPins = netPins.filter(
|
|
15
|
+
(otherPin) => Math.abs(otherPin.y - pin.y) <= SAME_RAIL_Y_TOLERANCE,
|
|
16
|
+
)
|
|
17
|
+
const railChipIds = new Set(sameRailPins.map((railPin) => railPin.chipId))
|
|
18
|
+
return railChipIds.size >= MIN_GROUPED_RAIL_PIN_COUNT
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function shouldSeparateGroundNetRows({
|
|
22
|
+
netConnection,
|
|
23
|
+
netPins,
|
|
24
|
+
pin1,
|
|
25
|
+
pin2,
|
|
26
|
+
}: {
|
|
27
|
+
netConnection?: InputNetConnection
|
|
28
|
+
netPins: Array<InputPin & { chipId: string }>
|
|
29
|
+
pin1: InputPin & { chipId: string }
|
|
30
|
+
pin2: InputPin & { chipId: string }
|
|
31
|
+
}) {
|
|
32
|
+
if (!netConnection?.isGround || pin1.chipId === pin2.chipId) return false
|
|
33
|
+
if (Math.abs(pin1.y - pin2.y) <= SAME_RAIL_Y_TOLERANCE) return false
|
|
34
|
+
|
|
35
|
+
// Net labels preserve ground connectivity without a cross-row MSP edge.
|
|
36
|
+
return (
|
|
37
|
+
isGroupedHorizontalRail({ pin: pin1, netPins }) &&
|
|
38
|
+
isGroupedHorizontalRail({ pin: pin2, netPins })
|
|
39
|
+
)
|
|
40
|
+
}
|
|
@@ -98,6 +98,9 @@ export interface InputNetConnection {
|
|
|
98
98
|
netId: string
|
|
99
99
|
pinIds: Array<PinId>
|
|
100
100
|
|
|
101
|
+
/** True when the authoritative source net is electrical ground. */
|
|
102
|
+
isGround?: boolean
|
|
103
|
+
|
|
101
104
|
/**
|
|
102
105
|
* User-facing text to render for this net label. `netId` remains the stable
|
|
103
106
|
* connectivity identifier and may be an internal id. When this is omitted
|
package/package.json
CHANGED
package/tests/repros/__snapshots__/repro-bluetooth-controller-ground-decoupling-groups.snap.svg
CHANGED
|
@@ -1,29 +1,31 @@
|
|
|
1
1
|
<svg width="1200" height="2016" viewBox="0 0 1200 2016" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Solver debug visualization on top and Circuit JSON schematic on the bottom">
|
|
2
2
|
<g transform="translate(0, 0) scale(1.875, 1.875) translate(0, 0)">
|
|
3
|
-
<rect width="100%" height="100%" fill="white"/><g><polyline data-points="7.3,4.48 7.3,4.680000000000001 5.7,4.680000000000001 5.7,4.48" data-type="line" data-label="" points="232.45599329421634,112.
|
|
4
|
-
globalConnNetId: connectivity_net0" data-x="8.9" data-y="4.890000000000001" x="343.23554065381404" y="54.
|
|
5
|
-
globalConnNetId: connectivity_net1" data-x="
|
|
6
|
-
globalConnNetId:
|
|
3
|
+
<rect width="100%" height="100%" fill="white"/><g><polyline data-points="7.3,4.48 7.3,4.680000000000001 5.7,4.680000000000001 5.7,4.48" data-type="line" data-label="" points="232.45599329421634,112.99245599329413 232.45599329421634,94.2162615255657 82.24643755238901,94.2162615255657 82.24643755238901,112.99245599329413" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="8.9,4.48 8.9,4.680000000000001 7.3,4.680000000000001 7.3,4.48" data-type="line" data-label="" points="382.66554903604367,112.99245599329413 382.66554903604367,94.2162615255657 232.45599329421634,94.2162615255657 232.45599329421634,112.99245599329413" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="10.5,4.48 10.5,4.68 8.9,4.68 8.9,4.48" data-type="line" data-label="" points="532.875104777871,112.99245599329413 532.875104777871,94.21626152556576 382.66554903604367,94.21626152556576 382.66554903604367,112.99245599329413" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="7.3,3.719999999999999 7.3,3.5199999999999987 5.7,3.5199999999999987 5.7,3.719999999999999" data-type="line" data-label="" points="232.45599329421634,184.34199497066226 232.45599329421634,203.1181894383907 82.24643755238901,203.1181894383907 82.24643755238901,184.34199497066226" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="8.9,3.719999999999999 8.9,3.5199999999999987 7.3,3.5199999999999987 7.3,3.719999999999999" data-type="line" data-label="" points="382.66554903604367,184.34199497066226 382.66554903604367,203.1181894383907 232.45599329421634,203.1181894383907 232.45599329421634,184.34199497066226" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="10.5,3.719999999999999 10.5,3.5199999999999996 8.9,3.5199999999999996 8.9,3.719999999999999" data-type="line" data-label="" points="532.875104777871,184.34199497066226 532.875104777871,203.11818943839057 382.66554903604367,203.11818943839057 382.66554903604367,184.34199497066226" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="6.5,0.06999999999999995 6.5,-0.13000000000000023 8.2,-0.13000000000000023 8.2,0.06999999999999995" data-type="line" data-label="" points="157.35121542330262,527.0075440067058 157.35121542330262,545.7837384744341 316.94886839899414,545.7837384744341 316.94886839899414,527.0075440067058" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="10.5,0.06999999999999995 10.5,-0.12999999999999934 8.2,-0.12999999999999934 8.2,0.06999999999999995" data-type="line" data-label="" points="532.875104777871,527.0075440067058 532.875104777871,545.7837384744341 316.94886839899414,545.7837384744341 316.94886839899414,527.0075440067058" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="6.5,0.8300000000000001 6.5,1.0300000000000002 8.2,1.0300000000000002 8.2,0.8300000000000001" data-type="line" data-label="" points="157.35121542330262,455.65800502933774 157.35121542330262,436.8818105616093 316.94886839899414,436.8818105616093 316.94886839899414,455.65800502933774" fill="none" stroke="purple" stroke-width="1px"/></g><g><rect data-type="rect" data-label="schematic_component_0" data-x="5.8325" data-y="4.1" x="40.000000000000085" y="112.9924559932941" width="109.37133277451795" height="71.34953897736813" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.010651785714285714"/></g><g><rect data-type="rect" data-label="schematic_component_1" data-x="7.4325" data-y="4.1" x="190.20955574182733" y="112.9924559932941" width="109.37133277451812" height="71.34953897736813" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.010651785714285714"/></g><g><rect data-type="rect" data-label="schematic_component_2" data-x="9.0325" data-y="4.1" x="340.4191114836547" y="112.9924559932941" width="109.37133277451801" height="71.34953897736813" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.010651785714285714"/></g><g><rect data-type="rect" data-label="schematic_component_3" data-x="10.6325" data-y="4.1" x="490.62866722548205" y="112.9924559932941" width="109.37133277451801" height="71.34953897736813" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.010651785714285714"/></g><g><rect data-type="rect" data-label="schematic_component_4" data-x="6.5125" data-y="0.45" x="115.10477787091372" y="455.6580050293377" width="86.83989941324398" height="71.34953897736801" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.010651785714285714"/></g><g><rect data-type="rect" data-label="schematic_component_5" data-x="8.212499999999999" data-y="0.45" x="274.7024308466051" y="455.6580050293377" width="86.83989941324398" height="71.34953897736801" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.010651785714285714"/></g><g><rect data-type="rect" data-label="schematic_component_6" data-x="10.5125" data-y="0.45" x="490.62866722548205" y="455.6580050293377" width="86.83989941324364" height="71.34953897736801" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.010651785714285714"/></g><g><rect data-type="rect" data-label="netId: VDD_IO
|
|
4
|
+
globalConnNetId: connectivity_net0" data-x="8.9" data-y="4.890000000000001" x="343.23554065381404" y="54.78625314333598" width="78.86001676445926" height="39.43000838222969" fill="#ef444466" stroke="#ef4444" stroke-width="0.010651785714285714"/></g><g><rect data-type="rect" data-label="netId: GND
|
|
5
|
+
globalConnNetId: connectivity_net1" data-x="8.9" data-y="3.3099999999999987" x="360.13411567476953" y="203.1181894383907" width="45.06286672254828" height="39.43000838222963" fill="#00000066" stroke="#000000" stroke-width="0.010651785714285714"/></g><g><rect data-type="rect" data-label="netId: GND
|
|
6
|
+
globalConnNetId: connectivity_net1" data-x="6.5" data-y="-0.3400000000000002" x="134.81978206202848" y="545.7837384744341" width="45.06286672254828" height="39.430008382229744" fill="#00000066" stroke="#000000" stroke-width="0.010651785714285714"/></g><g><rect data-type="rect" data-label="netId: VBAT
|
|
7
|
+
globalConnNetId: connectivity_net3" data-x="10.5" data-y="1.041" x="504.7108130762783" y="416.1341156747694" width="56.32858340318535" height="39.43000838222969" fill="#ef444466" stroke="#ef4444" stroke-width="0.010651785714285714"/></g><g><rect data-type="rect" data-label="INLINE netId: MLDO_OUT
|
|
7
8
|
axis: x
|
|
8
|
-
side: y+" data-x="7.35" data-y="1.1400000000000003" x="203.35289186923717" y="420.
|
|
9
|
-
y+" data-x="5.7" data-y="4.48" cx="82.24643755238901" cy="112.
|
|
10
|
-
y-" data-x="5.7" data-y="3.719999999999999" cx="82.24643755238901" cy="184.
|
|
11
|
-
y+" data-x="7.3" data-y="4.48" cx="232.45599329421634" cy="112.
|
|
12
|
-
y-" data-x="7.3" data-y="3.719999999999999" cx="232.45599329421634" cy="184.
|
|
13
|
-
y+" data-x="8.9" data-y="4.48" cx="382.66554903604367" cy="112.
|
|
14
|
-
y-" data-x="8.9" data-y="3.719999999999999" cx="382.66554903604367" cy="184.
|
|
15
|
-
y+" data-x="10.5" data-y="4.48" cx="532.875104777871" cy="112.
|
|
16
|
-
y-" data-x="10.5" data-y="3.719999999999999" cx="532.875104777871" cy="184.
|
|
17
|
-
y+" data-x="6.5" data-y="0.8300000000000001" cx="157.35121542330262" cy="455.
|
|
18
|
-
y-" data-x="6.5" data-y="0.06999999999999995" cx="157.35121542330262" cy="527.
|
|
19
|
-
y+" data-x="8.2" data-y="0.8300000000000001" cx="316.94886839899414" cy="455.
|
|
20
|
-
y-" data-x="8.2" data-y="0.06999999999999995" cx="316.94886839899414" cy="527.
|
|
21
|
-
y+" data-x="10.5" data-y="0.8300000000000001" cx="532.875104777871" cy="455.
|
|
22
|
-
y-" data-x="10.5" data-y="0.06999999999999995" cx="532.875104777871" cy="527.
|
|
23
|
-
orientation: y+" data-x="8.9" data-y="4.680000000000001" cx="382.66554903604367" cy="94.
|
|
24
|
-
orientation: y-" data-x="
|
|
25
|
-
orientation: y
|
|
26
|
-
|
|
9
|
+
side: y+" data-x="7.35" data-y="1.1400000000000003" x="203.35289186923717" y="420.92204526404015" width="67.59430008382242" height="11.26571668063707" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.010651785714285714"/></g><text data-type="text" data-label="MLDO_OUT" data-x="7.35" data-y="1.1400000000000003" x="237.15004191114838" y="426.5549036043587" fill="green" font-size="11.26571668063705" font-family="sans-serif" text-anchor="middle" dominant-baseline="central">MLDO_OUT</text><g><circle data-type="point" data-label="anode
|
|
10
|
+
y+" data-x="5.7" data-y="4.48" cx="82.24643755238901" cy="112.99245599329413" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="cathode
|
|
11
|
+
y-" data-x="5.7" data-y="3.719999999999999" cx="82.24643755238901" cy="184.34199497066226" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="anode
|
|
12
|
+
y+" data-x="7.3" data-y="4.48" cx="232.45599329421634" cy="112.99245599329413" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="cathode
|
|
13
|
+
y-" data-x="7.3" data-y="3.719999999999999" cx="232.45599329421634" cy="184.34199497066226" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="anode
|
|
14
|
+
y+" data-x="8.9" data-y="4.48" cx="382.66554903604367" cy="112.99245599329413" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="cathode
|
|
15
|
+
y-" data-x="8.9" data-y="3.719999999999999" cx="382.66554903604367" cy="184.34199497066226" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="anode
|
|
16
|
+
y+" data-x="10.5" data-y="4.48" cx="532.875104777871" cy="112.99245599329413" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="cathode
|
|
17
|
+
y-" data-x="10.5" data-y="3.719999999999999" cx="532.875104777871" cy="184.34199497066226" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="anode
|
|
18
|
+
y+" data-x="6.5" data-y="0.8300000000000001" cx="157.35121542330262" cy="455.65800502933774" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="cathode
|
|
19
|
+
y-" data-x="6.5" data-y="0.06999999999999995" cx="157.35121542330262" cy="527.0075440067058" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="anode
|
|
20
|
+
y+" data-x="8.2" data-y="0.8300000000000001" cx="316.94886839899414" cy="455.65800502933774" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="cathode
|
|
21
|
+
y-" data-x="8.2" data-y="0.06999999999999995" cx="316.94886839899414" cy="527.0075440067058" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="anode
|
|
22
|
+
y+" data-x="10.5" data-y="0.8300000000000001" cx="532.875104777871" cy="455.65800502933774" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="cathode
|
|
23
|
+
y-" data-x="10.5" data-y="0.06999999999999995" cx="532.875104777871" cy="527.0075440067058" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="anchorPoint
|
|
24
|
+
orientation: y+" data-x="8.9" data-y="4.680000000000001" cx="382.66554903604367" cy="94.2162615255657" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
|
|
25
|
+
orientation: y-" data-x="8.9" data-y="3.5199999999999987" cx="382.66554903604367" cy="203.1181894383907" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
|
|
26
|
+
orientation: y-" data-x="6.5" data-y="-0.13000000000000023" cx="157.35121542330262" cy="545.7837384744341" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
|
|
27
|
+
orientation: y+" data-x="10.5" data-y="0.8300000000000001" cx="532.875104777871" cy="455.65800502933774" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="inline anchor
|
|
28
|
+
MLDO_OUT" data-x="7.35" data-y="1.0300000000000002" cx="237.15004191114838" cy="436.8818105616093" r="3" fill="green"/></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[
|
|
27
29
|
document.currentScript.parentElement.addEventListener('mousemove', (e) => {
|
|
28
30
|
const svg = e.currentTarget;
|
|
29
31
|
const rect = svg.getBoundingClientRect();
|
|
@@ -45,7 +47,7 @@ MLDO_OUT" data-x="7.35" data-y="1.0300000000000002" cx="237.15004191114838" cy="
|
|
|
45
47
|
v.setAttribute('y2', '640');
|
|
46
48
|
|
|
47
49
|
// Calculate real coordinates using inverse transformation
|
|
48
|
-
const matrix = {"a":93.88097233864208,"c":0,"e":-452.8751047778709,"b":0,"d":-93.88097233864208,"f":533.
|
|
50
|
+
const matrix = {"a":93.88097233864208,"c":0,"e":-452.8751047778709,"b":0,"d":-93.88097233864208,"f":533.5792120704107};
|
|
49
51
|
// Manually invert and apply the affine transform
|
|
50
52
|
// Since we only use translate and scale, we can directly compute:
|
|
51
53
|
// x' = (x - tx) / sx
|
|
@@ -80,7 +82,7 @@ MLDO_OUT" data-x="7.35" data-y="1.0300000000000002" cx="237.15004191114838" cy="
|
|
|
80
82
|
.port-label { fill: rgb(0, 100, 100); }
|
|
81
83
|
.component-name { fill: rgb(0, 100, 100); }
|
|
82
84
|
|
|
83
|
-
</style><rect class="boundary" x="0" y="0" width="1200" height="800"/><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_0__stack1"><path d="M 487.0358779704501 132.88376506693987 L 487.0358779704501 108.65553514103988 L 293.2100385632501 108.65553514103988 L 293.2100385632501 132.88376506693987" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="19.38258394072px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 487.0358779704501 132.88376506693987 L 487.0358779704501 108.65553514103988 L 293.2100385632501 108.65553514103988 L 293.2100385632501 132.88376506693987" stroke="rgb(0, 150, 0)" fill="none" stroke-width="2.42282299259px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_1__stack1"><path d="M 680.86171737765 132.88376506693987 L 680.86171737765 108.65553514103988 L 487.0358779704501 108.65553514103988 L 487.0358779704501 132.88376506693987" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="19.38258394072px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 680.86171737765 132.88376506693987 L 680.86171737765 108.65553514103988 L 487.0358779704501 108.65553514103988 L 487.0358779704501 132.88376506693987" stroke="rgb(0, 150, 0)" fill="none" stroke-width="2.42282299259px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_2__stack1"><path d="M 874.68755678485 132.88376506693987 L 874.68755678485 108.65553514103999 L 680.86171737765 108.65553514103999 L 680.86171737765 132.88376506693987" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="19.38258394072px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 874.68755678485 132.88376506693987 L 874.68755678485 108.65553514103999 L 680.86171737765 108.65553514103999 L 680.86171737765 132.88376506693987" stroke="rgb(0, 150, 0)" fill="none" stroke-width="2.42282299259px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_3__stack1"><path d="M 487.0358779704501 224.95103878536014 L 487.0358779704501 249.17926871126014 L 293.2100385632501 249.17926871126014 L 293.2100385632501 224.95103878536014" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="19.38258394072px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 487.0358779704501 224.95103878536014 L 487.0358779704501 249.17926871126014 L 293.2100385632501 249.17926871126014 L 293.2100385632501 224.95103878536014" stroke="rgb(0, 150, 0)" fill="none" stroke-width="2.42282299259px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_4__stack1"><path d="M 680.86171737765 224.95103878536014 L 680.86171737765 249.17926871126014 L 487.0358779704501 249.17926871126014 L 487.0358779704501 224.95103878536014" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="19.38258394072px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 680.86171737765 224.95103878536014 L 680.86171737765 249.17926871126014 L 487.0358779704501 249.17926871126014 L 487.0358779704501 224.95103878536014" stroke="rgb(0, 150, 0)" fill="none" stroke-width="2.42282299259px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_5__stack1"><path d="M 874.68755678485 224.95103878536014 L 874.68755678485 249.17926871126002 L 680.86171737765 249.17926871126002 L 680.86171737765 224.95103878536014" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="19.38258394072px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 874.68755678485 224.95103878536014 L 874.68755678485 249.17926871126002 L 680.86171737765 249.17926871126002 L 680.86171737765 224.95103878536014" stroke="rgb(0, 150, 0)" fill="none" stroke-width="2.42282299259px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_6__stack1"><path d="M 874.68755678485 667.116234933035 L 874.68755678485 691.3444648589349 L 680.86171737765 691.3444648589349 L 680.86171737765 249.17926871126002 L 874.68755678485 249.17926871126002 L 874.68755678485 224.95103878536014" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="19.38258394072px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 874.68755678485 667.116234933035 L 874.68755678485 691.3444648589349 L 680.86171737765 691.3444648589349 L 680.86171737765 249.17926871126002 L 874.68755678485 249.17926871126002 L 874.68755678485 224.95103878536014" stroke="rgb(0, 150, 0)" fill="none" stroke-width="2.42282299259px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_7__stack1"><path d="M 596.062912637 667.116234933035 L 596.062912637 691.3444648589349 L 874.68755678485 691.3444648589349 L 874.68755678485 667.116234933035" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="19.38258394072px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 596.062912637 667.116234933035 L 596.062912637 691.3444648589349 L 874.68755678485 691.3444648589349 L 874.68755678485 667.116234933035" stroke="rgb(0, 150, 0)" fill="none" stroke-width="2.42282299259px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_8__stack1"><path d="M 390.1229582668501 667.116234933035 L 390.1229582668501 691.344464858935 L 596.062912637 691.344464858935 L 596.062912637 667.116234933035" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="19.38258394072px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 390.1229582668501 667.116234933035 L 390.1229582668501 691.344464858935 L 596.062912637 691.344464858935 L 596.062912637 667.116234933035" stroke="rgb(0, 150, 0)" fill="none" stroke-width="2.42282299259px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_9__stack1"><path d="M 390.1229582668501 575.048961214615 L 390.1229582668501 550.820731288715 L 596.062912637 550.820731288715 L 596.062912637 575.048961214615" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="19.38258394072px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 390.1229582668501 575.048961214615 L 390.1229582668501 550.820731288715 L 596.062912637 550.820731288715 L 596.062912637 575.048961214615" stroke="rgb(0, 150, 0)" fill="none" stroke-width="2.42282299259px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_0__stack1"><circle cx="487.0358779704501" cy="132.88376506693987" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/><circle cx="487.0358779704501" cy="108.65553514103988" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/></g><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_1__stack1"><circle cx="680.86171737765" cy="132.88376506693987" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/><circle cx="680.86171737765" cy="108.65553514103988" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/></g><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_2__stack1"/><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_3__stack1"><circle cx="487.0358779704501" cy="224.95103878536014" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/><circle cx="487.0358779704501" cy="249.17926871126014" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/></g><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_4__stack1"><circle cx="680.86171737765" cy="224.95103878536014" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/><circle cx="680.86171737765" cy="249.17926871126014" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/></g><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_5__stack1"><circle cx="874.68755678485" cy="224.95103878536014" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/><circle cx="874.68755678485" cy="249.17926871126002" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/></g><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_6__stack1"><circle cx="874.68755678485" cy="667.116234933035" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/><circle cx="874.68755678485" cy="691.3444648589349" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/></g><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_7__stack1"><circle cx="596.062912637" cy="667.116234933035" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/><circle cx="596.062912637" cy="691.3444648589349" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/></g><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_8__stack1"/><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_9__stack1"/><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_0__stack1"><rect class="component chip sch-component-body" x="238.69652122997502" y="172.86034444467504" width="141.12943931836742" height="12.114114962949941" stroke-width="2.42282299259px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="238.69652122997502" y="172.86034444467504" width="141.12943931836742" height="12.114114962949941" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="293.2100385632501" y1="172.86034444467504" x2="293.2100385632501" y2="132.88376506693987" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_0_0__stack1"><rect x="290.7872155706601" y="130.46094207434987" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="290.7872155706601" y="152.87205475580743" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 290.7872155706601 152.87205475580743)"></text><text class="pin-number sch-pin-label" x="293.2100385632501" y="184.97445940762498" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 293.2100385632501 184.97445940762498)">anode</text><line class="component-pin sch-component-pin sch-port-line" x1="293.2100385632501" y1="184.97445940762498" x2="293.2100385632501" y2="224.95103878536014" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_0_1__stack1"><rect x="290.7872155706601" y="222.52821579277014" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="290.7872155706601" y="204.96274909649253" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 290.7872155706601 204.96274909649253)"></text><text class="pin-number sch-pin-label" x="293.2100385632501" y="172.86034444467504" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 293.2100385632501 172.86034444467504)">cathode</text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_1__stack1"><rect class="component chip sch-component-body" x="432.522360637175" y="172.86034444467504" width="141.12943931836764" height="12.114114962949941" stroke-width="2.42282299259px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="432.522360637175" y="172.86034444467504" width="141.12943931836764" height="12.114114962949941" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="487.0358779704501" y1="172.86034444467504" x2="487.0358779704501" y2="132.88376506693987" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_1_0__stack1"><rect x="484.6130549778601" y="130.46094207434987" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="484.6130549778601" y="152.87205475580743" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 484.6130549778601 152.87205475580743)"></text><text class="pin-number sch-pin-label" x="487.0358779704501" y="184.97445940762498" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 487.0358779704501 184.97445940762498)">anode</text><line class="component-pin sch-component-pin sch-port-line" x1="487.0358779704501" y1="184.97445940762498" x2="487.0358779704501" y2="224.95103878536014" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_1_1__stack1"><rect x="484.6130549778601" y="222.52821579277014" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="484.6130549778601" y="204.96274909649253" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 484.6130549778601 204.96274909649253)"></text><text class="pin-number sch-pin-label" x="487.0358779704501" y="172.86034444467504" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 487.0358779704501 172.86034444467504)">cathode</text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_2__stack1"><rect class="component chip sch-component-body" x="626.3482000443752" y="172.86034444467504" width="141.12943931836753" height="12.114114962949941" stroke-width="2.42282299259px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="626.3482000443752" y="172.86034444467504" width="141.12943931836753" height="12.114114962949941" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="680.86171737765" y1="172.86034444467504" x2="680.86171737765" y2="132.88376506693987" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_2_0__stack1"><rect x="678.43889438506" y="130.46094207434987" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="678.4388943850603" y="152.87205475580743" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 678.4388943850603 152.87205475580743)"></text><text class="pin-number sch-pin-label" x="680.86171737765" y="184.97445940762498" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 680.86171737765 184.97445940762498)">anode</text><line class="component-pin sch-component-pin sch-port-line" x1="680.86171737765" y1="184.97445940762498" x2="680.86171737765" y2="224.95103878536014" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_2_1__stack1"><rect x="678.43889438506" y="222.52821579277014" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="678.4388943850603" y="204.96274909649253" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 678.4388943850603 204.96274909649253)"></text><text class="pin-number sch-pin-label" x="680.86171737765" y="172.86034444467504" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 680.86171737765 172.86034444467504)">cathode</text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_3__stack1"><rect class="component chip sch-component-body" x="820.1740394515751" y="172.86034444467504" width="141.12943931836753" height="12.114114962949941" stroke-width="2.42282299259px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="820.1740394515751" y="172.86034444467504" width="141.12943931836753" height="12.114114962949941" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="874.68755678485" y1="172.86034444467504" x2="874.68755678485" y2="132.88376506693987" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_3_0__stack1"><rect x="872.26473379226" y="130.46094207434987" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="872.2647337922602" y="152.87205475580743" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 872.2647337922602 152.87205475580743)"></text><text class="pin-number sch-pin-label" x="874.68755678485" y="184.97445940762498" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 874.68755678485 184.97445940762498)">anode</text><line class="component-pin sch-component-pin sch-port-line" x1="874.68755678485" y1="184.97445940762498" x2="874.68755678485" y2="224.95103878536014" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_3_1__stack1"><rect x="872.26473379226" y="222.52821579277014" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="872.2647337922602" y="204.96274909649253" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 872.2647337922602 204.96274909649253)"></text><text class="pin-number sch-pin-label" x="874.68755678485" y="172.86034444467504" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 874.68755678485 172.86034444467504)">cathode</text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_4__stack1"><rect class="component chip sch-component-body" x="335.609440933575" y="615.02554059235" width="112.05556340728765" height="12.114114962949998" stroke-width="2.42282299259px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="335.609440933575" y="615.02554059235" width="112.05556340728765" height="12.114114962949998" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="390.1229582668501" y1="615.02554059235" x2="390.1229582668501" y2="575.048961214615" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_4_0__stack1"><rect x="387.7001352742601" y="572.626138222025" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="387.7001352742601" y="595.0372509034825" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 387.7001352742601 595.0372509034825)"></text><text class="pin-number sch-pin-label" x="390.1229582668501" y="627.1396555553" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 390.1229582668501 627.1396555553)">anode</text><line class="component-pin sch-component-pin sch-port-line" x1="390.1229582668501" y1="627.1396555553" x2="390.1229582668501" y2="667.116234933035" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_4_1__stack1"><rect x="387.7001352742601" y="664.693411940445" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="387.7001352742601" y="647.1279452441674" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 387.7001352742601 647.1279452441674)"></text><text class="pin-number sch-pin-label" x="390.1229582668501" y="615.02554059235" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 390.1229582668501 615.02554059235)">cathode</text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_5__stack1"><rect class="component chip sch-component-body" x="541.5493953037249" y="615.02554059235" width="112.05556340728765" height="12.114114962949998" stroke-width="2.42282299259px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="541.5493953037249" y="615.02554059235" width="112.05556340728765" height="12.114114962949998" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="596.062912637" y1="615.02554059235" x2="596.062912637" y2="575.048961214615" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_5_0__stack1"><rect x="593.64008964441" y="572.626138222025" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="593.6400896444101" y="595.0372509034825" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 593.6400896444101 595.0372509034825)"></text><text class="pin-number sch-pin-label" x="596.062912637" y="627.1396555553" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 596.062912637 627.1396555553)">anode</text><line class="component-pin sch-component-pin sch-port-line" x1="596.062912637" y1="627.1396555553" x2="596.062912637" y2="667.116234933035" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_5_1__stack1"><rect x="593.64008964441" y="664.693411940445" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="593.6400896444101" y="647.1279452441674" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 593.6400896444101 647.1279452441674)"></text><text class="pin-number sch-pin-label" x="596.062912637" y="615.02554059235" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 596.062912637 615.02554059235)">cathode</text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_6__stack1"><rect class="component chip sch-component-body" x="820.1740394515751" y="615.02554059235" width="112.05556340728708" height="12.114114962949998" stroke-width="2.42282299259px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="820.1740394515751" y="615.02554059235" width="112.05556340728708" height="12.114114962949998" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="874.68755678485" y1="615.02554059235" x2="874.68755678485" y2="577.471784207205" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_6_0__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="874.68755678485" cy="575.048961214615" r="2.42282299259" stroke-width="2.42282299259px"/><rect x="872.26473379226" y="572.626138222025" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="872.2647337922602" y="595.0372509034825" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 872.2647337922602 595.0372509034825)"></text><text class="pin-number sch-pin-label" x="874.68755678485" y="627.1396555553" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 874.68755678485 627.1396555553)">anode</text><line class="component-pin sch-component-pin sch-port-line" x1="874.68755678485" y1="627.1396555553" x2="874.68755678485" y2="667.116234933035" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_6_1__stack1"><rect x="872.26473379226" y="664.693411940445" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="872.2647337922602" y="647.1279452441674" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 872.2647337922602 647.1279452441674)"></text><text class="pin-number sch-pin-label" x="874.68755678485" y="615.02554059235" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 874.68755678485 615.02554059235)">cathode</text></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_0__stack1"><circle cx="293.2100385632501" cy="132.88376506693987" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_1__stack1"><circle cx="293.2100385632501" cy="224.95103878536014" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_1_0__stack1"><circle cx="487.0358779704501" cy="132.88376506693987" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_1_1__stack1"><circle cx="487.0358779704501" cy="224.95103878536014" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_2_0__stack1"><circle cx="680.86171737765" cy="132.88376506693987" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_2_1__stack1"><circle cx="680.86171737765" cy="224.95103878536014" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_3_0__stack1"><circle cx="874.68755678485" cy="132.88376506693987" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_3_1__stack1"><circle cx="874.68755678485" cy="224.95103878536014" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_4_0__stack1"><circle cx="390.1229582668501" cy="575.048961214615" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_4_1__stack1"><circle cx="390.1229582668501" cy="667.116234933035" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_5_0__stack1"><circle cx="596.062912637" cy="575.048961214615" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_5_1__stack1"><circle cx="596.062912637" cy="667.116234933035" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_6_0__stack1"><circle cx="874.68755678485" cy="575.048961214615" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_6_1__stack1"><circle cx="874.68755678485" cy="667.116234933035" r="4.84564598518" fill="red" opacity="0"/></g><path class="net-label sch-net-label" data-circuit-json-type="schematic_net_label" data-schematic-net-label-id="schematic_net_label_0__stack1" d="
|
|
85
|
+
</style><rect class="boundary" x="0" y="0" width="1200" height="800"/><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_0__stack1"><path d="M 487.0358779704501 132.88376506693987 L 487.0358779704501 108.65553514103988 L 293.2100385632501 108.65553514103988 L 293.2100385632501 132.88376506693987" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="19.38258394072px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 487.0358779704501 132.88376506693987 L 487.0358779704501 108.65553514103988 L 293.2100385632501 108.65553514103988 L 293.2100385632501 132.88376506693987" stroke="rgb(0, 150, 0)" fill="none" stroke-width="2.42282299259px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_1__stack1"><path d="M 680.86171737765 132.88376506693987 L 680.86171737765 108.65553514103988 L 487.0358779704501 108.65553514103988 L 487.0358779704501 132.88376506693987" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="19.38258394072px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 680.86171737765 132.88376506693987 L 680.86171737765 108.65553514103988 L 487.0358779704501 108.65553514103988 L 487.0358779704501 132.88376506693987" stroke="rgb(0, 150, 0)" fill="none" stroke-width="2.42282299259px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_2__stack1"><path d="M 874.68755678485 132.88376506693987 L 874.68755678485 108.65553514103999 L 680.86171737765 108.65553514103999 L 680.86171737765 132.88376506693987" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="19.38258394072px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 874.68755678485 132.88376506693987 L 874.68755678485 108.65553514103999 L 680.86171737765 108.65553514103999 L 680.86171737765 132.88376506693987" stroke="rgb(0, 150, 0)" fill="none" stroke-width="2.42282299259px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_3__stack1"><path d="M 487.0358779704501 224.95103878536014 L 487.0358779704501 249.17926871126014 L 293.2100385632501 249.17926871126014 L 293.2100385632501 224.95103878536014" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="19.38258394072px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 487.0358779704501 224.95103878536014 L 487.0358779704501 249.17926871126014 L 293.2100385632501 249.17926871126014 L 293.2100385632501 224.95103878536014" stroke="rgb(0, 150, 0)" fill="none" stroke-width="2.42282299259px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_4__stack1"><path d="M 680.86171737765 224.95103878536014 L 680.86171737765 249.17926871126014 L 487.0358779704501 249.17926871126014 L 487.0358779704501 224.95103878536014" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="19.38258394072px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 680.86171737765 224.95103878536014 L 680.86171737765 249.17926871126014 L 487.0358779704501 249.17926871126014 L 487.0358779704501 224.95103878536014" stroke="rgb(0, 150, 0)" fill="none" stroke-width="2.42282299259px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_5__stack1"><path d="M 874.68755678485 224.95103878536014 L 874.68755678485 249.17926871126002 L 680.86171737765 249.17926871126002 L 680.86171737765 224.95103878536014" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="19.38258394072px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 874.68755678485 224.95103878536014 L 874.68755678485 249.17926871126002 L 680.86171737765 249.17926871126002 L 680.86171737765 224.95103878536014" stroke="rgb(0, 150, 0)" fill="none" stroke-width="2.42282299259px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_6__stack1"><path d="M 390.1229582668501 667.116234933035 L 390.1229582668501 691.344464858935 L 596.062912637 691.344464858935 L 596.062912637 667.116234933035" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="19.38258394072px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 390.1229582668501 667.116234933035 L 390.1229582668501 691.344464858935 L 596.062912637 691.344464858935 L 596.062912637 667.116234933035" stroke="rgb(0, 150, 0)" fill="none" stroke-width="2.42282299259px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_7__stack1"><path d="M 874.68755678485 667.116234933035 L 874.68755678485 691.3444648589349 L 596.062912637 691.3444648589349 L 596.062912637 667.116234933035" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="19.38258394072px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 874.68755678485 667.116234933035 L 874.68755678485 691.3444648589349 L 596.062912637 691.3444648589349 L 596.062912637 667.116234933035" stroke="rgb(0, 150, 0)" fill="none" stroke-width="2.42282299259px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_8__stack1"><path d="M 390.1229582668501 575.048961214615 L 390.1229582668501 550.820731288715 L 596.062912637 550.820731288715 L 596.062912637 575.048961214615" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="19.38258394072px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 390.1229582668501 575.048961214615 L 390.1229582668501 550.820731288715 L 596.062912637 550.820731288715 L 596.062912637 575.048961214615" stroke="rgb(0, 150, 0)" fill="none" stroke-width="2.42282299259px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_0__stack1"><circle cx="487.0358779704501" cy="132.88376506693987" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/><circle cx="487.0358779704501" cy="108.65553514103988" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/></g><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_1__stack1"><circle cx="680.86171737765" cy="132.88376506693987" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/><circle cx="680.86171737765" cy="108.65553514103988" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/></g><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_2__stack1"/><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_3__stack1"><circle cx="487.0358779704501" cy="224.95103878536014" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/><circle cx="487.0358779704501" cy="249.17926871126014" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/></g><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_4__stack1"><circle cx="680.86171737765" cy="224.95103878536014" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/><circle cx="680.86171737765" cy="249.17926871126014" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/></g><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_5__stack1"/><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_6__stack1"><circle cx="596.062912637" cy="691.344464858935" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/><circle cx="596.062912637" cy="667.116234933035" r="3.6342344888850002" class="trace-junction sch-trace-junction" fill="rgb(0, 150, 0)"/></g><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_7__stack1"/><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_8__stack1"/><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_0__stack1"><rect class="component chip sch-component-body" x="238.69652122997502" y="172.86034444467504" width="141.12943931836742" height="12.114114962949941" stroke-width="2.42282299259px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="238.69652122997502" y="172.86034444467504" width="141.12943931836742" height="12.114114962949941" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="293.2100385632501" y1="172.86034444467504" x2="293.2100385632501" y2="132.88376506693987" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_0_0__stack1"><rect x="290.7872155706601" y="130.46094207434987" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="290.7872155706601" y="152.87205475580743" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 290.7872155706601 152.87205475580743)"></text><text class="pin-number sch-pin-label" x="293.2100385632501" y="184.97445940762498" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 293.2100385632501 184.97445940762498)">anode</text><line class="component-pin sch-component-pin sch-port-line" x1="293.2100385632501" y1="184.97445940762498" x2="293.2100385632501" y2="224.95103878536014" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_0_1__stack1"><rect x="290.7872155706601" y="222.52821579277014" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="290.7872155706601" y="204.96274909649253" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 290.7872155706601 204.96274909649253)"></text><text class="pin-number sch-pin-label" x="293.2100385632501" y="172.86034444467504" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 293.2100385632501 172.86034444467504)">cathode</text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_1__stack1"><rect class="component chip sch-component-body" x="432.522360637175" y="172.86034444467504" width="141.12943931836764" height="12.114114962949941" stroke-width="2.42282299259px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="432.522360637175" y="172.86034444467504" width="141.12943931836764" height="12.114114962949941" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="487.0358779704501" y1="172.86034444467504" x2="487.0358779704501" y2="132.88376506693987" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_1_0__stack1"><rect x="484.6130549778601" y="130.46094207434987" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="484.6130549778601" y="152.87205475580743" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 484.6130549778601 152.87205475580743)"></text><text class="pin-number sch-pin-label" x="487.0358779704501" y="184.97445940762498" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 487.0358779704501 184.97445940762498)">anode</text><line class="component-pin sch-component-pin sch-port-line" x1="487.0358779704501" y1="184.97445940762498" x2="487.0358779704501" y2="224.95103878536014" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_1_1__stack1"><rect x="484.6130549778601" y="222.52821579277014" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="484.6130549778601" y="204.96274909649253" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 484.6130549778601 204.96274909649253)"></text><text class="pin-number sch-pin-label" x="487.0358779704501" y="172.86034444467504" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 487.0358779704501 172.86034444467504)">cathode</text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_2__stack1"><rect class="component chip sch-component-body" x="626.3482000443752" y="172.86034444467504" width="141.12943931836753" height="12.114114962949941" stroke-width="2.42282299259px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="626.3482000443752" y="172.86034444467504" width="141.12943931836753" height="12.114114962949941" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="680.86171737765" y1="172.86034444467504" x2="680.86171737765" y2="132.88376506693987" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_2_0__stack1"><rect x="678.43889438506" y="130.46094207434987" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="678.4388943850603" y="152.87205475580743" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 678.4388943850603 152.87205475580743)"></text><text class="pin-number sch-pin-label" x="680.86171737765" y="184.97445940762498" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 680.86171737765 184.97445940762498)">anode</text><line class="component-pin sch-component-pin sch-port-line" x1="680.86171737765" y1="184.97445940762498" x2="680.86171737765" y2="224.95103878536014" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_2_1__stack1"><rect x="678.43889438506" y="222.52821579277014" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="678.4388943850603" y="204.96274909649253" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 678.4388943850603 204.96274909649253)"></text><text class="pin-number sch-pin-label" x="680.86171737765" y="172.86034444467504" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 680.86171737765 172.86034444467504)">cathode</text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_3__stack1"><rect class="component chip sch-component-body" x="820.1740394515751" y="172.86034444467504" width="141.12943931836753" height="12.114114962949941" stroke-width="2.42282299259px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="820.1740394515751" y="172.86034444467504" width="141.12943931836753" height="12.114114962949941" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="874.68755678485" y1="172.86034444467504" x2="874.68755678485" y2="132.88376506693987" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_3_0__stack1"><rect x="872.26473379226" y="130.46094207434987" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="872.2647337922602" y="152.87205475580743" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 872.2647337922602 152.87205475580743)"></text><text class="pin-number sch-pin-label" x="874.68755678485" y="184.97445940762498" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 874.68755678485 184.97445940762498)">anode</text><line class="component-pin sch-component-pin sch-port-line" x1="874.68755678485" y1="184.97445940762498" x2="874.68755678485" y2="224.95103878536014" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_3_1__stack1"><rect x="872.26473379226" y="222.52821579277014" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="872.2647337922602" y="204.96274909649253" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 872.2647337922602 204.96274909649253)"></text><text class="pin-number sch-pin-label" x="874.68755678485" y="172.86034444467504" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 874.68755678485 172.86034444467504)">cathode</text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_4__stack1"><rect class="component chip sch-component-body" x="335.609440933575" y="615.02554059235" width="112.05556340728765" height="12.114114962949998" stroke-width="2.42282299259px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="335.609440933575" y="615.02554059235" width="112.05556340728765" height="12.114114962949998" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="390.1229582668501" y1="615.02554059235" x2="390.1229582668501" y2="575.048961214615" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_4_0__stack1"><rect x="387.7001352742601" y="572.626138222025" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="387.7001352742601" y="595.0372509034825" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 387.7001352742601 595.0372509034825)"></text><text class="pin-number sch-pin-label" x="390.1229582668501" y="627.1396555553" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 390.1229582668501 627.1396555553)">anode</text><line class="component-pin sch-component-pin sch-port-line" x1="390.1229582668501" y1="627.1396555553" x2="390.1229582668501" y2="667.116234933035" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_4_1__stack1"><rect x="387.7001352742601" y="664.693411940445" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="387.7001352742601" y="647.1279452441674" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 387.7001352742601 647.1279452441674)"></text><text class="pin-number sch-pin-label" x="390.1229582668501" y="615.02554059235" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 390.1229582668501 615.02554059235)">cathode</text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_5__stack1"><rect class="component chip sch-component-body" x="541.5493953037249" y="615.02554059235" width="112.05556340728765" height="12.114114962949998" stroke-width="2.42282299259px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="541.5493953037249" y="615.02554059235" width="112.05556340728765" height="12.114114962949998" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="596.062912637" y1="615.02554059235" x2="596.062912637" y2="575.048961214615" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_5_0__stack1"><rect x="593.64008964441" y="572.626138222025" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="593.6400896444101" y="595.0372509034825" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 593.6400896444101 595.0372509034825)"></text><text class="pin-number sch-pin-label" x="596.062912637" y="627.1396555553" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 596.062912637 627.1396555553)">anode</text><line class="component-pin sch-component-pin sch-port-line" x1="596.062912637" y1="627.1396555553" x2="596.062912637" y2="667.116234933035" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_5_1__stack1"><rect x="593.64008964441" y="664.693411940445" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="593.6400896444101" y="647.1279452441674" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 593.6400896444101 647.1279452441674)"></text><text class="pin-number sch-pin-label" x="596.062912637" y="615.02554059235" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 596.062912637 615.02554059235)">cathode</text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_6__stack1"><rect class="component chip sch-component-body" x="820.1740394515751" y="615.02554059235" width="112.05556340728708" height="12.114114962949998" stroke-width="2.42282299259px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="820.1740394515751" y="615.02554059235" width="112.05556340728708" height="12.114114962949998" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="874.68755678485" y1="615.02554059235" x2="874.68755678485" y2="577.471784207205" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_6_0__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="874.68755678485" cy="575.048961214615" r="2.42282299259" stroke-width="2.42282299259px"/><rect x="872.26473379226" y="572.626138222025" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="872.2647337922602" y="595.0372509034825" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 872.2647337922602 595.0372509034825)"></text><text class="pin-number sch-pin-label" x="874.68755678485" y="627.1396555553" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 874.68755678485 627.1396555553)">anode</text><line class="component-pin sch-component-pin sch-port-line" x1="874.68755678485" y1="627.1396555553" x2="874.68755678485" y2="667.116234933035" stroke-width="2.42282299259px"/><g class="sch-port" data-schematic-port-id="source_port_6_1__stack1"><rect x="872.26473379226" y="664.693411940445" width="4.84564598518" height="4.84564598518" opacity="0"/></g><text class="pin-number sch-pin-number" x="872.2647337922602" y="647.1279452441674" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="18.171172444425px" transform="rotate(-90 872.2647337922602 647.1279452441674)"></text><text class="pin-number sch-pin-label" x="874.68755678485" y="615.02554059235" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="18.171172444425px" transform="rotate(-90 874.68755678485 615.02554059235)">cathode</text></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_0__stack1"><circle cx="293.2100385632501" cy="132.88376506693987" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_1__stack1"><circle cx="293.2100385632501" cy="224.95103878536014" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_1_0__stack1"><circle cx="487.0358779704501" cy="132.88376506693987" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_1_1__stack1"><circle cx="487.0358779704501" cy="224.95103878536014" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_2_0__stack1"><circle cx="680.86171737765" cy="132.88376506693987" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_2_1__stack1"><circle cx="680.86171737765" cy="224.95103878536014" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_3_0__stack1"><circle cx="874.68755678485" cy="132.88376506693987" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_3_1__stack1"><circle cx="874.68755678485" cy="224.95103878536014" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_4_0__stack1"><circle cx="390.1229582668501" cy="575.048961214615" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_4_1__stack1"><circle cx="390.1229582668501" cy="667.116234933035" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_5_0__stack1"><circle cx="596.062912637" cy="575.048961214615" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_5_1__stack1"><circle cx="596.062912637" cy="667.116234933035" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_6_0__stack1"><circle cx="874.68755678485" cy="575.048961214615" r="4.84564598518" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_6_1__stack1"><circle cx="874.68755678485" cy="667.116234933035" r="4.84564598518" fill="red" opacity="0"/></g><path class="net-label sch-net-label" data-circuit-json-type="schematic_net_label" data-schematic-net-label-id="schematic_net_label_0__stack1" d="
|
|
84
86
|
M 680.86171737765,108.65553514103988
|
|
85
87
|
L 668.7476024147,102.11391306104687
|
|
86
88
|
L 668.7476024147,60.570574814770346
|
|
@@ -88,19 +90,26 @@ MLDO_OUT" data-x="7.35" data-y="1.0300000000000002" cx="237.15004191114838" cy="
|
|
|
88
90
|
L 692.9758323406,102.11391306104687
|
|
89
91
|
Z
|
|
90
92
|
" fill="rgba(255, 255, 255, 0.6)" stroke="rgb(132, 0, 0)" stroke-width="2.42282299259px"/><text class="net-label-text sch-net-label-text" data-circuit-json-type="schematic_net_label" data-schematic-net-label-id="schematic_net_label_0__stack1" x="680.86171737765" y="97.75283167438488" fill="rgb(132, 0, 0)" text-anchor="start" dominant-baseline="central" font-family="sans-serif" font-variant-numeric="tabular-nums" font-size="21.80540693331px" transform="rotate(-90 680.86171737765 97.75283167438488)">XX</text><path class="net-label sch-net-label" data-circuit-json-type="schematic_net_label" data-schematic-net-label-id="schematic_net_label_1__stack1" d="
|
|
91
|
-
M
|
|
92
|
-
L
|
|
93
|
-
L
|
|
94
|
-
L
|
|
95
|
-
L
|
|
93
|
+
M 680.86171737765,249.17926871126014
|
|
94
|
+
L 692.9758323406,255.72089079125314
|
|
95
|
+
L 692.9758323406,297.2642290375297
|
|
96
|
+
L 668.7476024147,297.2642290375297
|
|
97
|
+
L 668.7476024147,255.72089079125314
|
|
96
98
|
Z
|
|
97
|
-
" fill="rgba(255, 255, 255, 0.6)" stroke="rgb(132, 0, 0)" stroke-width="2.42282299259px"/><text class="net-label-text sch-net-label-text" data-circuit-json-type="schematic_net_label" data-schematic-net-label-id="schematic_net_label_1__stack1" x="
|
|
99
|
+
" fill="rgba(255, 255, 255, 0.6)" stroke="rgb(132, 0, 0)" stroke-width="2.42282299259px"/><text class="net-label-text sch-net-label-text" data-circuit-json-type="schematic_net_label" data-schematic-net-label-id="schematic_net_label_1__stack1" x="680.86171737765" y="260.08197217791513" fill="rgb(132, 0, 0)" text-anchor="start" dominant-baseline="central" font-family="sans-serif" font-variant-numeric="tabular-nums" font-size="21.80540693331px" transform="rotate(90 680.86171737765 260.08197217791513)">XX</text><path class="net-label sch-net-label" data-circuit-json-type="schematic_net_label" data-schematic-net-label-id="schematic_net_label_2__stack1" d="
|
|
100
|
+
M 390.1229582668501,691.344464858935
|
|
101
|
+
L 402.2370732298001,697.886086938928
|
|
102
|
+
L 402.2370732298001,739.4294251852045
|
|
103
|
+
L 378.0088433039001,739.4294251852045
|
|
104
|
+
L 378.0088433039001,697.886086938928
|
|
105
|
+
Z
|
|
106
|
+
" fill="rgba(255, 255, 255, 0.6)" stroke="rgb(132, 0, 0)" stroke-width="2.42282299259px"/><text class="net-label-text sch-net-label-text" data-circuit-json-type="schematic_net_label" data-schematic-net-label-id="schematic_net_label_2__stack1" x="390.1229582668501" y="702.24716832559" fill="rgb(132, 0, 0)" text-anchor="start" dominant-baseline="central" font-family="sans-serif" font-variant-numeric="tabular-nums" font-size="21.80540693331px" transform="rotate(90 390.1229582668501 702.24716832559)">XX</text><path class="net-label sch-net-label" data-circuit-json-type="schematic_net_label" data-schematic-net-label-id="schematic_net_label_3__stack1" d="
|
|
98
107
|
M 874.68755678485,575.048961214615
|
|
99
108
|
L 862.5734418219,568.507339134622
|
|
100
109
|
L 862.5734418219,526.9640008883455
|
|
101
110
|
L 886.8016717478,526.9640008883455
|
|
102
111
|
L 886.8016717478,568.507339134622
|
|
103
112
|
Z
|
|
104
|
-
" fill="rgba(255, 255, 255, 0.6)" stroke="rgb(132, 0, 0)" stroke-width="2.42282299259px"/><text class="net-label-text sch-net-label-text" data-circuit-json-type="schematic_net_label" data-schematic-net-label-id="
|
|
113
|
+
" fill="rgba(255, 255, 255, 0.6)" stroke="rgb(132, 0, 0)" stroke-width="2.42282299259px"/><text class="net-label-text sch-net-label-text" data-circuit-json-type="schematic_net_label" data-schematic-net-label-id="schematic_net_label_3__stack1" x="874.68755678485" y="564.14625774796" fill="rgb(132, 0, 0)" text-anchor="start" dominant-baseline="central" font-family="sans-serif" font-variant-numeric="tabular-nums" font-size="21.80540693331px" transform="rotate(-90 874.68755678485 564.14625774796)">XX</text><text class="sch-text" x="493.092935451925" y="537.4952048294699" fill="#047857" text-anchor="middle" dominant-baseline="middle" font-family="sans-serif" font-size="14.536937955540001px" transform="rotate(0, 493.092935451925, 537.4952048294699)">XXXXXXXX</text>
|
|
105
114
|
</g>
|
|
106
115
|
</svg>
|
package/tests/solvers/MspConnectionPairSolver/msp-connection-pair-solver-ground-net-rows.test.ts
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { expect, test } from "bun:test"
|
|
2
|
+
import { MspConnectionPairSolver } from "lib/solvers/MspConnectionPairSolver/MspConnectionPairSolver"
|
|
3
|
+
import type { InputNetConnection, InputProblem } from "lib/types/InputProblem"
|
|
4
|
+
import inputProblemJson from "../../repros/assets/repro-bluetooth-controller-ground-decoupling-groups.input.json"
|
|
5
|
+
|
|
6
|
+
function solveNetPairs({
|
|
7
|
+
inputProblem,
|
|
8
|
+
netConnection,
|
|
9
|
+
}: {
|
|
10
|
+
inputProblem: InputProblem
|
|
11
|
+
netConnection: InputNetConnection
|
|
12
|
+
}) {
|
|
13
|
+
const netPinIds = new Set(netConnection.pinIds)
|
|
14
|
+
const solver = new MspConnectionPairSolver({ inputProblem })
|
|
15
|
+
|
|
16
|
+
solver.solve()
|
|
17
|
+
|
|
18
|
+
return solver.mspConnectionPairs.filter((pair) =>
|
|
19
|
+
pair.pins.every((pin) => netPinIds.has(pin.pinId)),
|
|
20
|
+
)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
test("keeps grouped ground rails in separate rows", () => {
|
|
24
|
+
const inputProblem = inputProblemJson as InputProblem
|
|
25
|
+
const groundConnection = inputProblem.netConnections.find(
|
|
26
|
+
(connection) => connection.isGround,
|
|
27
|
+
)!
|
|
28
|
+
const groundPairs = solveNetPairs({
|
|
29
|
+
inputProblem,
|
|
30
|
+
netConnection: groundConnection,
|
|
31
|
+
})
|
|
32
|
+
const crossRowPairs = groundPairs.filter(
|
|
33
|
+
(pair) => pair.pins[0].y !== pair.pins[1].y,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
expect(groundPairs).toHaveLength(5)
|
|
37
|
+
expect(crossRowPairs).toHaveLength(0)
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
test("does not separate rows without ground metadata", () => {
|
|
41
|
+
const inputProblem = structuredClone(inputProblemJson) as InputProblem
|
|
42
|
+
const groundConnection = inputProblem.netConnections.find(
|
|
43
|
+
(connection) => connection.isGround,
|
|
44
|
+
)!
|
|
45
|
+
groundConnection.isGround = false
|
|
46
|
+
|
|
47
|
+
const netPairs = solveNetPairs({
|
|
48
|
+
inputProblem,
|
|
49
|
+
netConnection: groundConnection,
|
|
50
|
+
})
|
|
51
|
+
const crossRowPairs = netPairs.filter(
|
|
52
|
+
(pair) => pair.pins[0].y !== pair.pins[1].y,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
expect(netPairs).toHaveLength(6)
|
|
56
|
+
expect(crossRowPairs).toHaveLength(1)
|
|
57
|
+
})
|