@tscircuit/schematic-trace-solver 0.0.189 → 0.0.191

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.
Files changed (36) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.js +680 -428
  3. package/lib/solvers/InlineNetLabelSolver/getLocalTraceLabelShifts.ts +29 -0
  4. package/lib/solvers/LongDistancePairSolver/LongDistancePairSolver.ts +7 -0
  5. package/lib/solvers/LongDistancePairSolver/getParallelNetLabelPolicy.ts +98 -0
  6. package/lib/solvers/MspConnectionPairSolver/MspConnectionPairSolver.ts +24 -2
  7. package/lib/solvers/MspConnectionPairSolver/getParallelRailPairs.ts +178 -0
  8. package/lib/solvers/NetLabelToTraceSolver/NetLabelToTraceSolver.ts +13 -0
  9. package/lib/solvers/SameNetJunctionAlignmentSolver/SameNetJunctionAlignmentSolver.ts +4 -9
  10. package/lib/solvers/SameNetJunctionAlignmentSolver/alignSameNetJunctions.ts +10 -2
  11. package/lib/solvers/SameNetJunctionAlignmentSolver/collapseSameNetCycles.ts +75 -38
  12. package/package.json +1 -1
  13. package/tests/bug-reports/bug-report-20260706T213649Z/__snapshots__/bug-report-20260706T213649Z.snap.svg +837 -799
  14. package/tests/bug-reports/bug-report-20260706T220324Z/__snapshots__/bug-report-20260706T220324Z.snap.svg +904 -866
  15. package/tests/bug-reports/bug-report-20260707T092615Z/__snapshots__/bug-report-20260707T092615Z.snap.svg +533 -524
  16. package/tests/bug-reports/bug-report-20260804T171919Z/__snapshots__/bug-report-20260804T171919Z.snap.svg +2 -2
  17. package/tests/bug-reports/bug-report-20260806T093501Z/__snapshots__/bug-report-20260806T093501Z.snap.svg +94 -94
  18. package/tests/bug-reports/bug-report-20260901T064117Z/bug-report-20260901T064117Z.test.ts +13 -2
  19. package/tests/bug-reports/bug-report-20260902T092425Z/__snapshots__/bug-report-20260902T092425Z.snap.svg +2 -2
  20. package/tests/bug-reports/bug-report-20260902T092425Z/bug-report-20260902T092425Z.test.ts +16 -2
  21. package/tests/bug-reports/bug-report-20260905T041712Z/__snapshots__/bug-report-20260905T041712Z.snap.svg +2 -2
  22. package/tests/bug-reports/bug-report-20260907T110144Z/__snapshots__/bug-report-20260907T110144Z.snap.svg +19 -58
  23. package/tests/bug-reports/bug-report-20260907T110144Z/bug-report-20260907T110144Z.test.ts +2 -2
  24. package/tests/bug-reports/bug-report-20260907T145640Z/__snapshots__/bug-report-20260907T145640Z.snap.svg +917 -933
  25. package/tests/repros/__snapshots__/repro-pmp11282-isolated-dcdc.snap.svg +18 -18
  26. package/tests/repros/__snapshots__/repro-repeated-power-rail-junctions.snap.svg +255 -0
  27. package/tests/repros/__snapshots__/repro-smartwatch-power-sheet.snap.svg +111 -75
  28. package/tests/repros/assets/repro-repeated-power-rail-junctions.input.json +927 -0
  29. package/tests/repros/repro-repeated-power-rail-junctions.test.ts +22 -0
  30. package/tests/repros/repro-trellis-core-decoupling-snake-traces.test.ts +66 -0
  31. package/tests/solvers/InlineNetLabelSolver/local-trace-label-shifts.test.ts +62 -0
  32. package/tests/solvers/LongDistancePairSolver/__snapshots__/decoupling-mixed-supplies.snap.svg +112 -0
  33. package/tests/solvers/LongDistancePairSolver/__snapshots__/horizontal-rails.snap.svg +79 -0
  34. package/tests/solvers/LongDistancePairSolver/__snapshots__/vertical-rails.snap.svg +86 -0
  35. package/tests/solvers/LongDistancePairSolver/parallel-decoupling-labels.test.ts +505 -0
  36. package/tests/solvers/SameNetJunctionAlignmentSolver/collapse-same-net-cycles.test.ts +30 -0
@@ -0,0 +1,22 @@
1
+ import { expect, test } from "bun:test"
2
+ import { SchematicTracePipelineSolver } from "lib/solvers/SchematicTracePipelineSolver/SchematicTracePipelineSolver"
3
+ import type { InputProblem } from "lib/types/InputProblem"
4
+ import "tests/fixtures/matcher"
5
+ import inputProblem from "./assets/repro-repeated-power-rail-junctions.input.json"
6
+
7
+ // Reduced from the DS1 area of a Core clock schematic. Three repeated
8
+ // controller/decoupling pairs are the minimum input that preserves the local
9
+ // rectangular branches and multiple junctions beside U_DS1 pins 2 and 3.
10
+ test("collapses repeated junctions around adjacent power rails", () => {
11
+ const solver = new SchematicTracePipelineSolver(
12
+ inputProblem as unknown as InputProblem,
13
+ )
14
+
15
+ solver.solve()
16
+
17
+ expect(solver.solved).toBe(true)
18
+ expect(solver.sameNetJunctionAlignmentSolver?.stats.collapsedCycleCount).toBe(
19
+ 2,
20
+ )
21
+ expect(solver).toMatchSolverSnapshot(import.meta.path)
22
+ })
@@ -0,0 +1,66 @@
1
+ import { expect, test } from "bun:test"
2
+ import { SchematicTracePipelineSolver } from "lib/solvers/SchematicTracePipelineSolver/SchematicTracePipelineSolver"
3
+ import { getTraceConnectedPinComponents } from "lib/solvers/SchematicTraceLinesSolver/getTraceConnectedPinComponents"
4
+ import type { InputProblem } from "lib/types/InputProblem"
5
+ import inputProblem from "../bug-reports/bug-report-20260907T110144Z/bug-report-20260907T110144Z.json"
6
+
7
+ test("Trellis decoupling capacitors share straight rails within each row", () => {
8
+ const solver = new SchematicTracePipelineSolver(
9
+ structuredClone(inputProblem) as unknown as InputProblem,
10
+ )
11
+ solver.solve()
12
+
13
+ expect(solver.solved).toBe(true)
14
+ expect(solver.failed).toBe(false)
15
+
16
+ const { traces, netLabelPlacements, inlineNetLabelPlacements } =
17
+ solver.netLabelToTraceSolver!.getOutput()
18
+ const labels = [...netLabelPlacements, ...inlineNetLabelPlacements]
19
+ const netMap = solver.mspConnectionPairSolver!.globalConnMap
20
+ const groundPins = new Set(
21
+ inputProblem.netConnections.find((net) => net.netId === "GND")!.pinIds,
22
+ )
23
+ const capacitors = inputProblem.chips.filter(
24
+ (chip) =>
25
+ chip.pins.length === 2 &&
26
+ chip.pins.every((pin) =>
27
+ inputProblem.netConnections.some((net) =>
28
+ net.pinIds.includes(pin.pinId),
29
+ ),
30
+ ),
31
+ )
32
+ expect(capacitors).toHaveLength(21)
33
+
34
+ for (const capacitor of capacitors) {
35
+ for (const pin of capacitor.pins) {
36
+ const netId = netMap.getNetConnectedToId(pin.pinId)!
37
+ const component = getTraceConnectedPinComponents({
38
+ pinIds: inputProblem.chips
39
+ .flatMap((chip) => chip.pins)
40
+ .filter((other) => netMap.getNetConnectedToId(other.pinId) === netId)
41
+ .map((other) => other.pinId),
42
+ traces,
43
+ }).find((component) => component.pinIds.includes(pin.pinId))!
44
+ const pinLabels = labels.filter((label) =>
45
+ label.pinIds.some((pinId) => component.pinIds.includes(pinId)),
46
+ )
47
+ expect(pinLabels).toHaveLength(1)
48
+ expect(pinLabels[0]!.globalConnNetId).toBe(netId)
49
+ // Shared rails stay just outside the row instead of alternating above
50
+ // and below components or running back to the IC.
51
+ const sign = groundPins.has(pin.pinId) ? -1 : 1
52
+ for (const trace of component.traces) {
53
+ for (const point of trace.tracePath) {
54
+ expect(sign * (point.y - pin.y)).toBeGreaterThanOrEqual(-1e-6)
55
+ expect(sign * (point.y - pin.y)).toBeLessThanOrEqual(0.5)
56
+ }
57
+ }
58
+ if (groundPins.has(pin.pinId)) {
59
+ expect(component.pinIds).toHaveLength(
60
+ pin.y > 0 ? 13 : pin.x < 0 ? 6 : 4,
61
+ )
62
+ expect(pinLabels[0]).toMatchObject({ orientation: "y-" })
63
+ }
64
+ }
65
+ }
66
+ })
@@ -88,6 +88,68 @@ for (const rotation of [0, 1, 2, 3])
88
88
  expect(output).toEqual(saved)
