@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 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 userNetId = this.userNetIdByPinId[pin1] ?? this.userNetIdByPinId[pin2];
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 msp = getOrthogonalMinimumSpanningTree(
660
- directlyConnectedPins.map((p) => this.pinMap[p]).filter(Boolean),
661
- {
662
- maxDistance: this.maxMspPairDistance,
663
- forbidEdge: (a, b) => !this.canRouteGroundPair(a.pinId, b.pinId) || arePinsInDifferentSchematicSections(
664
- this.inputProblem,
665
- a,
666
- b
667
- ) || doesPairCrossRestrictedCenterLines({
668
- inputProblem: this.inputProblem,
669
- chipMap: this.chipMap,
670
- pinIdMap,
671
- p1: a,
672
- p2: b
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 userNetId = this.userNetIdByPinId[pin1] ?? this.userNetIdByPinId[pin2];
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 msp = getOrthogonalMinimumSpanningTree(
198
- directlyConnectedPins.map((p) => this.pinMap[p]!).filter(Boolean),
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 userNetId =
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: InputPin[],
19
+ export function getOrthogonalMinimumSpanningTree<Pin extends InputPin>(
20
+ pins: Pin[],
21
21
  opts: {
22
22
  maxDistance?: number
23
- forbidEdge?: (a: InputPin, b: InputPin) => boolean
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
@@ -5,7 +5,7 @@
5
5
  "url": "https://github.com/tscircuit/schematic-trace-solver.git"
6
6
  },
7
7
  "main": "dist/index.js",
8
- "version": "0.0.161",
8
+ "version": "0.0.162",
9
9
  "type": "module",
10
10
  "scripts": {
11
11
  "start": "cosmos",
@@ -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.99245599329424 232.45599329421634,94.21626152556581 82.24643755238901,94.21626152556581 82.24643755238901,112.99245599329424" 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.99245599329424 382.66554903604367,94.21626152556581 232.45599329421634,94.21626152556581 232.45599329421634,112.99245599329424" 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.99245599329424 532.875104777871,94.21626152556587 382.66554903604367,94.21626152556587 382.66554903604367,112.99245599329424" 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.34199497066237 232.45599329421634,203.1181894383908 82.24643755238901,203.1181894383908 82.24643755238901,184.34199497066237" 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.34199497066237 382.66554903604367,203.1181894383908 232.45599329421634,203.1181894383908 232.45599329421634,184.34199497066237" 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.34199497066237 532.875104777871,203.1181894383907 382.66554903604367,203.1181894383907 382.66554903604367,184.34199497066237" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="10.5,0.06999999999999995 10.5,-0.12999999999999934 8.9,-0.12999999999999934 8.9,3.5199999999999996 10.5,3.5199999999999996 10.5,3.719999999999999" data-type="line" data-label="" points="532.875104777871,527.0075440067059 532.875104777871,545.7837384744342 382.66554903604367,545.7837384744342 382.66554903604367,203.1181894383907 532.875104777871,203.1181894383907 532.875104777871,184.34199497066237" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="8.2,0.06999999999999995 8.2,-0.12999999999999934 10.5,-0.12999999999999934 10.5,0.06999999999999995" data-type="line" data-label="" points="316.94886839899414,527.0075440067059 316.94886839899414,545.7837384744342 532.875104777871,545.7837384744342 532.875104777871,527.0075440067059" 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.0075440067059 157.35121542330262,545.7837384744342 316.94886839899414,545.7837384744342 316.94886839899414,527.0075440067059" 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.65800502933786 157.35121542330262,436.8818105616094 316.94886839899414,436.8818105616094 316.94886839899414,455.65800502933786" 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.99245599329421" 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.99245599329421" 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.99245599329421" 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.99245599329421" 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.6580050293378" 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.6580050293378" 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.6580050293378" 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.7862531433361" 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="10.5" data-y="-0.3399999999999993" x="510.34367141659686" y="545.7837384744341" width="45.06286672254828" height="39.43000838222963" fill="#00000066" stroke="#000000" stroke-width="0.010651785714285714"/></g><g><rect data-type="rect" data-label="netId: VBAT
6
- globalConnNetId: connectivity_net3" data-x="10.5" data-y="1.041" x="504.7108130762783" y="416.13411567476953" 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
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.92204526404026" 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.5549036043588" 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
9
- y+" data-x="5.7" data-y="4.48" cx="82.24643755238901" cy="112.99245599329424" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="cathode
10
- y-" data-x="5.7" data-y="3.719999999999999" cx="82.24643755238901" cy="184.34199497066237" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="anode
11
- y+" data-x="7.3" data-y="4.48" cx="232.45599329421634" cy="112.99245599329424" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="cathode
12
- y-" data-x="7.3" data-y="3.719999999999999" cx="232.45599329421634" cy="184.34199497066237" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="anode
13
- y+" data-x="8.9" data-y="4.48" cx="382.66554903604367" cy="112.99245599329424" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="cathode
14
- y-" data-x="8.9" data-y="3.719999999999999" cx="382.66554903604367" cy="184.34199497066237" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="anode
15
- y+" data-x="10.5" data-y="4.48" cx="532.875104777871" cy="112.99245599329424" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="cathode
16
- y-" data-x="10.5" data-y="3.719999999999999" cx="532.875104777871" cy="184.34199497066237" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="anode
17
- y+" data-x="6.5" data-y="0.8300000000000001" cx="157.35121542330262" cy="455.65800502933786" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="cathode
18
- y-" data-x="6.5" data-y="0.06999999999999995" cx="157.35121542330262" cy="527.0075440067059" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="anode
19
- y+" data-x="8.2" data-y="0.8300000000000001" cx="316.94886839899414" cy="455.65800502933786" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="cathode
20
- y-" data-x="8.2" data-y="0.06999999999999995" cx="316.94886839899414" cy="527.0075440067059" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="anode
21
- y+" data-x="10.5" data-y="0.8300000000000001" cx="532.875104777871" cy="455.65800502933786" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="cathode
22
- y-" data-x="10.5" data-y="0.06999999999999995" cx="532.875104777871" cy="527.0075440067059" r="3" fill="hsl(184, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="anchorPoint
23
- orientation: y+" data-x="8.9" data-y="4.680000000000001" cx="382.66554903604367" cy="94.21626152556581" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
24
- orientation: y-" data-x="10.5" data-y="-0.12999999999999934" cx="532.875104777871" cy="545.7837384744342" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
25
- orientation: y+" data-x="10.5" data-y="0.8300000000000001" cx="532.875104777871" cy="455.65800502933786" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="inline anchor
26
- MLDO_OUT" data-x="7.35" data-y="1.0300000000000002" cx="237.15004191114838" cy="436.8818105616094" 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[
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.5792120704108};
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 874.68755678485,691.3444648589349
92
- L 886.8016717478,697.8860869389279
93
- L 886.8016717478,739.4294251852044
94
- L 862.5734418219,739.4294251852044
95
- L 862.5734418219,697.8860869389279
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="874.68755678485" y="702.2471683255899" 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 702.2471683255899)">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="
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="schematic_net_label_2__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>
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>
@@ -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
+ })