@tscircuit/schematic-trace-solver 0.0.71 → 0.0.72

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -4191,6 +4191,7 @@ var balanceZShapes = ({
4191
4191
  throw new Error(`Target trace ${targetMspConnectionPairId} not found`);
4192
4192
  }
4193
4193
  const TOLERANCE = 1e-5;
4194
+ const coordsEqual = (a, b) => Math.abs(a - b) < TOLERANCE;
4194
4195
  const obstacleTraces = traces.filter(
4195
4196
  (t) => t.mspPairId !== targetMspConnectionPairId
4196
4197
  );
@@ -4244,7 +4245,7 @@ var balanceZShapes = ({
4244
4245
  const [p0, p1, p2, p3] = newPath;
4245
4246
  let p1New;
4246
4247
  let p2New;
4247
- const isHVHShape = p0.y === p1.y && p1.x === p2.x && p2.y === p3.y;
4248
+ const isHVHShape = coordsEqual(p0.y, p1.y) && coordsEqual(p1.x, p2.x) && coordsEqual(p2.y, p3.y);
4248
4249
  if (isHVHShape) {
4249
4250
  const idealX = (p0.x + p3.x) / 2;
4250
4251
  p1New = { x: idealX, y: p1.y };
@@ -4266,10 +4267,10 @@ var balanceZShapes = ({
4266
4267
  const p2 = newPath[i + 1];
4267
4268
  const p3 = newPath[i + 2];
4268
4269
  const p4 = newPath[i + 3];
4269
- const isHVHZShape = p1.y === p2.y && p2.x === p3.x && p3.y === p4.y;
4270
- const isVHVZShape = p1.x === p2.x && p2.y === p3.y && p3.x === p4.x;
4271
- const isCollinearHorizontal = p1.y === p2.y && p2.y === p3.y && p3.y === p4.y;
4272
- const isCollinearVertical = p1.x === p2.x && p2.x === p3.x && p3.x === p4.x;
4270
+ const isHVHZShape = coordsEqual(p1.y, p2.y) && coordsEqual(p2.x, p3.x) && coordsEqual(p3.y, p4.y);
4271
+ const isVHVZShape = coordsEqual(p1.x, p2.x) && coordsEqual(p2.y, p3.y) && coordsEqual(p3.x, p4.x);
4272
+ const isCollinearHorizontal = coordsEqual(p1.y, p2.y) && coordsEqual(p2.y, p3.y) && coordsEqual(p3.y, p4.y);
4273
+ const isCollinearVertical = coordsEqual(p1.x, p2.x) && coordsEqual(p2.x, p3.x) && coordsEqual(p3.x, p4.x);
4273
4274
  const isCollinear = isCollinearHorizontal || isCollinearVertical;
4274
4275
  let isSameDirection = false;
4275
4276
  if (isHVHZShape) {
@@ -31,6 +31,12 @@ export const balanceZShapes = ({
31
31
 
32
32
  const TOLERANCE = 1e-5
33
33
 
34
+ // Axis-aligned segment classification must tolerate floating-point drift:
35
+ // coordinates that are "the same" can differ by a rounding epsilon (e.g. a
36
+ // vertical leg whose endpoints are 1.85 vs 1.8500000000000003). Strict `===`
37
+ // would misclassify such a Z-shape and "balance" it into diagonal segments.
38
+ const coordsEqual = (a: number, b: number) => Math.abs(a - b) < TOLERANCE
39
+
34
40
  const obstacleTraces = traces.filter(
35
41
  (t) => t.mspPairId !== targetMspConnectionPairId,
36
42
  )
@@ -98,7 +104,10 @@ export const balanceZShapes = ({
98
104
  let p1New: Point
99
105
  let p2New: Point
100
106
 
101
- const isHVHShape = p0.y === p1.y && p1.x === p2.x && p2.y === p3.y
107
+ const isHVHShape =
108
+ coordsEqual(p0.y, p1.y) &&
109
+ coordsEqual(p1.x, p2.x) &&
110
+ coordsEqual(p2.y, p3.y)
102
111
 
103
112
  if (isHVHShape) {
104
113
  const idealX = (p0.x + p3.x) / 2
@@ -132,12 +141,23 @@ export const balanceZShapes = ({
132
141
  const p3 = newPath[i + 2]!
133
142
  const p4 = newPath[i + 3]!
134
143
 
135
- const isHVHZShape = p1.y === p2.y && p2.x === p3.x && p3.y === p4.y
136
- const isVHVZShape = p1.x === p2.x && p2.y === p3.y && p3.x === p4.x
144
+ const isHVHZShape =
145
+ coordsEqual(p1.y, p2.y) &&
146
+ coordsEqual(p2.x, p3.x) &&
147
+ coordsEqual(p3.y, p4.y)
148
+ const isVHVZShape =
149
+ coordsEqual(p1.x, p2.x) &&
150
+ coordsEqual(p2.y, p3.y) &&
151
+ coordsEqual(p3.x, p4.x)
137
152
 
138
153
  const isCollinearHorizontal =
139
- p1.y === p2.y && p2.y === p3.y && p3.y === p4.y
140
- const isCollinearVertical = p1.x === p2.x && p2.x === p3.x && p3.x === p4.x
154
+ coordsEqual(p1.y, p2.y) &&
155
+ coordsEqual(p2.y, p3.y) &&
156
+ coordsEqual(p3.y, p4.y)
157
+ const isCollinearVertical =
158
+ coordsEqual(p1.x, p2.x) &&
159
+ coordsEqual(p2.x, p3.x) &&
160
+ coordsEqual(p3.x, p4.x)
141
161
  const isCollinear = isCollinearHorizontal || isCollinearVertical
142
162
 
143
163
  let isSameDirection = false
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.71",
4
+ "version": "0.0.72",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "start": "cosmos",
@@ -0,0 +1,570 @@
1
+ <svg width="640" height="640" viewBox="0 0 640 640" xmlns="http://www.w3.org/2000/svg">
2
+ <rect width="100%" height="100%" fill="white" />
3
+ <g>
4
+ <circle data-type="point" data-label="U1.1
5
+ x+" data-x="1.65" data-y="0.42500000000000004" cx="435.12538302434456" cy="217.0711319737694" r="3" fill="hsl(319, 100%, 50%, 0.8)" />
6
+ </g>
7
+ <g>
8
+ <circle data-type="point" data-label="U1.2
9
+ x+" data-x="1.65" data-y="0.7749999999999999" cx="435.12538302434456" cy="200.58367027620386" r="3" fill="hsl(320, 100%, 50%, 0.8)" />
10
+ </g>
11
+ <g>
12
+ <circle data-type="point" data-label="U1.3
13
+ x+" data-x="1.65" data-y="-0.7749999999999999" cx="435.12538302434456" cy="273.5995720797084" r="3" fill="hsl(321, 100%, 50%, 0.8)" />
14
+ </g>
15
+ <g>
16
+ <circle data-type="point" data-label="U1.4
17
+ x+" data-x="1.65" data-y="-0.42499999999999993" cx="435.12538302434456" cy="257.1121103821429" r="3" fill="hsl(322, 100%, 50%, 0.8)" />
18
+ </g>
19
+ <g>
20
+ <circle data-type="point" data-label="U1.5
21
+ x+" data-x="1.65" data-y="-0.07499999999999996" cx="435.12538302434456" cy="240.62464868457732" r="3" fill="hsl(323, 100%, 50%, 0.8)" />
22
+ </g>
23
+ <g>
24
+ <circle data-type="point" data-label="U1.6
25
+ x-" data-x="-1.65" data-y="0.7" cx="279.67217273301225" cy="204.11669778282504" r="3" fill="hsl(324, 100%, 50%, 0.8)" />
26
+ </g>
27
+ <g>
28
+ <circle data-type="point" data-label="U1.7
29
+ x-" data-x="-1.65" data-y="-0.7" cx="279.67217273301225" cy="270.06654457308724" r="3" fill="hsl(325, 100%, 50%, 0.8)" />
30
+ </g>
31
+ <g>
32
+ <circle data-type="point" data-label="U1.8
33
+ x-" data-x="-1.65" data-y="0.35" cx="279.67217273301225" cy="220.6041594803906" r="3" fill="hsl(326, 100%, 50%, 0.8)" />
34
+ </g>
35
+ <g>
36
+ <circle data-type="point" data-label="U1.9
37
+ x-" data-x="-1.65" data-y="-0.3500000000000001" cx="279.67217273301225" cy="253.5790828755217" r="3" fill="hsl(327, 100%, 50%, 0.8)" />
38
+ </g>
39
+ <g>
40
+ <circle data-type="point" data-label="U1.10
41
+ x-" data-x="-1.65" data-y="-1.1102230246251565e-16" cx="279.67217273301225" cy="237.09162117795614" r="3" fill="hsl(217, 100%, 50%, 0.8)" />
42
+ </g>
43
+ <g>
44
+ <circle data-type="point" data-label="C1.1
45
+ y+" data-x="0.22500000000000064" data-y="-3.005" cx="367.997860398542" cy="378.64825660991175" r="3" fill="hsl(121, 100%, 50%, 0.8)" />
46
+ </g>
47
+ <g>
48
+ <circle data-type="point" data-label="C1.2
49
+ y-" data-x="0.22500000000000042" data-y="-4.105" cx="367.997860398542" cy="430.46599337368923" r="3" fill="hsl(122, 100%, 50%, 0.8)" />
50
+ </g>
51
+ <g>
52
+ <circle data-type="point" data-label="B1.1
53
+ y-" data-x="-2.5650000000000004" data-y="-2.505" cx="236.56923715223374" cy="355.09473989910384" r="3" fill="hsl(210, 100%, 50%, 0.8)" />
54
+ </g>
55
+ <g>
56
+ <circle data-type="point" data-label="B1.2
57
+ y+" data-x="-2.5650000000000004" data-y="-1.5549999999999997" cx="236.56923715223374" cy="310.3430581485688" r="3" fill="hsl(211, 100%, 50%, 0.8)" />
58
+ </g>
59
+ <g>
60
+ <circle data-type="point" data-label="R_SHUNT.1
61
+ x-" data-x="-3.96" data-y="0.03445534999999911" cx="170.85492552907965" cy="235.46853185395273" r="3" fill="hsl(44, 100%, 50%, 0.8)" />
62
+ </g>
63
+ <g>
64
+ <circle data-type="point" data-label="R_SHUNT.2
65
+ x+" data-x="-2.8599999999999994" data-y="0.03445534999999911" cx="222.6726622928571" cy="235.46853185395273" r="3" fill="hsl(45, 100%, 50%, 0.8)" />
66
+ </g>
67
+ <g>
68
+ <circle data-type="point" data-label="R_LOAD.1
69
+ y+" data-x="-4.32945535" data-y="-1.5599999999999996" cx="153.45098000883488" cy="310.5785933156768" r="3" fill="hsl(110, 100%, 50%, 0.8)" />
70
+ </g>
71
+ <g>
72
+ <circle data-type="point" data-label="R_LOAD.2
73
+ y-" data-x="-4.32945535" data-y="-2.66" cx="153.45098000883488" cy="362.3963300794543" r="3" fill="hsl(111, 100%, 50%, 0.8)" />
74
+ </g>
75
+ <g>
76
+ <circle data-type="point" data-label="CHARGER.1
77
+ y-" data-x="-6.323366049999999" data-y="-2.2738180812500004" cx="59.52376202421749" cy="344.2044455260743" r="3" fill="hsl(153, 100%, 50%, 0.8)" />
78
+ </g>
79
+ <g>
80
+ <circle data-type="point" data-label="CHARGER.2
81
+ y+" data-x="-6.333366049999999" data-y="-1.1938180812500003" cx="59.052691690001325" cy="293.3288494307292" r="3" fill="hsl(154, 100%, 50%, 0.8)" />
82
+ </g>
83
+ <g>
84
+ <circle data-type="point" data-label="R1.1
85
+ y+" data-x="0.4555446500000012" data-y="-5.315" cx="378.85813493126676" cy="487.4655038138444" r="3" fill="hsl(226, 100%, 50%, 0.8)" />
86
+ </g>
87
+ <g>
88
+ <circle data-type="point" data-label="R1.2
89
+ y-" data-x="0.455544650000001" data-y="-6.415" cx="378.85813493126676" cy="539.2832405776218" r="3" fill="hsl(227, 100%, 50%, 0.8)" />
90
+ </g>
91
+ <g>
92
+ <circle data-type="point" data-label="R2.1
93
+ y+" data-x="3.244455349999999" data-y="0.32499999999999984" cx="510.2354444860687" cy="221.781835315931" r="3" fill="hsl(107, 100%, 50%, 0.8)" />
94
+ </g>
95
+ <g>
96
+ <circle data-type="point" data-label="R2.2
97
+ y-" data-x="3.244455349999999" data-y="-0.7750000000000002" cx="510.2354444860687" cy="273.5995720797084" r="3" fill="hsl(108, 100%, 50%, 0.8)" />
98
+ </g>
99
+ <g>
100
+ <circle data-type="point" data-label="R3.1
101
+ y+" data-x="2.8394553499999997" data-y="2.7350000000000003" cx="491.15709595031433" cy="108.25388476983679" r="3" fill="hsl(348, 100%, 50%, 0.8)" />
102
+ </g>
103
+ <g>
104
+ <circle data-type="point" data-label="R3.2
105
+ y-" data-x="2.8394553499999997" data-y="1.6349999999999998" cx="491.15709595031433" cy="160.07162153361423" r="3" fill="hsl(349, 100%, 50%, 0.8)" />
106
+ </g>
107
+ <g>
108
+ <circle data-type="point" data-label="J1.1
109
+ x-" data-x="2.0500000000000003" data-y="-3.4050000000000002" cx="453.9681963929909" cy="397.49106997855813" r="3" fill="hsl(218, 100%, 50%, 0.8)" />
110
+ </g>
111
+ <g>
112
+ <circle data-type="point" data-label="J1.2
113
+ x-" data-x="2.0500000000000003" data-y="-3.605" cx="453.9681963929909" cy="406.91247666288126" r="3" fill="hsl(219, 100%, 50%, 0.8)" />
114
+ </g>
115
+ <g>
116
+ <circle data-type="point" data-label="J1.3
117
+ x-" data-x="2.0500000000000003" data-y="-4.055" cx="453.9681963929909" cy="428.1106417026084" r="3" fill="hsl(220, 100%, 50%, 0.8)" />
118
+ </g>
119
+ <g>
120
+ <circle data-type="point" data-label="J1.4
121
+ x-" data-x="2.0500000000000003" data-y="-4.255" cx="453.9681963929909" cy="437.5320483869316" r="3" fill="hsl(221, 100%, 50%, 0.8)" />
122
+ </g>
123
+ <g>
124
+ <circle data-type="point" data-label="anchorPoint
125
+ orientation: y+" data-x="1.8499999999999999" data-y="0.7749999999999999" cx="444.5467897086677" cy="200.58367027620386" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
126
+ </g>
127
+ <g>
128
+ <circle data-type="point" data-label="anchorPoint
129
+ orientation: y-" data-x="-1.751" data-y="-1.401" cx="274.91436235742907" cy="303.0885750016399" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
130
+ </g>
131
+ <g>
132
+ <circle data-type="point" data-label="anchorPoint
133
+ orientation: y-" data-x="1.1375000000000002" data-y="-4.255" cx="410.98302839576644" cy="437.5320483869316" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
134
+ </g>
135
+ <g>
136
+ <circle data-type="point" data-label="anchorPoint
137
+ orientation: y-" data-x="-6.323366049999999" data-y="-2.86" cx="59.52376202421749" cy="371.8177367637775" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
138
+ </g>
139
+ <g>
140
+ <circle data-type="point" data-label="anchorPoint
141
+ orientation: x-" data-x="1.85" data-y="-2.415" cx="444.5467897086677" cy="350.8551068911584" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
142
+ </g>
143
+ <g>
144
+ <circle data-type="point" data-label="anchorPoint
145
+ orientation: y-" data-x="2.8394553499999997" data-y="1.6349999999999998" cx="491.15709595031433" cy="160.07162153361423" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
146
+ </g>
147
+ <g>
148
+ <circle data-type="point" data-label="anchorPoint
149
+ orientation: x+" data-x="2.4472276749999997" data-y="-0.42499999999999993" cx="472.68041375520664" cy="257.1121103821429" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
150
+ </g>
151
+ <g>
152
+ <circle data-type="point" data-label="anchorPoint
153
+ orientation: x-" data-x="2.0500000000000003" data-y="-3.605" cx="453.9681963929909" cy="406.91247666288126" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
154
+ </g>
155
+ <g>
156
+ <circle data-type="point" data-label="anchorPoint
157
+ orientation: x+" data-x="1.65" data-y="-0.07499999999999996" cx="435.12538302434456" cy="240.62464868457732" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
158
+ </g>
159
+ <g>
160
+ <circle data-type="point" data-label="anchorPoint
161
+ orientation: x-" data-x="0.254544650000001" data-y="-6.516" cx="369.38962121352193" cy="544.0410509532051" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
162
+ </g>
163
+ <g>
164
+ <circle data-type="point" data-label="anchorPoint
165
+ orientation: x-" data-x="2.0500000000000003" data-y="-3.4050000000000002" cx="453.9681963929909" cy="397.49106997855813" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
166
+ </g>
167
+ <g>
168
+ <circle data-type="point" data-label="anchorPoint
169
+ orientation: y+" data-x="-1.8499999999999999" data-y="1.5999999999999999" cx="270.2507660486891" cy="161.7203677033708" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
170
+ </g>
171
+ <g>
172
+ <circle data-type="point" data-label="anchorPoint
173
+ orientation: y+" data-x="0.22500000000000064" data-y="-3.005" cx="367.997860398542" cy="378.64825660991175" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
174
+ </g>
175
+ <g>
176
+ <circle data-type="point" data-label="anchorPoint
177
+ orientation: y+" data-x="0.4555446500000012" data-y="-5.315" cx="378.85813493126676" cy="487.4655038138444" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
178
+ </g>
179
+ <g>
180
+ <circle data-type="point" data-label="anchorPoint
181
+ orientation: y+" data-x="2.8394553499999997" data-y="2.7350000000000003" cx="491.15709595031433" cy="108.25388476983679" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
182
+ </g>
183
+ <g>
184
+ <circle data-type="point" data-label="anchorPoint
185
+ orientation: x-" data-x="-2.5650000000000004" data-y="-1.1576361625" cx="236.56923715223374" cy="291.62442657491476" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
186
+ </g>
187
+ <g>
188
+ <circle data-type="point" data-label="anchorPoint
189
+ orientation: y+" data-x="-1.9525" data-y="-0.3500000000000001" cx="265.4222951229735" cy="253.5790828755217" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
190
+ </g>
191
+ <g>
192
+ <circle data-type="point" data-label="anchorPoint
193
+ orientation: x-" data-x="-4.32945535" data-y="-1.276909040625" cx="153.45098000883488" cy="297.24301803104146" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
194
+ </g>
195
+ <g>
196
+ <polyline data-points="1.65,0.42500000000000004 1.65,0.7749999999999999" data-type="line" data-label="" points="435.12538302434456,217.0711319737694 435.12538302434456,200.58367027620386" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
197
+ </g>
198
+ <g>
199
+ <polyline data-points="1.65,0.42500000000000004 -1.65,-0.7" data-type="line" data-label="" points="435.12538302434456,217.0711319737694 279.67217273301225,270.06654457308724" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
200
+ </g>
201
+ <g>
202
+ <polyline data-points="1.65,0.42500000000000004 0.22500000000000042,-4.105" data-type="line" data-label="" points="435.12538302434456,217.0711319737694 367.997860398542,430.46599337368923" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
203
+ </g>
204
+ <g>
205
+ <polyline data-points="1.65,0.42500000000000004 -2.5650000000000004,-2.505" data-type="line" data-label="" points="435.12538302434456,217.0711319737694 236.56923715223374,355.09473989910384" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
206
+ </g>
207
+ <g>
208
+ <polyline data-points="1.65,0.42500000000000004 -4.32945535,-2.66" data-type="line" data-label="" points="435.12538302434456,217.0711319737694 153.45098000883488,362.3963300794543" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
209
+ </g>
210
+ <g>
211
+ <polyline data-points="1.65,0.42500000000000004 -6.323366049999999,-2.2738180812500004" data-type="line" data-label="" points="435.12538302434456,217.0711319737694 59.52376202421749,344.2044455260743" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
212
+ </g>
213
+ <g>
214
+ <polyline data-points="1.65,0.42500000000000004 2.0500000000000003,-4.255" data-type="line" data-label="" points="435.12538302434456,217.0711319737694 453.9681963929909,437.5320483869316" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
215
+ </g>
216
+ <g>
217
+ <polyline data-points="1.65,0.7749999999999999 -1.65,-0.7" data-type="line" data-label="" points="435.12538302434456,200.58367027620386 279.67217273301225,270.06654457308724" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
218
+ </g>
219
+ <g>
220
+ <polyline data-points="1.65,0.7749999999999999 0.22500000000000042,-4.105" data-type="line" data-label="" points="435.12538302434456,200.58367027620386 367.997860398542,430.46599337368923" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
221
+ </g>
222
+ <g>
223
+ <polyline data-points="1.65,0.7749999999999999 -2.5650000000000004,-2.505" data-type="line" data-label="" points="435.12538302434456,200.58367027620386 236.56923715223374,355.09473989910384" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
224
+ </g>
225
+ <g>
226
+ <polyline data-points="1.65,0.7749999999999999 -4.32945535,-2.66" data-type="line" data-label="" points="435.12538302434456,200.58367027620386 153.45098000883488,362.3963300794543" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
227
+ </g>
228
+ <g>
229
+ <polyline data-points="1.65,0.7749999999999999 -6.323366049999999,-2.2738180812500004" data-type="line" data-label="" points="435.12538302434456,200.58367027620386 59.52376202421749,344.2044455260743" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
230
+ </g>
231
+ <g>
232
+ <polyline data-points="1.65,0.7749999999999999 2.0500000000000003,-4.255" data-type="line" data-label="" points="435.12538302434456,200.58367027620386 453.9681963929909,437.5320483869316" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
233
+ </g>
234
+ <g>
235
+ <polyline data-points="-1.65,-0.7 0.22500000000000042,-4.105" data-type="line" data-label="" points="279.67217273301225,270.06654457308724 367.997860398542,430.46599337368923" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
236
+ </g>
237
+ <g>
238
+ <polyline data-points="-1.65,-0.7 -2.5650000000000004,-2.505" data-type="line" data-label="" points="279.67217273301225,270.06654457308724 236.56923715223374,355.09473989910384" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
239
+ </g>
240
+ <g>
241
+ <polyline data-points="-1.65,-0.7 -4.32945535,-2.66" data-type="line" data-label="" points="279.67217273301225,270.06654457308724 153.45098000883488,362.3963300794543" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
242
+ </g>
243
+ <g>
244
+ <polyline data-points="-1.65,-0.7 -6.323366049999999,-2.2738180812500004" data-type="line" data-label="" points="279.67217273301225,270.06654457308724 59.52376202421749,344.2044455260743" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
245
+ </g>
246
+ <g>
247
+ <polyline data-points="-1.65,-0.7 2.0500000000000003,-4.255" data-type="line" data-label="" points="279.67217273301225,270.06654457308724 453.9681963929909,437.5320483869316" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
248
+ </g>
249
+ <g>
250
+ <polyline data-points="0.22500000000000042,-4.105 -2.5650000000000004,-2.505" data-type="line" data-label="" points="367.997860398542,430.46599337368923 236.56923715223374,355.09473989910384" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
251
+ </g>
252
+ <g>
253
+ <polyline data-points="0.22500000000000042,-4.105 -4.32945535,-2.66" data-type="line" data-label="" points="367.997860398542,430.46599337368923 153.45098000883488,362.3963300794543" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
254
+ </g>
255
+ <g>
256
+ <polyline data-points="0.22500000000000042,-4.105 -6.323366049999999,-2.2738180812500004" data-type="line" data-label="" points="367.997860398542,430.46599337368923 59.52376202421749,344.2044455260743" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
257
+ </g>
258
+ <g>
259
+ <polyline data-points="0.22500000000000042,-4.105 2.0500000000000003,-4.255" data-type="line" data-label="" points="367.997860398542,430.46599337368923 453.9681963929909,437.5320483869316" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
260
+ </g>
261
+ <g>
262
+ <polyline data-points="-2.5650000000000004,-2.505 -4.32945535,-2.66" data-type="line" data-label="" points="236.56923715223374,355.09473989910384 153.45098000883488,362.3963300794543" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
263
+ </g>
264
+ <g>
265
+ <polyline data-points="-2.5650000000000004,-2.505 -6.323366049999999,-2.2738180812500004" data-type="line" data-label="" points="236.56923715223374,355.09473989910384 59.52376202421749,344.2044455260743" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
266
+ </g>
267
+ <g>
268
+ <polyline data-points="-2.5650000000000004,-2.505 2.0500000000000003,-4.255" data-type="line" data-label="" points="236.56923715223374,355.09473989910384 453.9681963929909,437.5320483869316" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
269
+ </g>
270
+ <g>
271
+ <polyline data-points="-4.32945535,-2.66 -6.323366049999999,-2.2738180812500004" data-type="line" data-label="" points="153.45098000883488,362.3963300794543 59.52376202421749,344.2044455260743" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
272
+ </g>
273
+ <g>
274
+ <polyline data-points="-4.32945535,-2.66 2.0500000000000003,-4.255" data-type="line" data-label="" points="153.45098000883488,362.3963300794543 453.9681963929909,437.5320483869316" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
275
+ </g>
276
+ <g>
277
+ <polyline data-points="-6.323366049999999,-2.2738180812500004 2.0500000000000003,-4.255" data-type="line" data-label="" points="59.52376202421749,344.2044455260743 453.9681963929909,437.5320483869316" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
278
+ </g>
279
+ <g>
280
+ <polyline data-points="1.65,-0.7749999999999999 2.8394553499999997,1.6349999999999998" data-type="line" data-label="" points="435.12538302434456,273.5995720797084 491.15709595031433,160.07162153361423" fill="none" stroke="hsl(219, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
281
+ </g>
282
+ <g>
283
+ <polyline data-points="1.65,-0.7749999999999999 2.0500000000000003,-4.055" data-type="line" data-label="" points="435.12538302434456,273.5995720797084 453.9681963929909,428.1106417026084" fill="none" stroke="hsl(219, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
284
+ </g>
285
+ <g>
286
+ <polyline data-points="2.8394553499999997,1.6349999999999998 2.0500000000000003,-4.055" data-type="line" data-label="" points="491.15709595031433,160.07162153361423 453.9681963929909,428.1106417026084" fill="none" stroke="hsl(219, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
287
+ </g>
288
+ <g>
289
+ <polyline data-points="1.65,-0.42499999999999993 3.244455349999999,-0.7750000000000002" data-type="line" data-label="" points="435.12538302434456,257.1121103821429 510.2354444860687,273.5995720797084" fill="none" stroke="hsl(216, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
290
+ </g>
291
+ <g>
292
+ <polyline data-points="1.65,-0.42499999999999993 2.0500000000000003,-3.605" data-type="line" data-label="" points="435.12538302434456,257.1121103821429 453.9681963929909,406.91247666288126" fill="none" stroke="hsl(216, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
293
+ </g>
294
+ <g>
295
+ <polyline data-points="3.244455349999999,-0.7750000000000002 2.0500000000000003,-3.605" data-type="line" data-label="" points="510.2354444860687,273.5995720797084 453.9681963929909,406.91247666288126" fill="none" stroke="hsl(216, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
296
+ </g>
297
+ <g>
298
+ <polyline data-points="1.65,-0.07499999999999996 0.455544650000001,-6.415" data-type="line" data-label="" points="435.12538302434456,240.62464868457732 378.85813493126676,539.2832405776218" fill="none" stroke="hsl(196, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
299
+ </g>
300
+ <g>
301
+ <polyline data-points="1.65,-0.07499999999999996 2.0500000000000003,-3.4050000000000002" data-type="line" data-label="" points="435.12538302434456,240.62464868457732 453.9681963929909,397.49106997855813" fill="none" stroke="hsl(196, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
302
+ </g>
303
+ <g>
304
+ <polyline data-points="0.455544650000001,-6.415 2.0500000000000003,-3.4050000000000002" data-type="line" data-label="" points="378.85813493126676,539.2832405776218 453.9681963929909,397.49106997855813" fill="none" stroke="hsl(196, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
305
+ </g>
306
+ <g>
307
+ <polyline data-points="-1.65,0.7 0.22500000000000064,-3.005" data-type="line" data-label="" points="279.67217273301225,204.11669778282504 367.997860398542,378.64825660991175" fill="none" stroke="hsl(229, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
308
+ </g>
309
+ <g>
310
+ <polyline data-points="-1.65,0.7 0.4555446500000012,-5.315" data-type="line" data-label="" points="279.67217273301225,204.11669778282504 378.85813493126676,487.4655038138444" fill="none" stroke="hsl(229, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
311
+ </g>
312
+ <g>
313
+ <polyline data-points="-1.65,0.7 3.244455349999999,0.32499999999999984" data-type="line" data-label="" points="279.67217273301225,204.11669778282504 510.2354444860687,221.781835315931" fill="none" stroke="hsl(229, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
314
+ </g>
315
+ <g>
316
+ <polyline data-points="-1.65,0.7 2.8394553499999997,2.7350000000000003" data-type="line" data-label="" points="279.67217273301225,204.11669778282504 491.15709595031433,108.25388476983679" fill="none" stroke="hsl(229, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
317
+ </g>
318
+ <g>
319
+ <polyline data-points="0.22500000000000064,-3.005 0.4555446500000012,-5.315" data-type="line" data-label="" points="367.997860398542,378.64825660991175 378.85813493126676,487.4655038138444" fill="none" stroke="hsl(229, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
320
+ </g>
321
+ <g>
322
+ <polyline data-points="0.22500000000000064,-3.005 3.244455349999999,0.32499999999999984" data-type="line" data-label="" points="367.997860398542,378.64825660991175 510.2354444860687,221.781835315931" fill="none" stroke="hsl(229, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
323
+ </g>
324
+ <g>
325
+ <polyline data-points="0.22500000000000064,-3.005 2.8394553499999997,2.7350000000000003" data-type="line" data-label="" points="367.997860398542,378.64825660991175 491.15709595031433,108.25388476983679" fill="none" stroke="hsl(229, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
326
+ </g>
327
+ <g>
328
+ <polyline data-points="0.4555446500000012,-5.315 3.244455349999999,0.32499999999999984" data-type="line" data-label="" points="378.85813493126676,487.4655038138444 510.2354444860687,221.781835315931" fill="none" stroke="hsl(229, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
329
+ </g>
330
+ <g>
331
+ <polyline data-points="0.4555446500000012,-5.315 2.8394553499999997,2.7350000000000003" data-type="line" data-label="" points="378.85813493126676,487.4655038138444 491.15709595031433,108.25388476983679" fill="none" stroke="hsl(229, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
332
+ </g>
333
+ <g>
334
+ <polyline data-points="3.244455349999999,0.32499999999999984 2.8394553499999997,2.7350000000000003" data-type="line" data-label="" points="510.2354444860687,221.781835315931 491.15709595031433,108.25388476983679" fill="none" stroke="hsl(229, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
335
+ </g>
336
+ <g>
337
+ <polyline data-points="-1.65,0.35 -1.65,-1.1102230246251565e-16" data-type="line" data-label="" points="279.67217273301225,220.6041594803906 279.67217273301225,237.09162117795614" fill="none" stroke="hsl(17, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
338
+ </g>
339
+ <g>
340
+ <polyline data-points="-1.65,0.35 -2.5650000000000004,-1.5549999999999997" data-type="line" data-label="" points="279.67217273301225,220.6041594803906 236.56923715223374,310.3430581485688" fill="none" stroke="hsl(17, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
341
+ </g>
342
+ <g>
343
+ <polyline data-points="-1.65,0.35 -3.96,0.03445534999999911" data-type="line" data-label="" points="279.67217273301225,220.6041594803906 170.85492552907965,235.46853185395273" fill="none" stroke="hsl(17, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
344
+ </g>
345
+ <g>
346
+ <polyline data-points="-1.65,-1.1102230246251565e-16 -2.5650000000000004,-1.5549999999999997" data-type="line" data-label="" points="279.67217273301225,237.09162117795614 236.56923715223374,310.3430581485688" fill="none" stroke="hsl(17, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
347
+ </g>
348
+ <g>
349
+ <polyline data-points="-1.65,-1.1102230246251565e-16 -3.96,0.03445534999999911" data-type="line" data-label="" points="279.67217273301225,237.09162117795614 170.85492552907965,235.46853185395273" fill="none" stroke="hsl(17, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
350
+ </g>
351
+ <g>
352
+ <polyline data-points="-2.5650000000000004,-1.5549999999999997 -3.96,0.03445534999999911" data-type="line" data-label="" points="236.56923715223374,310.3430581485688 170.85492552907965,235.46853185395273" fill="none" stroke="hsl(17, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
353
+ </g>
354
+ <g>
355
+ <polyline data-points="-1.65,-0.3500000000000001 -2.8599999999999994,0.03445534999999911" data-type="line" data-label="" points="279.67217273301225,253.5790828755217 222.6726622928571,235.46853185395273" fill="none" stroke="hsl(320, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
356
+ </g>
357
+ <g>
358
+ <polyline data-points="-1.65,-0.3500000000000001 -4.32945535,-1.5599999999999996" data-type="line" data-label="" points="279.67217273301225,253.5790828755217 153.45098000883488,310.5785933156768" fill="none" stroke="hsl(320, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
359
+ </g>
360
+ <g>
361
+ <polyline data-points="-1.65,-0.3500000000000001 -6.333366049999999,-1.1938180812500003" data-type="line" data-label="" points="279.67217273301225,253.5790828755217 59.052691690001325,293.3288494307292" fill="none" stroke="hsl(320, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
362
+ </g>
363
+ <g>
364
+ <polyline data-points="-2.8599999999999994,0.03445534999999911 -4.32945535,-1.5599999999999996" data-type="line" data-label="" points="222.6726622928571,235.46853185395273 153.45098000883488,310.5785933156768" fill="none" stroke="hsl(320, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
365
+ </g>
366
+ <g>
367
+ <polyline data-points="-2.8599999999999994,0.03445534999999911 -6.333366049999999,-1.1938180812500003" data-type="line" data-label="" points="222.6726622928571,235.46853185395273 59.052691690001325,293.3288494307292" fill="none" stroke="hsl(320, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
368
+ </g>
369
+ <g>
370
+ <polyline data-points="-4.32945535,-1.5599999999999996 -6.333366049999999,-1.1938180812500003" data-type="line" data-label="" points="153.45098000883488,310.5785933156768 59.052691690001325,293.3288494307292" fill="none" stroke="hsl(320, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
371
+ </g>
372
+ <g>
373
+ <polyline data-points="-4.32945535,-2.66 -4.32945535,-2.8600000000000003 -2.5650000000000004,-2.8600000000000003 -2.5650000000000004,-2.505" data-type="line" data-label="" points="153.45098000883488,362.3963300794543 153.45098000883488,371.8177367637775 236.56923715223374,371.8177367637775 236.56923715223374,355.09473989910384" fill="none" stroke="purple" stroke-width="1" />
374
+ </g>
375
+ <g>
376
+ <polyline data-points="-6.323366049999999,-2.2738180812500004 -6.323366049999999,-2.86 -4.32945535,-2.86 -4.32945535,-2.6599999999999997" data-type="line" data-label="" points="59.52376202421749,344.2044455260743 59.52376202421749,371.8177367637775 153.45098000883488,371.8177367637775 153.45098000883488,362.3963300794543" fill="none" stroke="purple" stroke-width="1" />
377
+ </g>
378
+ <g>
379
+ <polyline data-points="2.05,-4.255 0.22500000000000042,-4.255 0.22500000000000042,-4.105" data-type="line" data-label="" points="453.9681963929909,437.5320483869316 367.997860398542,437.5320483869316 367.997860398542,430.46599337368923" fill="none" stroke="purple" stroke-width="1" />
380
+ </g>
381
+ <g>
382
+ <polyline data-points="1.65,0.7749999999999999 1.8499999999999999,0.7749999999999999 1.8499999999999999,0.42500000000000004 1.65,0.42500000000000004" data-type="line" data-label="" points="435.12538302434456,200.58367027620386 444.5467897086677,200.58367027620386 444.5467897086677,217.0711319737694 435.12538302434456,217.0711319737694" fill="none" stroke="purple" stroke-width="1" />
383
+ </g>
384
+ <g>
385
+ <polyline data-points="1.65,-0.42499999999999993 2.4472276749999997,-0.42499999999999993 2.4472276749999997,-0.9750000000000003 3.244455349999999,-0.9750000000000003 3.244455349999999,-0.7750000000000002" data-type="line" data-label="" points="435.12538302434456,257.1121103821429 472.68041375520664,257.1121103821429 472.68041375520664,283.0209787640316 510.2354444860687,283.0209787640316 510.2354444860687,273.5995720797084" fill="none" stroke="purple" stroke-width="1" />
386
+ </g>
387
+ <g>
388
+ <polyline data-points="-1.65,0.35 -1.8499999999999999,0.35 -1.8499999999999999,-1.1102230246251565e-16 -1.65,-1.1102230246251565e-16" data-type="line" data-label="" points="279.67217273301225,220.6041594803906 270.2507660486891,220.6041594803906 270.2507660486891,237.09162117795614 279.67217273301225,237.09162117795614" fill="none" stroke="purple" stroke-width="1" />
389
+ </g>
390
+ <g>
391
+ <polyline data-points="-4.32945535,-1.56 -4.32945535,-0.9938180812500002 -6.333366049999999,-0.9938180812500002 -6.333366049999999,-1.1938180812500003" data-type="line" data-label="" points="153.45098000883488,310.57859331567687 153.45098000883488,283.90744274640605 59.052691690001325,283.90744274640605 59.052691690001325,293.3288494307292" fill="none" stroke="purple" stroke-width="1" />
392
+ </g>
393
+ <g>
394
+ <polyline data-points="-1.65,-0.3500000000000001 -2.255,-0.3500000000000001 -2.255,0.03445534999999911 -2.8599999999999994,0.03445534999999911" data-type="line" data-label="" points="279.67217273301225,253.5790828755217 251.17241751293466,253.5790828755217 251.17241751293466,235.46853185395273 222.6726622928571,235.46853185395273" fill="none" stroke="purple" stroke-width="1" />
395
+ </g>
396
+ <g>
397
+ <polyline data-points="-2.5650000000000004,-1.5549999999999997 -2.5650000000000004,-0.7602723250000003 -4.16,-0.7602723250000003 -4.16,0.03445534999999911 -3.96,0.03445534999999911" data-type="line" data-label="" points="236.56923715223374,310.3430581485688 236.56923715223374,272.90579500126074 161.43351884475646,272.90579500126074 161.43351884475646,235.46853185395273 170.85492552907965,235.46853185395273" fill="none" stroke="purple" stroke-width="1" />
398
+ </g>
399
+ <g>
400
+ <polyline data-points="1.65,-0.7749999999999999 1.85,-0.7749999999999999 1.85,-3.2049999999999996 1.4690000000000003,-3.2049999999999996 1.4690000000000003,-3.805 1.8500000000000003,-3.805 1.8500000000000003,-4.055 2.0500000000000003,-4.055" data-type="line" data-label="" points="435.12538302434456,273.5995720797084 444.5467897086677,273.5995720797084 444.5467897086677,388.06966329423494 426.5990099750321,388.06966329423494 426.5990099750321,416.33388334720445 444.54678970866775,416.33388334720445 444.54678970866775,428.1106417026084 453.9681963929909,428.1106417026084" fill="none" stroke="purple" stroke-width="1" />
401
+ </g>
402
+ <g>
403
+ <polyline data-points="-1.65,0.7 -1.8499999999999999,0.7 -1.8499999999999999,1.5999999999999999 2.6394553499999995,1.5999999999999999 2.6394553499999995,0.574 3.2444553499999995,0.574 3.2444553499999995,0.32499999999999984" data-type="line" data-label="" points="279.67217273301225,204.11669778282504 270.2507660486891,204.11669778282504 270.2507660486891,161.7203677033708 481.73568926599114,161.7203677033708 481.73568926599114,210.05218399394866 510.23544448606873,210.05218399394866 510.23544448606873,221.781835315931" fill="none" stroke="purple" stroke-width="1" />
404
+ </g>
405
+ <g>
406
+ <polyline data-points="-1.65,-0.7 -1.751,-0.7 -1.751,-1.401" data-type="line" data-label="" points="279.67217273301225,270.06654457308724 274.91436235742907,270.06654457308724 274.91436235742907,303.0885750016399" fill="none" stroke="purple" stroke-width="1" />
407
+ </g>
408
+ <g>
409
+ <polyline data-points="0.455544650000001,-6.415 0.455544650000001,-6.516 0.254544650000001,-6.516" data-type="line" data-label="" points="378.85813493126676,539.2832405776218 378.85813493126676,544.0410509532051 369.38962121352193,544.0410509532051" fill="none" stroke="purple" stroke-width="1" />
410
+ </g>
411
+ <g>
412
+ <rect data-type="rect" data-label="schematic_component_0" data-x="0" data-y="0" x="279.67217273301225" y="171.14177438769394" width="155.4532102913323" height="131.8996935805244" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.021228252499999996" />
413
+ </g>
414
+ <g>
415
+ <rect data-type="rect" data-label="schematic_component_1" data-x="0.42250000000000054" data-y="-3.555" x="348.21290636146335" y="378.64825660991175" width="58.17718627569553" height="51.817736763777475" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.021228252499999996" />
416
+ </g>
417
+ <g>
418
+ <rect data-type="rect" data-label="schematic_component_2" data-x="-2.595" data-y="-2.03" x="228.32550630345096" y="310.3430581485688" width="13.661039692268588" height="44.751681750535056" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.021228252499999996" />
419
+ </g>
420
+ <g>
421
+ <rect data-type="rect" data-label="schematic_component_3" data-x="-3.4099999999999997" data-y="0.03445534999999911" x="170.85492552907965" y="217.12244566527565" width="51.81773676377745" height="36.692172377354126" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.021228252499999996" />
422
+ </g>
423
+ <g>
424
+ <rect data-type="rect" data-label="schematic_component_4" data-x="-3.91695535" data-y="-2.11" x="144.2907653373729" y="310.5785933156768" width="57.18373191575702" height="51.817736763777475" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.021228252499999996" />
425
+ </g>
426
+ <g>
427
+ <rect data-type="rect" data-label="schematic_component_5" data-x="-6.328366049999999" data-y="-1.7338180812500004" x="40.00000000000006" y="293.3288494307292" width="38.5764537142187" height="50.875596095345145" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.021228252499999996" />
428
+ </g>
429
+ <g>
430
+ <rect data-type="rect" data-label="schematic_component_6" data-x="0.7480446500000012" data-y="-5.865" x="369.6979202598048" y="487.4655038138444" width="45.8780438945692" height="51.81773676377736" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.021228252499999996" />
431
+ </g>
432
+ <g>
433
+ <rect data-type="rect" data-label="schematic_component_7" data-x="3.5369553499999986" data-y="-0.2250000000000002" x="501.0752298146067" y="221.781835315931" width="45.87804389456926" height="51.81773676377742" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.021228252499999996" />
434
+ </g>
435
+ <g>
436
+ <rect data-type="rect" data-label="schematic_component_8" data-x="3.1319553499999997" data-y="2.185" x="481.9968812788523" y="108.25388476983679" width="45.878043894569316" height="51.81773676377745" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.021228252499999996" />
437
+ </g>
438
+ <g>
439
+ <rect data-type="rect" data-label="schematic_component_9" data-x="3.6" data-y="-3.83" x="453.9681963929909" y="349.20636072140184" width="146.03180360700912" height="136.610396922686" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.021228252499999996" />
440
+ </g>
441
+ <g>
442
+ <rect data-type="rect" data-label="netId: GND
443
+ globalConnNetId: connectivity_net0" data-x="1.8499999999999999" data-y="1.0151" x="439.83608636650615" y="177.9675835304861" width="9.42140668432313" height="22.61137604237561" fill="#00000066" stroke="#000000" stroke-width="0.021228252499999996" />
444
+ </g>
445
+ <g>
446
+ <rect data-type="rect" data-label="netId: GND
447
+ globalConnNetId: connectivity_net0" data-x="-1.751" data-y="-1.641" x="270.2036590152675" y="303.0885750016399" width="9.421406684323188" height="22.61137604237564" fill="#00000066" stroke="#000000" stroke-width="0.021228252499999996" />
448
+ </g>
449
+ <g>
450
+ <rect data-type="rect" data-label="netId: GND
451
+ globalConnNetId: connectivity_net0" data-x="1.1375000000000002" data-y="-4.495" x="406.27232505360485" y="437.5320483869316" width="9.421406684323188" height="22.611376042375582" fill="#00000066" stroke="#000000" stroke-width="0.021228252499999996" />
452
+ </g>
453
+ <g>
454
+ <rect data-type="rect" data-label="netId: GND
455
+ globalConnNetId: connectivity_net0" data-x="-6.323366049999999" data-y="-3.0999999999999996" x="54.813058682055896" y="371.8177367637775" width="9.42140668432313" height="22.611376042375582" fill="#00000066" stroke="#000000" stroke-width="0.021228252499999996" />
456
+ </g>
457
+ <g>
458
+ <rect data-type="rect" data-label="netId: N_ALERT
459
+ globalConnNetId: connectivity_net1" data-x="1.37" data-y="-2.415" x="399.3240376239165" y="346.1444035489968" width="45.222752084751164" height="9.421406684323188" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.021228252499999996" />
460
+ </g>
461
+ <g>
462
+ <rect data-type="rect" data-label="netId: N_ALERT
463
+ globalConnNetId: connectivity_net1" data-x="2.8394553499999997" data-y="1.154" x="486.4463926081527" y="160.11872856703587" width="9.421406684323188" height="45.22275208475119" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.021228252499999996" />
464
+ </g>
465
+ <g>
466
+ <rect data-type="rect" data-label="netId: SDA
467
+ globalConnNetId: connectivity_net2" data-x="2.687227675" data-y="-0.42499999999999993" x="472.68041375520664" y="252.40140703998128" width="22.61137604237564" height="9.421406684323188" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.021228252499999996" />
468
+ </g>
469
+ <g>
470
+ <rect data-type="rect" data-label="netId: SDA
471
+ globalConnNetId: connectivity_net2" data-x="1.8090000000000004" data-y="-3.605" x="431.30971331719365" y="402.20177332071967" width="22.61137604237564" height="9.421406684323188" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.021228252499999996" />
472
+ </g>
473
+ <g>
474
+ <rect data-type="rect" data-label="netId: SCL
475
+ globalConnNetId: connectivity_net3" data-x="1.8909999999999998" data-y="-0.07499999999999996" x="435.17249005776614" y="235.91394534241573" width="22.61137604237564" height="9.421406684323188" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.021228252499999996" />
476
+ </g>
477
+ <g>
478
+ <rect data-type="rect" data-label="netId: SCL
479
+ globalConnNetId: connectivity_net3" data-x="0.014544650000000992" data-y="-6.516" x="346.77824517114635" y="539.3303476110434" width="22.611376042375582" height="9.421406684323074" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.021228252499999996" />
480
+ </g>
481
+ <g>
482
+ <rect data-type="rect" data-label="netId: SCL
483
+ globalConnNetId: connectivity_net3" data-x="1.8090000000000004" data-y="-3.4050000000000002" x="431.30971331719365" y="392.7803666363965" width="22.61137604237564" height="9.421406684323188" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.021228252499999996" />
484
+ </g>
485
+ <g>
486
+ <rect data-type="rect" data-label="netId: VS
487
+ globalConnNetId: connectivity_net4" data-x="-1.8499999999999999" data-y="1.7799999999999998" x="265.5400627065275" y="144.7618356715891" width="9.42140668432313" height="16.958532031781715" fill="#ef444466" stroke="#ef4444" stroke-width="0.021228252499999996" />
488
+ </g>
489
+ <g>
490
+ <rect data-type="rect" data-label="netId: VS
491
+ globalConnNetId: connectivity_net4" data-x="0.22500000000000064" data-y="-2.824" x="363.2871570563804" y="361.6426175447084" width="9.421406684323188" height="16.958532031781715" fill="#ef444466" stroke="#ef4444" stroke-width="0.021228252499999996" />
492
+ </g>
493
+ <g>
494
+ <rect data-type="rect" data-label="netId: VS
495
+ globalConnNetId: connectivity_net4" data-x="0.4555446500000012" data-y="-5.134" x="374.14743158910517" y="470.45986474864105" width="9.421406684323188" height="16.958532031781715" fill="#ef444466" stroke="#ef4444" stroke-width="0.021228252499999996" />
496
+ </g>
497
+ <g>
498
+ <rect data-type="rect" data-label="netId: VS
499
+ globalConnNetId: connectivity_net4" data-x="2.8394553499999997" data-y="2.9160000000000004" x="486.4463926081527" y="91.24824570463346" width="9.421406684323188" height="16.958532031781715" fill="#ef444466" stroke="#ef4444" stroke-width="0.021228252499999996" />
500
+ </g>
501
+ <g>
502
+ <rect data-type="rect" data-label="netId: BUS_HIGH
503
+ globalConnNetId: connectivity_net5" data-x="-3.1050000000000004" data-y="-1.1576361625" x="185.69364105688862" y="286.91372323275317" width="50.87559609534512" height="9.421406684323188" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.021228252499999996" />
504
+ </g>
505
+ <g>
506
+ <rect data-type="rect" data-label="netId: LOAD_CHARGER
507
+ globalConnNetId: connectivity_net6" data-x="-1.9525" data-y="0.42999999999999994" x="260.7115917808119" y="180.09211073780097" width="9.421406684323188" height="73.48697213772073" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.021228252499999996" />
508
+ </g>
509
+ <g>
510
+ <rect data-type="rect" data-label="netId: LOAD_CHARGER
511
+ globalConnNetId: connectivity_net6" data-x="-5.10945535" data-y="-1.276909040625" x="79.96400787111412" y="292.53231468887986" width="73.48697213772076" height="9.421406684323188" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.021228252499999996" />
512
+ </g>
513
+ <g id="crosshair" style="display: none">
514
+ <line id="crosshair-h" y1="0" y2="640" stroke="#666" stroke-width="0.5" />
515
+ <line id="crosshair-v" x1="0" x2="640" stroke="#666" stroke-width="0.5" /><text id="coordinates" font-family="monospace" font-size="12" fill="#666"></text>
516
+ </g>
517
+ <script>
518
+ <![CDATA[
519
+ document.currentScript.parentElement.addEventListener('mousemove', (e) => {
520
+ const svg = e.currentTarget;
521
+ const rect = svg.getBoundingClientRect();
522
+ const x = e.clientX - rect.left;
523
+ const y = e.clientY - rect.top;
524
+ const crosshair = svg.getElementById('crosshair');
525
+ const h = svg.getElementById('crosshair-h');
526
+ const v = svg.getElementById('crosshair-v');
527
+ const coords = svg.getElementById('coordinates');
528
+
529
+ crosshair.style.display = 'block';
530
+ h.setAttribute('x1', '0');
531
+ h.setAttribute('x2', '640');
532
+ h.setAttribute('y1', y);
533
+ h.setAttribute('y2', y);
534
+ v.setAttribute('x1', x);
535
+ v.setAttribute('x2', x);
536
+ v.setAttribute('y1', '0');
537
+ v.setAttribute('y2', '640');
538
+
539
+ // Calculate real coordinates using inverse transformation
540
+ const matrix = {
541
+ "a": 47.107033421615846,
542
+ "c": 0,
543
+ "e": 357.3987778786784,
544
+ "b": 0,
545
+ "d": -47.107033421615846,
546
+ "f": 237.09162117795614
547
+ };
548
+ // Manually invert and apply the affine transform
549
+ // Since we only use translate and scale, we can directly compute:
550
+ // x' = (x - tx) / sx
551
+ // y' = (y - ty) / sy
552
+ const sx = matrix.a;
553
+ const sy = matrix.d;
554
+ const tx = matrix.e;
555
+ const ty = matrix.f;
556
+ const realPoint = {
557
+ x: (x - tx) / sx,
558
+ y: (y - ty) / sy // Flip y back since we used negative scale
559
+ }
560
+
561
+ coords.textContent = `(${realPoint.x.toFixed(2)}, ${realPoint.y.toFixed(2)})`;
562
+ coords.setAttribute('x', (x + 5).toString());
563
+ coords.setAttribute('y', (y - 5).toString());
564
+ });
565
+ document.currentScript.parentElement.addEventListener('mouseleave', () => {
566
+ document.currentScript.parentElement.getElementById('crosshair').style.display = 'none';
567
+ });
568
+ ]]>
569
+ </script>
570
+ </svg>
@@ -0,0 +1,321 @@
1
+ {
2
+ "chips": [
3
+ {
4
+ "chipId": "schematic_component_0",
5
+ "center": {
6
+ "x": 0,
7
+ "y": 0
8
+ },
9
+ "width": 2.5,
10
+ "height": 2.8,
11
+ "pins": [
12
+ {
13
+ "pinId": "U1.1",
14
+ "x": 1.65,
15
+ "y": 0.42500000000000004
16
+ },
17
+ {
18
+ "pinId": "U1.2",
19
+ "x": 1.65,
20
+ "y": 0.7749999999999999
21
+ },
22
+ {
23
+ "pinId": "U1.3",
24
+ "x": 1.65,
25
+ "y": -0.7749999999999999
26
+ },
27
+ {
28
+ "pinId": "U1.4",
29
+ "x": 1.65,
30
+ "y": -0.42499999999999993
31
+ },
32
+ {
33
+ "pinId": "U1.5",
34
+ "x": 1.65,
35
+ "y": -0.07499999999999996
36
+ },
37
+ {
38
+ "pinId": "U1.6",
39
+ "x": -1.65,
40
+ "y": 0.7
41
+ },
42
+ {
43
+ "pinId": "U1.7",
44
+ "x": -1.65,
45
+ "y": -0.7
46
+ },
47
+ {
48
+ "pinId": "U1.8",
49
+ "x": -1.65,
50
+ "y": 0.35
51
+ },
52
+ {
53
+ "pinId": "U1.9",
54
+ "x": -1.65,
55
+ "y": -0.3500000000000001
56
+ },
57
+ {
58
+ "pinId": "U1.10",
59
+ "x": -1.65,
60
+ "y": -1.1102230246251565e-16
61
+ }
62
+ ]
63
+ },
64
+ {
65
+ "chipId": "schematic_component_1",
66
+ "center": {
67
+ "x": 0.42250000000000054,
68
+ "y": -3.555
69
+ },
70
+ "width": 1.2349999999999999,
71
+ "height": 1.1000000000000005,
72
+ "pins": [
73
+ {
74
+ "pinId": "C1.1",
75
+ "x": 0.22500000000000064,
76
+ "y": -3.005
77
+ },
78
+ {
79
+ "pinId": "C1.2",
80
+ "x": 0.22500000000000042,
81
+ "y": -4.105
82
+ }
83
+ ]
84
+ },
85
+ {
86
+ "chipId": "schematic_component_2",
87
+ "center": {
88
+ "x": -2.595,
89
+ "y": -2.03
90
+ },
91
+ "width": 0.29000000000000004,
92
+ "height": 0.9500000000000002,
93
+ "pins": [
94
+ {
95
+ "pinId": "B1.1",
96
+ "x": -2.5650000000000004,
97
+ "y": -2.48
98
+ },
99
+ {
100
+ "pinId": "B1.2",
101
+ "x": -2.5650000000000004,
102
+ "y": -1.5799999999999996
103
+ }
104
+ ]
105
+ },
106
+ {
107
+ "chipId": "schematic_component_3",
108
+ "center": {
109
+ "x": -3.4099999999999997,
110
+ "y": 0.03445534999999911
111
+ },
112
+ "width": 1.1000000000000005,
113
+ "height": 0.778910699999999,
114
+ "pins": [
115
+ {
116
+ "pinId": "R_SHUNT.1",
117
+ "x": -3.96,
118
+ "y": 0.03445534999999911
119
+ },
120
+ {
121
+ "pinId": "R_SHUNT.2",
122
+ "x": -2.8599999999999994,
123
+ "y": 0.03445534999999911
124
+ }
125
+ ]
126
+ },
127
+ {
128
+ "chipId": "schematic_component_4",
129
+ "center": {
130
+ "x": -3.91695535,
131
+ "y": -2.11
132
+ },
133
+ "width": 1.2139106999999987,
134
+ "height": 1.1000000000000003,
135
+ "pins": [
136
+ {
137
+ "pinId": "R_LOAD.1",
138
+ "x": -4.32945535,
139
+ "y": -1.56
140
+ },
141
+ {
142
+ "pinId": "R_LOAD.2",
143
+ "x": -4.32945535,
144
+ "y": -2.6599999999999997
145
+ }
146
+ ]
147
+ },
148
+ {
149
+ "chipId": "schematic_component_5",
150
+ "center": {
151
+ "x": -6.328366049999999,
152
+ "y": -1.7338180812500004
153
+ },
154
+ "width": 0.8189106999999982,
155
+ "height": 1.08,
156
+ "pins": [
157
+ {
158
+ "pinId": "CHARGER.1",
159
+ "x": -6.323366049999999,
160
+ "y": -2.2738180812500004
161
+ },
162
+ {
163
+ "pinId": "CHARGER.2",
164
+ "x": -6.333366049999999,
165
+ "y": -1.1938180812500003
166
+ }
167
+ ]
168
+ },
169
+ {
170
+ "chipId": "schematic_component_6",
171
+ "center": {
172
+ "x": 0.7480446500000012,
173
+ "y": -5.865
174
+ },
175
+ "width": 0.9739106999999991,
176
+ "height": 1.0999999999999996,
177
+ "pins": [
178
+ {
179
+ "pinId": "R1.1",
180
+ "x": 0.4555446500000012,
181
+ "y": -5.315
182
+ },
183
+ {
184
+ "pinId": "R1.2",
185
+ "x": 0.455544650000001,
186
+ "y": -6.415
187
+ }
188
+ ]
189
+ },
190
+ {
191
+ "chipId": "schematic_component_7",
192
+ "center": {
193
+ "x": 3.5369553499999986,
194
+ "y": -0.2250000000000002
195
+ },
196
+ "width": 0.9739106999999989,
197
+ "height": 1.1,
198
+ "pins": [
199
+ {
200
+ "pinId": "R2.1",
201
+ "x": 3.244455349999999,
202
+ "y": 0.3249999999999996
203
+ },
204
+ {
205
+ "pinId": "R2.2",
206
+ "x": 3.244455349999999,
207
+ "y": -0.775
208
+ }
209
+ ]
210
+ },
211
+ {
212
+ "chipId": "schematic_component_8",
213
+ "center": {
214
+ "x": 3.1319553499999997,
215
+ "y": 2.185
216
+ },
217
+ "width": 0.9739106999999994,
218
+ "height": 1.1000000000000003,
219
+ "pins": [
220
+ {
221
+ "pinId": "R3.1",
222
+ "x": 2.8394553499999997,
223
+ "y": 2.735
224
+ },
225
+ {
226
+ "pinId": "R3.2",
227
+ "x": 2.8394553499999997,
228
+ "y": 1.6350000000000002
229
+ }
230
+ ]
231
+ },
232
+ {
233
+ "chipId": "schematic_component_9",
234
+ "center": {
235
+ "x": 3.6,
236
+ "y": -3.83
237
+ },
238
+ "width": 2.3,
239
+ "height": 2.9000000000000004,
240
+ "pins": [
241
+ {
242
+ "pinId": "J1.1",
243
+ "x": 2.0500000000000003,
244
+ "y": -3.4050000000000002
245
+ },
246
+ {
247
+ "pinId": "J1.2",
248
+ "x": 2.0500000000000003,
249
+ "y": -3.605
250
+ },
251
+ {
252
+ "pinId": "J1.3",
253
+ "x": 2.0500000000000003,
254
+ "y": -4.055
255
+ },
256
+ {
257
+ "pinId": "J1.4",
258
+ "x": 2.0500000000000003,
259
+ "y": -4.255
260
+ }
261
+ ]
262
+ }
263
+ ],
264
+ "directConnections": [],
265
+ "netConnections": [
266
+ {
267
+ "netId": "GND",
268
+ "pinIds": [
269
+ "U1.1",
270
+ "U1.2",
271
+ "U1.7",
272
+ "C1.2",
273
+ "B1.1",
274
+ "R_LOAD.2",
275
+ "CHARGER.1",
276
+ "J1.4"
277
+ ],
278
+ "netLabelWidth": 0.48
279
+ },
280
+ {
281
+ "netId": "N_ALERT",
282
+ "pinIds": ["U1.3", "R3.2", "J1.3"],
283
+ "netLabelWidth": 0.96
284
+ },
285
+ {
286
+ "netId": "SDA",
287
+ "pinIds": ["U1.4", "R2.2", "J1.2"],
288
+ "netLabelWidth": 0.48
289
+ },
290
+ {
291
+ "netId": "SCL",
292
+ "pinIds": ["U1.5", "R1.2", "J1.1"],
293
+ "netLabelWidth": 0.48
294
+ },
295
+ {
296
+ "netId": "VS",
297
+ "pinIds": ["U1.6", "C1.1", "R1.1", "R2.1", "R3.1"],
298
+ "netLabelWidth": 0.36
299
+ },
300
+ {
301
+ "netId": "BUS_HIGH",
302
+ "pinIds": ["U1.8", "U1.10", "B1.2", "R_SHUNT.1"],
303
+ "netLabelWidth": 1.08
304
+ },
305
+ {
306
+ "netId": "LOAD_CHARGER",
307
+ "pinIds": ["U1.9", "R_SHUNT.2", "R_LOAD.1", "CHARGER.2"],
308
+ "netLabelWidth": 1.56
309
+ }
310
+ ],
311
+ "availableNetLabelOrientations": {
312
+ "VS": ["y+"],
313
+ "BUS_HIGH": ["x-", "x+"],
314
+ "LOAD_CHARGER": ["x-", "x+"],
315
+ "GND": ["y-"],
316
+ "SCL": ["x-", "x+"],
317
+ "SDA": ["x-", "x+"],
318
+ "N_ALERT": ["x-", "x+"]
319
+ },
320
+ "maxMspPairDistance": 2.4
321
+ }
@@ -0,0 +1,19 @@
1
+ import { expect, test } from "bun:test"
2
+ import { SchematicTracePipelineSolver } from "lib/solvers/SchematicTracePipelineSolver/SchematicTracePipelineSolver"
3
+ import inputProblem from "./assets/repro-ina237-current-monitor.input.json"
4
+ import "tests/fixtures/matcher"
5
+
6
+ // InputProblem extracted from a tscircuit circuit: an INA237AQDGSRQ1 current/
7
+ // power monitor (U1) sensing across a 0.001Ω shunt (R_SHUNT) in the
8
+ // BUS_HIGH/LOAD_CHARGER path, with a 48V battery (B1), a 12V charger source
9
+ // (CHARGER), a load resistor (R_LOAD), I2C pull-ups (R1/R2/R3 to VS), a VS
10
+ // decoupling cap (C1) and an MCU I2C connector (J1). VS/SCL/SDA/N_ALERT/GND etc.
11
+ // break out to net labels. Generated by rendering the circuit in @tscircuit/core
12
+ // with DEBUG=Group_doInitialSchematicTraceRender and copying the emitted
13
+ // "group-trace-render-input-problem" output.
14
+ test("repro ina237 current monitor", () => {
15
+ const solver = new SchematicTracePipelineSolver(inputProblem as any)
16
+ solver.solve()
17
+
18
+ expect(solver).toMatchSolverSnapshot(import.meta.path)
19
+ })