@tscircuit/schematic-trace-solver 0.0.120 → 0.0.122

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 (40) hide show
  1. package/dist/index.d.ts +10 -3
  2. package/dist/index.js +350 -78
  3. package/lib/solvers/RailNetLabelCornerPlacementSolver/RailNetLabelCornerPlacementSolver.ts +223 -21
  4. package/lib/solvers/RailNetLabelCornerPlacementSolver/types.ts +3 -3
  5. package/lib/solvers/SchematicTracePipelineSolver/SchematicTracePipelineSolver.ts +34 -9
  6. package/lib/solvers/TraceCleanupSolver/sameNetRailAlignment/evaluateRailGroup.ts +79 -59
  7. package/lib/solvers/TraceCleanupSolver/sameNetRailAlignment/getRailAlignmentFallbackCoordinates.ts +96 -0
  8. package/lib/utils/doesPathCoincideWithTraces.ts +71 -1
  9. package/package.json +1 -1
  10. package/site/bug-reports/bug-report-20260804T095800Z.page.tsx +4 -0
  11. package/tests/bug-reports/bug-report-20260706T213649Z/__snapshots__/bug-report-20260706T213649Z.snap.svg +4 -4
  12. package/tests/bug-reports/bug-report-20260706T220324Z/__snapshots__/bug-report-20260706T220324Z.snap.svg +5 -5
  13. package/tests/bug-reports/bug-report-20260717T042845Z/__snapshots__/bug-report-20260717T042845Z.snap.svg +12 -12
  14. package/tests/bug-reports/bug-report-20260721T221026Z/__snapshots__/bug-report-20260721T221026Z.snap.svg +2 -2
  15. package/tests/bug-reports/bug-report-20260728T144234Z/__snapshots__/bug-report-20260728T144234Z.snap.svg +2 -2
  16. package/tests/bug-reports/bug-report-20260804T095800Z/__snapshots__/bug-report-20260804T095800Z.snap.svg +135 -0
  17. package/tests/bug-reports/bug-report-20260804T095800Z/bug-report-20260804T095800Z.json +634 -0
  18. package/tests/bug-reports/bug-report-20260804T095800Z/bug-report-20260804T095800Z.test.ts +12 -0
  19. package/tests/examples/__snapshots__/example12.snap.svg +2 -2
  20. package/tests/examples/__snapshots__/example13.snap.svg +4 -4
  21. package/tests/examples/__snapshots__/example14.snap.svg +36 -36
  22. package/tests/examples/__snapshots__/example31.snap.svg +6 -6
  23. package/tests/examples/__snapshots__/example43.snap.svg +2 -2
  24. package/tests/examples/__snapshots__/example44.snap.svg +2 -2
  25. package/tests/repros/__snapshots__/board-15984-same-net-junction.snap.svg +2 -2
  26. package/tests/repros/__snapshots__/bugreport-001-gnd-overlap.snap.svg +26 -26
  27. package/tests/repros/__snapshots__/netlabel-connector-through-rail-label.snap.svg +2 -2
  28. package/tests/repros/__snapshots__/repro-atmega328p-fault-pullup.snap.svg +2 -2
  29. package/tests/repros/__snapshots__/repro-atmega328p-missing-gnd-netlabel.snap.svg +2 -2
  30. package/tests/repros/__snapshots__/repro-bq25895-cross-net-trace-overlap.snap.svg +101 -0
  31. package/tests/repros/__snapshots__/repro-missing-trace-netlabel.snap.svg +18 -18
  32. package/tests/repros/__snapshots__/repro-netlabel-overlap-trace.snap.svg +3 -3
  33. package/tests/repros/__snapshots__/repro-nrf52810-clock-routing.snap.svg +82 -0
  34. package/tests/repros/assets/repro-bq25895-cross-net-trace-overlap.input.json +498 -0
  35. package/tests/repros/assets/repro-nrf52810-clock-routing.input.json +234 -0
  36. package/tests/repros/repro-bq25895-cross-net-trace-overlap.test.ts +88 -0
  37. package/tests/repros/repro-missing-trace-netlabel.test.ts +12 -0
  38. package/tests/repros/repro-netlabel-overlap-trace.test.ts +38 -0
  39. package/tests/repros/repro-nrf52810-clock-routing.test.ts +28 -0
  40. package/tests/solvers/TraceCleanupSolver/alignSameNetRails-trace-clearance.test.ts +68 -0
