@tscircuit/schematic-trace-solver 0.0.52 → 0.0.53

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 (29) hide show
  1. package/dist/index.d.ts +0 -3
  2. package/dist/index.js +135 -156
  3. package/lib/solvers/AvailableNetOrientationSolver/AvailableNetOrientationSolver.ts +3 -39
  4. package/lib/solvers/SchematicTracePipelineSolver/SchematicTracePipelineSolver.ts +2 -0
  5. package/lib/solvers/SchematicTracePipelineSolver/colorAvailableNetOrientationLabels.ts +54 -0
  6. package/lib/solvers/TraceAnchoredNetLabelOverlapSolver/TraceAnchoredNetLabelOverlapSolver.ts +6 -6
  7. package/lib/solvers/TraceAnchoredNetLabelOverlapSolver/candidates.ts +63 -105
  8. package/lib/solvers/TraceAnchoredNetLabelOverlapSolver/geometry.ts +4 -0
  9. package/lib/solvers/TraceAnchoredNetLabelOverlapSolver/visualize.ts +38 -4
  10. package/package.json +1 -1
  11. package/tests/assets/example30.json +4 -1
  12. package/tests/examples/__snapshots__/example01.snap.svg +6 -3
  13. package/tests/examples/__snapshots__/example02.snap.svg +8 -4
  14. package/tests/examples/__snapshots__/example04.snap.svg +4 -2
  15. package/tests/examples/__snapshots__/example07.snap.svg +10 -5
  16. package/tests/examples/__snapshots__/example12.snap.svg +8 -4
  17. package/tests/examples/__snapshots__/example13.snap.svg +16 -8
  18. package/tests/examples/__snapshots__/example14.snap.svg +16 -8
  19. package/tests/examples/__snapshots__/example15.snap.svg +18 -9
  20. package/tests/examples/__snapshots__/example16.snap.svg +8 -4
  21. package/tests/examples/__snapshots__/example17.snap.svg +9 -5
  22. package/tests/examples/__snapshots__/example18.snap.svg +10 -5
  23. package/tests/examples/__snapshots__/example20.snap.svg +6 -3
  24. package/tests/examples/__snapshots__/example21.snap.svg +17 -12
  25. package/tests/examples/__snapshots__/example22.snap.svg +8 -4
  26. package/tests/examples/__snapshots__/example25.snap.svg +18 -9
  27. package/tests/examples/__snapshots__/example30.snap.svg +74 -62
  28. package/tests/examples/__snapshots__/example31.snap.svg +2 -1
  29. package/tests/fixtures/matcher.ts +21 -0
@@ -10,7 +10,6 @@ import {
10
10
  EPS,
11
11
  getManhattanDistance,
12
12
  getPointAtTraceDistance,
13
- getTraceDistanceCompatibleOrientations,
14
13
  getTraceLength,
15
14
  getTraceVertexDistances,
16
15
  } from "./geometry"