89
89
  })
90
90
 
91
+ for (const hasJunction of [false, true])
92
+ test(`clears a neighboring redundant bend without losing a junction (junction=${hasJunction})`, () => {
93
+ const { input, output } = fixture()
94
+ input.chips.push({
95
+ chipId: "body",
96
+ center: { x: 2.5, y: 0 },
97
+ width: 1,
98
+ height: 2,
99
+ pins: [],
100
+ })
101
+ output.traces = [
102
+ trace("wire", [
103
+ { x: 2, y: -0.4 },
104
+ { x: 1.9, y: -0.4 },
105
+ { x: 1.9, y: 0.4 },
106
+ { x: 2, y: 0.4 },
107
+ ]),
108
+ trace("neighbor", [
109
+ { x: 2, y: -0.2 },
110
+ { x: 0.7, y: -0.2 },
111
+ { x: 0.7, y: 0.4 },
112
+ { x: 1.7, y: 0.4 },
113
+ { x: 1.7, y: 0.6 },
114
+ { x: 2, y: 0.6 },
115
+ ]),
116
+ ]
117
+ Object.assign(output.netLabelPlacements[0]!, {
118
+ orientation: "x-",
119
+ anchorPoint: { x: 2, y: 0 },
120
+ center: { x: 1.4, y: 0 },
121
+ width: 1.2,
122
+ })
123
+ if (hasJunction)
124
+ output.traces.push({
125
+ ...trace("branch", [
126
+ { x: 1.2, y: 0.4 },
127
+ { x: 1.2, y: 0.8 },
128
+ ]),
129
+ globalConnNetId: "neighbor",
130
+ })
131
+ const saved = structuredClone(output)
132
+ const proposals = [...getLocalTraceLabelShifts(input, output)]
133
+ if (hasJunction) {
134
+ expect(proposals).toEqual([])
135
+ } else {
136
+ expect(proposals.length).toBeGreaterThan(0)
137
+ for (const proposal of proposals) {
138
+ expect(proposal.traces.map((trace) => trace.tracePath.length)).toEqual([
139
+ 4, 4,
140
+ ])
141
+ for (const [index, trace] of proposal.traces.entries()) {
142
+ expect(trace.tracePath[0]).toEqual(output.traces[index]!.tracePath[0])
143
+ expect(trace.tracePath.at(-1)).toEqual(
144
+ output.traces[index]!.tracePath.at(-1),
145
+ )
146
+ }
147
+ expect(getOutputLabelCollisions(proposal)).toEqual([])
148
+ }
149
+ }
150
+ expect(output).toEqual(saved)
151
+ })
152
+
91
153
  test.each([
92
154
  "chip",
93
155
  "parallel wire",
@@ -0,0 +1,112 @@
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
+ <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="0,0.38 3,0.38" data-type="line" data-label="" points="50.769230769230774,306.35897435897436 158.46153846153845,306.35897435897436" fill="none" stroke="hsl(154, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="0,0.38 6,0.38" data-type="line" data-label="" points="50.769230769230774,306.35897435897436 266.15384615384613,306.35897435897436" fill="none" stroke="hsl(154, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="3,0.38 6,0.38" data-type="line" data-label="" points="158.46153846153845,306.35897435897436 266.15384615384613,306.35897435897436" fill="none" stroke="hsl(154, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="0,-0.38 3,-0.38" data-type="line" data-label="" points="50.769230769230774,333.64102564102564 158.46153846153845,333.64102564102564" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="0,-0.38 6,-0.38" data-type="line" data-label="" points="50.769230769230774,333.64102564102564 266.15384615384613,333.64102564102564" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="0,-0.38 9,-0.38" data-type="line" data-label="" points="50.769230769230774,333.64102564102564 373.8461538461538,333.64102564102564" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="0,-0.38 12,-0.38" data-type="line" data-label="" points="50.769230769230774,333.64102564102564 481.5384615384615,333.64102564102564" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="0,-0.38 15,-0.38" data-type="line" data-label="" points="50.769230769230774,333.64102564102564 589.230769230769,333.64102564102564" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="3,-0.38 6,-0.38" data-type="line" data-label="" points="158.46153846153845,333.64102564102564 266.15384615384613,333.64102564102564" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="3,-0.38 9,-0.38" data-type="line" data-label="" points="158.46153846153845,333.64102564102564 373.8461538461538,333.64102564102564" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="3,-0.38 12,-0.38" data-type="line" data-label="" points="158.46153846153845,333.64102564102564 481.5384615384615,333.64102564102564" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="3,-0.38 15,-0.38" data-type="line" data-label="" points="158.46153846153845,333.64102564102564 589.230769230769,333.64102564102564" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="6,-0.38 9,-0.38" data-type="line" data-label="" points="266.15384615384613,333.64102564102564 373.8461538461538,333.64102564102564" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="6,-0.38 12,-0.38" data-type="line" data-label="" points="266.15384615384613,333.64102564102564 481.5384615384615,333.64102564102564" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="6,-0.38 15,-0.38" data-type="line" data-label="" points="266.15384615384613,333.64102564102564 589.230769230769,333.64102564102564" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="9,-0.38 12,-0.38" data-type="line" data-label="" points="373.8461538461538,333.64102564102564 481.5384615384615,333.64102564102564" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="9,-0.38 15,-0.38" data-type="line" data-label="" points="373.8461538461538,333.64102564102564 589.230769230769,333.64102564102564" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="12,-0.38 15,-0.38" data-type="line" data-label="" points="481.5384615384615,333.64102564102564 589.230769230769,333.64102564102564" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="0,0.38 0,0.5800000000000001 3,0.5800000000000001 3,0.38" data-type="line" data-label="" points="50.769230769230774,306.35897435897436 50.769230769230774,299.1794871794872 158.46153846153845,299.1794871794872 158.46153846153845,306.35897435897436" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="3,0.5800000000000001 6,0.5800000000000002 6,0.38" data-type="line" data-label="" points="158.46153846153845,299.1794871794872 266.15384615384613,299.1794871794872 266.15384615384613,306.35897435897436" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="0,-0.38 0,-0.5800000000000001 3,-0.5800000000000001 3,-0.38" data-type="line" data-label="" points="50.769230769230774,333.64102564102564 50.769230769230774,340.8205128205128 158.46153846153845,340.8205128205128 158.46153846153845,333.64102564102564" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="3,-0.5800000000000001 6,-0.5800000000000002 6,-0.38" data-type="line" data-label="" points="158.46153846153845,340.8205128205128 266.15384615384613,340.8205128205128 266.15384615384613,333.64102564102564" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="6,-0.5800000000000002 9,-0.5800000000000002 9,-0.38" data-type="line" data-label="" points="266.15384615384613,340.8205128205128 373.8461538461538,340.8205128205128 373.8461538461538,333.64102564102564" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="9,-0.5800000000000002 12,-0.5799999999999993 12,-0.38" data-type="line" data-label="" points="373.8461538461538,340.8205128205128 481.5384615384615,340.8205128205128 481.5384615384615,333.64102564102564" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="12,-0.5799999999999993 15,-0.5799999999999993 15,-0.38" data-type="line" data-label="" points="481.5384615384615,340.8205128205128 589.230769230769,340.8205128205128 589.230769230769,333.64102564102564" fill="none" stroke="purple" stroke-width="1px"/></g><g><rect data-type="rect" data-label="C_MCU_VDD1" data-x="0" data-y="0" x="40.00000000000001" y="306.35897435897436" width="21.538461538461533" height="27.28205128205127" fill="hsl(247, 100%, 50%, 0.8)" stroke="black" stroke-width="0.02785714285714286"/></g><g><rect data-type="rect" data-label="C_MCU_VDD3" data-x="3" data-y="0" x="147.69230769230768" y="306.35897435897436" width="21.538461538461547" height="27.28205128205127" fill="hsl(249, 100%, 50%, 0.8)" stroke="black" stroke-width="0.02785714285714286"/></g><g><rect data-type="rect" data-label="C_MCU_VDD2" data-x="6" data-y="0" x="255.38461538461536" y="306.35897435897436" width="21.538461538461547" height="27.28205128205127" fill="hsl(248, 100%, 50%, 0.8)" stroke="black" stroke-width="0.02785714285714286"/></g><g><rect data-type="rect" data-label="C_MCU_DEC1" data-x="9" data-y="0" x="363.076923076923" y="306.35897435897436" width="21.538461538461604" height="27.28205128205127" fill="hsl(259, 100%, 50%, 0.8)" stroke="black" stroke-width="0.02785714285714286"/></g><g><rect data-type="rect" data-label="C_MCU_DEC3" data-x="12" data-y="0" x="470.7692307692307" y="306.35897435897436" width="21.538461538461604" height="27.28205128205127" fill="hsl(261, 100%, 50%, 0.8)" stroke="black" stroke-width="0.02785714285714286"/></g><g><rect data-type="rect" data-label="C_MCU_DEC4" data-x="15" data-y="0" x="578.4615384615382" y="306.35897435897436" width="21.53846153846166" height="27.28205128205127" fill="hsl(262, 100%, 50%, 0.8)" stroke="black" stroke-width="0.02785714285714286"/></g><g><rect data-type="rect" data-label="netId: V3V3
4
+ globalConnNetId: connectivity_net0" data-x="0" data-y="0.805" x="47.17948717948718" y="283.025641025641" width="7.179487179487182" height="16.153846153846132" fill="#ef444466" stroke="#ef4444" stroke-width="0.02785714285714286"/></g><g><rect data-type="rect" data-label="netId: GND
5
+ globalConnNetId: connectivity_net4" data-x="0" data-y="-0.805" x="47.17948717948718" y="340.8205128205128" width="7.179487179487182" height="16.153846153846132" fill="#00000066" stroke="#000000" stroke-width="0.02785714285714286"/></g><g><rect data-type="rect" data-label="netId: DEC1
6
+ globalConnNetId: connectivity_net1" data-x="9" data-y="0.606" x="370.2564102564103" y="290.16923076923075" width="7.179487179487126" height="16.15384615384619" fill="#ef444466" stroke="#ef4444" stroke-width="0.02785714285714286"/></g><g><rect data-type="rect" data-label="netId: DEC3
7
+ globalConnNetId: connectivity_net2" data-x="12" data-y="0.606" x="477.9487179487179" y="290.16923076923075" width="7.179487179487126" height="16.15384615384619" fill="#ef444466" stroke="#ef4444" stroke-width="0.02785714285714286"/></g><g><rect data-type="rect" data-label="netId: DEC4
8
+ globalConnNetId: connectivity_net3" data-x="15" data-y="0.606" x="585.6410256410255" y="290.16923076923075" width="7.179487179487069" height="16.15384615384619" fill="#ef444466" stroke="#ef4444" stroke-width="0.02785714285714286"/></g><g><circle data-type="point" data-label="C1.1
9
+ y+" data-x="0" data-y="0.38" cx="50.769230769230774" cy="306.35897435897436" r="3" fill="hsl(121, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="C1.2
10
+ y-" data-x="0" data-y="-0.38" cx="50.769230769230774" cy="333.64102564102564" r="3" fill="hsl(122, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="C2.1
11
+ y+" data-x="3" data-y="0.38" cx="158.46153846153845" cy="306.35897435897436" r="3" fill="hsl(2, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="C2.2
12
+ y-" data-x="3" data-y="-0.38" cx="158.46153846153845" cy="333.64102564102564" r="3" fill="hsl(3, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="C3.1
13
+ y+" data-x="6" data-y="0.38" cx="266.15384615384613" cy="306.35897435897436" r="3" fill="hsl(243, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="C3.2
14
+ y-" data-x="6" data-y="-0.38" cx="266.15384615384613" cy="333.64102564102564" r="3" fill="hsl(244, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="C4.1
15
+ y+" data-x="9" data-y="0.38" cx="373.8461538461538" cy="306.35897435897436" r="3" fill="hsl(124, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="C4.2
16
+ y-" data-x="9" data-y="-0.38" cx="373.8461538461538" cy="333.64102564102564" r="3" fill="hsl(125, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="C5.1
17
+ y+" data-x="12" data-y="0.38" cx="481.5384615384615" cy="306.35897435897436" r="3" fill="hsl(5, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="C5.2
18
+ y-" data-x="12" data-y="-0.38" cx="481.5384615384615" cy="333.64102564102564" r="3" fill="hsl(6, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="C6.1
19
+ y+" data-x="15" data-y="0.38" cx="589.230769230769" cy="306.35897435897436" r="3" fill="hsl(246, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="C6.2
20
+ y-" data-x="15" data-y="-0.38" cx="589.230769230769" cy="333.64102564102564" r="3" fill="hsl(247, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="anchorPoint
21
+ orientation: y+" data-x="0" data-y="0.5800000000000001" cx="50.769230769230774" cy="299.1794871794872" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
22
+ orientation: y-" data-x="0" data-y="-0.5800000000000001" cx="50.769230769230774" cy="340.8205128205128" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
23
+ orientation: y+" data-x="9" data-y="0.38" cx="373.8461538461538" cy="306.35897435897436" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
24
+ orientation: y+" data-x="12" data-y="0.38" cx="481.5384615384615" cy="306.35897435897436" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
25
+ orientation: y+" data-x="15" data-y="0.38" cx="589.230769230769" cy="306.35897435897436" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g id="crosshair" style="display: none"><line id="crosshair-h" y1="0" y2="640" stroke="#666" stroke-width="0.5"/><line id="crosshair-v" x1="0" x2="640" stroke="#666" stroke-width="0.5"/><text id="coordinates" font-family="monospace" font-size="12" fill="#666"></text></g><script><![CDATA[
26
+ document.currentScript.parentElement.addEventListener('mousemove', (e) => {
27
+ const svg = e.currentTarget;
28
+ const rect = svg.getBoundingClientRect();
29
+ const x = e.clientX - rect.left;
30
+ const y = e.clientY - rect.top;
31
+ const crosshair = svg.getElementById('crosshair');
32
+ const h = svg.getElementById('crosshair-h');
33
+ const v = svg.getElementById('crosshair-v');
34
+ const coords = svg.getElementById('coordinates');
35
+
36
+ crosshair.style.display = 'block';
37
+ h.setAttribute('x1', '0');
38
+ h.setAttribute('x2', '640');
39
+ h.setAttribute('y1', y);
40
+ h.setAttribute('y2', y);
41
+ v.setAttribute('x1', x);
42
+ v.setAttribute('x2', x);
43
+ v.setAttribute('y1', '0');
44
+ v.setAttribute('y2', '640');
45
+
46
+ // Calculate real coordinates using inverse transformation
47
+ const matrix = {"a":35.89743589743589,"c":0,"e":50.769230769230774,"b":0,"d":-35.89743589743589,"f":320};
48
+ // Manually invert and apply the affine transform
49
+ // Since we only use translate and scale, we can directly compute:
50
+ // x' = (x - tx) / sx
51
+ // y' = (y - ty) / sy
52
+ const sx = matrix.a;
53
+ const sy = matrix.d;
54
+ const tx = matrix.e;
55
+ const ty = matrix.f;
56
+ const realPoint = {
57
+ x: (x - tx) / sx,
58
+ y: (y - ty) / sy // Flip y back since we used negative scale
59
+ }
60
+
61
+ coords.textContent = `(${realPoint.x.toFixed(2)}, ${realPoint.y.toFixed(2)})`;
62
+ coords.setAttribute('x', (x + 5).toString());
63
+ coords.setAttribute('y', (y - 5).toString());
64
+ });
65
+ document.currentScript.parentElement.addEventListener('mouseleave', () => {
66
+ document.currentScript.parentElement.getElementById('crosshair').style.display = 'none';
67
+ });
68
+ ]]></script>
69
+ </g>
70
+ <g transform="translate(0, 1216)">
71
+ <style>
72
+ .boundary { fill: rgb(245, 241, 237); }
73
+ .schematic-boundary { fill: none; stroke: #fff; }
74
+ .component { fill: none; stroke: rgb(132, 0, 0); }
75
+ .chip { fill: rgb(255, 255, 194); stroke: rgb(132, 0, 0); }
76
+ .component-pin { fill: none; stroke: rgb(132, 0, 0); }
77
+ .text { font-family: sans-serif; fill: rgb(0, 150, 0); }
78
+ .pin-number { fill: rgb(169, 0, 0); }
79
+ .port-label { fill: rgb(0, 100, 100); }
80
+ .component-name { fill: rgb(0, 100, 100); }
81
+
82
+ </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 74.9124854142 374.94049008166803 L 74.9124854142 360.938156359388 L 284.94749124839996 360.938156359388 L 284.94749124839996 374.94049008166803" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="11.201866977824px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 74.9124854142 374.94049008166803 L 74.9124854142 360.938156359388 L 284.94749124839996 360.938156359388 L 284.94749124839996 374.94049008166803" stroke="rgb(0, 150, 0)" fill="none" stroke-width="1.400233372228px" 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 284.94749124839996 360.938156359388 L 494.98249708259993 360.938156359388 L 494.98249708259993 374.94049008166803" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="11.201866977824px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 284.94749124839996 360.938156359388 L 494.98249708259993 360.938156359388 L 494.98249708259993 374.94049008166803" stroke="rgb(0, 150, 0)" fill="none" stroke-width="1.400233372228px" 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 74.9124854142 428.14935822633197 L 74.9124854142 442.151691948612 L 284.94749124839996 442.151691948612 L 284.94749124839996 428.14935822633197" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="11.201866977824px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 74.9124854142 428.14935822633197 L 74.9124854142 442.151691948612 L 284.94749124839996 442.151691948612 L 284.94749124839996 428.14935822633197" stroke="rgb(0, 150, 0)" fill="none" stroke-width="1.400233372228px" 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 284.94749124839996 442.151691948612 L 494.98249708259993 442.151691948612 L 494.98249708259993 428.14935822633197" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="11.201866977824px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 284.94749124839996 442.151691948612 L 494.98249708259993 442.151691948612 L 494.98249708259993 428.14935822633197" stroke="rgb(0, 150, 0)" fill="none" stroke-width="1.400233372228px" 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 494.98249708259993 442.151691948612 L 705.0175029167999 442.151691948612 L 705.0175029167999 428.14935822633197" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="11.201866977824px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 494.98249708259993 442.151691948612 L 705.0175029167999 442.151691948612 L 705.0175029167999 428.14935822633197" stroke="rgb(0, 150, 0)" fill="none" stroke-width="1.400233372228px" 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 705.0175029167999 442.151691948612 L 915.0525087509999 442.1516919486119 L 915.0525087509999 428.14935822633197" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="11.201866977824px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 705.0175029167999 442.151691948612 L 915.0525087509999 442.1516919486119 L 915.0525087509999 428.14935822633197" stroke="rgb(0, 150, 0)" fill="none" stroke-width="1.400233372228px" 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 915.0525087509999 442.1516919486119 L 1125.0875145852 442.1516919486119 L 1125.0875145852 428.14935822633197" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="11.201866977824px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 915.0525087509999 442.1516919486119 L 1125.0875145852 442.1516919486119 L 1125.0875145852 428.14935822633197" stroke="rgb(0, 150, 0)" fill="none" stroke-width="1.400233372228px" 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="284.94749124839996" cy="360.938156359388" r="2.100350058342" 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"/><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_2__stack1"><circle cx="284.94749124839996" cy="442.151691948612" r="2.100350058342" 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_3__stack1"><circle cx="494.98249708259993" cy="442.151691948612" r="2.100350058342" 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="705.0175029167999" cy="442.151691948612" r="2.100350058342" 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="915.0525087509999" cy="442.1516919486119" r="2.100350058342" 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"/><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_0__stack1"><rect class="component-overlay sch-component-overlay" x="60.72168028001812" y="374.940490081668" width="28.381610268363772" height="53.20886814466405" fill="transparent"/><path class="sch-component-symbol-path" d="M 74.9124854142 428.149358226332 L 74.9124854142 406.8658109684664" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 74.9124854142 396.2240373395336 L 74.9124854142 374.940490081668" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 89.10329054838189 406.8658109684664 L 60.72168028001812 406.8658109684664" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 89.10329054838189 396.2240373395336 L 60.72168028001812 396.2240373395336" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><text class="sch-component-name sch-component-text" x="85.11085180859394" y="383.8086347724453" stroke="rgb(245, 241, 237)" stroke-width="1.400233372228px" paint-order="stroke" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="start" dominant-baseline="ideographic" font-size="12.602100350052px">C1</text><text class="sch-component-text" x="85.11085180859394" y="419.2812135355547" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="start" dominant-baseline="hanging" font-size="12.602100350052px"></text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_1__stack1"><rect class="component-overlay sch-component-overlay" x="270.75668611421804" y="374.940490081668" width="28.38161026836383" height="53.20886814466405" fill="transparent"/><path class="sch-component-symbol-path" d="M 284.94749124839996 428.149358226332 L 284.94749124839996 406.8658109684664" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 284.94749124839996 396.2240373395336 L 284.94749124839996 374.940490081668" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 299.13829638258187 406.8658109684664 L 270.75668611421804 406.8658109684664" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 299.13829638258187 396.2240373395336 L 270.75668611421804 396.2240373395336" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><text class="sch-component-name sch-component-text" x="295.1458576427939" y="383.8086347724453" stroke="rgb(245, 241, 237)" stroke-width="1.400233372228px" paint-order="stroke" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="start" dominant-baseline="ideographic" font-size="12.602100350052px">C2</text><text class="sch-component-text" x="295.1458576427939" y="419.2812135355547" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="start" dominant-baseline="hanging" font-size="12.602100350052px"></text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_2__stack1"><rect class="component-overlay sch-component-overlay" x="480.791691948418" y="374.940490081668" width="28.38161026836383" height="53.20886814466405" fill="transparent"/><path class="sch-component-symbol-path" d="M 494.98249708259993 428.149358226332 L 494.98249708259993 406.8658109684664" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 494.98249708259993 396.2240373395336 L 494.98249708259993 374.940490081668" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 509.17330221678185 406.8658109684664 L 480.791691948418 406.8658109684664" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 509.17330221678185 396.2240373395336 L 480.791691948418 396.2240373395336" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><text class="sch-component-name sch-component-text" x="505.18086347699386" y="383.8086347724453" stroke="rgb(245, 241, 237)" stroke-width="1.400233372228px" paint-order="stroke" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="start" dominant-baseline="ideographic" font-size="12.602100350052px">C3</text><text class="sch-component-text" x="505.18086347699386" y="419.2812135355547" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="start" dominant-baseline="hanging" font-size="12.602100350052px"></text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_3__stack1"><rect class="component-overlay sch-component-overlay" x="690.826697782618" y="374.940490081668" width="28.38161026836383" height="53.20886814466405" fill="transparent"/><path class="sch-component-symbol-path" d="M 705.0175029167999 428.149358226332 L 705.0175029167999 406.8658109684664" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 705.0175029167999 396.2240373395336 L 705.0175029167999 374.940490081668" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 719.2083080509818 406.8658109684664 L 690.826697782618 406.8658109684664" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 719.2083080509818 396.2240373395336 L 690.826697782618 396.2240373395336" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><text class="sch-component-name sch-component-text" x="715.2158693111938" y="383.8086347724453" stroke="rgb(245, 241, 237)" stroke-width="1.400233372228px" paint-order="stroke" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="start" dominant-baseline="ideographic" font-size="12.602100350052px">C4</text><text class="sch-component-text" x="715.2158693111938" y="419.2812135355547" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="start" dominant-baseline="hanging" font-size="12.602100350052px"></text><circle class="component-pin sch-component-pin" cx="705.0175029167999" cy="374.940490081668" r="1.400233372228px" stroke-width="1.400233372228px" fill="none" stroke="rgb(132, 0, 0)"/></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_4__stack1"><rect class="component-overlay sch-component-overlay" x="900.861703616818" y="374.940490081668" width="28.38161026836383" height="53.20886814466405" fill="transparent"/><path class="sch-component-symbol-path" d="M 915.0525087509999 428.149358226332 L 915.0525087509999 406.8658109684664" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 915.0525087509999 396.2240373395336 L 915.0525087509999 374.940490081668" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 929.2433138851818 406.8658109684664 L 900.861703616818 406.8658109684664" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 929.2433138851818 396.2240373395336 L 900.861703616818 396.2240373395336" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><text class="sch-component-name sch-component-text" x="925.2508751453938" y="383.8086347724453" stroke="rgb(245, 241, 237)" stroke-width="1.400233372228px" paint-order="stroke" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="start" dominant-baseline="ideographic" font-size="12.602100350052px">C5</text><text class="sch-component-text" x="925.2508751453938" y="419.2812135355547" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="start" dominant-baseline="hanging" font-size="12.602100350052px"></text><circle class="component-pin sch-component-pin" cx="915.0525087509999" cy="374.940490081668" r="1.400233372228px" stroke-width="1.400233372228px" fill="none" stroke="rgb(132, 0, 0)"/></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_5__stack1"><rect class="component-overlay sch-component-overlay" x="1110.8967094510183" y="374.940490081668" width="28.381610268363602" height="53.20886814466405" fill="transparent"/><path class="sch-component-symbol-path" d="M 1125.0875145852 428.149358226332 L 1125.0875145852 406.8658109684664" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 1125.0875145852 396.2240373395336 L 1125.0875145852 374.940490081668" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 1139.278319719382 406.8658109684664 L 1110.8967094510183 406.8658109684664" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 1139.278319719382 396.2240373395336 L 1110.8967094510183 396.2240373395336" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><text class="sch-component-name sch-component-text" x="1135.2858809795941" y="383.8086347724453" stroke="rgb(245, 241, 237)" stroke-width="1.400233372228px" paint-order="stroke" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="start" dominant-baseline="ideographic" font-size="12.602100350052px">C6</text><text class="sch-component-text" x="1135.2858809795941" y="419.2812135355547" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="start" dominant-baseline="hanging" font-size="12.602100350052px"></text><circle class="component-pin sch-component-pin" cx="1125.0875145852" cy="374.940490081668" r="1.400233372228px" stroke-width="1.400233372228px" fill="none" stroke="rgb(132, 0, 0)"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_0__stack1"><circle cx="74.9124854142" cy="380.54142357058" r="2.800466744456" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_1__stack1"><circle cx="74.9124854142" cy="433.750291715244" r="2.800466744456" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_1_0__stack1"><circle cx="284.94749124839996" cy="380.54142357058" r="2.800466744456" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_1_1__stack1"><circle cx="284.94749124839996" cy="433.750291715244" r="2.800466744456" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_2_0__stack1"><circle cx="494.98249708259993" cy="380.54142357058" r="2.800466744456" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_2_1__stack1"><circle cx="494.98249708259993" cy="433.750291715244" r="2.800466744456" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_3_0__stack1"><circle cx="705.0175029167999" cy="380.54142357058" r="2.800466744456" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_3_1__stack1"><circle cx="705.0175029167999" cy="433.750291715244" r="2.800466744456" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_4_0__stack1"><circle cx="915.0525087509999" cy="380.54142357058" r="2.800466744456" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_4_1__stack1"><circle cx="915.0525087509999" cy="433.750291715244" r="2.800466744456" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_5_0__stack1"><circle cx="1125.0875145852" cy="380.54142357058" r="2.800466744456" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_5_1__stack1"><circle cx="1125.0875145852" cy="433.750291715244" r="2.800466744456" 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="
83
+ M 74.9124854142,360.938156359388
84
+ L 67.91131855306,357.15752625437244
85
+ L 67.91131855306001,319.5005834305874
86
+ L 81.91365227534001,319.5005834305874
87
+ L 81.91365227534001,357.15752625437244
88
+ Z
89
+ " fill="rgba(255, 255, 255, 0.6)" stroke="rgb(132, 0, 0)" stroke-width="1.400233372228px"/><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="74.9124854142" y="354.63710618436204" fill="rgb(132, 0, 0)" text-anchor="start" dominant-baseline="central" font-family="sans-serif" font-variant-numeric="tabular-nums" font-size="12.602100350052px" transform="rotate(-90 74.9124854142 354.63710618436204)">V3V3</text><rect class="component-overlay sch-component-overlay sch-net-label-overlay" data-circuit-json-type="schematic_net_label" data-schematic-net-label-id="schematic_net_label_1__stack1" x="66.51108518083201" y="442.15169194861204" width="16.802800466735988" height="12.602100350051956" fill="transparent"/><path class="sch-net-label-symbol-path" data-circuit-json-type="schematic_net_label" data-schematic-net-label-id="schematic_net_label_1__stack1" d="M 66.51108518083201 454.753792298664 L 83.313885647568 454.753792298664" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><path class="sch-net-label-symbol-path" data-circuit-json-type="schematic_net_label" data-schematic-net-label-id="schematic_net_label_1__stack1" d="M 74.9124854142 454.753792298664 L 74.9124854142 442.15169194861204" stroke="rgb(132, 0, 0)" fill="none" stroke-width="1.400233372228px" stroke-linecap="round"/><text class="sch-net-label-symbol-text" data-circuit-json-type="schematic_net_label" data-schematic-net-label-id="schematic_net_label_1__stack1" x="74.9124854142" y="458.254375729234" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="middle" dominant-baseline="hanging" font-size="12.602100350052px">GND</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="
90
+ M 705.0175029167999,374.94049008166803
91
+ L 698.01633605566,371.15985997665246
92
+ L 698.01633605566,331.16919486582077
93
+ L 712.0186697779399,331.16919486582077
94
+ L 712.0186697779399,371.15985997665246
95
+ Z
96
+ " fill="rgba(255, 255, 255, 0.6)" stroke="rgb(132, 0, 0)" stroke-width="1.400233372228px"/><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="705.0175029167999" y="368.63943990664205" fill="rgb(132, 0, 0)" text-anchor="start" dominant-baseline="central" font-family="sans-serif" font-variant-numeric="tabular-nums" font-size="12.602100350052px" transform="rotate(-90 705.0175029167999 368.63943990664205)">DEC1</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="
97
+ M 915.0525087509999,374.94049008166803
98
+ L 908.0513418898599,371.15985997665246
99
+ L 908.0513418898599,331.16919486582077
100
+ L 922.0536756121398,331.16919486582077
101
+ L 922.0536756121398,371.15985997665246
102
+ Z
103
+ " fill="rgba(255, 255, 255, 0.6)" stroke="rgb(132, 0, 0)" stroke-width="1.400233372228px"/><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="915.0525087509999" y="368.63943990664205" fill="rgb(132, 0, 0)" text-anchor="start" dominant-baseline="central" font-family="sans-serif" font-variant-numeric="tabular-nums" font-size="12.602100350052px" transform="rotate(-90 915.0525087509999 368.63943990664205)">DEC3</text><path class="net-label sch-net-label" data-circuit-json-type="schematic_net_label" data-schematic-net-label-id="schematic_net_label_4__stack1" d="
104
+ M 1125.0875145852,374.94049008166803
105
+ L 1118.08634772406,371.15985997665246
106
+ L 1118.08634772406,331.16919486582077
107
+ L 1132.0886814463402,331.16919486582077
108
+ L 1132.0886814463402,371.15985997665246
109
+ Z
110
+ " fill="rgba(255, 255, 255, 0.6)" stroke="rgb(132, 0, 0)" stroke-width="1.400233372228px"/><text class="net-label-text sch-net-label-text" data-circuit-json-type="schematic_net_label" data-schematic-net-label-id="schematic_net_label_4__stack1" x="1125.0875145852" y="368.63943990664205" fill="rgb(132, 0, 0)" text-anchor="start" dominant-baseline="central" font-family="sans-serif" font-variant-numeric="tabular-nums" font-size="12.602100350052px" transform="rotate(-90 1125.0875145852 368.63943990664205)">DEC4</text>
111
+ </g>
112
+ </svg>
@@ -0,0 +1,79 @@
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
+ <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="0,0.4 2,0.4" data-type="line" data-label="" points="76.52173913043478,271.30434782608694 320,271.30434782608694" fill="none" stroke="hsl(222, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="0,0.4 4,0.4" data-type="line" data-label="" points="76.52173913043478,271.30434782608694 563.4782608695652,271.30434782608694" fill="none" stroke="hsl(222, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="2,0.4 4,0.4" data-type="line" data-label="" points="320,271.30434782608694 563.4782608695652,271.30434782608694" fill="none" stroke="hsl(222, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="0,-0.4 2,-0.4" data-type="line" data-label="" points="76.52173913043478,368.69565217391306 320,368.69565217391306" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="0,-0.4 4,-0.4" data-type="line" data-label="" points="76.52173913043478,368.69565217391306 563.4782608695652,368.69565217391306" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="2,-0.4 4,-0.4" data-type="line" data-label="" points="320,368.69565217391306 563.4782608695652,368.69565217391306" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="0,0.4 0,0.6000000000000001 2,0.6000000000000001 2,0.4" data-type="line" data-label="" points="76.52173913043478,271.30434782608694 76.52173913043478,246.9565217391304 320,246.9565217391304 320,271.30434782608694" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="2,0.6000000000000001 4,0.6000000000000002 4,0.4" data-type="line" data-label="" points="320,246.9565217391304 563.4782608695652,246.95652173913038 563.4782608695652,271.30434782608694" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="0,-0.4 0,-0.6000000000000001 2,-0.6000000000000001 2,-0.4" data-type="line" data-label="" points="76.52173913043478,368.69565217391306 76.52173913043478,393.0434782608696 320,393.0434782608696 320,368.69565217391306" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="2,-0.6000000000000001 4,-0.6000000000000002 4,-0.4" data-type="line" data-label="" points="320,393.0434782608696 563.4782608695652,393.0434782608696 563.4782608695652,368.69565217391306" fill="none" stroke="purple" stroke-width="1px"/></g><g><rect data-type="rect" data-label="C1" data-x="0" data-y="0" x="40" y="271.30434782608694" width="73.04347826086956" height="97.39130434782612" fill="hsl(326, 100%, 50%, 0.8)" stroke="black" stroke-width="0.008214285714285714"/></g><g><rect data-type="rect" data-label="C2" data-x="2" data-y="0" x="283.47826086956525" y="271.30434782608694" width="73.0434782608695" height="97.39130434782612" fill="hsl(327, 100%, 50%, 0.8)" stroke="black" stroke-width="0.008214285714285714"/></g><g><rect data-type="rect" data-label="C3" data-x="4" data-y="0" x="526.9565217391305" y="271.30434782608694" width="73.0434782608695" height="97.39130434782612" fill="hsl(328, 100%, 50%, 0.8)" stroke="black" stroke-width="0.008214285714285714"/></g><g><rect data-type="rect" data-label="netId: VDD
4
+ globalConnNetId: connectivity_net0" data-x="0" data-y="0.8250000000000001" x="64.34782608695652" y="192.17391304347825" width="24.34782608695653" height="54.78260869565216" fill="#ef444466" stroke="#ef4444" stroke-width="0.008214285714285714"/></g><g><rect data-type="rect" data-label="netId: GND
5
+ globalConnNetId: connectivity_net1" data-x="0" data-y="-0.8250000000000001" x="64.34782608695652" y="393.0434782608696" width="24.34782608695653" height="54.78260869565213" fill="#00000066" stroke="#000000" stroke-width="0.008214285714285714"/></g><g><circle data-type="point" data-label="C1.1
6
+ y+" data-x="0" data-y="0.4" cx="76.52173913043478" cy="271.30434782608694" r="3" fill="hsl(121, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="C1.2
7
+ y-" data-x="0" data-y="-0.4" cx="76.52173913043478" cy="368.69565217391306" r="3" fill="hsl(122, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="C2.2
8
+ y-" data-x="2" data-y="-0.4" cx="320" cy="368.69565217391306" r="3" fill="hsl(3, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="C2.1
9
+ y+" data-x="2" data-y="0.4" cx="320" cy="271.30434782608694" r="3" fill="hsl(2, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="C3.1
10
+ y+" data-x="4" data-y="0.4" cx="563.4782608695652" cy="271.30434782608694" r="3" fill="hsl(243, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="C3.2
11
+ y-" data-x="4" data-y="-0.4" cx="563.4782608695652" cy="368.69565217391306" r="3" fill="hsl(244, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="anchorPoint
12
+ orientation: y+" data-x="0" data-y="0.6000000000000001" cx="76.52173913043478" cy="246.9565217391304" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
13
+ orientation: y-" data-x="0" data-y="-0.6000000000000001" cx="76.52173913043478" cy="393.0434782608696" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g id="crosshair" style="display: none"><line id="crosshair-h" y1="0" y2="640" stroke="#666" stroke-width="0.5"/><line id="crosshair-v" x1="0" x2="640" stroke="#666" stroke-width="0.5"/><text id="coordinates" font-family="monospace" font-size="12" fill="#666"></text></g><script><![CDATA[
14
+ document.currentScript.parentElement.addEventListener('mousemove', (e) => {
15
+ const svg = e.currentTarget;
16
+ const rect = svg.getBoundingClientRect();
17
+ const x = e.clientX - rect.left;
18
+ const y = e.clientY - rect.top;
19
+ const crosshair = svg.getElementById('crosshair');
20
+ const h = svg.getElementById('crosshair-h');
21
+ const v = svg.getElementById('crosshair-v');
22
+ const coords = svg.getElementById('coordinates');
23
+
24
+ crosshair.style.display = 'block';
25
+ h.setAttribute('x1', '0');
26
+ h.setAttribute('x2', '640');
27
+ h.setAttribute('y1', y);
28
+ h.setAttribute('y2', y);
29
+ v.setAttribute('x1', x);
30
+ v.setAttribute('x2', x);
31
+ v.setAttribute('y1', '0');
32
+ v.setAttribute('y2', '640');
33
+
34
+ // Calculate real coordinates using inverse transformation
35
+ const matrix = {"a":121.73913043478262,"c":0,"e":76.52173913043478,"b":0,"d":-121.73913043478262,"f":320};
36
+ // Manually invert and apply the affine transform
37
+ // Since we only use translate and scale, we can directly compute:
38
+ // x' = (x - tx) / sx
39
+ // y' = (y - ty) / sy
40
+ const sx = matrix.a;
41
+ const sy = matrix.d;
42
+ const tx = matrix.e;
43
+ const ty = matrix.f;
44
+ const realPoint = {
45
+ x: (x - tx) / sx,
46
+ y: (y - ty) / sy // Flip y back since we used negative scale
47
+ }
48
+
49
+ coords.textContent = `(${realPoint.x.toFixed(2)}, ${realPoint.y.toFixed(2)})`;
50
+ coords.setAttribute('x', (x + 5).toString());
51
+ coords.setAttribute('y', (y - 5).toString());
52
+ });
53
+ document.currentScript.parentElement.addEventListener('mouseleave', () => {
54
+ document.currentScript.parentElement.getElementById('crosshair').style.display = 'none';
55
+ });
56
+ ]]></script>
57
+ </g>
58
+ <g transform="translate(0, 1216)">
59
+ <style>
60
+ .boundary { fill: rgb(245, 241, 237); }
61
+ .schematic-boundary { fill: none; stroke: #fff; }
62
+ .component { fill: none; stroke: rgb(132, 0, 0); }
63
+ .chip { fill: rgb(255, 255, 194); stroke: rgb(132, 0, 0); }
64
+ .component-pin { fill: none; stroke: rgb(132, 0, 0); }
65
+ .text { font-family: sans-serif; fill: rgb(0, 150, 0); }
66
+ .pin-number { fill: rgb(169, 0, 0); }
67
+ .port-label { fill: rgb(0, 100, 100); }
68
+ .component-name { fill: rgb(0, 100, 100); }
69
+
70
+ </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 212.9032258065 322.58064516128 L 212.9032258065 283.87096774191997 L 600.0000000001 283.87096774191997 L 600.0000000001 322.58064516128" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="30.967741935488004px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 212.9032258065 322.58064516128 L 212.9032258065 283.87096774191997 L 600.0000000001 283.87096774191997 L 600.0000000001 322.58064516128" stroke="rgb(0, 150, 0)" fill="none" stroke-width="3.8709677419360005px" 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 600.0000000001 283.87096774191997 L 987.0967741937001 283.87096774191997 L 987.0967741937001 322.58064516128" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="30.967741935488004px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 600.0000000001 283.87096774191997 L 987.0967741937001 283.87096774191997 L 987.0967741937001 322.58064516128" stroke="rgb(0, 150, 0)" fill="none" stroke-width="3.8709677419360005px" 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 212.9032258065 477.41935483872 L 212.9032258065 516.1290322580801 L 600.0000000001 516.1290322580801 L 600.0000000001 477.41935483872" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="30.967741935488004px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 212.9032258065 477.41935483872 L 212.9032258065 516.1290322580801 L 600.0000000001 516.1290322580801 L 600.0000000001 477.41935483872" stroke="rgb(0, 150, 0)" fill="none" stroke-width="3.8709677419360005px" 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 600.0000000001 516.1290322580801 L 987.0967741937001 516.1290322580801 L 987.0967741937001 477.41935483872" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="30.967741935488004px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 600.0000000001 516.1290322580801 L 987.0967741937001 516.1290322580801 L 987.0967741937001 477.41935483872" stroke="rgb(0, 150, 0)" fill="none" stroke-width="3.8709677419360005px" 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="600.0000000001" cy="283.87096774191997" r="5.8064516129040005" 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"/><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_2__stack1"><circle cx="600.0000000001" cy="516.1290322580801" r="5.8064516129040005" 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_3__stack1"/><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_0__stack1"><rect class="component-overlay sch-component-overlay" x="171.60774193552675" y="322.58064516128" width="82.59096774194649" height="154.83870967743997" fill="transparent"/><path class="sch-component-symbol-path" d="M 212.9032258065 477.41935483872 L 212.9032258065 415.483870967744" stroke="rgb(132, 0, 0)" fill="none" stroke-width="3.8709677419360005px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 212.9032258065 384.516129032256 L 212.9032258065 322.58064516128" stroke="rgb(132, 0, 0)" fill="none" stroke-width="3.8709677419360005px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 254.19870967747323 415.483870967744 L 171.60774193552675 415.483870967744" stroke="rgb(132, 0, 0)" fill="none" stroke-width="3.8709677419360005px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 254.19870967747323 384.516129032256 L 171.60774193552675 384.516129032256" stroke="rgb(132, 0, 0)" fill="none" stroke-width="3.8709677419360005px" stroke-linecap="round"/><text class="sch-component-name sch-component-text" x="242.58064516134266" y="348.38709677418666" stroke="rgb(245, 241, 237)" stroke-width="3.8709677419360005px" paint-order="stroke" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="start" dominant-baseline="ideographic" font-size="34.838709677424px">C1</text><text class="sch-component-text" x="242.58064516134266" y="451.61290322581334" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="start" dominant-baseline="hanging" font-size="34.838709677424px"></text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_1__stack1"><rect class="component-overlay sch-component-overlay" x="558.7045161291268" y="322.58064516128" width="82.59096774194654" height="154.83870967743997" fill="transparent"/><path class="sch-component-symbol-path" d="M 600.0000000001 477.41935483872 L 600.0000000001 415.483870967744" stroke="rgb(132, 0, 0)" fill="none" stroke-width="3.8709677419360005px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 600.0000000001 384.516129032256 L 600.0000000001 322.58064516128" stroke="rgb(132, 0, 0)" fill="none" stroke-width="3.8709677419360005px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 641.2954838710733 415.483870967744 L 558.7045161291268 415.483870967744" stroke="rgb(132, 0, 0)" fill="none" stroke-width="3.8709677419360005px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 641.2954838710733 384.516129032256 L 558.7045161291268 384.516129032256" stroke="rgb(132, 0, 0)" fill="none" stroke-width="3.8709677419360005px" stroke-linecap="round"/><text class="sch-component-name sch-component-text" x="629.6774193549427" y="348.38709677418666" stroke="rgb(245, 241, 237)" stroke-width="3.8709677419360005px" paint-order="stroke" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="start" dominant-baseline="ideographic" font-size="34.838709677424px">C2</text><text class="sch-component-text" x="629.6774193549427" y="451.61290322581334" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="start" dominant-baseline="hanging" font-size="34.838709677424px"></text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_2__stack1"><rect class="component-overlay sch-component-overlay" x="945.8012903227268" y="322.58064516128" width="82.59096774194654" height="154.83870967743997" fill="transparent"/><path class="sch-component-symbol-path" d="M 987.0967741937001 477.41935483872 L 987.0967741937001 415.483870967744" stroke="rgb(132, 0, 0)" fill="none" stroke-width="3.8709677419360005px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 987.0967741937001 384.516129032256 L 987.0967741937001 322.58064516128" stroke="rgb(132, 0, 0)" fill="none" stroke-width="3.8709677419360005px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 1028.3922580646733 415.483870967744 L 945.8012903227268 415.483870967744" stroke="rgb(132, 0, 0)" fill="none" stroke-width="3.8709677419360005px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 1028.3922580646733 384.516129032256 L 945.8012903227268 384.516129032256" stroke="rgb(132, 0, 0)" fill="none" stroke-width="3.8709677419360005px" stroke-linecap="round"/><text class="sch-component-name sch-component-text" x="1016.7741935485427" y="348.38709677418666" stroke="rgb(245, 241, 237)" stroke-width="3.8709677419360005px" paint-order="stroke" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="start" dominant-baseline="ideographic" font-size="34.838709677424px">C3</text><text class="sch-component-text" x="1016.7741935485427" y="451.61290322581334" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="start" dominant-baseline="hanging" font-size="34.838709677424px"></text></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_0__stack1"><circle cx="212.9032258065" cy="341.93548387096" r="7.741935483872001" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_1__stack1"><circle cx="212.9032258065" cy="496.77419354840004" r="7.741935483872001" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_1_0__stack1"><circle cx="600.0000000001" cy="496.77419354840004" r="7.741935483872001" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_1_1__stack1"><circle cx="600.0000000001" cy="341.93548387096" r="7.741935483872001" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_2_0__stack1"><circle cx="987.0967741937001" cy="341.93548387096" r="7.741935483872001" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_2_1__stack1"><circle cx="987.0967741937001" cy="496.77419354840004" r="7.741935483872001" 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="
71
+ M 212.9032258065,283.87096774191997
72
+ L 193.54838709682,273.41935483869275
73
+ L 193.54838709682,207.04516129029685
74
+ L 232.25806451617999,207.04516129029685
75
+ L 232.25806451617999,273.41935483869275
76
+ Z
77
+ " fill="rgba(255, 255, 255, 0.6)" stroke="rgb(132, 0, 0)" stroke-width="3.8709677419360005px"/><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="212.9032258065" y="266.45161290320794" fill="rgb(132, 0, 0)" text-anchor="start" dominant-baseline="central" font-family="sans-serif" font-variant-numeric="tabular-nums" font-size="34.838709677424px" transform="rotate(-90 212.9032258065 266.45161290320794)">XX</text><rect class="component-overlay sch-component-overlay sch-net-label-overlay" data-circuit-json-type="schematic_net_label" data-schematic-net-label-id="schematic_net_label_1__stack1" x="189.677419354884" y="516.12903225808" width="46.45161290323199" height="34.83870967742405" fill="transparent"/><path class="sch-net-label-symbol-path" data-circuit-json-type="schematic_net_label" data-schematic-net-label-id="schematic_net_label_1__stack1" d="M 189.677419354884 550.967741935504 L 236.12903225811598 550.967741935504" stroke="rgb(132, 0, 0)" fill="none" stroke-width="3.8709677419360005px" stroke-linecap="round"/><path class="sch-net-label-symbol-path" data-circuit-json-type="schematic_net_label" data-schematic-net-label-id="schematic_net_label_1__stack1" d="M 212.9032258065 550.967741935504 L 212.9032258065 516.12903225808" stroke="rgb(132, 0, 0)" fill="none" stroke-width="3.8709677419360005px" stroke-linecap="round"/><text class="sch-net-label-symbol-text" data-circuit-json-type="schematic_net_label" data-schematic-net-label-id="schematic_net_label_1__stack1" x="212.9032258065" y="560.645161290344" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="middle" dominant-baseline="hanging" font-size="34.838709677424px">XX</text>
78
+ </g>
79
+ </svg>