@@ -1,7 +1,18 @@
1
- import type { Point } from "@tscircuit/math-utils"
1
+ import { boundsIntersection, type Point } from "@tscircuit/math-utils"
2
2
  import type { SolvedTracePath } from "lib/solvers/SchematicTraceLinesSolver/SchematicTraceLinesSolver"
3
3
 
4
4
  const COINCIDENT_EPS = 2e-3
5
+ const GEOMETRY_EPS = 1e-6
6
+
7
+ // Schematic traces are rendered 0.02 schematic units wide.
8
+ export const SCHEMATIC_TRACE_STROKE_WIDTH = 0.02
9
+ export const SCHEMATIC_TRACE_MIN_CENTERLINE_CLEARANCE =
10
+ SCHEMATIC_TRACE_STROKE_WIDTH + GEOMETRY_EPS
11
+ // Rail-alignment fallbacks need a visible gap, not only non-overlapping trace
12
+ // bodies. Three stroke widths of centerline separation leave two stroke widths
13
+ // of whitespace between the rendered traces.
14
+ export const SCHEMATIC_TRACE_MIN_VISUAL_CENTERLINE_CLEARANCE =
15
+ SCHEMATIC_TRACE_STROKE_WIDTH * 3
5
16
 
6
17
  /**
7
18
  * Returns true when an orthogonal path shares a positive-length segment with
@@ -59,3 +70,62 @@ export const doesPathCoincideWithTraces = (
59
70
 
60
71
  return false
61
72
  }
73
+
74
+ /** Returns true when the rendered strokes of parallel trace runs overlap. */
75
+ export const doesPathOverlapTraceStrokes = (
76
+ path: Point[],
77
+ traces: SolvedTracePath[],
78
+ ): boolean => {
79
+ const traceStrokeRadius = SCHEMATIC_TRACE_MIN_CENTERLINE_CLEARANCE / 2
80
+ const getStrokeBounds = (start: Point, end: Point, isVertical: boolean) =>
81
+ isVertical
82
+ ? {
83
+ minX: start.x - traceStrokeRadius,
84
+ maxX: start.x + traceStrokeRadius,
85
+ minY: Math.min(start.y, end.y),
86
+ maxY: Math.max(start.y, end.y),
87
+ }
88
+ : {
89
+ minX: Math.min(start.x, end.x),
90
+ maxX: Math.max(start.x, end.x),
91
+ minY: start.y - traceStrokeRadius,
92
+ maxY: start.y + traceStrokeRadius,
93
+ }
94
+
95
+ for (let pathIndex = 0; pathIndex < path.length - 1; pathIndex++) {
96
+ const pathStart = path[pathIndex]!
97
+ const pathEnd = path[pathIndex + 1]!
98
+ const isVertical = Math.abs(pathStart.x - pathEnd.x) < COINCIDENT_EPS
99
+ const isHorizontal = Math.abs(pathStart.y - pathEnd.y) < COINCIDENT_EPS
100
+ if (!isVertical && !isHorizontal) continue
101
+
102
+ const pathBounds = getStrokeBounds(pathStart, pathEnd, isVertical)
103
+ for (const trace of traces) {
104
+ for (
105
+ let traceIndex = 0;
106
+ traceIndex < trace.tracePath.length - 1;
107
+ traceIndex++
108
+ ) {
109
+ const traceStart = trace.tracePath[traceIndex]!
110
+ const traceEnd = trace.tracePath[traceIndex + 1]!
111
+ const isParallel = isVertical
112
+ ? Math.abs(traceStart.x - traceEnd.x) < COINCIDENT_EPS
113
+ : Math.abs(traceStart.y - traceEnd.y) < COINCIDENT_EPS
114
+ if (!isParallel) continue
115
+
116
+ const overlap = boundsIntersection(
117
+ pathBounds,
118
+ getStrokeBounds(traceStart, traceEnd, isVertical),
119
+ )
120
+ if (!overlap) continue
121
+
122
+ const overlapLength = isVertical
123
+ ? overlap.maxY - overlap.minY
124
+ : overlap.maxX - overlap.minX
125
+ if (overlapLength > COINCIDENT_EPS) return true
126
+ }
127
+ }
128
+ }
129
+
130
+ return false
131
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tscircuit/schematic-trace-solver",
3
3
  "main": "dist/index.js",
4
- "version": "0.0.120",
4
+ "version": "0.0.122",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "start": "cosmos",
@@ -0,0 +1,4 @@
1
+ import { PipelineDebugger } from "site/components/PipelineDebugger"
2
+ import inputProblem from "../../tests/bug-reports/bug-report-20260804T095800Z/bug-report-20260804T095800Z.json"
3
+
4
+ export default () => <PipelineDebugger inputProblem={inputProblem as any} />
@@ -1,7 +1,7 @@
1
1
  <svg width="640" height="640" viewBox="0 0 640 640" xmlns="http://www.w3.org/2000/svg"><rect width="100%" height="100%" fill="white"/><g><polyline data-points="17.565,0 17.765,0 17.765,2 17.565,2" data-type="line" data-label="" points="594.9036857272865,290.95950250265435 598.301228575762,290.95950250265435 598.301228575762,256.9840740178978 594.9036857272865,256.9840740178978" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="17.565,-2 17.765,-2 17.765,0 17.565,0" data-type="line" data-label="" points="594.9036857272865,324.9349309874109 598.301228575762,324.9349309874109 598.301228575762,290.95950250265435 594.9036857272865,290.95950250265435" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="17.565,-4 17.765,-4 17.765,-2 17.565,-2" data-type="line" data-label="" points="594.9036857272865,358.91035947216744 598.301228575762,358.91035947216744 598.301228575762,324.9349309874109 594.9036857272865,324.9349309874109" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-4.949999999999999,9 -4.5249999999999995,9 -4.5249999999999995,2.3 -4.1,2.3" data-type="line" data-label="" points="212.4252995601395,138.07007432124985 219.64507811315028,138.07007432124985 219.64507811315028,251.88775974518433 226.86485666616105,251.88775974518433" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-7.85,1.7 -5.975,1.7 -5.975,2.1 -4.1,2.1" data-type="line" data-label="" points="163.1609282572425,262.08038829061127 195.01289246170177,262.08038829061127 195.01289246170177,255.28530259365996 226.86485666616105,255.28530259365996" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="10.15,2.1 10.450000000000001,2.1 10.450000000000001,5.55 8.75,5.55 8.75,9 8.95,9" data-type="line" data-label="" points="468.9397846200515,255.28530259365996 474.03609889276504,255.28530259365996 474.03609889276504,196.6776884574549 445.1569846807219,196.6776884574549 445.1569846807219,138.07007432124985 448.55452752919757,138.07007432124985" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-7.9,-4.3 -6,-4.3 -6,-4.1 -4.1,-4.1" data-type="line" data-label="" points="162.3115425451236,364.0066737448809 194.5881996056423,364.0066737448809 194.5881996056423,360.6091308964053 226.86485666616105,360.6091308964053" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="15.05,9 15.7425,9 15.7425,-4 16.435,-4" data-type="line" data-label="" points="552.1795844077051,138.07007432124985 563.943576520552,138.07007432124985 563.943576520552,358.91035947216744 575.707568633399,358.91035947216744" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.15,-9.5 1.3499999999999999,-9.5 1.3499999999999999,-10.75 0.25,-10.75 0.25,-12 0.44999999999999996,-12" data-type="line" data-label="" points="316.050356438647,452.342787805248 319.44789928712265,452.342787805248 319.44789928712265,473.5774306082208 300.7614136205066,473.5774306082208 300.7614136205066,494.8120734111937 304.1589564689822,494.8120734111937" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="4.15,2.3 4.3500000000000005,2.3 4.3500000000000005,2.7 10.25,2.7 10.25,2.3 10.15,2.3" data-type="line" data-label="" points="367.0134991657818,251.88775974518433 370.4110420142575,251.88775974518433 370.4110420142575,245.092674048233 470.6385560442893,245.092674048233 470.6385560442893,251.88775974518433 468.9397846200515,251.88775974518433" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-7.9,-3.7 -7.7,-3.7 -7.7,-3.3 -1.7,-3.3 -1.7,-3.7 -1.9,-3.7" data-type="line" data-label="" points="162.3115425451236,353.814045199454 165.70908539359922,353.814045199454 165.70908539359922,347.01895950250264 267.6353708478689,347.01895950250264 267.6353708478689,353.814045199454 264.23782799939323,353.814045199454" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-11.55,-12 -11.75,-12 -11.75,-12.819999999999999 -8.75,-12.819999999999999 -8.75,-12 -8.55,-12" data-type="line" data-label="" points="100.30638556044286,494.8120734111937 96.90884271196722,494.8120734111937 96.90884271196722,508.7419990899439 147.87198543910205,508.7419990899439 147.87198543910205,494.8120734111937 151.26952828757769,494.8120734111937" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-5.55,-12 -5.75,-12 -5.75,-12.819999999999999 -2.7499999999999982,-12.819999999999999 -2.7499999999999982,-12 -2.549999999999999,-12" data-type="line" data-label="" points="202.23267101471254,494.8120734111937 198.83512816623687,494.8120734111937 198.83512816623687,508.7419990899439 249.79827089337175,508.7419990899439 249.79827089337175,494.8120734111937 253.1958137418474,494.8120734111937" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="3.45,-12 3.25,-12 3.25,-12.819999999999999 6.25,-12.819999999999999 6.25,-12 6.45,-12" data-type="line" data-label="" points="355.12209919611706,494.8120734111937 351.7245563476414,494.8120734111937 351.7245563476414,508.7419990899439 402.6876990747762,508.7419990899439 402.6876990747762,494.8120734111937 406.0852419232519,494.8120734111937" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.15,-9.3 1.75,-9.3 1.75,-12 1.55,-12" data-type="line" data-label="" points="316.050356438647,448.94524495677234 326.242984984074,448.94524495677234 326.242984984074,494.8120734111937 322.8454421355983,494.8120734111937" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="7.55,-12 7.75,-12 7.75,-12.819999999999999 10.75,-12.819999999999999 10.75,-12 10.55,-12" data-type="line" data-label="" points="424.77172758986796,494.8120734111937 428.16927043834363,494.8120734111937 428.16927043834363,508.7419990899439 479.13241316547845,508.7419990899439 479.13241316547845,494.8120734111937 475.7348703170028,494.8120734111937" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-12.9,4.3 -12.700000000000001,4.3 -12.700000000000001,6.65 -13.75,6.65 -13.75,9 -13.55,9" data-type="line" data-label="" points="77.37297133323219,217.91233126042775 80.77051418170782,217.91233126042775 80.77051418170782,177.9912027908388 62.93341422721065,177.9912027908388 62.93341422721065,138.07007432124985 66.33095707568629,138.07007432124985" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-12.45,9 -11.600999999999999,9 -11.600999999999999,2.3 -10.15,2.3" data-type="line" data-label="" points="85.01744274230242,138.07007432124985 99.4400121340816,138.07007432124985 99.4400121340816,251.88775974518433 124.08918549977244,251.88775974518433" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.8499999999999996,2.3 -1.319,2.3 -1.319,9 -2.45,9" data-type="line" data-label="" points="327.9417564083118,251.88775974518433 274.107689974215,251.88775974518433 274.107689974215,138.07007432124985 254.8945851660852,138.07007432124985" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1.9000000000000021,1.7 -1.7000000000000028,1.7 -1.7000000000000028,-0.9 -10.299999999999999,-0.9 -10.299999999999999,-3.5 -10.650999999999998,-3.5 -10.650999999999998,-3.9000000000000004 -10.1,-3.9" data-type="line" data-label="" points="264.23782799939323,262.08038829061127 267.63537084786884,262.08038829061127 267.63537084786884,306.2484453207948 121.54102836341573,306.2484453207948 121.54102836341573,350.4165023509783 115.57834066434097,350.4165023509783 115.57834066434097,357.21158804792964 124.93857121189137,357.21158804792964" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="4.15,1.9 4.701,1.9000000000000001 4.701,-0.9000000000000001 1.6499999999999995,-0.9000000000000001 1.6499999999999995,-3.7 1.8499999999999996,-3.7" data-type="line" data-label="" points="367.0134991657818,258.6828454421356 376.37372971333224,258.6828454421356 376.37372971333224,306.2484453207948 324.5442135598361,306.2484453207948 324.5442135598361,353.814045199454 327.9417564083118,353.814045199454" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="10.15,1.7 15.800999999999998,1.7 15.800999999999998,4.3 15.15,4.3" data-type="line" data-label="" points="468.9397846200515,262.08038829061127 564.9373578037312,262.08038829061127 564.9373578037312,217.91233126042775 553.8783558319428,217.91233126042775" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="10.15,-4.1 10.700999999999999,-4.1000000000000005 10.700999999999999,-4.8 -1.049,-4.8 -1.049,-3.8000000000000003 -1.3489999999999998,-3.8000000000000003 -1.3489999999999998,-4.1 -1.9,-4.1" data-type="line" data-label="" points="468.9397846200515,360.6091308964053 478.30001516760194,360.6091308964053 478.30001516760194,372.5005308660701 278.6943728196572,372.5005308660701 278.6943728196572,355.51281662369183 273.59805854694366,355.51281662369183 273.59805854694366,360.6091308964053 264.23782799939323,360.6091308964053" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="7.85,-3.9 7.299,-3.9000000000000004 7.299,0.40000000000000013 15.900999999999998,0.40000000000000013 15.900999999999998,4.7 15.15,4.7" data-type="line" data-label="" points="429.86804186258144,357.21158804792964 420.50781131503106,357.21158804792964 420.50781131503106,284.164416805703 566.6361292279689,284.164416805703 566.6361292279689,211.11724556347644 553.8783558319428,211.11724556347644" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-10.15,1.7 -10.750999999999998,1.7 -10.750999999999998,-4.3 -10.1,-4.3" data-type="line" data-label="" points="124.08918549977244,262.08038829061127 113.87956924010314,262.08038829061127 113.87956924010314,364.0066737448809 124.93857121189137,364.0066737448809" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-12.9,4.7 -12.8,4.7 -12.8,4.751 -12.499,4.751" data-type="line" data-label="" points="77.37297133323219,211.11724556347644 79.07174275747002,211.11724556347644 79.07174275747002,210.25087213711515 84.18504474442588,210.25087213711515" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="15.15,3.3 16.151,3.3 16.151,3.3509999999999995" data-type="line" data-label="" points="553.8783558319428,234.90004550280602 570.8830577885635,234.90004550280602 570.8830577885635,234.03367207644476" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-7.85,2.3 -7.749,2.3 -7.749,2.501" data-type="line" data-label="" points="163.1609282572425,251.88775974518433 164.8766873957227,251.88775974518433 164.8766873957227,248.47322918246627" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1.9,2.3 -1.799,2.3 -1.799,2.501" data-type="line" data-label="" points="264.23782799939323,251.88775974518433 265.95358713787346,251.88775974518433 265.95358713787346,248.47322918246627" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="4.15,-3.7 4.251,-3.7 4.251,-3.499" data-type="line" data-label="" points="367.0134991657818,353.814045199454 368.72925830426203,353.814045199454 368.72925830426203,350.39951463673594" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="10.15,-3.7 10.251,-3.7 10.251,-3.499" data-type="line" data-label="" points="468.9397846200515,353.814045199454 470.65554375853173,353.814045199454 470.65554375853173,350.39951463673594" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-3.55,9 -3.651,9 -3.651,9.401" data-type="line" data-label="" points="236.20809949946909,138.07007432124985 234.4923403609889,138.07007432124985 234.4923403609889,131.25800091005615" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1.05,9 -1.151,9 -1.151,9.401" data-type="line" data-label="" points="278.67738510541477,138.07007432124985 276.96162596693455,138.07007432124985 276.96162596693455,131.25800091005615" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="9.45,-12 9.349,-12 9.349,-11.349" data-type="line" data-label="" points="457.04838465038665,494.8120734111937 455.3326255119065,494.8120734111937 455.3326255119065,483.7530714394054" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-12.9,4.5 -12.8,4.5 -12.8,4.449 -12.349000000000002,4.449" data-type="line" data-label="" points="77.37297133323219,214.5147884119521 79.07174275747002,214.5147884119521 79.07174275747002,215.3811618383134 86.73320188078259,215.3811618383134" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="15.15,3.5 15.251,3.5 15.251,3.099" data-type="line" data-label="" points="553.8783558319428,231.50250265433039 555.5941149704231,231.50250265433039 555.5941149704231,238.31457606552405" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-4.1,1.7 -4.201,1.7 -4.201,1.499" data-type="line" data-label="" points="226.86485666616105,262.08038829061127 225.14909752768085,262.08038829061127 225.14909752768085,265.4949188533293" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.8499999999999996,1.7 1.7489999999999997,1.7 1.7489999999999997,1.499" data-type="line" data-label="" points="327.9417564083118,262.08038829061127 326.22599726983157,262.08038829061127 326.22599726983157,265.4949188533293" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="7.85,1.7 7.749,1.7 7.749,1.499" data-type="line" data-label="" points="429.86804186258144,262.08038829061127 428.15228272410127,262.08038829061127 428.15228272410127,265.4949188533293" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-4.1,-4.3 -4.201,-4.3 -4.201,-4.501" data-type="line" data-label="" points="226.86485666616105,364.0066737448809 225.14909752768085,364.0066737448809 225.14909752768085,367.421204307599" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="1.8499999999999996,-4.3 -1.150999999999998,-4.3 -1.150999999999998,-4.901" data-type="line" data-label="" points="327.9417564083118,364.0066737448809 276.9616259669346,364.0066737448809 276.9616259669346,374.2162900045503" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-10.45,-12 -10.299,-12 -10.299,-12.051" data-type="line" data-label="" points="118.992871227059,494.8120734111937 121.5580160776581,494.8120734111937 121.5580160776581,495.678446837555" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-7.449999999999999,-12 -7.348999999999999,-12 -7.348999999999999,-12.651" data-type="line" data-label="" points="169.95601395419382,494.8120734111937 171.67177309267402,494.8120734111937 171.67177309267402,505.8710753829819" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-4.45,-12 -4.299,-12 -4.299,-12.051" data-type="line" data-label="" points="220.91915668132862,494.8120734111937 223.48430153192777,494.8120734111937 223.48430153192777,495.678446837555" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-1.45,-12 -1.349,-12 -1.349,-12.651" data-type="line" data-label="" points="271.8822994084635,494.8120734111937 273.59805854694366,494.8120734111937 273.59805854694366,505.8710753829819" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="4.55,-12 4.701,-12 4.701,-12.051" data-type="line" data-label="" points="373.80858486273314,494.8120734111937 376.37372971333224,494.8120734111937 376.37372971333224,495.678446837555" fill="none" stroke="purple" stroke-width="1px"/></g><g><rect data-type="rect" data-label="schematic_component_0" data-x="-14" data-y="4" x="39.999999999999986" y="207.71970271500078" width="37.37297133323219" height="30.57788563628091" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_1" data-x="14" data-y="4" x="514.8066130744728" y="207.71970271500078" width="39.07174275747002" height="30.57788563628091" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_2" data-x="0" data-y="-9" x="276.97861368117697" y="431.957530714394" width="39.07174275747002" height="23.78279993932955" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_3" data-x="-9" data-y="2" x="124.08918549977246" y="248.49021689670866" width="39.07174275747005" height="16.987714242378274" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_4" data-x="-3" data-y="2" x="226.86485666616107" y="248.49021689670866" width="37.37297133323219" height="16.987714242378274" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_5" data-x="3" data-y="2" x="327.9417564083118" y="248.49021689670866" width="39.07174275747002" height="16.987714242378274" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_6" data-x="9" data-y="2" x="429.86804186258144" y="248.49021689670866" width="39.071742757470076" height="16.987714242378274" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_7" data-x="-9" data-y="-4" x="124.93857121189137" y="350.4165023509783" width="37.372971333232215" height="16.987714242378274" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_8" data-x="-3" data-y="-4" x="226.86485666616107" y="350.4165023509783" width="37.37297133323219" height="16.987714242378274" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_9" data-x="3" data-y="-4" x="327.9417564083118" y="350.4165023509783" width="39.07174275747002" height="16.987714242378274" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_10" data-x="9" data-y="-4" x="429.86804186258144" y="350.4165023509783" width="39.071742757470076" height="16.987714242378274" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_11" data-x="-13" data-y="9" x="66.33095707568629" y="131.45411812528445" width="18.686485666616136" height="13.231912391930791" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_12" data-x="-10.5" data-y="9" x="108.800242681632" y="131.45411812528445" width="18.686485666616136" height="13.231912391930791" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_13" data-x="-8" data-y="9" x="151.26952828757769" y="131.45411812528445" width="18.686485666616136" height="13.231912391930791" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_14" data-x="-5.5" data-y="9" x="193.7388138935234" y="131.45411812528445" width="18.686485666616107" height="13.231912391930791" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_15" data-x="-3" data-y="9" x="236.20809949946909" y="131.45411812528445" width="18.686485666616107" height="13.231912391930791" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_16" data-x="-0.5" data-y="9" x="278.67738510541477" y="131.45411812528445" width="18.686485666616136" height="13.231912391930791" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_17" data-x="2" data-y="9" x="321.14667071136046" y="131.45411812528445" width="18.686485666616136" height="13.231912391930791" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_18" data-x="4.5" data-y="9" x="363.61595631730614" y="131.45411812528445" width="18.686485666616136" height="13.231912391930791" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_19" data-x="7" data-y="9" x="406.08524192325183" y="131.45411812528445" width="18.686485666616136" height="13.231912391930791" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_20" data-x="9.5" data-y="9" x="448.55452752919757" y="131.45411812528445" width="18.686485666616136" height="13.231912391930791" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_21" data-x="12" data-y="9" x="491.0238131351433" y="131.45411812528445" width="18.68648566661608" height="13.231912391930791" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_22" data-x="14.5" data-y="9" x="533.4930987410889" y="131.45411812528445" width="18.686485666616136" height="13.231912391930791" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_23" data-x="-11" data-y="-12" x="100.30638556044286" y="484.2796905809191" width="18.686485666616136" height="21.064765660549085" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_24" data-x="-8" data-y="-12" x="151.26952828757769" y="484.2796905809191" width="18.686485666616136" height="21.064765660549085" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_25" data-x="-5" data-y="-12" x="202.23267101471257" y="484.2796905809191" width="18.68648566661608" height="21.064765660549085" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_26" data-x="-2" data-y="-12" x="253.19581374184736" y="484.2796905809191" width="18.686485666616136" height="21.064765660549085" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_27" data-x="1" data-y="-12" x="304.1589564689822" y="484.2796905809191" width="18.686485666616136" height="21.064765660549085" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_28" data-x="4" data-y="-12" x="355.122099196117" y="484.2796905809191" width="18.68648566661608" height="21.064765660549085" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_29" data-x="7" data-y="-12" x="406.08524192325183" y="484.2796905809191" width="18.68648566661608" height="21.064765660549085" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_30" data-x="10" data-y="-12" x="457.04838465038665" y="484.2796905809191" width="18.686485666616136" height="21.064765660549085" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_31" data-x="17" data-y="2" x="575.707568633399" y="246.9613226148946" width="19.19611709388755" height="20.04550280600637" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_32" data-x="17" data-y="0" x="575.707568633399" y="280.93675109965113" width="19.19611709388755" height="20.045502806006425" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_33" data-x="17" data-y="-2" x="575.707568633399" y="314.9121795844077" width="19.19611709388755" height="20.04550280600637" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="schematic_component_34" data-x="17" data-y="-4" x="575.707568633399" y="348.88760806916423" width="19.19611709388755" height="20.04550280600637" fill="hsl(320, 100%, 50%, 0.8)" stroke="black" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="netId: VIN
2
2
  globalConnNetId: connectivity_net36" data-x="-12.499" data-y="4.9910000000000005" x="82.48627332018806" y="202.09676930077353" width="3.397542848475638" height="8.154102836341593" fill="#ef444466" stroke="#ef4444" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="netId: VIN
3
3
  globalConnNetId: connectivity_net36" data-x="16.151" data-y="3.5909999999999993" x="569.1842863643258" y="225.87956924010314" width="3.3975428484756094" height="8.154102836341593" fill="#ef444466" stroke="#ef4444" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="netId: VIN
4
- globalConnNetId: connectivity_net36" data-x="0.7999999999999999" data-y="-10.51" x="308.4058850295768" y="465.42332777187926" width="3.3975428484756662" height="8.154102836341565" fill="#ef444466" stroke="#ef4444" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="netId: VIN
4
+ globalConnNetId: connectivity_net36" data-x="0.25" data-y="-10.51" x="299.0626421962687" y="465.42332777187926" width="3.3975428484756662" height="8.154102836341565" fill="#ef444466" stroke="#ef4444" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="netId: VIN
5
5
  globalConnNetId: connectivity_net36" data-x="-7.749" data-y="2.7409999999999997" x="163.17791597148488" y="240.31912634612468" width="3.397542848475638" height="8.154102836341593" fill="#ef444466" stroke="#ef4444" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="netId: VIN
6
6
  globalConnNetId: connectivity_net36" data-x="-1.799" data-y="2.7409999999999997" x="264.25481571363565" y="240.31912634612468" width="3.3975428484756094" height="8.154102836341593" fill="#ef444466" stroke="#ef4444" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="netId: VIN
7
7
  globalConnNetId: connectivity_net36" data-x="4.3500000000000005" data-y="2.9400000000000004" x="368.71227059001967" y="236.93857121189143" width="3.3975428484756662" height="8.154102836341565" fill="#ef444466" stroke="#ef4444" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="netId: VIN
@@ -11,7 +11,7 @@ globalConnNetId: connectivity_net36" data-x="10.251" data-y="-3.2590000000000003
11
11
  globalConnNetId: connectivity_net36" data-x="-3.651" data-y="9.641" x="232.79356893675106" y="123.10389807371459" width="3.3975428484756662" height="8.154102836341565" fill="#ef444466" stroke="#ef4444" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="netId: VIN
12
12
  globalConnNetId: connectivity_net36" data-x="-1.151" data-y="9.641" x="275.2628545426967" y="123.10389807371459" width="3.3975428484756662" height="8.154102836341565" fill="#ef444466" stroke="#ef4444" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="netId: VIN
13
13
  globalConnNetId: connectivity_net36" data-x="-11.75" data-y="-11.76" x="95.2100712877294" y="486.65797057485213" width="3.397542848475638" height="8.154102836341565" fill="#ef444466" stroke="#ef4444" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="netId: VIN
14
- globalConnNetId: connectivity_net36" data-x="-5.65" data-y="-11.76" x="198.83512816623687" y="486.65797057485213" width="3.3975428484756662" height="8.154102836341565" fill="#ef444466" stroke="#ef4444" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="netId: VIN
14
+ globalConnNetId: connectivity_net36" data-x="-5.75" data-y="-11.76" x="197.13635674199907" y="486.65797057485213" width="3.397542848475638" height="8.154102836341565" fill="#ef444466" stroke="#ef4444" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="netId: VIN
15
15
  globalConnNetId: connectivity_net36" data-x="3.25" data-y="-11.76" x="350.02578492340353" y="486.65797057485213" width="3.3975428484756662" height="8.154102836341565" fill="#ef444466" stroke="#ef4444" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="netId: VIN
16
16
  globalConnNetId: connectivity_net36" data-x="9.349" data-y="-11.109" x="453.6338540876686" y="475.5989686030639" width="3.3975428484756662" height="8.154102836341565" fill="#ef444466" stroke="#ef4444" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="netId: GND
17
17
  globalConnNetId: connectivity_net37" data-x="-12.349000000000002" data-y="4.209" x="85.03443045654475" y="215.3811618383134" width="3.3975428484756662" height="8.154102836341565" fill="#00000066" stroke="#000000" stroke-width="0.058866071428571434"/></g><g><rect data-type="rect" data-label="netId: GND
@@ -239,7 +239,7 @@ x-" data-x="16.435" data-y="-4" cx="575.707568633399" cy="358.91035947216744" r=
239
239
  x+" data-x="17.565" data-y="-4" cx="594.9036857272865" cy="358.91035947216744" r="3" fill="hsl(36, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="anchorPoint
240
240
  orientation: y+" data-x="-12.499" data-y="4.751" cx="84.18504474442588" cy="210.25087213711515" r="3" fill="hsl(80, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
241
241
  orientation: y+" data-x="16.151" data-y="3.3509999999999995" cx="570.8830577885635" cy="234.03367207644476" r="3" fill="hsl(80, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
242
- orientation: y+" data-x="0.7999999999999999" data-y="-10.75" cx="310.1046564538146" cy="473.5774306082208" r="3" fill="hsl(80, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
242
+ orientation: y+" data-x="0.25" data-y="-10.75" cx="300.7614136205066" cy="473.5774306082208" r="3" fill="hsl(80, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
243
243
  orientation: y+" data-x="-7.749" data-y="2.501" cx="164.8766873957227" cy="248.47322918246627" r="3" fill="hsl(80, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
244
244
  orientation: y+" data-x="-1.799" data-y="2.501" cx="265.95358713787346" cy="248.47322918246627" r="3" fill="hsl(80, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
245
245
  orientation: y+" data-x="4.3500000000000005" data-y="2.7" cx="370.4110420142575" cy="245.092674048233" r="3" fill="hsl(80, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
@@ -249,7 +249,7 @@ orientation: y+" data-x="10.251" data-y="-3.499" cx="470.65554375853173" cy="350
249
249
  orientation: y+" data-x="-3.651" data-y="9.401" cx="234.4923403609889" cy="131.25800091005615" r="3" fill="hsl(80, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
250
250
  orientation: y+" data-x="-1.151" data-y="9.401" cx="276.96162596693455" cy="131.25800091005615" r="3" fill="hsl(80, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
251
251
  orientation: y+" data-x="-11.75" data-y="-12" cx="96.90884271196722" cy="494.8120734111937" r="3" fill="hsl(80, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
252
- orientation: y+" data-x="-5.65" data-y="-12" cx="200.5338995904747" cy="494.8120734111937" r="3" fill="hsl(80, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
252
+ orientation: y+" data-x="-5.75" data-y="-12" cx="198.83512816623687" cy="494.8120734111937" r="3" fill="hsl(80, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
253
253
  orientation: y+" data-x="3.25" data-y="-12" cx="351.7245563476414" cy="494.8120734111937" r="3" fill="hsl(80, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
254
254
  orientation: y+" data-x="9.349" data-y="-11.349" cx="455.3326255119065" cy="483.7530714394054" r="3" fill="hsl(80, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
255
255
  orientation: y-" data-x="-12.349000000000002" data-y="4.449" cx="86.73320188078259" cy="215.3811618383134" r="3" fill="hsl(80, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint