@tscircuit/schematic-trace-solver 0.0.156 → 0.0.158

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 (176) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.js +151 -57
  3. package/lib/solvers/MspConnectionPairSolver/MspConnectionPairSolver.ts +10 -2
  4. package/lib/solvers/SameNetJunctionAlignmentSolver/alignSameNetJunctions.ts +196 -67
  5. package/package.json +1 -1
  6. package/site/bug-reports/bug-report-20260826T072956Z.page.tsx +4 -0
  7. package/site/components/PipelineDebugger.tsx +4 -2
  8. package/site/examples/example51.page.tsx +3 -1
  9. package/tests/bug-reports/bug-report-20260706T213649Z/__snapshots__/bug-report-20260706T213649Z.snap.svg +2 -2
  10. package/tests/bug-reports/bug-report-20260706T220324Z/__snapshots__/bug-report-20260706T220324Z.snap.svg +2 -2
  11. package/tests/bug-reports/bug-report-20260707T020342Z/__snapshots__/bug-report-20260707T020342Z.snap.svg +2 -2
  12. package/tests/bug-reports/bug-report-20260707T092615Z/__snapshots__/bug-report-20260707T092615Z.snap.svg +2 -2
  13. package/tests/bug-reports/bug-report-20260707T134549Z/__snapshots__/bug-report-20260707T134549Z.snap.svg +2 -2
  14. package/tests/bug-reports/bug-report-20260707T134722Z/__snapshots__/bug-report-20260707T134722Z.snap.svg +2 -2
  15. package/tests/bug-reports/bug-report-20260707T140410Z/__snapshots__/bug-report-20260707T140410Z.snap.svg +2 -2
  16. package/tests/bug-reports/bug-report-20260707T141025Z/__snapshots__/bug-report-20260707T141025Z.snap.svg +2 -2
  17. package/tests/bug-reports/bug-report-20260707T141421Z/__snapshots__/bug-report-20260707T141421Z.snap.svg +2 -2
  18. package/tests/bug-reports/bug-report-20260707T230831Z/__snapshots__/bug-report-20260707T230831Z.snap.svg +2 -2
  19. package/tests/bug-reports/bug-report-20260708T053736Z/__snapshots__/bug-report-20260708T053736Z.snap.svg +2 -2
  20. package/tests/bug-reports/bug-report-20260708T055430Z/__snapshots__/bug-report-20260708T055430Z.snap.svg +2 -2
  21. package/tests/bug-reports/bug-report-20260708T095725Z/__snapshots__/bug-report-20260708T095725Z.snap.svg +2 -2
  22. package/tests/bug-reports/bug-report-20260716T144856Z/__snapshots__/bug-report-20260716T144856Z.snap.svg +2 -2
  23. package/tests/bug-reports/bug-report-20260717T022934Z/__snapshots__/bug-report-20260717T022934Z.snap.svg +2 -2
  24. package/tests/bug-reports/bug-report-20260717T031704Z/__snapshots__/bug-report-20260717T031704Z.snap.svg +2 -2
  25. package/tests/bug-reports/bug-report-20260717T042845Z/__snapshots__/bug-report-20260717T042845Z.snap.svg +2 -2
  26. package/tests/bug-reports/bug-report-20260721T221026Z/__snapshots__/bug-report-20260721T221026Z.snap.svg +2 -2
  27. package/tests/bug-reports/bug-report-20260724T175257Z/__snapshots__/bug-report-20260724T175257Z.snap.svg +2 -2
  28. package/tests/bug-reports/bug-report-20260728T144234Z/__snapshots__/bug-report-20260728T144234Z.snap.svg +4 -4
  29. package/tests/bug-reports/bug-report-20260728T225606Z/__snapshots__/bug-report-20260728T225606Z.snap.svg +2 -2
  30. package/tests/bug-reports/bug-report-20260730T061837Z/__snapshots__/bug-report-20260730T061837Z.snap.svg +2 -2
  31. package/tests/bug-reports/bug-report-20260731T052229Z/__snapshots__/bug-report-20260731T052229Z.snap.svg +2 -2
  32. package/tests/bug-reports/bug-report-20260804T095800Z/__snapshots__/bug-report-20260804T095800Z.snap.svg +2 -2
  33. package/tests/bug-reports/bug-report-20260804T171919Z/__snapshots__/bug-report-20260804T171919Z.snap.svg +2 -2
  34. package/tests/bug-reports/bug-report-20260804T225912Z/__snapshots__/bug-report-20260804T225912Z.snap.svg +2 -2
  35. package/tests/bug-reports/bug-report-20260805T061316Z/__snapshots__/bug-report-20260805T061316Z.snap.svg +2 -2
  36. package/tests/bug-reports/bug-report-20260806T061548Z/__snapshots__/bug-report-20260806T061548Z.snap.svg +2 -2
  37. package/tests/bug-reports/bug-report-20260806T093501Z/__snapshots__/bug-report-20260806T093501Z.snap.svg +2 -2
  38. package/tests/bug-reports/bug-report-20260811T075142Z/__snapshots__/bug-report-20260811T075142Z.snap.svg +2 -2
  39. package/tests/bug-reports/bug-report-20260815T073240Z/__snapshots__/bug-report-20260815T073240Z.snap.svg +2 -2
  40. package/tests/bug-reports/bug-report-20260819T091818Z/__snapshots__/bug-report-20260819T091818Z.snap.svg +2 -2
  41. package/tests/bug-reports/bug-report-20260825T045913Z/__snapshots__/bug-report-20260825T045913Z.snap.svg +4 -4
  42. package/tests/bug-reports/bug-report-20260825T103621Z/__snapshots__/bug-report-20260825T103621Z.snap.svg +2 -2
  43. package/tests/bug-reports/bug-report-20260826T072956Z/__snapshots__/bug-report-20260826T072956Z.snap.svg +842 -0
  44. package/tests/bug-reports/bug-report-20260826T072956Z/bug-report-20260826T072956Z.json +2452 -0
  45. package/tests/bug-reports/bug-report-20260826T072956Z/bug-report-20260826T072956Z.test.ts +12 -0
  46. package/tests/examples/__snapshots__/example01.snap.svg +2 -2
  47. package/tests/examples/__snapshots__/example02.snap.svg +12 -12
  48. package/tests/examples/__snapshots__/example03.snap.svg +2 -2
  49. package/tests/examples/__snapshots__/example04.snap.svg +2 -2
  50. package/tests/examples/__snapshots__/example05.snap.svg +2 -2
  51. package/tests/examples/__snapshots__/example06.snap.svg +2 -2
  52. package/tests/examples/__snapshots__/example07.snap.svg +2 -2
  53. package/tests/examples/__snapshots__/example08.snap.svg +2 -2
  54. package/tests/examples/__snapshots__/example09.snap.svg +2 -2
  55. package/tests/examples/__snapshots__/example10.snap.svg +2 -2
  56. package/tests/examples/__snapshots__/example11.snap.svg +2 -2
  57. package/tests/examples/__snapshots__/example12.snap.svg +2 -2
  58. package/tests/examples/__snapshots__/example13.snap.svg +2 -2
  59. package/tests/examples/__snapshots__/example14.snap.svg +2 -2
  60. package/tests/examples/__snapshots__/example15.snap.svg +2 -2
  61. package/tests/examples/__snapshots__/example16.snap.svg +2 -2
  62. package/tests/examples/__snapshots__/example17.snap.svg +2 -2
  63. package/tests/examples/__snapshots__/example18.snap.svg +2 -2
  64. package/tests/examples/__snapshots__/example19.snap.svg +2 -2
  65. package/tests/examples/__snapshots__/example20.snap.svg +2 -2
  66. package/tests/examples/__snapshots__/example21.snap.svg +2 -2
  67. package/tests/examples/__snapshots__/example22.snap.svg +2 -2
  68. package/tests/examples/__snapshots__/example23.snap.svg +2 -2
  69. package/tests/examples/__snapshots__/example24.snap.svg +2 -2
  70. package/tests/examples/__snapshots__/example25.snap.svg +2 -2
  71. package/tests/examples/__snapshots__/example26.snap.svg +2 -2
  72. package/tests/examples/__snapshots__/example27.snap.svg +2 -2
  73. package/tests/examples/__snapshots__/example28.snap.svg +2 -2
  74. package/tests/examples/__snapshots__/example29.snap.svg +2 -2
  75. package/tests/examples/__snapshots__/example30.snap.svg +2 -2
  76. package/tests/examples/__snapshots__/example31.snap.svg +2 -2
  77. package/tests/examples/__snapshots__/example32.snap.svg +2 -2
  78. package/tests/examples/__snapshots__/example33.snap.svg +2 -2
  79. package/tests/examples/__snapshots__/example34.snap.svg +2 -2
  80. package/tests/examples/__snapshots__/example35.snap.svg +2 -2
  81. package/tests/examples/__snapshots__/example36.snap.svg +2 -2
  82. package/tests/examples/__snapshots__/example37.snap.svg +2 -2
  83. package/tests/examples/__snapshots__/example38.snap.svg +2 -2
  84. package/tests/examples/__snapshots__/example39.snap.svg +2 -2
  85. package/tests/examples/__snapshots__/example40.snap.svg +2 -2
  86. package/tests/examples/__snapshots__/example41.snap.svg +2 -2
  87. package/tests/examples/__snapshots__/example42.snap.svg +2 -2
  88. package/tests/examples/__snapshots__/example43.snap.svg +2 -2
  89. package/tests/examples/__snapshots__/example44.snap.svg +2 -2
  90. package/tests/examples/__snapshots__/example45.snap.svg +2 -2
  91. package/tests/examples/__snapshots__/example46.snap.svg +2 -2
  92. package/tests/examples/__snapshots__/example47.snap.svg +2 -2
  93. package/tests/examples/__snapshots__/example48.snap.svg +2 -2
  94. package/tests/examples/__snapshots__/example49.snap.svg +2 -2
  95. package/tests/examples/__snapshots__/example50.snap.svg +2 -2
  96. package/tests/examples/__snapshots__/example51.snap.svg +4 -4
  97. package/tests/fixtures/matcher.ts +3 -3
  98. package/tests/repros/__snapshots__/board-1273-trace-overlap-cycle.snap.svg +73 -82
  99. package/tests/repros/__snapshots__/board-15984-same-net-junction.snap.svg +12 -12
  100. package/tests/repros/__snapshots__/board1096-usb-label-overlap-iteration.snap.svg +5 -5
  101. package/tests/repros/__snapshots__/bugreport-001-gnd-overlap.snap.svg +2 -2
  102. package/tests/repros/__snapshots__/manufacturePartNumber-text-box.snap.svg +2 -2
  103. package/tests/repros/__snapshots__/netlabel-connector-through-rail-label.snap.svg +2 -2
  104. package/tests/repros/__snapshots__/repro-atmega328p-fault-pullup.snap.svg +2 -2
  105. package/tests/repros/__snapshots__/repro-atmega328p-missing-gnd-netlabel.snap.svg +2 -2
  106. package/tests/repros/__snapshots__/repro-board-589-regulator-section.snap.svg +2 -2
  107. package/tests/repros/__snapshots__/repro-board-648-esp12f-section.snap.svg +2 -2
  108. package/tests/repros/__snapshots__/repro-bq24074-battery-charger.snap.svg +2 -2
  109. package/tests/repros/__snapshots__/repro-bq25895-cross-net-trace-overlap.snap.svg +2 -2
  110. package/tests/repros/__snapshots__/repro-cc2340r5.snap.svg +2 -2
  111. package/tests/repros/__snapshots__/repro-core-555-power-cross-net-overlap.snap.svg +2 -2
  112. package/tests/repros/__snapshots__/repro-core-subcircuit-missing-ground.snap.svg +2 -2
  113. package/tests/repros/__snapshots__/repro-core-tb67s579ftg-inline-label-routing.snap.svg +2 -2
  114. package/tests/repros/__snapshots__/repro-dc-power-isolated-routing.snap.svg +129 -0
  115. package/tests/repros/__snapshots__/repro-example35-minimize-trace-crossing.snap.svg +2 -2
  116. package/tests/repros/__snapshots__/repro-ground-label-on-lower-rail-end.snap.svg +2 -2
  117. package/tests/repros/__snapshots__/repro-ina237-current-monitor.snap.svg +2 -2
  118. package/tests/repros/__snapshots__/repro-missing-trace-netlabel.snap.svg +2 -2
  119. package/tests/repros/__snapshots__/repro-mspm0l1306-capacitor-symmetry.snap.svg +182 -0
  120. package/tests/repros/__snapshots__/repro-netlabel-collision-687.snap.svg +2 -2
  121. package/tests/repros/__snapshots__/repro-netlabel-overlap-trace.snap.svg +2 -2
  122. package/tests/repros/__snapshots__/repro-nrf52810-clock-routing.snap.svg +2 -2
  123. package/tests/repros/__snapshots__/repro-pga300-c6-trace-alignment.snap.svg +2 -2
  124. package/tests/repros/__snapshots__/repro-pga300-redundant-ground-traces.snap.svg +288 -0
  125. package/tests/repros/__snapshots__/repro-pmp11282-isolated-dcdc.snap.svg +1290 -0
  126. package/tests/repros/__snapshots__/repro-power-group-rail-labels.snap.svg +2 -2
  127. package/tests/repros/__snapshots__/repro-rectifier-trace-overlap.snap.svg +2 -2
  128. package/tests/repros/__snapshots__/repro-rp2040-gamepad-trace-alignment.snap.svg +2 -2
  129. package/tests/repros/__snapshots__/repro-rp2040-usb-cc2-ground-overlap.snap.svg +2 -2
  130. package/tests/repros/__snapshots__/repro-rp2040-v3v3-label-placement.snap.svg +2 -2
  131. package/tests/repros/__snapshots__/repro-rp2040-zero-crystal-fallback-netlabels.snap.svg +2 -2
  132. package/tests/repros/__snapshots__/repro-ti-power-output-section.snap.svg +4 -4
  133. package/tests/repros/__snapshots__/repro-tida00553-j4-cell-divider.snap.svg +130 -0
  134. package/tests/repros/__snapshots__/repro-tida010076-j4-ground-bus.snap.svg +2 -2
  135. package/tests/repros/__snapshots__/repro-tida010076-page02.snap.svg +2 -2
  136. package/tests/repros/__snapshots__/repro-tps61222-trace-intersection.snap.svg +4 -4
  137. package/tests/repros/__snapshots__/repro-type-c-16pin-self-connection.snap.svg +2 -2
  138. package/tests/repros/__snapshots__/repro-type-c-16pin-to-resistor.snap.svg +2 -2
  139. package/tests/repros/__snapshots__/repro-type-c-vbus-led-ground-label.snap.svg +2 -2
  140. package/tests/repros/__snapshots__/repro-usb-power-vbus-label-detour.snap.svg +12 -12
  141. package/tests/repros/__snapshots__/repro-vcc-pin1-detour.snap.svg +2 -2
  142. package/tests/repros/__snapshots__/repro129-host-custom-symbol-passives.snap.svg +2 -2
  143. package/tests/repros/__snapshots__/repro130-bq27441-fuel-gauge-trace-through-c1.snap.svg +2 -2
  144. package/tests/repros/__snapshots__/repro161-power-section-autolayout.snap.svg +4 -4
  145. package/tests/repros/__snapshots__/repro47-endpoint-obstacle-detour.snap.svg +2 -2
  146. package/tests/repros/__snapshots__/repro48-555-timer-vcc-rail-label.snap.svg +2 -2
  147. package/tests/repros/__snapshots__/repro5-escape-padded-text-obstacles.snap.svg +2 -2
  148. package/tests/repros/__snapshots__/repro51-overlap-junction-crossing.snap.svg +2 -2
  149. package/tests/repros/__snapshots__/repro84-stacked-gnd-label-orientation.snap.svg +2 -2
  150. package/tests/repros/__snapshots__/small-variant-resistor-facing-direction.snap.svg +2 -2
  151. package/tests/repros/__snapshots__/trace-overlap-box-resistor.snap.svg +2 -2
  152. package/tests/repros/assets/repro-dc-power-isolated-routing.input.json +193 -0
  153. package/tests/repros/assets/repro-mspm0l1306-capacitor-symmetry.input.json +537 -0
  154. package/tests/repros/assets/repro-pga300-redundant-ground-traces.input.json +858 -0
  155. package/tests/repros/assets/repro-pmp11282-isolated-dcdc.input.json +4570 -0
  156. package/tests/repros/board-1273-trace-overlap-cycle.test.ts +1 -1
  157. package/tests/repros/repro-dc-power-isolated-routing.test.ts +13 -0
  158. package/tests/repros/repro-mspm0l1306-capacitor-symmetry.test.ts +54 -0
  159. package/tests/repros/repro-pga300-redundant-ground-traces.test.ts +33 -0
  160. package/tests/repros/repro-pmp11282-isolated-dcdc.test.ts +77 -0
  161. package/tests/repros/repro-tida00553-j4-cell-divider.test.ts +111 -0
  162. package/tests/solvers/InlineNetLabelSolver/__snapshots__/anchored-net-label-width.snap.svg +2 -2
  163. package/tests/solvers/InlineNetLabelSolver/__snapshots__/inline-net-label-anchored-label-clearance.snap.svg +2 -2
  164. package/tests/solvers/InlineNetLabelSolver/__snapshots__/inline-net-label-port-stub.snap.svg +2 -2
  165. package/tests/solvers/InlineNetLabelSolver/__snapshots__/inline-net-label-two-pin-net.snap.svg +2 -2
  166. package/tests/solvers/InlineNetLabelSolver/__snapshots__/inline-net-label01.snap.svg +2 -2
  167. package/tests/solvers/InlineNetLabelSolver/__snapshots__/inline-net-label02.snap.svg +2 -2
  168. package/tests/solvers/InlineNetLabelSolver/__snapshots__/terminal-stub-trace-clearance.snap.svg +2 -2
  169. package/tests/solvers/SameNetJunctionAlignmentSolver/parallel-load-rails.test.ts +291 -0
  170. package/tests/solvers/SchematicTraceSingleLineSolver2/__snapshots__/SchematicTraceSingleLineSolver2_01-example17-d1_1-u1_1.snap.svg +2 -2
  171. package/tests/solvers/SchematicTraceSingleLineSolver2/__snapshots__/SchematicTraceSingleLineSolver2_repro47-short-opposing-pins.snap.svg +2 -2
  172. package/tests/solvers/TraceCleanupSolver/__snapshots__/TraceCleanupSolver.snap.svg +2 -2
  173. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/__snapshots__/TraceLabelOverlapAvoidanceSolver.snap.svg +2 -2
  174. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/__snapshots__/MergedNetLabelObstacles.snap.svg +2 -2
  175. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/__snapshots__/OverlapAvoidanceStepSolver.snap.svg +2 -2
  176. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/__snapshots__/SingleOverlapSolver.snap.svg +2 -2
@@ -0,0 +1,291 @@
1
+ import { expect, test } from "bun:test"
2
+ import { alignSameNetJunctions } from "lib/solvers/SameNetJunctionAlignmentSolver/alignSameNetJunctions"
3
+ import type { SolvedTracePath } from "lib/solvers/SchematicTraceLinesSolver/SchematicTraceLinesSolver"
4
+ import type { NetLabelPlacement } from "lib/solvers/NetLabelPlacementSolver/NetLabelPlacementSolver"
5
+ import { tracePathContainsPoint } from "lib/solvers/RailNetLabelCornerPlacementSolver/geometry"
6
+ import type { InputProblem } from "lib/types/InputProblem"
7
+
8
+ const createFixture = (mirrorX = 1, mirrorY = 1) => {
9
+ const point = (x: number, y: number) => ({ x: x * mirrorX, y: y * mirrorY })
10
+ const facing = mirrorY === 1 ? "y-" : "y+"
11
+ const pins: Array<SolvedTracePath["pins"][number]> = [
12
+ { pinId: "A.1", chipId: "A", ...point(0, 1), _facingDirection: facing },
13
+ { pinId: "B.1", chipId: "B", ...point(2, 1), _facingDirection: facing },
14
+ { pinId: "C.1", chipId: "C", ...point(2, -1), _facingDirection: facing },
15
+ {
16
+ pinId: "U.1",
17
+ chipId: "U",
18
+ ...point(3, 0.6),
19
+ _facingDirection: mirrorX === 1 ? "x-" : "x+",
20
+ },
21
+ ]
22
+ const trace = (
23
+ id: string,
24
+ indexes: [number, number],
25
+ coordinates: number[][],
26
+ ): SolvedTracePath => ({
27
+ mspPairId: id,
28
+ dcConnNetId: "rail",
29
+ globalConnNetId: "rail",
30
+ userNetId: "RAIL",
31
+ mspConnectionPairIds: [id],
32
+ pins: [pins[indexes[0]]!, pins[indexes[1]]!],
33
+ pinIds: indexes.map((index) => pins[index]!.pinId),
34
+ tracePath: coordinates.map(([x, y]) => point(x!, y!)),
35
+ })
36
+ const traces = [
37
+ trace(
38
+ "parallel",
39
+ [1, 0],
40
+ [
41
+ [2, 1],
42
+ [2, 0.8],
43
+ [0, 0.8],
44
+ [0, 1],
45
+ ],
46
+ ),
47
+ trace(
48
+ "supply",
49
+ [3, 1],
50
+ [
51
+ [3, 0.6],
52
+ [2, 0.6],
53
+ [2, 1],
54
+ ],
55
+ ),
56
+ trace(
57
+ "return",
58
+ [2, 1],
59
+ [
60
+ [2, -1],
61
+ [2, -1.2],
62
+ [1.2, -1.2],
63
+ [1.2, 0.8],
64
+ [2, 0.8],
65
+ [2, 1],
66
+ ],
67
+ ),
68
+ ]
69
+ const inputProblem: InputProblem = {
70
+ chips: pins.map((pin, index) => ({
71
+ chipId: pin.chipId,
72
+ center:
73
+ index === 3 ? point(3.2, 0.6) : { x: pin.x, y: pin.y + 0.2 * mirrorY },
74
+ width: 0.4,
75
+ height: 0.4,
76
+ pins: [pin],
77
+ })),
78
+ directConnections: [],
79
+ netConnections: [],
80
+ availableNetLabelOrientations: {},
81
+ }
82
+ return {
83
+ inputProblem,
84
+ traces,
85
+ point,
86
+ netLabelPlacements: [] as NetLabelPlacement[],
87
+ }
88
+ }
89
+
90
+ for (const mirrorX of [1, -1]) {
91
+ for (const mirrorY of [1, -1]) {
92
+ test(`levels parallel rails and aligns return columns (${mirrorX}, ${mirrorY})`, () => {
93
+ const fixture = createFixture(mirrorX, mirrorY)
94
+ const before = structuredClone(fixture.traces)
95
+ const result = alignSameNetJunctions(fixture)
96
+ expect(result.alignedJunctionCount).toBe(2)
97
+ const parallel = result.traces.find(
98
+ (trace) => trace.mspPairId === "parallel",
99
+ )!
100
+ expect(parallel.tracePath).toEqual([
101
+ fixture.point(2, 1),
102
+ fixture.point(2, 0.6),
103
+ fixture.point(0, 0.6),
104
+ fixture.point(0, 1),
105
+ ])
106
+ const branch = result.traces.find(
107
+ (trace) => trace.mspPairId === "return",
108
+ )!
109
+ expect(branch.tracePath).toEqual([
110
+ fixture.point(2, -1),
111
+ fixture.point(2, -1.2),
112
+ fixture.point(0, -1.2),
113
+ fixture.point(0, 0.6),
114
+ fixture.point(2, 0.6),
115
+ fixture.point(2, 1),
116
+ ])
117
+ for (const trace of result.traces) {
118
+ expect(trace.tracePath[0]).toEqual({
119
+ x: trace.pins[0]!.x,
120
+ y: trace.pins[0]!.y,
121
+ })
122
+ expect(trace.tracePath.at(-1)).toEqual({
123
+ x: trace.pins[1]!.x,
124
+ y: trace.pins[1]!.y,
125
+ })
126
+ }
127
+ expect(fixture.traces).toEqual(before)
128
+ expect(
129
+ alignSameNetJunctions({ ...fixture, traces: result.traces }).traces,
130
+ ).toEqual(result.traces)
131
+ })
132
+ }
133
+ }
134
+
135
+ test("reversing trace order and endpoints preserves the aligned geometry", () => {
136
+ const fixture = createFixture()
137
+ fixture.traces.reverse()
138
+ for (const trace of fixture.traces) {
139
+ trace.pins.reverse()
140
+ trace.pinIds.reverse()
141
+ trace.tracePath.reverse()
142
+ }
143
+ const result = alignSameNetJunctions(fixture)
144
+ expect(result.alignedJunctionCount).toBe(2)
145
+ const branch = result.traces.find((trace) => trace.mspPairId === "return")!
146
+ expect(
147
+ branch.tracePath.every((point) => point.x === 0 || point.x === 2),
148
+ ).toBe(true)
149
+ })
150
+
151
+ test("does not route a return column through a component", () => {
152
+ const fixture = createFixture()
153
+ fixture.inputProblem.chips.push({
154
+ chipId: "obstacle",
155
+ center: { x: 0, y: 0 },
156
+ width: 0.2,
157
+ height: 0.2,
158
+ pins: [],
159
+ })
160
+ const original = structuredClone(fixture.traces[2]!)
161
+ const result = alignSameNetJunctions(fixture)
162
+ expect(result.traces.find((trace) => trace.mspPairId === "return")).toEqual(
163
+ original,
164
+ )
165
+ })
166
+
167
+ for (const [name, path] of [
168
+ [
169
+ "perpendicular",
170
+ [
171
+ { x: -0.5, y: 0 },
172
+ { x: 0.5, y: 0 },
173
+ ],
174
+ ],
175
+ [
176
+ "collinear",
177
+ [
178
+ { x: 0, y: -0.5 },
179
+ { x: 0, y: 0.3 },
180
+ ],
181
+ ],
182
+ ] as const) {
183
+ test(`does not introduce a ${name} cross-net intersection`, () => {
184
+ const fixture = createFixture()
185
+ const original = structuredClone(fixture.traces[2]!)
186
+ fixture.traces.push({
187
+ ...original,
188
+ mspPairId: "foreign",
189
+ globalConnNetId: "foreign",
190
+ tracePath: [...path],
191
+ })
192
+ const result = alignSameNetJunctions(fixture)
193
+ expect(result.traces.find((trace) => trace.mspPairId === "return")).toEqual(
194
+ original,
195
+ )
196
+ })
197
+ }
198
+
199
+ test("shortens the return escape when the original length would cross another net", () => {
200
+ const fixture = createFixture()
201
+ fixture.traces.push({
202
+ ...fixture.traces[2]!,
203
+ mspPairId: "foreign",
204
+ globalConnNetId: "foreign",
205
+ tracePath: [
206
+ { x: -0.5, y: -1.1 },
207
+ { x: 1, y: -1.1 },
208
+ { x: 1, y: -1.3 },
209
+ ],
210
+ })
211
+ const result = alignSameNetJunctions(fixture)
212
+ const branch = result.traces.find((trace) => trace.mspPairId === "return")!
213
+ expect(
214
+ branch.tracePath.every((point) => point.x === 0 || point.x === 2),
215
+ ).toBe(true)
216
+ expect(Math.min(...branch.tracePath.map((point) => point.y))).toBeCloseTo(
217
+ -1.05,
218
+ 6,
219
+ )
220
+ })
221
+
222
+ test("keeps a label attached when the return branch moves", () => {
223
+ const fixture = createFixture()
224
+ fixture.netLabelPlacements.push({
225
+ globalConnNetId: "rail",
226
+ dcConnNetId: "rail",
227
+ netId: "RAIL",
228
+ mspConnectionPairIds: ["return"],
229
+ pinIds: ["C.1", "B.1"],
230
+ anchorPoint: { x: 1.2, y: 0 },
231
+ center: { x: 1.1, y: 0 },
232
+ width: 0.2,
233
+ height: 0.1,
234
+ orientation: "x-",
235
+ })
236
+ const result = alignSameNetJunctions(fixture)
237
+ const branch = result.traces.find((trace) => trace.mspPairId === "return")!
238
+ expect(
239
+ branch.tracePath.every((point) => point.x === 0 || point.x === 2),
240
+ ).toBe(true)
241
+ expect(
242
+ tracePathContainsPoint(
243
+ branch.tracePath,
244
+ result.netLabelPlacements[0]!.anchorPoint,
245
+ ),
246
+ ).toBe(true)
247
+ })
248
+
249
+ test("does not combine rails belonging to different nets", () => {
250
+ const fixture = createFixture()
251
+ fixture.traces[2]!.globalConnNetId = "different"
252
+ const original = structuredClone(fixture.traces[2]!)
253
+ const result = alignSameNetJunctions(fixture)
254
+ expect(result.traces.find((trace) => trace.mspPairId === "return")).toEqual(
255
+ original,
256
+ )
257
+ })
258
+
259
+ test("does not force an outer return column onto staggered load pins", () => {
260
+ const fixture = createFixture()
261
+ fixture.traces[0]!.pins[1].y = 1.4
262
+ fixture.traces[0]!.tracePath.at(-1)!.y = 1.4
263
+ const original = structuredClone(fixture.traces[2]!)
264
+ const result = alignSameNetJunctions(fixture)
265
+ expect(result.traces.find((trace) => trace.mspPairId === "return")).toEqual(
266
+ original,
267
+ )
268
+ })
269
+
270
+ for (const net of ["rail", "foreign"]) {
271
+ test(`does not enter a ${net} label while extending the return column`, () => {
272
+ const fixture = createFixture()
273
+ fixture.netLabelPlacements.push({
274
+ globalConnNetId: net,
275
+ dcConnNetId: net,
276
+ netId: net,
277
+ mspConnectionPairIds: [],
278
+ pinIds: [],
279
+ orientation: "x+",
280
+ anchorPoint: { x: -0.1, y: 0 },
281
+ center: { x: 0, y: 0 },
282
+ width: 0.2,
283
+ height: 0.2,
284
+ })
285
+ const original = structuredClone(fixture.traces[2]!)
286
+ const result = alignSameNetJunctions(fixture)
287
+ expect(result.traces.find((trace) => trace.mspPairId === "return")).toEqual(
288
+ original,
289
+ )
290
+ })
291
+ }
@@ -1,4 +1,4 @@
1
- <svg width="2416" height="1200" viewBox="0 0 2416 1200" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Solver debug visualization on the left and Circuit JSON schematic on the right">
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
3
  <rect width="100%" height="100%" fill="white"/><g><polyline data-points="1.15,-0.30000000000000004 1.8499999999999996,-0.3000000000000007" data-type="line" data-label="" points="336.1256544502618,395.86387434554973 387.43455497382195,395.8638743455498" fill="none" stroke="hsl(160, 100%, 50%, 0.1)" stroke-width="1px"/></g><g><polyline data-points="2.95,-0.3000000000000007 3.6500000000000004,-0.3000000000000007" data-type="line" data-label="" points="468.0628272251309,395.8638743455498 519.3717277486911,395.8638743455498" fill="none" stroke="hsl(48, 100%, 50%, 0.1)" stroke-width="1px"/></g><g><polyline data-points="-1.15,0.30000000000000004 -1.1500000000000004,1.15" data-type="line" data-label="" points="167.5392670157068,351.8848167539267 167.5392670157068,289.58115183246076" fill="none" stroke="hsl(280, 100%, 50%, 0.1)" stroke-width="1px"/></g><g><polyline data-points="-1.15,0.10000000000000003 -1.85,0.10000000000000002" data-type="line" data-label="" points="167.5392670157068,366.5445026178011 116.2303664921466,366.5445026178011" fill="none" stroke="hsl(48, 100%, 50%, 0.1)" stroke-width="1px"/></g><g><polyline data-points="-1.15,0.30000000000000004 -1.3499999999999999,0.30000000000000004 -1.3499999999999999,0.7250000000000001 -1.1500000000000004,0.7250000000000001 -1.1500000000000004,1.15" data-type="line" data-label="" points="167.5392670157068,351.8848167539267 152.87958115183247,351.8848167539267 152.87958115183247,320.73298429319374 167.5392670157068,320.73298429319374 167.5392670157068,289.58115183246076" fill="none" stroke="red" stroke-width="1px" stroke-dasharray="4 4"/></g><g><polyline data-points="-1.15,0.30000000000000004 -1.1500000000000004,1.15" data-type="line" data-label="" points="167.5392670157068,351.8848167539267 167.5392670157068,289.58115183246076" fill="none" stroke="blue" stroke-width="1px" stroke-dasharray="5 5"/></g><g><polyline data-points="-1.15,0.30000000000000004 -1.3499999999999999,0.30000000000000004 -1.3499999999999999,0.7250000000000001 -1.1500000000000004,0.7250000000000001 -1.1500000000000004,1.15" data-type="line" data-label="" points="167.5392670157068,351.8848167539267 152.87958115183247,351.8848167539267 152.87958115183247,320.73298429319374 167.5392670157068,320.73298429319374 167.5392670157068,289.58115183246076" fill="none" stroke="green" stroke-width="1px"/></g><g><rect data-type="rect" data-label="schematic_component_0" data-x="0" data-y="0" x="167.5392670157068" y="337.22513089005236" width="168.58638743455498" height="73.29842931937173" fill="hsl(24, 100%, 50%, 0.1)" stroke="black" stroke-width="0.013642857142857144"/></g><g><rect data-type="rect" data-label="schematic_component_1" data-x="-1.1500000000000004" data-y="1.6700000000000002" x="129.4240837696335" y="213.3507853403141" width="76.2303664921466" height="76.23036649214663" fill="hsl(24, 100%, 50%, 0.1)" stroke="black" stroke-width="0.013642857142857144"/></g><g><rect data-type="rect" data-label="schematic_component_2" data-x="-2.37" data-y="0.10000000000000009" x="40.000000000000014" y="346.75392670157066" width="76.2303664921466" height="39.58115183246076" fill="hsl(24, 100%, 50%, 0.1)" stroke="black" stroke-width="0.013642857142857144"/></g><g><rect data-type="rect" data-label="schematic_component_3" data-x="2.4" data-y="-0.3000000000000007" x="387.43455497382195" y="365.07853403141365" width="80.62827225130894" height="61.57068062827227" fill="hsl(24, 100%, 50%, 0.1)" stroke="black" stroke-width="0.013642857142857144"/></g><g><rect data-type="rect" data-label="schematic_component_4" data-x="4.2" data-y="-0.3000000000000007" x="519.371727748691" y="365.07853403141365" width="80.62827225130889" height="61.57068062827227" fill="hsl(24, 100%, 50%, 0.1)" stroke="black" stroke-width="0.013642857142857144"/></g><g><circle data-type="point" data-label="U1.1