@@ -27,10 +26,8 @@ export const generateCandidatesAlongTrace = (params: {
27
26
  const traceLength = getTraceLength(traceLocation.trace)
28
27
  const orientationConstraint = getOrientationConstraint(inputProblem, label)
29
28
  const candidateDistances = getCandidateDistances(
30
- traceLocation,
31
29
  traceLength,
32
30
  getTraceVertexDistances(traceLocation.trace),
33
- orientationConstraint,
34
31
  )
35
32
  const netLabelWidth = getNetLabelWidth(inputProblem, label)
36
33
  const candidates: LabelCandidate[] = []
@@ -38,15 +35,10 @@ export const generateCandidatesAlongTrace = (params: {
38
35
 
39
36
  for (const pathDistance of candidateDistances) {
40
37
  const point = getPointAtTraceDistance(traceLocation.trace, pathDistance)
41
- const compatibleOrientations = getTraceDistanceCompatibleOrientations(
42
- traceLocation.trace,
43
- pathDistance,
44
- )
45
38
  const orientations = getOrientationsForPoint({
46
39
  inputProblem,
47
40
  label,
48
41
  point,
49
- compatibleOrientations,
50
42
  orientationConstraint,
51
43
  })
52
44
 
@@ -71,18 +63,12 @@ export const generateCandidatesAlongTrace = (params: {
71
63
  }
72
64
  }
73
65
 
74
- return candidates.sort(
75
- (a, b) =>
76
- a.distanceFromOriginal - b.distanceFromOriginal ||
77
- a.pathDistance - b.pathDistance,
78
- )
66
+ return candidates
79
67
  }
80
68
 
81
69
  const getCandidateDistances = (
82
- traceLocation: TraceLocation,
83
70
  traceLength: number,
84
71
  vertexDistances: number[],
85
- orientationConstraint: FacingDirection[] | null,
86
72
  ) => {
87
73
  const distances = new Set<number>()
88
74
  const maxSteps = Math.ceil(traceLength / CANDIDATE_STEP)
@@ -94,50 +80,28 @@ const getCandidateDistances = (
94
80
  for (const distance of vertexDistances) {
95
81
  distances.add(roundDistance(distance))
96
82
  }
97
- distances.add(roundDistance(traceLocation.distance))
98
83
 
99
84
  return [...distances]
100
85
  .filter((distance) => distance >= -EPS && distance <= traceLength + EPS)
101
- .filter((distance) =>
102
- isDistanceAllowedByOrientationConstraint(
103
- traceLocation,
104
- distance,
105
- orientationConstraint,
106
- ),
107
- )
108
- .sort(
109
- (a, b) =>
110
- Math.abs(a - traceLocation.distance) -
111
- Math.abs(b - traceLocation.distance) || a - b,
112
- )
86
+ .sort((a, b) => a - b)
113
87
  }
114
88
 
115
89
  const getOrientationsForPoint = (params: {
116
90
  inputProblem: InputProblem
117
91
  label: NetLabelPlacement
118
92
  point: Point
119
- compatibleOrientations: Set<FacingDirection>
120
93
  orientationConstraint: FacingDirection[] | null
121
94
  }) => {
122
- const {
123
- inputProblem,
124
- label,
125
- point,
126
- compatibleOrientations,
127
- orientationConstraint,
128
- } = params
95
+ const { inputProblem, label, point, orientationConstraint } = params
129
96
 
130
97
  if (orientationConstraint) {
131
- return orientationConstraint.filter((orientation) =>
132
- compatibleOrientations.has(orientation),
133
- )
98
+ return orientationConstraint
134
99
  }
135
100
 
136
101
  return getUnconstrainedOrientations({
137
102
  label,
138
103
  inputProblem,
139
104
  point,
140
- compatibleOrientations,
141
105
  })
142
106
  }
143
107
 
@@ -180,31 +144,23 @@ const getOrientationConstraint = (
180
144
  inputProblem: InputProblem,
181
145
  label: NetLabelPlacement,
182
146
  ): FacingDirection[] | null => {
147
+ const availableOrientations = inputProblem.availableNetLabelOrientations ?? {}
183
148
  for (const netId of getOrientationConstraintKeys(inputProblem, label)) {
184
- if (Object.hasOwn(inputProblem.availableNetLabelOrientations, netId)) {
185
- return inputProblem.availableNetLabelOrientations[netId] ?? []
149
+ if (Object.hasOwn(availableOrientations, netId)) {
150
+ return dedupeOrientations(
151
+ (availableOrientations[netId] ?? [])
152
+ .map(normalizeFacingDirection)
153
+ .filter(
154
+ (orientation): orientation is FacingDirection =>
155
+ orientation !== undefined,
156
+ ),
157
+ )
186
158
  }
187
159
  }
188
160
 
189
161
  return null
190
162
  }
191
163
 
192
- const isDistanceAllowedByOrientationConstraint = (
193
- traceLocation: TraceLocation,
194
- distance: number,
195
- constrainedOrientations: FacingDirection[] | null,
196
- ) => {
197
- if (!constrainedOrientations) return true
198
-
199
- const compatibleOrientations = getTraceDistanceCompatibleOrientations(
200
- traceLocation.trace,
201
- distance,
202
- )
203
- return constrainedOrientations.some((orientation) =>
204
- compatibleOrientations.has(orientation),
205
- )
206
- }
207
-
208
164
  const getOrientationConstraintKeys = (
209
165
  inputProblem: InputProblem,
210
166
  label: NetLabelPlacement,
@@ -223,77 +179,60 @@ const getUnconstrainedOrientations = (params: {
223
179
  label: NetLabelPlacement
224
180
  inputProblem: InputProblem
225
181
  point: Point
226
- compatibleOrientations: Set<FacingDirection>
227
182
  }) => {
228
- const { label, inputProblem, point, compatibleOrientations } = params
183
+ const { label, inputProblem, point } = params
229
184
  return dedupeOrientations([
230
- ...getInitialOrientations(label, compatibleOrientations),
185
+ ...getInitialOrientations(label),
231
186
  ...getOutwardOrientations({
232
187
  inputProblem,
233
188
  point,
234
- compatibleOrientations,
235
189
  }),
236
- ...ALL_ORIENTATIONS.filter((orientation) =>
237
- compatibleOrientations.has(orientation),
238
- ),
190
+ ...ALL_ORIENTATIONS,
239
191
  ])
240
192
  }
241
193
 
242
- const getInitialOrientations = (
243
- label: NetLabelPlacement,
244
- compatibleOrientations: Set<FacingDirection>,
245
- ) =>
246
- [label.orientation, getFlippedOrientation(label.orientation)].filter(
247
- (orientation) => compatibleOrientations.has(orientation),
248
- )
194
+ const getInitialOrientations = (label: NetLabelPlacement) => [
195
+ label.orientation,
196
+ getFlippedOrientation(label.orientation),
197
+ ]
249
198
 
250
199
  const getOutwardOrientations = (params: {
251
200
  inputProblem: InputProblem
252
201
  point: Point
253
- compatibleOrientations: Set<FacingDirection>
254
202
  }) => {
255
- const { inputProblem, point, compatibleOrientations } = params
203
+ const { inputProblem, point } = params
256
204
  const chipBounds = getChipBounds(inputProblem)
257
205
 
258
206
  return dedupeOrientations(
259
- getOutwardOrientationOptions(point, chipBounds, compatibleOrientations)
260
- .filter(({ orientation }) => compatibleOrientations.has(orientation))
207
+ getOutwardOrientationOptions(point, chipBounds)
261
208
  .sort((a, b) => b.outwardScore - a.outwardScore)
262
209
  .map(({ orientation }) => orientation),
263
210
  )
264
211
  }
265
212
 
266
- const getOutwardOrientationOptions = (
267
- point: Point,
268
- chipBounds: ChipBounds,
269
- compatibleOrientations: Set<FacingDirection>,
270
- ) => {
213
+ const getOutwardOrientationOptions = (point: Point, chipBounds: ChipBounds) => {
271
214
  const options: OutwardOrientationOption[] = []
272
215
 
273
- if (compatibleOrientations.has("y+") || compatibleOrientations.has("y-")) {
274
- options.push(
275
- getOutwardAxisOption({
276
- value: point.y,
277
- min: chipBounds.minY,
278
- max: chipBounds.maxY,
279
- center: chipBounds.centerY,
280
- positiveOrientation: "y+",
281
- negativeOrientation: "y-",
282
- }),
283
- )
284
- }
285
- if (compatibleOrientations.has("x+") || compatibleOrientations.has("x-")) {
286
- options.push(
287
- getOutwardAxisOption({
288
- value: point.x,
289
- min: chipBounds.minX,
290
- max: chipBounds.maxX,
291
- center: chipBounds.centerX,
292
- positiveOrientation: "x+",
293
- negativeOrientation: "x-",
294
- }),
295
- )
296
- }
216
+ options.push(
217
+ getOutwardAxisOption({
218
+ value: point.y,
219
+ min: chipBounds.minY,
220
+ max: chipBounds.maxY,
221
+ center: chipBounds.centerY,
222
+ positiveOrientation: "y+",
223
+ negativeOrientation: "y-",
224
+ }),
225
+ )
226
+ options.push(
227
+ getOutwardAxisOption({
228
+ value: point.x,
229
+ min: chipBounds.minX,
230
+ max: chipBounds.maxX,
231
+ center: chipBounds.centerX,
232
+ positiveOrientation: "x+",
233
+ negativeOrientation: "x-",
234
+ }),
235
+ )
297
236
 
298
237
  return options
299
238
  }
@@ -415,6 +354,25 @@ const dedupeOrientations = (orientations: FacingDirection[]) => [
415
354
  ...new Set(orientations),
416
355
  ]
417
356
 
357
+ const normalizeFacingDirection = (
358
+ value: string,
359
+ ): FacingDirection | undefined => {
360
+ switch (value) {
361
+ case "x+":
362
+ case "+x":
363
+ return "x+"
364
+ case "x-":
365
+ case "-x":
366
+ return "x-"
367
+ case "y+":
368
+ case "+y":
369
+ return "y+"
370
+ case "y-":
371
+ case "-y":
372
+ return "y-"
373
+ }
374
+ }
375
+
418
376
  const dedupeStrings = (values: Array<string | undefined>) => [
419
377
  ...new Set(values.filter((value): value is string => value !== undefined)),
420
378
  ]
@@ -17,6 +17,10 @@ export const rectsOverlap = (a: Bounds, b: Bounds) =>
17
17
  Math.min(a.maxX, b.maxX) - Math.max(a.minX, b.minX) > EPS &&
18
18
  Math.min(a.maxY, b.maxY) - Math.max(a.minY, b.minY) > EPS
19
19
 
20
+ export const rectsTouchOrOverlap = (a: Bounds, b: Bounds) =>
21
+ Math.min(a.maxX, b.maxX) - Math.max(a.minX, b.minX) >= -EPS &&
22
+ Math.min(a.maxY, b.maxY) - Math.max(a.minY, b.minY) >= -EPS
23
+
20
24
  export const traceCrossesBoundsInterior = (
21
25
  bounds: Bounds,
22
26
  traces: SolvedTracePath[],
@@ -21,7 +21,7 @@ export const visualizeTraceAnchoredNetLabelOverlapSolver = (state: {
21
21
  ensureGraphicsArrays(graphics)
22
22
 
23
23
  drawTraces(graphics, state.traces)
24
- drawNetLabels(graphics, state.outputNetLabelPlacements)
24
+ drawNetLabels(graphics, state.inputProblem, state.outputNetLabelPlacements)
25
25
 
26
26
  if (!state.solved) {
27
27
  drawCurrentOverlap(graphics, state)
@@ -42,6 +42,7 @@ const drawTraces = (graphics: GraphicsObject, traces: SolvedTracePath[]) => {
42
42
 
43
43
  const drawNetLabels = (
44
44
  graphics: GraphicsObject,
45
+ inputProblem: InputProblem,
45
46
  labels: NetLabelPlacement[],
46
47
  ) => {
47
48
  for (const label of labels) {
@@ -51,7 +52,7 @@ const drawNetLabels = (
51
52
  height: label.height,
52
53
  fill: getColorFromString(label.globalConnNetId, 0.35),
53
54
  strokeColor: getColorFromString(label.globalConnNetId, 0.9),
54
- label: `netId: ${label.netId}\nglobalConnNetId: ${label.globalConnNetId}`,
55
+ label: getNetLabelVisualizationLabel(inputProblem, label),
55
56
  } as any)
56
57
  graphics.points!.push({
57
58
  x: label.anchorPoint.x,
@@ -65,6 +66,7 @@ const drawNetLabels = (
65
66
  const drawCurrentOverlap = (
66
67
  graphics: GraphicsObject,
67
68
  state: {
69
+ inputProblem: InputProblem
68
70
  outputNetLabelPlacements: NetLabelPlacement[]
69
71
  currentOverlap: LabelOverlap | null
70
72
  },
@@ -84,7 +86,7 @@ const drawCurrentOverlap = (
84
86
  height: label.height,
85
87
  fill: "rgba(255, 0, 0, 0.2)",
86
88
  strokeColor: CANDIDATE_REJECTED_COLOR,
87
- label: `netlabel overlap target\n${label.netId ?? label.globalConnNetId}`,
89
+ label: `netlabel overlap target\n${label.netId ?? label.globalConnNetId}\n${getAvailableOrientationText(state.inputProblem, label)}`,
88
90
  } as any)
89
91
  }
90
92
  }
@@ -106,7 +108,7 @@ const drawCurrentCandidates = (
106
108
  : "rgba(255, 0, 0, 0.15)",
107
109
  strokeColor: color,
108
110
  strokeDash: candidate.selected ? undefined : "4 2",
109
- label: `${candidate.selected ? "selected" : candidate.status} netlabel overlap candidate\ntrace: ${candidate.traceId}\ndistance: ${candidate.distanceFromOriginal.toFixed(3)}`,
111
+ label: `${candidate.selected ? "selected" : candidate.status} netlabel overlap candidate\ntrace: ${candidate.traceId}\npath distance: ${candidate.pathDistance.toFixed(3)}\norientation: ${candidate.orientation}\ndistance from original: ${candidate.distanceFromOriginal.toFixed(3)}`,
110
112
  } as any)
111
113
  graphics.points!.push({
112
114
  ...candidate.anchorPoint,
@@ -123,3 +125,35 @@ const ensureGraphicsArrays = (graphics: GraphicsObject) => {
123
125
  if (!graphics.circles) graphics.circles = []
124
126
  if (!graphics.texts) graphics.texts = []
125
127
  }
128
+
129
+ const getAvailableOrientationText = (
130
+ inputProblem: InputProblem,
131
+ label: NetLabelPlacement,
132
+ ) => {
133
+ const orientations = getAvailableOrientationsForLabel(inputProblem, label)
134
+ return `available orientations: ${orientations?.join(", ") ?? "any"}`
135
+ }
136
+
137
+ const getNetLabelVisualizationLabel = (
138
+ inputProblem: InputProblem,
139
+ label: NetLabelPlacement,
140
+ ) =>
141
+ [
142
+ `netId: ${label.netId}`,
143
+ `globalConnNetId: ${label.globalConnNetId}`,
144
+ getAvailableOrientationText(inputProblem, label),
145
+ ].join("\n")
146
+
147
+ const getAvailableOrientationsForLabel = (
148
+ inputProblem: InputProblem,
149
+ label: NetLabelPlacement,
150
+ ) => {
151
+ const availableOrientations = inputProblem.availableNetLabelOrientations ?? {}
152
+ for (const netId of [label.netId, label.globalConnNetId]) {
153
+ if (netId && Object.hasOwn(availableOrientations, netId)) {
154
+ return availableOrientations[netId]
155
+ }
156
+ }
157
+
158
+ return undefined
159
+ }
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.52",
4
+ "version": "0.0.53",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "start": "cosmos",
@@ -163,6 +163,9 @@
163
163
  }
164
164
  ],
165
165
  "netConnections": [],
166
- "availableNetLabelOrientations": {},
166
+ "availableNetLabelOrientations": {
167
+ "P.pin1 to P.pin18": ["y+"],
168
+ "P.pin4 to P.pin15": ["y-"]
169
+ },
167
170
  "maxMspPairDistance": 2.4
168
171
  }
@@ -90,15 +90,18 @@ orientation: y-" data-x="-1.4" data-y="-0.7" cx="356.0396039603961" cy="378.2178
90
90
  </g>
91
91
  <g>
92
92
  <rect data-type="rect" data-label="netId: VCC
93
- globalConnNetId: connectivity_net0" data-x="-1.1" data-y="0.42500000000000016" x="378.21782178217825" y="228.51485148514848" width="22.178217821782198" height="49.9009900990099" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.009017857142857143" />
93
+ globalConnNetId: connectivity_net0
94
+ available orientations: y+" data-x="-1.1" data-y="0.42500000000000016" x="378.21782178217825" y="228.51485148514848" width="22.178217821782198" height="49.9009900990099" fill="#93c5fd66" stroke="#93c5fd" stroke-width="0.009017857142857143" />
94
95
  </g>
95
96
  <g>
96
97
  <rect data-type="rect" data-label="netId: EN
97
- globalConnNetId: connectivity_net1" data-x="-1.5" data-y="0" x="320" y="289.5049504950495" width="49.90099009900996" height="22.17821782178214" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.009017857142857143" />
98
+ globalConnNetId: connectivity_net1
99
+ available orientations: x+, x-" data-x="-1.5" data-y="0" x="320" y="289.5049504950495" width="49.90099009900996" height="22.17821782178214" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.009017857142857143" />
98
100
  </g>
99
101
  <g>
100
102
  <rect data-type="rect" data-label="netId: GND
101
- globalConnNetId: connectivity_net2" data-x="-1.4" data-y="-0.9249999999999999" x="344.950495049505" y="378.2178217821782" width="22.178217821782198" height="49.9009900990099" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.009017857142857143" />
103
+ globalConnNetId: connectivity_net2
104
+ available orientations: y-" data-x="-1.4" data-y="-0.9249999999999999" x="344.950495049505" y="378.2178217821782" width="22.178217821782198" height="49.9009900990099" fill="#fca5a566" stroke="#fca5a5" stroke-width="0.009017857142857143" />
102
105
  </g>
103
106
  <g id="crosshair" style="display: none">
104
107
  <line id="crosshair-h" y1="0" y2="640" stroke="#666" stroke-width="0.5" />
@@ -196,19 +196,23 @@ orientation: y+" data-x="1.4571549750000001" data-y="0.29999999999999966" cx="53
196
196
  </g>
197
197
  <g>
198
198
  <rect data-type="rect" data-label="netId: VSYS
199
- globalConnNetId: connectivity_net0" data-x="-1.4574283249999997" data-y="1.5274186000000005" x="283.75416992460123" y="184.33736239143013" width="16.926952823252577" height="38.08564385231816" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.011815475714285715" />
199
+ globalConnNetId: connectivity_net0
200
+ available orientations: y+" data-x="-1.4574283249999997" data-y="1.5274186000000005" x="283.75416992460123" y="184.33736239143013" width="16.926952823252577" height="38.08564385231816" fill="#93c5fd66" stroke="#93c5fd" stroke-width="0.011815475714285715" />
200
201
  </g>
201
202
  <g>
202
203
  <rect data-type="rect" data-label="netId: GND
203
- globalConnNetId: connectivity_net1" data-x="-3.0434765500000003" data-y="-0.4250000000000004" x="149.51935252470935" y="349.5798500586337" width="16.926952823252492" height="38.085643852318185" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.011815475714285715" />
204
+ globalConnNetId: connectivity_net1
205
+ available orientations: y-" data-x="-3.0434765500000003" data-y="-0.4250000000000004" x="149.51935252470935" y="349.5798500586337" width="16.926952823252492" height="38.085643852318185" fill="#fca5a566" stroke="#fca5a5" stroke-width="0.011815475714285715" />
204
206
  </g>
205
207
  <g>
206
208
  <rect data-type="rect" data-label="netId: GND
207
- globalConnNetId: connectivity_net1" data-x="1.9148566499999995" data-y="-1.2284186000000008" x="569.1667133165424" y="417.5769937562517" width="16.926952823252577" height="38.08564385231813" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.011815475714285715" />
209
+ globalConnNetId: connectivity_net1
210
+ available orientations: y-" data-x="1.9148566499999995" data-y="-1.2284186000000008" x="569.1667133165424" y="417.5769937562517" width="16.926952823252577" height="38.08564385231813" fill="#fca5a566" stroke="#fca5a5" stroke-width="0.011815475714285715" />
208
211
  </g>
209
212
  <g>
210
213
  <rect data-type="rect" data-label="netId: V3_3
211
- globalConnNetId: connectivity_net2" data-x="1.4571549750000001" data-y="0.5249999999999997" x="530.4292400172993" y="269.1768241481843" width="16.926952823252464" height="38.08564385231813" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.011815475714285715" />
214
+ globalConnNetId: connectivity_net2
215
+ available orientations: y+" data-x="1.4571549750000001" data-y="0.5249999999999997" x="530.4292400172993" y="269.1768241481843" width="16.926952823252464" height="38.08564385231813" fill="#93c5fd66" stroke="#93c5fd" stroke-width="0.011815475714285715" />
212
216
  </g>
213
217
  <g id="crosshair" style="display: none">
214
218
  <line id="crosshair-h" y1="0" y2="640" stroke="#666" stroke-width="0.5" />
@@ -28,11 +28,13 @@ orientation: y-" data-x="0.31067575550000137" data-y="-0.5800832909999993" cx="4
28
28
  </g>
29
29
  <g>
30
30
  <rect data-type="rect" data-label="netId: V3_3
31
- globalConnNetId: connectivity_net0" data-x="0.30397715550000004" data-y="0.8060832909999993" x="375.3918427720889" y="40" width="54.311810198852356" height="122.20157294741779" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.003682440324999998" />
31
+ globalConnNetId: connectivity_net0
32
+ available orientations: y+" data-x="0.30397715550000004" data-y="0.8060832909999993" x="375.3918427720889" y="40" width="54.311810198852356" height="122.20157294741779" fill="#93c5fd66" stroke="#93c5fd" stroke-width="0.003682440324999998" />
32
33
  </g>
33
34
  <g>
34
35
  <rect data-type="rect" data-label="netId: V3_3
35
- globalConnNetId: connectivity_net0" data-x="0.31067575550000137" data-y="-0.8060832909999993" x="377.2109082310795" y="477.7984270525822" width="54.3118101988523" height="122.20157294741779" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.003682440324999998" />
36
+ globalConnNetId: connectivity_net0
37
+ available orientations: y+" data-x="0.31067575550000137" data-y="-0.8060832909999993" x="377.2109082310795" y="477.7984270525822" width="54.3118101988523" height="122.20157294741779" fill="#93c5fd66" stroke="#93c5fd" stroke-width="0.003682440324999998" />
36
38
  </g>
37
39
  <g id="crosshair" style="display: none">
38
40
  <line id="crosshair-h" y1="0" y2="640" stroke="#666" stroke-width="0.5" />
@@ -136,23 +136,28 @@ orientation: x+" data-x="1.757519574999999" data-y="0.85" cx="547.3539750075635"
136
136
  </g>
137
137
  <g>
138
138
  <rect data-type="rect" data-label="netId: V3_3
139
- globalConnNetId: connectivity_net0" data-x="-1.8574283249999997" data-y="0.9762093000000004" x="112.7378861431207" y="270.2760341291854" width="23.398233329971788" height="52.64602499243642" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.00854765388392857" />
139
+ globalConnNetId: connectivity_net0
140
+ available orientations: y+" data-x="-1.8574283249999997" data-y="0.9762093000000004" x="112.7378861431207" y="270.2760341291854" width="23.398233329971788" height="52.64602499243642" fill="#93c5fd66" stroke="#93c5fd" stroke-width="0.00854765388392857" />
140
141
  </g>
141
142
  <g>
142
143
  <rect data-type="rect" data-label="netId: V3_3
143
- globalConnNetId: connectivity_net0" data-x="1.5999999999999999" data-y="-0.07499999999999998" x="517.2264594931378" y="393.2582365293668" width="23.39823332997173" height="52.64602499243648" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.00854765388392857" />
144
+ globalConnNetId: connectivity_net0
145
+ available orientations: y+" data-x="1.5999999999999999" data-y="-0.07499999999999998" x="517.2264594931378" y="393.2582365293668" width="23.39823332997173" height="52.64602499243648" fill="#93c5fd66" stroke="#93c5fd" stroke-width="0.00854765388392857" />
144
146
  </g>
145
147
  <g>
146
148
  <rect data-type="rect" data-label="netId: V3_3
147
- globalConnNetId: connectivity_net0" data-x="1.7580660749999977" data-y="2.5285814" x="535.7187940151516" y="88.66221107549416" width="23.39823332997173" height="52.64602499243642" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.00854765388392857" />
149
+ globalConnNetId: connectivity_net0
150
+ available orientations: y+" data-x="1.7580660749999977" data-y="2.5285814" x="535.7187940151516" y="88.66221107549416" width="23.39823332997173" height="52.64602499243642" fill="#93c5fd66" stroke="#93c5fd" stroke-width="0.00854765388392857" />
148
151
  </g>
149
152
  <g>
150
153
  <rect data-type="rect" data-label="netId: GND
151
- globalConnNetId: connectivity_net1" data-x="-2.31430995" data-y="-0.9762093000000004" x="59.28677181348735" y="498.6917639320694" width="23.398233329971788" height="52.64602499243642" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.00854765388392857" />
154
+ globalConnNetId: connectivity_net1
155
+ available orientations: y-" data-x="-2.31430995" data-y="-0.9762093000000004" x="59.28677181348735" y="498.6917639320694" width="23.398233329971788" height="52.64602499243642" fill="#fca5a566" stroke="#fca5a5" stroke-width="0.00854765388392857" />
152
156
  </g>
153
157
  <g>
154
158
  <rect data-type="rect" data-label="netId: FLASH_N_CS
155
- globalConnNetId: connectivity_net2" data-x="1.982519574999999" data-y="0.85" x="547.3539750075635" y="299.6653032094798" width="52.64602499243654" height="23.39823332997173" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.00854765388392857" />
159
+ globalConnNetId: connectivity_net2
160
+ available orientations: any" data-x="1.982519574999999" data-y="0.85" x="547.3539750075635" y="299.6653032094798" width="52.64602499243654" height="23.39823332997173" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.00854765388392857" />
156
161
  </g>
157
162
  <g id="crosshair" style="display: none">
158
163
  <line id="crosshair-h" y1="0" y2="640" stroke="#666" stroke-width="0.5" />
@@ -82,19 +82,23 @@ orientation: y-" data-x="3.511" data-y="-0.4310000000000001" cx="588.11292719167
82
82
  </g>
83
83
  <g>
84
84
  <rect data-type="rect" data-label="netId: VCC
85
- globalConnNetId: connectivity_net0" data-x="1.7049999999999998" data-y="0.42500000000000004" x="361.54531946508166" y="147.96699257057952" width="23.77414561664193" height="53.49182763744429" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008412500000000002" />
85
+ globalConnNetId: connectivity_net0
86
+ available orientations: y+" data-x="1.7049999999999998" data-y="0.42500000000000004" x="361.54531946508166" y="147.96699257057952" width="23.77414561664193" height="53.49182763744429" fill="#93c5fd66" stroke="#93c5fd" stroke-width="0.008412500000000002" />
86
87
  </g>
87
88
  <g>
88
89
  <rect data-type="rect" data-label="netId: OUT
89
- globalConnNetId: connectivity_net1" data-x="1.5250000000000001" data-y="-0.4486138374999999" x="325.28974739970283" y="266.6729465081724" width="53.49182763744432" height="23.774145616641874" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008412500000000002" />
90
+ globalConnNetId: connectivity_net1
91
+ available orientations: any" data-x="1.5250000000000001" data-y="-0.4486138374999999" x="325.28974739970283" y="266.6729465081724" width="53.49182763744432" height="23.774145616641874" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008412500000000002" />
90
92
  </g>
91
93
  <g>
92
94
  <rect data-type="rect" data-label="netId: GND
93
- globalConnNetId: connectivity_net2" data-x="1.8499999999999996" data-y="-2.0194553499999994" x="378.78157503714704" y="438.54117979197616" width="23.77414561664193" height="53.49182763744432" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008412500000000002" />
95
+ globalConnNetId: connectivity_net2
96
+ available orientations: y-" data-x="1.8499999999999996" data-y="-2.0194553499999994" x="378.78157503714704" y="438.54117979197616" width="23.77414561664193" height="53.49182763744432" fill="#fca5a566" stroke="#fca5a5" stroke-width="0.008412500000000002" />
94
97
  </g>
95
98
  <g>
96
99
  <rect data-type="rect" data-label="netId: GND
97
- globalConnNetId: connectivity_net2" data-x="3.511" data-y="-0.6560000000000001" x="576.2258543833581" y="276.466249628529" width="23.77414561664193" height="53.49182763744432" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008412500000000002" />
100
+ globalConnNetId: connectivity_net2
101
+ available orientations: y-" data-x="3.511" data-y="-0.6560000000000001" x="576.2258543833581" y="276.466249628529" width="23.77414561664193" height="53.49182763744432" fill="#fca5a566" stroke="#fca5a5" stroke-width="0.008412500000000002" />
98
102
  </g>
99
103
  <g id="crosshair" style="display: none">
100
104
  <line id="crosshair-h" y1="0" y2="640" stroke="#666" stroke-width="0.5" />
@@ -251,35 +251,43 @@ orientation: y+" data-x="1.96375" data-y="3" cx="417.91062100986653" cy="157.492
251
251
  </g>
252
252
  <g>
253
253
  <rect data-type="rect" data-label="netId: gnd
254
- globalConnNetId: connectivity_net3" data-x="3.75" data-y="-1.725" x="527.5217643644805" y="450.0058038305282" width="13.000580383052807" height="29.251305861868843" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.015383928571428571" />
254
+ globalConnNetId: connectivity_net3
255
+ available orientations: y-" data-x="3.75" data-y="-1.725" x="527.5217643644805" y="450.0058038305282" width="13.000580383052807" height="29.251305861868843" fill="#fca5a566" stroke="#fca5a5" stroke-width="0.015383928571428571" />
255
256
  </g>
256
257
  <g>
257
258
  <rect data-type="rect" data-label="netId: gnd
258
- globalConnNetId: connectivity_net3" data-x="-2.125" data-y="-2.2249999999999996" x="145.6297156123041" y="482.5072547881602" width="13.000580383052835" height="29.251305861868843" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.015383928571428571" />
259
+ globalConnNetId: connectivity_net3
260
+ available orientations: y-" data-x="-2.125" data-y="-2.2249999999999996" x="145.6297156123041" y="482.5072547881602" width="13.000580383052835" height="29.251305861868843" fill="#fca5a566" stroke="#fca5a5" stroke-width="0.015383928571428571" />
259
261
  </g>
260
262
  <g>
261
263
  <rect data-type="rect" data-label="netId: v5
262
- globalConnNetId: connectivity_net4" data-x="1.475" data-y="0.225" x="379.6401625072548" y="323.25014509576323" width="13.000580383052807" height="29.251305861868843" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.015383928571428571" />
264
+ globalConnNetId: connectivity_net4
265
+ available orientations: y+" data-x="1.475" data-y="0.225" x="379.6401625072548" y="323.25014509576323" width="13.000580383052807" height="29.251305861868843" fill="#93c5fd66" stroke="#93c5fd" stroke-width="0.015383928571428571" />
263
266
  </g>
264
267
  <g>
265
268
  <rect data-type="rect" data-label="netId: v5
266
- globalConnNetId: connectivity_net4" data-x="-1.301" data-y="-0.8490000000000001" x="199.19210679048172" y="393.0632617527569" width="13.000580383052807" height="29.251305861868843" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.015383928571428571" />
269
+ globalConnNetId: connectivity_net4
270
+ available orientations: y+" data-x="-1.301" data-y="-0.8490000000000001" x="199.19210679048172" y="393.0632617527569" width="13.000580383052807" height="29.251305861868843" fill="#93c5fd66" stroke="#93c5fd" stroke-width="0.015383928571428571" />
267
271
  </g>
268
272
  <g>
269
273
  <rect data-type="rect" data-label="netId: .PWR1 &gt; .FB to .R6 &gt; .pin2
270
- globalConnNetId: connectivity_net2" data-x="-2.125" data-y="0.225" x="145.6297156123041" y="323.25014509576323" width="13.000580383052835" height="29.251305861868843" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.015383928571428571" />
274
+ globalConnNetId: connectivity_net2
275
+ available orientations: any" data-x="-2.125" data-y="0.225" x="145.6297156123041" y="323.25014509576323" width="13.000580383052835" height="29.251305861868843" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.015383928571428571" />
271
276
  </g>
272
277
  <g>
273
278
  <rect data-type="rect" data-label="netId: v3_3
274
- globalConnNetId: connectivity_net0" data-x="-3.75" data-y="2.225" x="39.99999999999997" y="193.24434126523508" width="13.000580383052835" height="29.251305861868843" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.015383928571428571" />
279
+ globalConnNetId: connectivity_net0
280
+ available orientations: y+" data-x="-3.75" data-y="2.225" x="39.99999999999997" y="193.24434126523508" width="13.000580383052835" height="29.251305861868843" fill="#93c5fd66" stroke="#93c5fd" stroke-width="0.015383928571428571" />
275
281
  </g>
276
282
  <g>
277
283
  <rect data-type="rect" data-label="netId: v3_3
278
- globalConnNetId: connectivity_net0" data-x="2.2990000000000004" data-y="0.276" x="433.20255368543235" y="319.93499709808475" width="13.000580383052863" height="29.251305861868843" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.015383928571428571" />
284
+ globalConnNetId: connectivity_net0
285
+ available orientations: y+" data-x="2.2990000000000004" data-y="0.276" x="433.20255368543235" y="319.93499709808475" width="13.000580383052863" height="29.251305861868843" fill="#93c5fd66" stroke="#93c5fd" stroke-width="0.015383928571428571" />
279
286
  </g>
280
287
  <g>
281
288
  <rect data-type="rect" data-label="netId: .LED1 &gt; .pos to .R8 &gt; .pin2
282
- globalConnNetId: connectivity_net1" data-x="1.96375" data-y="3.225" x="411.41033081834007" y="128.241439349971" width="13.000580383052807" height="29.25130586186887" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.015383928571428571" />
289
+ globalConnNetId: connectivity_net1
290
+ available orientations: any" data-x="1.96375" data-y="3.225" x="411.41033081834007" y="128.241439349971" width="13.000580383052807" height="29.25130586186887" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.015383928571428571" />
283
291
  </g>
284
292
  <g id="crosshair" style="display: none">
285
293
  <line id="crosshair-h" y1="0" y2="640" stroke="#666" stroke-width="0.5" />