4
4
  x-" data-x="-1.15" data-y="0.30000000000000004" cx="167.5392670157068" cy="351.8848167539267" r="3" fill="hsl(319, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.2
@@ -61,7 +61,7 @@ x+" data-x="4.75" data-y="-0.3000000000000007" cx="600" cy="395.8638743455498" r
61
61
  });
62
62
  ]]></script>
63
63
  </g>
64
- <g transform="translate(1216, 200)">
64
+ <g transform="translate(0, 1216)">
65
65
  <style>
66
66
  .boundary { fill: rgb(245, 241, 237); }
67
67
  .schematic-boundary { fill: none; stroke: #fff; }
@@ -1,4 +1,4 @@
1
- <svg width="2416" height="1200" viewBox="0 0 2416 1200" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Solver debug visualization on the left and Circuit JSON schematic on the right">
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
3
  <rect width="100%" height="100%" fill="white"/><g><polyline data-points="3.4,0.095 3.61,0.045" data-type="line" data-label="" points="261.78217821782187,306.13861386138615 378.21782178217813,333.86138613861385" fill="none" stroke="hsl(112, 100%, 50%, 0.1)" stroke-width="1px"/></g><g><polyline data-points="3.4,0.095 3.465,0.095 3.505,0.095 3.505,0.045 3.545,0.045 3.61,0.045" data-type="line" data-label="" points="261.78217821782187,306.13861386138615 297.82178217821775,306.13861386138615 320,306.13861386138615 320,333.86138613861385 342.17821782178225,333.86138613861385 378.21782178217813,333.86138613861385" fill="none" stroke="red" stroke-width="1px" stroke-dasharray="4 4"/></g><g><polyline data-points="3.4,0.095 3.61,0.045" data-type="line" data-label="" points="261.78217821782187,306.13861386138615 378.21782178217813,333.86138613861385" fill="none" stroke="blue" stroke-width="1px" stroke-dasharray="5 5"/></g><g><polyline data-points="3.4,0.095 3.465,0.095 3.505,0.095 3.505,0.045 3.545,0.045 3.61,0.045" data-type="line" data-label="" points="261.78217821782187,306.13861386138615 297.82178217821775,306.13861386138615 320,306.13861386138615 320,333.86138613861385 342.17821782178225,333.86138613861385 378.21782178217813,333.86138613861385" fill="none" stroke="green" stroke-width="1px"/></g><g><rect data-type="rect" data-label="D2" data-x="3.2" data-y="0.095" x="40" y="250.69306930693068" width="221.7821782178221" height="110.89108910891093" fill="hsl(358, 100%, 50%, 0.1)" stroke="black" stroke-width="0.0018035714285714283"/></g><g><rect data-type="rect" data-label="SW2" data-x="3.81" data-y="0.045" x="378.21782178217825" y="278.41584158415844" width="221.78217821782187" height="110.89108910891088" fill="hsl(70, 100%, 50%, 0.1)" stroke="black" stroke-width="0.0018035714285714283"/></g><g><circle data-type="point" data-label="D2.cathode
4
4
  x+" data-x="3.4" data-y="0.095" cx="261.78217821782187" cy="306.13861386138615" r="3" fill="hsl(22, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="SW2.pin1
@@ -47,7 +47,7 @@ x-" data-x="3.61" data-y="0.045" cx="378.21782178217813" cy="333.86138613861385"
47
47
  });
48
48
  ]]></script>
49
49
  </g>
50
- <g transform="translate(1216, 200)">
50
+ <g transform="translate(0, 1216)">
51
51
  <style>
52
52
  .boundary { fill: rgb(245, 241, 237); }
53
53
  .schematic-boundary { fill: none; stroke: #fff; }
@@ -1,4 +1,4 @@
1
- <svg width="2416" height="1200" viewBox="0 0 2416 1200" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Solver debug visualization on the left and Circuit JSON schematic on the right">
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
3
  <rect width="100%" height="100%" fill="white"/><g><polyline data-points="1.2000000000000002,-0.30000000000000004 1.6,-2.295" data-type="line" data-label="" points="308.80000000000007,241.88 353.6,465.31999999999994" fill="none" stroke="hsl(157, 100%, 50%, 0.1)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="1.2000000000000002,0.30000000000000004 1.6,-1.895" data-type="line" data-label="" points="308.80000000000007,174.68 353.6,420.52" fill="none" stroke="hsl(190, 100%, 50%, 0.1)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="1.2000000000000002,-0.30000000000000004 1.4000000000000001,-0.30000000000000004 1.4000000000000001,-1.2975000000000003 1.049,-1.2975000000000003 1.049,-2.2950000000000004 1.6,-2.295" data-type="line" data-label="" points="308.80000000000007,241.88 331.20000000000005,241.88 331.20000000000005,353.6 291.88800000000003,353.6 291.88800000000003,465.32000000000005 353.6,465.31999999999994" fill="none" stroke="red" stroke-width="1px"/></g><g><rect data-type="rect" data-label="schematic_component_0" data-x="0" data-y="0" x="40" y="152.28000000000003" width="268.80000000000007" height="111.99999999999997" fill="hsl(24, 100%, 50%, 0.1)" stroke="black" stroke-width="0.008928571428571428"/></g><g><rect data-type="rect" data-label="schematic_component_1" data-x="2.7" data-y="-2.095" x="353.6000000000001" y="398.12" width="246.39999999999998" height="89.60000000000002" fill="hsl(24, 100%, 50%, 0.1)" stroke="black" stroke-width="0.008928571428571428"/></g><g><circle data-type="point" data-label="U1.1
4
4
  x+" data-x="1.2000000000000002" data-y="-0.30000000000000004" cx="308.80000000000007" cy="241.88" r="3" fill="hsl(319, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.2
@@ -56,7 +56,7 @@ x-" data-x="1.6" data-y="-2.295" cx="353.6" cy="465.31999999999994" r="3" fill="
56
56
  });
57
57
  ]]></script>
58
58
  </g>
59
- <g transform="translate(1216, 200)">
59
+ <g transform="translate(0, 1216)">
60
60
  <style>
61
61
  .boundary { fill: rgb(245, 241, 237); }
62
62
  .schematic-boundary { fill: none; stroke: #fff; }
@@ -1,4 +1,4 @@
1
- <svg width="2416" height="1200" viewBox="0 0 2416 1200" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Solver debug visualization on the left and Circuit JSON schematic on the right">
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
3
  <rect width="100%" height="100%" fill="white"/><g><polyline data-points="-5.005,2.54 -0.55,2.98" data-type="line" data-label="" points="55.35329792453959,253.89930298391727 272.6806818408854,232.4348700045251" fill="none" stroke="hsl(136, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="0.55,2.97 2.48,3" data-type="line" data-label="" points="326.34176428936587,232.922698026784 420.4925725853361,231.45921396000725" fill="none" stroke="hsl(112, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="3.52,3 3,0.495" data-type="line" data-label="" points="471.2266869002631,231.45921396000725 445.8596297427996,353.66013353586504" fill="none" stroke="hsl(128, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="3.52,3 6,0.5499999999999999" data-type="line" data-label="" points="471.2266869002631,231.45921396000725 592.2080364204736,350.977079413441" fill="none" stroke="hsl(128, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="3,-0.49500000000000005 6,-0.55" data-type="line" data-label="" points="445.8596297427996,401.9551077394974 592.2080364204736,404.63816186192145" fill="none" stroke="hsl(136, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="6,-0.55 -4.995,1.46" data-type="line" data-label="" points="592.2080364204736,404.63816186192145 55.841125946798485,306.58472938787986" fill="none" stroke="hsl(72, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="0.55,2.97 0.3,0.55" data-type="line" data-label="" points="326.34176428936587,232.922698026784 314.146063732893,350.977079413441" fill="none" stroke="hsl(112, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="0.31,-0.55 -4.995,1.46" data-type="line" data-label="" points="314.633891755152,404.63816186192145 55.841125946798485,306.58472938787986" fill="none" stroke="hsl(184, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="-0.42,-0.1 -2.9999378,0.4458008" data-type="line" data-label="" points="279.0224461302513,382.68590086027035 153.16585067775011,356.06020837913707" fill="none" stroke="hsl(232, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="-3.0000622,-0.4458008 -4.995,1.46" data-type="line" data-label="" points="153.15978209715323,399.5550328962254 55.841125946798485,306.58472938787986" fill="none" stroke="hsl(224, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="-4.995,1.46 3,-0.49500000000000005" data-type="line" data-label="" points="55.841125946798485,306.58472938787986 445.8596297427996,401.9551077394974" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-4.995,1.46 6,-0.55" data-type="line" data-label="" points="55.841125946798485,306.58472938787986 592.2080364204736,404.63816186192145" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-4.995,1.46 -3.0000622,-0.4458008" data-type="line" data-label="" points="55.841125946798485,306.58472938787986 153.15978209715323,399.5550328962254" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-4.995,1.46 0.31,-0.55" data-type="line" data-label="" points="55.841125946798485,306.58472938787986 314.633891755152,404.63816186192145" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="3,-0.49500000000000005 6,-0.55" data-type="line" data-label="" points="445.8596297427996,401.9551077394974 592.2080364204736,404.63816186192145" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="3,-0.49500000000000005 -3.0000622,-0.4458008" data-type="line" data-label="" points="445.8596297427996,401.9551077394974 153.15978209715323,399.5550328962254" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="3,-0.49500000000000005 0.31,-0.55" data-type="line" data-label="" points="445.8596297427996,401.9551077394974 314.633891755152,404.63816186192145" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="6,-0.55 -3.0000622,-0.4458008" data-type="line" data-label="" points="592.2080364204736,404.63816186192145 153.15978209715323,399.5550328962254" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="6,-0.55 0.31,-0.55" data-type="line" data-label="" points="592.2080364204736,404.63816186192145 314.633891755152,404.63816186192145" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-3.0000622,-0.4458008 0.31,-0.55" data-type="line" data-label="" points="153.15978209715323,399.5550328962254 314.633891755152,404.63816186192145" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="0.58,2.97 0.78,2.97 1.53,2.97 1.53,3 2.28,3 2.48,3" data-type="line" data-label="" points="327.8052483561426,232.922698026784 337.56180880132086,232.922698026784 374.1489104707394,232.922698026784 374.1489104707394,231.45921396000725 410.73601214015787,231.45921396000725 420.4925725853361,231.45921396000725" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-5.005,2.54 -5.005,2.9800000000000004 -0.5800000000000001,2.9800000000000004" data-type="line" data-label="" points="55.35329792453959,253.89930298391727 55.35329792453959,232.43487000452507 271.2171977741087,232.43487000452507" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="3.52,3 3.7199999999999998,3 3.7199999999999998,1.7474999999999996 3,1.7474999999999996 3,0.49500000000000005" data-type="line" data-label="" points="471.2266869002631,231.45921396000725 480.9832473454413,231.45921396000725 480.9832473454413,292.55967374793613 445.8596297427996,292.55967374793613 445.8596297427996,353.66013353586504" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="3,-0.4950000000000001 3,-0.78 0.31,-0.78 0.31,-0.58" data-type="line" data-label="" points="445.8596297427996,401.9551077394974 445.8596297427996,415.85820637387644 314.633891755152,415.85820637387644 314.633891755152,406.1016459286982" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-4.995,1.46 -4.995,-0.6458008 -3.0000622,-0.6458008 -3.0000622,-0.4458007999999998" data-type="line" data-label="" points="55.841125946798485,306.58472938787986 55.841125946798485,409.31159334140364 153.15978209715323,409.31159334140364 153.15978209715323,399.5550328962253" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-0.44499999999999984,-0.09999999999999987 -1.7224689,-0.09999999999999987 -1.7224689,0.6458008000000002 -2.9999378,0.6458008000000002 -2.9999378,0.4458008" data-type="line" data-label="" points="277.802876074604,382.68590086027035 215.48436337617707,382.68590086027035 215.48436337617707,346.3036479339588 153.16585067775011,346.3036479339588 153.16585067775011,356.06020837913707" fill="none" stroke="purple" stroke-width="1px"/></g><g><rect data-type="rect" data-label="schematic_component_0" data-x="-5" data-y="2" x="40.000000000000014" y="253.8993029839173" width="31.194423871338046" height="52.685426403962595" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.020499027410714285"/></g><g><rect data-type="rect" data-label="schematic_component_1" data-x="0" data-y="3" x="271.2171977741087" y="220.23916944805222" width="56.58805058203393" height="22.44008902391002" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.020499027410714285"/></g><g><rect data-type="rect" data-label="schematic_component_2" data-x="3" data-y="3" x="420.4925725853361" y="218.28785735901658" width="50.734114314926956" height="26.342713201981326" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.020499027410714285"/></g><g><rect data-type="rect" data-label="schematic_component_3" data-x="3" data-y="0" x="431.95653110842056" y="353.66013353586504" width="27.80619726875807" height="48.294974203632364" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.020499027410714285"/></g><g><rect data-type="rect" data-label="schematic_component_4" data-x="6" data-y="0" x="584.4160728409472" y="350.977079413441" width="15.583927159052791" height="53.66108244848044" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.020499027410714285"/></g><g><rect data-type="rect" data-label="schematic_component_5" data-x="-3" data-y="0" x="143.49775540526844" y="356.06020837913707" width="19.330121964366498" height="43.49482451708832" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.020499027410714285"/></g><g><rect data-type="rect" data-label="schematic_component_6" data-x="0" data-y="0" x="277.802876074604" y="349.51359534666426" width="43.416693981043295" height="56.58805058203393" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.020499027410714285"/></g><g><rect data-type="rect" data-label="connectivity_net0" data-x="-4.78" data-y="2.7600000000000002" x="55.35329792453959" y="238.28880627163204" width="21.95226100165104" height="9.75656044517828" fill="hsl(40, 100%, 50%, 0.3)" stroke="hsl(40, 100%, 50%, 1)" stroke-width="0.020499027410714285"/></g><g><rect data-type="rect" data-label="connectivity_net3" data-x="3" data-y="-0.93" x="440.9813495202104" y="415.85820637387644" width="9.756560445178309" height="14.634840667767435" fill="hsl(40, 100%, 50%, 0.3)" stroke="hsl(40, 100%, 50%, 1)" stroke-width="0.020499027410714285"/></g><g><rect data-type="rect" data-label="connectivity_net3" data-x="6" data-y="-0.7010000000000001" x="587.3297561978845" y="404.6869446641474" width="9.756560445178138" height="14.634840667767378" fill="hsl(40, 100%, 50%, 0.3)" stroke="hsl(40, 100%, 50%, 1)" stroke-width="0.020499027410714285"/></g><g><rect data-type="rect" data-label="connectivity_net3" data-x="-4.995" data-y="-0.7958008" x="50.96284572420937" y="409.31159334140364" width="9.756560445178224" height="14.634840667767378" fill="hsl(40, 100%, 50%, 0.3)" stroke="hsl(40, 100%, 50%, 1)" stroke-width="0.020499027410714285"/></g><g><rect data-type="rect" data-label="connectivity_net1" data-x="0.78" data-y="3.1950000000000003" x="332.68352857873174" y="210.97043702513287" width="9.756560445178252" height="21.952261001651124" fill="hsl(40, 100%, 50%, 0.3)" stroke="hsl(40, 100%, 50%, 1)" stroke-width="0.020499027410714285"/></g><g><rect data-type="rect" data-label="connectivity_net1" data-x="0.3" data-y="0.8059999999999999" x="309.26778351030384" y="327.51255154278726" width="9.756560445178309" height="21.952261001651095" fill="hsl(40, 100%, 50%, 0.3)" stroke="hsl(40, 100%, 50%, 1)" stroke-width="0.020499027410714285"/></g><g><rect data-type="rect" data-label="connectivity_net2" data-x="3.7199999999999998" data-y="3.225" x="476.1049671228522" y="209.50695295835615" width="9.756560445178252" height="21.952261001651095" fill="hsl(40, 100%, 50%, 0.3)" stroke="hsl(40, 100%, 50%, 1)" stroke-width="0.020499027410714285"/></g><g><rect data-type="rect" data-label="connectivity_net2" data-x="6" data-y="0.776" x="587.3297561978845" y="328.976035609564" width="9.756560445178138" height="21.952261001651095" fill="hsl(40, 100%, 50%, 0.3)" stroke="hsl(40, 100%, 50%, 1)" stroke-width="0.020499027410714285"/></g><g><rect data-type="rect" data-label="connectivity_net4" data-x="-1.08373445" data-y="0.12500000000000014" x="241.7653395028014" y="360.73363985861926" width="9.75656044517828" height="21.952261001651095" fill="hsl(40, 100%, 50%, 0.3)" stroke="hsl(40, 100%, 50%, 1)" stroke-width="0.020499027410714285"/></g><g><circle data-type="point" data-label="V1.1
4
4
  y+" data-x="-5.005" data-y="2.54" cx="55.35329792453959" cy="253.89930298391727" r="3" fill="hsl(230, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="V1.2
@@ -60,7 +60,7 @@ x-" data-x="-0.42" data-y="-0.1" cx="279.0224461302513" cy="382.68590086027035"
60
60
  });
61
61
  ]]></script>
62
62
  </g>
63
- <g transform="translate(1216, 200)">
63
+ <g transform="translate(0, 1216)">
64
64
  <style>
65
65
  .boundary { fill: rgb(245, 241, 237); }
66
66
  .schematic-boundary { fill: none; stroke: #fff; }
@@ -1,4 +1,4 @@
1
- <svg width="2416" height="1200" viewBox="0 0 2416 1200" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Solver debug visualization on the left and Circuit JSON schematic on the right">
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
3
  <rect width="100%" height="100%" fill="white"/><g><polyline data-points="1.2000000000000002,-0.30000000000000004 1.6,-2.295" data-type="line" data-label="" points="308.80000000000007,227.88 353.6,451.31999999999994" fill="none" stroke="hsl(157, 100%, 50%, 0.1)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="1.2000000000000002,0.30000000000000004 1.6,-1.895" data-type="line" data-label="" points="308.80000000000007,160.68 353.6,406.52" fill="none" stroke="hsl(190, 100%, 50%, 0.1)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="1.2000000000000002,-0.30000000000000004 1.4000000000000001,-0.30000000000000004 1.4000000000000001,-1.2974999999999999 1.4000000000000001,-2.295 1.6,-2.295" data-type="line" data-label="" points="308.80000000000007,227.88 331.20000000000005,227.88 331.20000000000005,339.6 331.20000000000005,451.31999999999994 353.6,451.31999999999994" fill="none" stroke="blue" stroke-width="1px"/></g><g><polyline data-points="1.149,-1.995 1.5990000000000002,-1.995 1.5990000000000002,-1.795 1.149,-1.795 1.149,-1.995" data-type="line" data-label="" points="303.088,417.72 353.48800000000006,417.72 353.48800000000006,395.32 303.088,395.32 303.088,417.72" fill="none" stroke="hsl(296, 100%, 50%, 1)" stroke-width="1px" stroke-dasharray="4 4"/></g><g><polyline data-points="1.374,-1.895 1.374,-1.995" data-type="line" data-label="" points="328.288,406.52 328.288,417.72" fill="none" stroke="hsl(296, 100%, 50%, 1)" stroke-width="1px" stroke-dasharray="2 2"/></g><g><polyline data-points="1.149,-2.1950000000000003 1.5990000000000002,-2.1950000000000003 1.5990000000000002,-1.995 1.149,-1.995 1.149,-2.1950000000000003" data-type="line" data-label="" points="303.088,440.12 353.48800000000006,440.12 353.48800000000006,417.72 303.088,417.72 303.088,440.12" fill="none" stroke="hsl(296, 100%, 50%, 1)" stroke-width="1px" stroke-dasharray="4 4"/></g><g><polyline data-points="1.374,-2.095 1.374,-1.995" data-type="line" data-label="" points="328.288,428.92 328.288,417.72" fill="none" stroke="hsl(296, 100%, 50%, 1)" stroke-width="1px" stroke-dasharray="2 2"/></g><g><rect data-type="rect" data-label="schematic_component_0" data-x="0" data-y="0" x="40" y="138.28" width="268.80000000000007" height="112" fill="hsl(24, 100%, 50%, 0.1)" stroke="black" stroke-width="0.008928571428571428"/></g><g><rect data-type="rect" data-label="schematic_component_1" data-x="2.7" data-y="-2.095" x="353.6000000000001" y="384.12" width="246.39999999999998" height="89.60000000000002" fill="hsl(24, 100%, 50%, 0.1)" stroke="black" stroke-width="0.008928571428571428"/></g><g><rect data-type="rect" data-label="merged-group-J1-x-" data-x="1.374" data-y="-1.995" x="303.08799999999997" y="395.32000000000005" width="50.400000000000034" height="44.80000000000001" fill="hsl(296, 100%, 50%, 0.2)" stroke="hsl(296, 100%, 50%, 1)" stroke-width="0.008928571428571428"/></g><g><rect data-type="rect" data-label="connectivity_net1" data-x="1.4260000000000002" data-y="0.30000000000000004" x="308.91200000000003" y="149.48000000000002" width="50.400000000000034" height="22.400000000000006" fill="none" stroke="hsl(40, 100%, 50%, 1)" stroke-width="0.008928571428571428"/></g><g><rect data-type="rect" data-label="connectivity_net0" data-x="1.4000000000000001" data-y="-2.52" x="320" y="451.31999999999994" width="22.40000000000009" height="50.40000000000009" fill="none" stroke="hsl(40, 100%, 50%, 1)" stroke-width="0.008928571428571428"/></g><g><circle data-type="point" data-label="U1.1
4
4
  x+" data-x="1.2000000000000002" data-y="-0.30000000000000004" cx="308.80000000000007" cy="227.88" r="3" fill="hsl(319, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.2
@@ -56,7 +56,7 @@ x-" data-x="1.6" data-y="-2.295" cx="353.6" cy="451.31999999999994" r="3" fill="
56
56
  });
57
57
  ]]></script>
58
58
  </g>
59
- <g transform="translate(1216, 200)">
59
+ <g transform="translate(0, 1216)">
60
60
  <style>
61
61
  .boundary { fill: rgb(245, 241, 237); }
62
62
  .schematic-boundary { fill: none; stroke: #fff; }
@@ -1,4 +1,4 @@
1
- <svg width="2416" height="1200" viewBox="0 0 2416 1200" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Solver debug visualization on the left and Circuit JSON schematic on the right">
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
3
  <rect width="100%" height="100%" fill="white"/><g><polyline data-points="-1.2000000000000002,0.10000000000000003 -1.9000000000000004,0.10000000000000002" data-type="line" data-label="" points="215,302.5 153.74999999999997,302.5" fill="none" stroke="hsl(296, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="-1.2000000000000002,-0.09999999999999998 -1.2000000000000002,-0.30000000000000004" data-type="line" data-label="" points="215,320 215,337.5" fill="none" stroke="hsl(168, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="1.9000000000000004,-0.10000000000000002 1.2000000000000002,-0.10000000000000003" data-type="line" data-label="" points="486.25,320 425,320" fill="none" stroke="hsl(248, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="1.2000000000000002,-0.10000000000000003 1.2000000000000002,-1.2944553500000002" data-type="line" data-label="" points="425,320 425,424.514843125" fill="none" stroke="hsl(160, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="0.10000000000000009,-1.2944553500000002 -1.2000000000000002,-0.09999999999999998" data-type="line" data-label="" points="328.75,424.514843125 215,320" fill="none" stroke="hsl(104, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="-1.2000000000000002,-0.09999999999999998 -1.2000000000000002,-1.1500000000000001" data-type="line" data-label="" points="215,320 215,411.875" fill="none" stroke="hsl(168, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="1.2000000000000002,0.09999999999999998 1.2000000000000002,1.1500000000000001" data-type="line" data-label="" points="425,302.5 425,210.625" fill="none" stroke="hsl(320, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="1.2000000000000002,-0.30000000000000004 -1.2000000000000002,-2.25" data-type="line" data-label="" points="425,337.5 215,508.125" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="1.2000000000000002,-0.30000000000000004 -3,0.10000000000000016" data-type="line" data-label="" points="425,337.5 57.5,302.5" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-1.2000000000000002,-2.25 -3,0.10000000000000016" data-type="line" data-label="" points="215,508.125 57.5,302.5" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-1.2000000000000002,0.30000000000000004 1.2000000000000002,0.30000000000000004" data-type="line" data-label="" points="215,285 425,285" fill="none" stroke="hsl(190, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-1.2000000000000002,0.30000000000000004 3,-0.10000000000000016" data-type="line" data-label="" points="215,285 582.5,320" fill="none" stroke="hsl(190, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="1.2000000000000002,0.30000000000000004 3,-0.10000000000000016" data-type="line" data-label="" points="425,285 582.5,320" fill="none" stroke="hsl(190, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-1.2000000000000002,0.10000000000000003 -1.9000000000000004,0.10000000000000002" data-type="line" data-label="" points="215,302.5 153.74999999999997,302.5" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1.2000000000000002,-0.30000000000000004 -1.4000000000000001,-0.30000000000000004 -1.4000000000000001,-0.7250000000000001 -1.2000000000000002,-0.7250000000000001 -1.2000000000000002,-1.1500000000000001" data-type="line" data-label="" points="215,337.5 197.5,337.5 197.5,374.6875 215,374.6875 215,411.875" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1.2000000000000002,-0.09999999999999998 -1.4000000000000001,-0.09999999999999998 -1.4000000000000001,-0.30000000000000004 -1.2000000000000002,-0.30000000000000004" data-type="line" data-label="" points="215,320 197.5,320 197.5,337.5 215,337.5" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="0.09999999999999987,-1.2944553500000002 -0.55,-1.2944553500000002 -0.55,-0.9500000000000002 -1.2000000000000002,-0.9500000000000002 -1.2000000000000002,-1.1500000000000001" data-type="line" data-label="" points="328.75,424.514843125 271.875,424.514843125 271.875,394.375 215,394.375 215,411.875" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.2000000000000002,-0.10000000000000003 1.9000000000000004,-0.10000000000000002" data-type="line" data-label="" points="425,320 486.25,320" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.2000000000000002,-1.2944553500000002 1.4000000000000001,-1.2944553500000002 1.4000000000000001,-0.10000000000000003 1.2000000000000002,-0.10000000000000003" data-type="line" data-label="" points="425,424.514843125 442.5,424.514843125 442.5,320 425,320" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.2000000000000002,0.09999999999999998 1.4000000000000001,0.09999999999999998 1.4000000000000001,0.625 1.2000000000000002,0.625 1.2000000000000002,1.1500000000000001" data-type="line" data-label="" points="425,302.5 442.5,302.5 442.5,256.5625 425,256.5625 425,210.625" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.2000000000000002,0.30000000000000004 3.2,0.30000000000000004 3.2,-0.10000000000000016 3,-0.10000000000000016" data-type="line" data-label="" points="425,285 600,285 600,320 582.5,320" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1.2000000000000002,-2.25 -1.2000000000000002,-2.45 -3.2,-2.45 -3.2,0.10000000000000016 -3,0.10000000000000016" data-type="line" data-label="" points="215,508.125 215,525.625 40,525.625 40,302.5 57.5,302.5" fill="none" stroke="purple" stroke-width="1px"/></g><g><rect data-type="rect" data-label="schematic_component_0" data-x="0" data-y="0" x="215" y="267.5" width="210" height="87.5" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.011428571428571429"/></g><g><rect data-type="rect" data-label="schematic_component_1" data-x="2.45" data-y="-0.10000000000000009" x="486.25" y="302.98515687500003" width="96.25" height="34.02968624999994" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.011428571428571429"/></g><g><rect data-type="rect" data-label="schematic_component_2" data-x="0.6500000000000001" data-y="-1.2944553500000002" x="328.75" y="407.5000000000001" width="96.25" height="34.029686249999884" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.011428571428571429"/></g><g><rect data-type="rect" data-label="schematic_component_3" data-x="-1.2000000000000002" data-y="-1.7000000000000002" x="168.625" y="411.875" width="92.75000000000003" height="96.25" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.011428571428571429"/></g><g><rect data-type="rect" data-label="schematic_component_4" data-x="-2.45" data-y="0.10000000000000009" x="57.499999999999986" y="265.75" width="96.24999999999997" height="73.5" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.011428571428571429"/></g><g><rect data-type="rect" data-label="schematic_component_5" data-x="1.2000000000000002" data-y="1.7000000000000002" x="378.625" y="114.37499999999997" width="92.75" height="96.25" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.011428571428571429"/></g><g><circle data-type="point" data-label="U1.1
4
4
  x+" data-x="1.2000000000000002" data-y="-0.30000000000000004" cx="425" cy="337.5" r="3" fill="hsl(319, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.2
@@ -63,7 +63,7 @@ y+" data-x="1.2000000000000002" data-y="2.25" cx="425" cy="114.375" r="3" fill="
63
63
  });
64
64
  ]]></script>
65
65
  </g>
66
- <g transform="translate(1216, 200)">
66
+ <g transform="translate(0, 1216)">
67
67
  <style>
68
68
  .boundary { fill: rgb(245, 241, 237); }
69
69
  .schematic-boundary { fill: none; stroke: #fff; }
@@ -1,4 +1,4 @@
1
- <svg width="2416" height="1200" viewBox="0 0 2416 1200" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Solver debug visualization on the left and Circuit JSON schematic on the right">
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
3
  <rect width="100%" height="100%" fill="white"/><g><polyline data-points="1.2000000000000002,-0.30000000000000004 1.6,-2.295" data-type="line" data-label="" points="308.80000000000007,241.88 353.6,465.31999999999994" fill="none" stroke="hsl(157, 100%, 50%, 0.1)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="1.2000000000000002,0.30000000000000004 1.6,-1.895" data-type="line" data-label="" points="308.80000000000007,174.68 353.6,420.52" fill="none" stroke="hsl(190, 100%, 50%, 0.1)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="1.2000000000000002,-0.30000000000000004 1.4000000000000001,-0.30000000000000004 1.4000000000000001,-1.2974999999999999 1.4000000000000001,-2.295 1.6,-2.295" data-type="line" data-label="" points="308.80000000000007,241.88 331.20000000000005,241.88 331.20000000000005,353.6 331.20000000000005,465.31999999999994 353.6,465.31999999999994" fill="none" stroke="red" stroke-width="1px" stroke-dasharray="4 4"/></g><g><polyline data-points="1.2000000000000002,-0.30000000000000004 1.4000000000000001,-0.30000000000000004 1.4000000000000001,-1.6949999999999998 1.049,-1.6949999999999998 1.049,-2.2950000000000004 1.6,-2.295" data-type="line" data-label="" points="308.80000000000007,241.88 331.20000000000005,241.88 331.20000000000005,398.12 291.88800000000003,398.12 291.88800000000003,465.32000000000005 353.6,465.31999999999994" fill="none" stroke="green" stroke-width="1px"/></g><g><rect data-type="rect" data-label="schematic_component_0" data-x="0" data-y="0" x="40" y="152.28000000000003" width="268.80000000000007" height="111.99999999999997" fill="hsl(24, 100%, 50%, 0.1)" stroke="black" stroke-width="0.008928571428571428"/></g><g><rect data-type="rect" data-label="schematic_component_1" data-x="2.7" data-y="-2.095" x="353.6000000000001" y="398.12" width="246.39999999999998" height="89.60000000000002" fill="hsl(24, 100%, 50%, 0.1)" stroke="black" stroke-width="0.008928571428571428"/></g><g><rect data-type="rect" data-label="" data-x="1.374" data-y="-1.995" x="303.08799999999997" y="409.32000000000005" width="50.400000000000034" height="44.80000000000001" fill="rgba(255, 0, 0, 0.2)" stroke="black" stroke-width="0.008928571428571428"/></g><g><circle data-type="point" data-label="U1.1
4
4
  x+" data-x="1.2000000000000002" data-y="-0.30000000000000004" cx="308.80000000000007" cy="241.88" r="3" fill="hsl(319, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.2
@@ -56,7 +56,7 @@ x-" data-x="1.6" data-y="-2.295" cx="353.6" cy="465.31999999999994" r="3" fill="
56
56
  });
57
57
  ]]></script>
58
58
  </g>
59
- <g transform="translate(1216, 200)">
59
+ <g transform="translate(0, 1216)">
60
60
  <style>
61
61
  .boundary { fill: rgb(245, 241, 237); }
62
62
  .schematic-boundary { fill: none; stroke: #fff; }