@tscircuit/schematic-trace-solver 0.0.148 → 0.0.150

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 (164) hide show
  1. package/.agents/skills/schematic-trace-visualization/SKILL.md +7 -2
  2. package/dist/index.d.ts +31 -2
  3. package/dist/index.js +127 -46
  4. package/lib/solvers/InlineNetLabelSolver/InlineNetLabelSolver.ts +115 -6
  5. package/lib/solvers/NetLabelPlacementSolver/NetLabelPlacementSolver.ts +17 -1
  6. package/lib/solvers/NetLabelPlacementSolver/SingleNetLabelPlacementSolver/SingleNetLabelPlacementSolver.ts +2 -0
  7. package/lib/solvers/NetLabelPlacementSolver/SingleNetLabelPlacementSolver/solvePortOnlyPin.ts +2 -0
  8. package/lib/types/InputProblem.ts +27 -1
  9. package/package.json +8 -1
  10. package/site/examples/example51.page.tsx +4 -0
  11. package/tests/assets/example51.json +5102 -0
  12. package/tests/bug-reports/bug-report-20260706T213649Z/__snapshots__/bug-report-20260706T213649Z.snap.svg +751 -5
  13. package/tests/bug-reports/bug-report-20260706T220324Z/__snapshots__/bug-report-20260706T220324Z.snap.svg +660 -5
  14. package/tests/bug-reports/bug-report-20260707T020342Z/__snapshots__/bug-report-20260707T020342Z.snap.svg +44 -5
  15. package/tests/bug-reports/bug-report-20260707T092615Z/__snapshots__/bug-report-20260707T092615Z.snap.svg +394 -5
  16. package/tests/bug-reports/bug-report-20260707T134549Z/__snapshots__/bug-report-20260707T134549Z.snap.svg +170 -5
  17. package/tests/bug-reports/bug-report-20260707T134722Z/__snapshots__/bug-report-20260707T134722Z.snap.svg +79 -5
  18. package/tests/bug-reports/bug-report-20260707T140410Z/__snapshots__/bug-report-20260707T140410Z.snap.svg +219 -5
  19. package/tests/bug-reports/bug-report-20260707T141025Z/__snapshots__/bug-report-20260707T141025Z.snap.svg +65 -5
  20. package/tests/bug-reports/bug-report-20260707T141421Z/__snapshots__/bug-report-20260707T141421Z.snap.svg +142 -5
  21. package/tests/bug-reports/bug-report-20260707T230831Z/__snapshots__/bug-report-20260707T230831Z.snap.svg +100 -5
  22. package/tests/bug-reports/bug-report-20260708T053736Z/__snapshots__/bug-report-20260708T053736Z.snap.svg +23 -5
  23. package/tests/bug-reports/bug-report-20260708T055430Z/__snapshots__/bug-report-20260708T055430Z.snap.svg +58 -5
  24. package/tests/bug-reports/bug-report-20260708T095725Z/__snapshots__/bug-report-20260708T095725Z.snap.svg +86 -5
  25. package/tests/bug-reports/bug-report-20260716T144856Z/__snapshots__/bug-report-20260716T144856Z.snap.svg +226 -5
  26. package/tests/bug-reports/bug-report-20260717T022934Z/__snapshots__/bug-report-20260717T022934Z.snap.svg +191 -5
  27. package/tests/bug-reports/bug-report-20260717T031704Z/__snapshots__/bug-report-20260717T031704Z.snap.svg +30 -5
  28. package/tests/bug-reports/bug-report-20260717T042845Z/__snapshots__/bug-report-20260717T042845Z.snap.svg +37 -5
  29. package/tests/bug-reports/bug-report-20260721T221026Z/__snapshots__/bug-report-20260721T221026Z.snap.svg +580 -2
  30. package/tests/bug-reports/bug-report-20260724T175257Z/__snapshots__/bug-report-20260724T175257Z.snap.svg +44 -5
  31. package/tests/bug-reports/bug-report-20260728T144234Z/__snapshots__/bug-report-20260728T144234Z.snap.svg +107 -5
  32. package/tests/bug-reports/bug-report-20260728T225606Z/__snapshots__/bug-report-20260728T225606Z.snap.svg +114 -5
  33. package/tests/bug-reports/bug-report-20260730T061837Z/__snapshots__/bug-report-20260730T061837Z.snap.svg +121 -5
  34. package/tests/bug-reports/bug-report-20260731T052229Z/__snapshots__/bug-report-20260731T052229Z.snap.svg +51 -5
  35. package/tests/bug-reports/bug-report-20260804T095800Z/__snapshots__/bug-report-20260804T095800Z.snap.svg +212 -5
  36. package/tests/bug-reports/bug-report-20260804T171919Z/__snapshots__/bug-report-20260804T171919Z.snap.svg +569 -5
  37. package/tests/bug-reports/bug-report-20260804T225912Z/__snapshots__/bug-report-20260804T225912Z.snap.svg +37 -5
  38. package/tests/bug-reports/bug-report-20260805T061316Z/__snapshots__/bug-report-20260805T061316Z.snap.svg +289 -5
  39. package/tests/bug-reports/bug-report-20260806T061548Z/__snapshots__/bug-report-20260806T061548Z.snap.svg +289 -5
  40. package/tests/bug-reports/bug-report-20260806T093501Z/__snapshots__/bug-report-20260806T093501Z.snap.svg +149 -5
  41. package/tests/bug-reports/bug-report-20260811T075142Z/__snapshots__/bug-report-20260811T075142Z.snap.svg +93 -5
  42. package/tests/bug-reports/bug-report-20260815T073240Z/__snapshots__/bug-report-20260815T073240Z.snap.svg +79 -5
  43. package/tests/bug-reports/bug-report-20260819T091818Z/__snapshots__/bug-report-20260819T091818Z.snap.svg +244 -2
  44. package/tests/examples/__snapshots__/example01.snap.svg +44 -5
  45. package/tests/examples/__snapshots__/example02.snap.svg +51 -5
  46. package/tests/examples/__snapshots__/example03.snap.svg +86 -5
  47. package/tests/examples/__snapshots__/example04.snap.svg +30 -5
  48. package/tests/examples/__snapshots__/example05.snap.svg +30 -5
  49. package/tests/examples/__snapshots__/example06.snap.svg +30 -5
  50. package/tests/examples/__snapshots__/example07.snap.svg +58 -5
  51. package/tests/examples/__snapshots__/example08.snap.svg +37 -5
  52. package/tests/examples/__snapshots__/example09.snap.svg +149 -5
  53. package/tests/examples/__snapshots__/example10.snap.svg +65 -5
  54. package/tests/examples/__snapshots__/example11.snap.svg +51 -5
  55. package/tests/examples/__snapshots__/example12.snap.svg +51 -5
  56. package/tests/examples/__snapshots__/example13.snap.svg +72 -5
  57. package/tests/examples/__snapshots__/example14.snap.svg +79 -5
  58. package/tests/examples/__snapshots__/example15.snap.svg +86 -5
  59. package/tests/examples/__snapshots__/example16.snap.svg +51 -5
  60. package/tests/examples/__snapshots__/example17.snap.svg +51 -5
  61. package/tests/examples/__snapshots__/example18.snap.svg +58 -5
  62. package/tests/examples/__snapshots__/example19.snap.svg +44 -5
  63. package/tests/examples/__snapshots__/example20.snap.svg +44 -5
  64. package/tests/examples/__snapshots__/example21.snap.svg +72 -5
  65. package/tests/examples/__snapshots__/example22.snap.svg +51 -5
  66. package/tests/examples/__snapshots__/example23.snap.svg +51 -5
  67. package/tests/examples/__snapshots__/example24.snap.svg +51 -5
  68. package/tests/examples/__snapshots__/example25.snap.svg +86 -5
  69. package/tests/examples/__snapshots__/example26.snap.svg +51 -5
  70. package/tests/examples/__snapshots__/example27.snap.svg +72 -5
  71. package/tests/examples/__snapshots__/example28.snap.svg +44 -5
  72. package/tests/examples/__snapshots__/example29.snap.svg +324 -5
  73. package/tests/examples/__snapshots__/example30.snap.svg +107 -5
  74. package/tests/examples/__snapshots__/example31.snap.svg +37 -5
  75. package/tests/examples/__snapshots__/example32.snap.svg +149 -5
  76. package/tests/examples/__snapshots__/example33.snap.svg +93 -5
  77. package/tests/examples/__snapshots__/example34.snap.svg +51 -5
  78. package/tests/examples/__snapshots__/example35.snap.svg +58 -5
  79. package/tests/examples/__snapshots__/example36.snap.svg +44 -5
  80. package/tests/examples/__snapshots__/example37.snap.svg +72 -5
  81. package/tests/examples/__snapshots__/example38.snap.svg +30 -5
  82. package/tests/examples/__snapshots__/example39.snap.svg +37 -5
  83. package/tests/examples/__snapshots__/example40.snap.svg +100 -5
  84. package/tests/examples/__snapshots__/example41.snap.svg +44 -5
  85. package/tests/examples/__snapshots__/example42.snap.svg +65 -5
  86. package/tests/examples/__snapshots__/example43.snap.svg +58 -5
  87. package/tests/examples/__snapshots__/example44.snap.svg +107 -5
  88. package/tests/examples/__snapshots__/example45.snap.svg +51 -5
  89. package/tests/examples/__snapshots__/example46.snap.svg +93 -5
  90. package/tests/examples/__snapshots__/example47.snap.svg +93 -5
  91. package/tests/examples/__snapshots__/example48.snap.svg +65 -5
  92. package/tests/examples/__snapshots__/example49.snap.svg +177 -5
  93. package/tests/examples/__snapshots__/example50.snap.svg +93 -5
  94. package/tests/examples/__snapshots__/example51.snap.svg +952 -0
  95. package/tests/examples/example51.test.ts +12 -0
  96. package/tests/fixtures/convertSolverOutputToCircuitJson.test.ts +219 -0
  97. package/tests/fixtures/convertSolverOutputToCircuitJson.ts +1058 -0
  98. package/tests/fixtures/matcher.ts +45 -8
  99. package/tests/repros/__snapshots__/board-1273-trace-overlap-cycle.snap.svg +762 -2
  100. package/tests/repros/__snapshots__/board-15984-same-net-junction.snap.svg +111 -2
  101. package/tests/repros/__snapshots__/board1096-usb-label-overlap-iteration.snap.svg +167 -2
  102. package/tests/repros/__snapshots__/bugreport-001-gnd-overlap.snap.svg +65 -5
  103. package/tests/repros/__snapshots__/manufacturePartNumber-text-box.snap.svg +30 -5
  104. package/tests/repros/__snapshots__/netlabel-connector-through-rail-label.snap.svg +79 -5
  105. package/tests/repros/__snapshots__/repro-atmega328p-fault-pullup.snap.svg +65 -5
  106. package/tests/repros/__snapshots__/repro-atmega328p-missing-gnd-netlabel.snap.svg +149 -5
  107. package/tests/repros/__snapshots__/repro-board-589-regulator-section.snap.svg +55 -2
  108. package/tests/repros/__snapshots__/repro-board-648-esp12f-section.snap.svg +160 -2
  109. package/tests/repros/__snapshots__/repro-bq24074-battery-charger.snap.svg +135 -5
  110. package/tests/repros/__snapshots__/repro-bq25895-cross-net-trace-overlap.snap.svg +69 -2
  111. package/tests/repros/__snapshots__/repro-cc2340r5.snap.svg +86 -5
  112. package/tests/repros/__snapshots__/repro-core-555-power-cross-net-overlap.snap.svg +44 -5
  113. package/tests/repros/__snapshots__/repro-core-subcircuit-missing-ground.snap.svg +44 -5
  114. package/tests/repros/__snapshots__/repro-core-tb67s579ftg-inline-label-routing.snap.svg +260 -0
  115. package/tests/repros/__snapshots__/repro-example35-minimize-trace-crossing.snap.svg +335 -2
  116. package/tests/repros/__snapshots__/repro-ground-label-on-lower-rail-end.snap.svg +48 -2
  117. package/tests/repros/__snapshots__/repro-ina237-current-monitor.snap.svg +149 -5
  118. package/tests/repros/__snapshots__/repro-missing-trace-netlabel.snap.svg +72 -5
  119. package/tests/repros/__snapshots__/repro-netlabel-collision-687.snap.svg +100 -5
  120. package/tests/repros/__snapshots__/repro-netlabel-overlap-trace.snap.svg +51 -5
  121. package/tests/repros/__snapshots__/repro-nrf52810-clock-routing.snap.svg +90 -2
  122. package/tests/repros/__snapshots__/repro-power-group-rail-labels.snap.svg +37 -5
  123. package/tests/repros/__snapshots__/repro-rectifier-trace-overlap.snap.svg +44 -5
  124. package/tests/repros/__snapshots__/repro-rp2040-gamepad-trace-alignment.snap.svg +237 -2
  125. package/tests/repros/__snapshots__/repro-rp2040-usb-cc2-ground-overlap.snap.svg +72 -5
  126. package/tests/repros/__snapshots__/repro-rp2040-v3v3-label-placement.snap.svg +51 -5
  127. package/tests/repros/__snapshots__/repro-rp2040-zero-crystal-fallback-netlabels.snap.svg +30 -5
  128. package/tests/repros/__snapshots__/repro-ti-power-output-section.snap.svg +79 -5
  129. package/tests/repros/__snapshots__/repro-tida010076-j4-ground-bus.snap.svg +27 -2
  130. package/tests/repros/__snapshots__/repro-tida010076-page02.snap.svg +1150 -5
  131. package/tests/repros/__snapshots__/repro-tps61222-trace-intersection.snap.svg +51 -5
  132. package/tests/repros/__snapshots__/repro-type-c-16pin-self-connection.snap.svg +30 -5
  133. package/tests/repros/__snapshots__/repro-type-c-16pin-to-resistor.snap.svg +30 -5
  134. package/tests/repros/__snapshots__/repro-type-c-vbus-led-ground-label.snap.svg +44 -5
  135. package/tests/repros/__snapshots__/repro-usb-power-vbus-label-detour.snap.svg +685 -2
  136. package/tests/repros/__snapshots__/repro-vcc-pin1-detour.snap.svg +27 -2
  137. package/tests/repros/__snapshots__/repro129-host-custom-symbol-passives.snap.svg +51 -5
  138. package/tests/repros/__snapshots__/repro130-bq27441-fuel-gauge-trace-through-c1.snap.svg +100 -5
  139. package/tests/repros/__snapshots__/repro161-power-section-autolayout.snap.svg +107 -5
  140. package/tests/repros/__snapshots__/repro47-endpoint-obstacle-detour.snap.svg +51 -5
  141. package/tests/repros/__snapshots__/repro48-555-timer-vcc-rail-label.snap.svg +104 -2
  142. package/tests/repros/__snapshots__/repro5-escape-padded-text-obstacles.snap.svg +30 -5
  143. package/tests/repros/__snapshots__/repro51-overlap-junction-crossing.snap.svg +65 -5
  144. package/tests/repros/__snapshots__/repro84-stacked-gnd-label-orientation.snap.svg +27 -2
  145. package/tests/repros/__snapshots__/small-variant-resistor-facing-direction.snap.svg +58 -5
  146. package/tests/repros/__snapshots__/trace-overlap-box-resistor.snap.svg +37 -5
  147. package/tests/repros/assets/repro-core-tb67s579ftg-inline-label-routing.input.json +900 -0
  148. package/tests/repros/repro-core-tb67s579ftg-inline-label-routing.test.ts +40 -0
  149. package/tests/solvers/InlineNetLabelSolver/__snapshots__/fallback-net-label-width.snap.svg +25 -7
  150. package/tests/solvers/InlineNetLabelSolver/__snapshots__/inline-net-label-anchored-label-clearance.snap.svg +34 -2
  151. package/tests/solvers/InlineNetLabelSolver/__snapshots__/inline-net-label-port-stub.snap.svg +23 -5
  152. package/tests/solvers/InlineNetLabelSolver/__snapshots__/inline-net-label-two-pin-net.snap.svg +23 -5
  153. package/tests/solvers/InlineNetLabelSolver/__snapshots__/inline-net-label01.snap.svg +23 -5
  154. package/tests/solvers/InlineNetLabelSolver/__snapshots__/inline-net-label02.snap.svg +23 -5
  155. package/tests/solvers/InlineNetLabelSolver/__snapshots__/terminal-stub-trace-clearance.snap.svg +71 -0
  156. package/tests/solvers/InlineNetLabelSolver/fallback-net-label-width.test.ts +10 -1
  157. package/tests/solvers/InlineNetLabelSolver/terminal-stub-trace-clearance.test.ts +102 -0
  158. package/tests/solvers/SchematicTraceSingleLineSolver2/__snapshots__/SchematicTraceSingleLineSolver2_01-example17-d1_1-u1_1.snap.svg +23 -5
  159. package/tests/solvers/SchematicTraceSingleLineSolver2/__snapshots__/SchematicTraceSingleLineSolver2_repro47-short-opposing-pins.snap.svg +20 -2
  160. package/tests/solvers/TraceCleanupSolver/__snapshots__/TraceCleanupSolver.snap.svg +44 -5
  161. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/__snapshots__/TraceLabelOverlapAvoidanceSolver.snap.svg +79 -5
  162. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/__snapshots__/MergedNetLabelObstacles.snap.svg +44 -5
  163. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/__snapshots__/OverlapAvoidanceStepSolver.snap.svg +23 -5
  164. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/__snapshots__/SingleOverlapSolver.snap.svg +30 -5
@@ -1,4 +1,6 @@
1
- <svg width="640" height="640" viewBox="0 0 640 640" xmlns="http://www.w3.org/2000/svg"><rect width="100%" height="100%" fill="white"/><g><polyline data-points="0.6000000000000001,-0.30000000000000004 2.435,0" data-type="line" data-label="" points="201.34453781512605,376.47058823529414 448.06722689075633,336.1344537815126" fill="none" stroke="hsl(48, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="0.6000000000000001,-0.30000000000000004 1.5175,-0.30000000000000004 1.5175,0 2.435,0" data-type="line" data-label="" points="201.34453781512605,376.47058823529414 324.7058823529412,376.47058823529414 324.7058823529412,336.1344537815126 448.06722689075633,336.1344537815126" fill="none" stroke="purple" stroke-width="1px"/></g><g><rect data-type="rect" data-label="schematic_component_0" data-x="0" data-y="0" x="40" y="268.9075630252101" width="161.34453781512605" height="134.45378151260502" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.0074375"/></g><g><rect data-type="rect" data-label="schematic_component_1" data-x="3" data-y="0.13249999999999998" x="448.0672268907564" y="256.8067226890756" width="151.93277310924367" height="123.02521008403363" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.0074375"/></g><g><rect data-type="rect" data-label="U1" data-x="-0.08000000000000002" data-y="0.615" x="85.7142857142857" y="236.6386554621849" width="48.40336134453783" height="33.613445378151255" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.0074375"/></g><g><rect data-type="rect" data-label="INLINE netId: USER_LED_ANODE
1
+ <svg width="2416" height="1200" viewBox="0 0 2416 1200" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Solver debug visualization on the left and Circuit JSON schematic on the right">
2
+ <g transform="translate(0, 0) scale(1.875, 1.875) translate(0, 0)">
3
+ <rect width="100%" height="100%" fill="white"/><g><polyline data-points="0.6000000000000001,-0.30000000000000004 2.435,0" data-type="line" data-label="" points="201.34453781512605,376.47058823529414 448.06722689075633,336.1344537815126" fill="none" stroke="hsl(48, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="0.6000000000000001,-0.30000000000000004 1.5175,-0.30000000000000004 1.5175,0 2.435,0" data-type="line" data-label="" points="201.34453781512605,376.47058823529414 324.7058823529412,376.47058823529414 324.7058823529412,336.1344537815126 448.06722689075633,336.1344537815126" fill="none" stroke="purple" stroke-width="1px"/></g><g><rect data-type="rect" data-label="schematic_component_0" data-x="0" data-y="0" x="40" y="268.9075630252101" width="161.34453781512605" height="134.45378151260502" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.0074375"/></g><g><rect data-type="rect" data-label="schematic_component_1" data-x="3" data-y="0.13249999999999998" x="448.0672268907564" y="256.8067226890756" width="151.93277310924367" height="123.02521008403363" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.0074375"/></g><g><rect data-type="rect" data-label="U1" data-x="-0.08000000000000002" data-y="0.615" x="85.7142857142857" y="236.6386554621849" width="48.40336134453783" height="33.613445378151255" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.0074375"/></g><g><rect data-type="rect" data-label="INLINE netId: USER_LED_ANODE
2
4
  axis: x
3
5
  side: y+" data-x="1.5175" data-y="0.14" x="203.69747899159668" y="305.21008403361344" width="242.01680672268907" height="24.201680672268935" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.0074375"/></g><text data-type="text" data-label="USER_LED_ANODE" data-x="1.5175" data-y="0.14" x="324.7058823529412" y="317.3109243697479" fill="green" font-size="24.201680672268907" font-family="sans-serif" text-anchor="middle" dominant-baseline="central">USER_LED_ANODE</text><g><circle data-type="point" data-label="schematic_port_0
4
6
  x-" data-x="-0.6000000000000001" data-y="0.30000000000000004" cx="39.999999999999986" cy="295.79831932773106" r="3" fill="hsl(248, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="schematic_port_1
@@ -21,7 +23,7 @@ USER_LED_ANODE" data-x="1.5175" data-y="0" cx="324.7058823529412" cy="336.134453
21
23
  const h = svg.getElementById('crosshair-h');
22
24
  const v = svg.getElementById('crosshair-v');
23
25
  const coords = svg.getElementById('coordinates');
24
-
26
+
25
27
  crosshair.style.display = 'block';
26
28
  h.setAttribute('x1', '0');
27
29
  h.setAttribute('x2', '640');
@@ -40,13 +42,13 @@ USER_LED_ANODE" data-x="1.5175" data-y="0" cx="324.7058823529412" cy="336.134453
40
42
  // y' = (y - ty) / sy
41
43
  const sx = matrix.a;
42
44
  const sy = matrix.d;
43
- const tx = matrix.e;
45
+ const tx = matrix.e;
44
46
  const ty = matrix.f;
45
47
  const realPoint = {
46
48
  x: (x - tx) / sx,
47
49
  y: (y - ty) / sy // Flip y back since we used negative scale
48
50
  }
49
-
51
+
50
52
  coords.textContent = `(${realPoint.x.toFixed(2)}, ${realPoint.y.toFixed(2)})`;
51
53
  coords.setAttribute('x', (x + 5).toString());
52
54
  coords.setAttribute('y', (y - 5).toString());
@@ -54,4 +56,20 @@ USER_LED_ANODE" data-x="1.5175" data-y="0" cx="324.7058823529412" cy="336.134453
54
56
  document.currentScript.parentElement.addEventListener('mouseleave', () => {
55
57
  document.currentScript.parentElement.getElementById('crosshair').style.display = 'none';
56
58
  });
57
- ]]></script></svg>
59
+ ]]></script>
60
+ </g>
61
+ <g transform="translate(1216, 200)">
62
+ <style>
63
+ .boundary { fill: rgb(245, 241, 237); }
64
+ .schematic-boundary { fill: none; stroke: #fff; }
65
+ .component { fill: none; stroke: rgb(132, 0, 0); }
66
+ .chip { fill: rgb(255, 255, 194); stroke: rgb(132, 0, 0); }
67
+ .component-pin { fill: none; stroke: rgb(132, 0, 0); }
68
+ .text { font-family: sans-serif; fill: rgb(0, 150, 0); }
69
+ .pin-number { fill: rgb(169, 0, 0); }
70
+ .port-label { fill: rgb(0, 100, 100); }
71
+ .component-name { fill: rgb(0, 100, 100); }
72
+
73
+ </style><rect class="boundary" x="0" y="0" width="1200" height="800"/><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_0__stack1"><path d="M 461.18251928022 464.78149100256 L 602.6992287917735 464.78149100256 L 602.6992287917735 418.5089974293 L 744.215938303327 418.5089974293" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="24.678663239071998px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 461.18251928022 464.78149100256 L 602.6992287917735 464.78149100256 L 602.6992287917735 418.5089974293 L 744.215938303327 418.5089974293" stroke="rgb(0, 150, 0)" fill="none" stroke-width="3.0848329048839997px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_0__stack1"/><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_0__stack1"><rect class="component chip sch-component-body" x="337.78920308486" y="341.3881748072" width="61.69665809768003" height="154.24164524419996" stroke-width="3.0848329048839997px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="337.78920308486" y="341.3881748072" width="61.69665809768003" height="154.24164524419996" fill="transparent"/><text class="sch-text" x="368.6375321337" y="418.5089974293" fill="#0f172a" text-anchor="middle" dominant-baseline="middle" font-family="sans-serif" font-size="27.763496143955997px" transform="rotate(0, 368.6375321337, 418.5089974293)">schematic_component_0</text><line class="component-pin sch-component-pin sch-port-line" x1="337.78920308486" y1="372.23650385604" x2="279.177377892064" y2="372.23650385604" stroke-width="3.0848329048839997px"/><g class="sch-port" data-schematic-port-id="source_port_0_0__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="276.09254498718" cy="372.23650385604" r="3.0848329048839997" stroke-width="3.0848329048839997px"/><rect x="273.007712082296" y="369.15167095115595" width="6.1696658097679995" height="6.1696658097679995" opacity="0"/></g><text class="pin-number sch-pin-number" x="306.94087403602" y="369.151670951156" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="23.136246786629997px" transform=""></text><text class="pin-number sch-pin-label" x="353.21336760928" y="372.23650385604" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="23.136246786629997px" transform="">schematic_port_0</text><line class="component-pin sch-component-pin sch-port-line" x1="337.78920308486" y1="403.08483290488" x2="279.177377892064" y2="403.08483290488" stroke-width="3.0848329048839997px"/><g class="sch-port" data-schematic-port-id="source_port_0_1__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="276.09254498718" cy="403.08483290488" r="3.0848329048839997" stroke-width="3.0848329048839997px"/><rect x="273.007712082296" y="399.99999999999596" width="6.1696658097679995" height="6.1696658097679995" opacity="0"/></g><text class="pin-number sch-pin-number" x="306.94087403602" y="399.999999999996" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="23.136246786629997px" transform=""></text><text class="pin-number sch-pin-label" x="353.21336760928" y="403.08483290488" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="23.136246786629997px" transform="">schematic_port_1</text><line class="component-pin sch-component-pin sch-port-line" x1="337.78920308486" y1="433.93316195372" x2="279.177377892064" y2="433.93316195372" stroke-width="3.0848329048839997px"/><g class="sch-port" data-schematic-port-id="source_port_0_2__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="276.09254498718" cy="433.93316195372" r="3.0848329048839997" stroke-width="3.0848329048839997px"/><rect x="273.007712082296" y="430.848329048836" width="6.1696658097679995" height="6.1696658097679995" opacity="0"/></g><text class="pin-number sch-pin-number" x="306.94087403602" y="430.848329048836" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="23.136246786629997px" transform=""></text><text class="pin-number sch-pin-label" x="353.21336760928" y="433.93316195372" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="23.136246786629997px" transform="">schematic_port_2</text><line class="component-pin sch-component-pin sch-port-line" x1="337.78920308486" y1="464.78149100256" x2="279.177377892064" y2="464.78149100256" stroke-width="3.0848329048839997px"/><g class="sch-port" data-schematic-port-id="source_port_0_3__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="276.09254498718" cy="464.78149100256" r="3.0848329048839997" stroke-width="3.0848329048839997px"/><rect x="273.007712082296" y="461.696658097676" width="6.1696658097679995" height="6.1696658097679995" opacity="0"/></g><text class="pin-number sch-pin-number" x="306.94087403602" y="461.696658097676" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="23.136246786629997px" transform=""></text><text class="pin-number sch-pin-label" x="353.21336760928" y="464.78149100256" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="23.136246786629997px" transform="">schematic_port_3</text><line class="component-pin sch-component-pin sch-port-line" x1="399.48586118254" y1="464.78149100256" x2="461.18251928022" y2="464.78149100256" stroke-width="3.0848329048839997px"/><g class="sch-port" data-schematic-port-id="source_port_0_4__stack1"><rect x="458.09768637533597" y="461.696658097676" width="6.1696658097679995" height="6.1696658097679995" opacity="0"/></g><text class="pin-number sch-pin-number" x="430.33419023138003" y="461.696658097676" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="23.136246786629997px" transform=""></text><text class="pin-number sch-pin-label" x="384.06169665812" y="464.78149100256" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="23.136246786629997px" transform="">schematic_port_4</text><line class="component-pin sch-component-pin sch-port-line" x1="399.48586118254" y1="433.93316195372" x2="458.097686375336" y2="433.93316195372" stroke-width="3.0848329048839997px"/><g class="sch-port" data-schematic-port-id="source_port_0_5__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="461.18251928022" cy="433.93316195372" r="3.0848329048839997" stroke-width="3.0848329048839997px"/><rect x="458.09768637533597" y="430.848329048836" width="6.1696658097679995" height="6.1696658097679995" opacity="0"/></g><text class="pin-number sch-pin-number" x="430.33419023138003" y="430.848329048836" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="23.136246786629997px" transform=""></text><text class="pin-number sch-pin-label" x="384.06169665812" y="433.93316195372" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="23.136246786629997px" transform="">schematic_port_5</text><line class="component-pin sch-component-pin sch-port-line" x1="399.48586118254" y1="403.08483290488" x2="458.097686375336" y2="403.08483290488" stroke-width="3.0848329048839997px"/><g class="sch-port" data-schematic-port-id="source_port_0_6__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="461.18251928022" cy="403.08483290488" r="3.0848329048839997" stroke-width="3.0848329048839997px"/><rect x="458.09768637533597" y="399.99999999999596" width="6.1696658097679995" height="6.1696658097679995" opacity="0"/></g><text class="pin-number sch-pin-number" x="430.33419023138003" y="399.999999999996" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="23.136246786629997px" transform=""></text><text class="pin-number sch-pin-label" x="384.06169665812" y="403.08483290488" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="23.136246786629997px" transform="">schematic_port_6</text><line class="component-pin sch-component-pin sch-port-line" x1="399.48586118254" y1="372.23650385604" x2="458.097686375336" y2="372.23650385604" stroke-width="3.0848329048839997px"/><g class="sch-port" data-schematic-port-id="source_port_0_7__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="461.18251928022" cy="372.23650385604" r="3.0848329048839997" stroke-width="3.0848329048839997px"/><rect x="458.09768637533597" y="369.15167095115595" width="6.1696658097679995" height="6.1696658097679995" opacity="0"/></g><text class="pin-number sch-pin-number" x="430.33419023138003" y="369.151670951156" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="23.136246786629997px" transform=""></text><text class="pin-number sch-pin-label" x="384.06169665812" y="372.23650385604" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="23.136246786629997px" transform="">schematic_port_7</text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_1__stack1"><rect class="component chip sch-component-body" x="805.912596401007" y="327.506426735222" width="50.899742930585944" height="141.13110539844297" stroke-width="3.0848329048839997px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="805.912596401007" y="327.506426735222" width="50.899742930585944" height="141.13110539844297" fill="transparent"/><text class="sch-text" x="831.3624678663" y="398.0719794344435" fill="#0f172a" text-anchor="middle" dominant-baseline="middle" font-family="sans-serif" font-size="27.763496143955997px" transform="rotate(0, 831.3624678663, 398.0719794344435)">schematic_component_1</text><line class="component-pin sch-component-pin sch-port-line" x1="805.912596401007" y1="418.5089974293" x2="744.215938303327" y2="418.5089974293" stroke-width="3.0848329048839997px"/><g class="sch-port" data-schematic-port-id="source_port_1_0__stack1"><rect x="741.131105398443" y="415.42416452441597" width="6.1696658097679995" height="6.1696658097679995" opacity="0"/></g><text class="pin-number sch-pin-number" x="775.064267352167" y="415.42416452441597" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="23.136246786629997px" transform=""></text><text class="pin-number sch-pin-label" x="821.3367609254269" y="418.5089974293" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="23.136246786629997px" transform="">schematic_port_8</text><line class="component-pin sch-component-pin sch-port-line" x1="856.812339331593" y1="418.5089974293" x2="915.424164524389" y2="418.5089974293" stroke-width="3.0848329048839997px"/><g class="sch-port" data-schematic-port-id="source_port_1_1__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="918.508997429273" cy="418.5089974293" r="3.0848329048839997" stroke-width="3.0848329048839997px"/><rect x="915.424164524389" y="415.42416452441597" width="6.1696658097679995" height="6.1696658097679995" opacity="0"/></g><text class="pin-number sch-pin-number" x="887.660668380433" y="415.42416452441597" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="23.136246786629997px" transform=""></text><text class="pin-number sch-pin-label" x="841.388174807173" y="418.5089974293" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="23.136246786629997px" transform="">schematic_port_9</text></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_0__stack1"><circle cx="276.09254498718" cy="372.23650385604" r="6.1696658097679995" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_1__stack1"><circle cx="276.09254498718" cy="403.08483290488" r="6.1696658097679995" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_2__stack1"><circle cx="276.09254498718" cy="433.93316195372" r="6.1696658097679995" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_3__stack1"><circle cx="276.09254498718" cy="464.78149100256" r="6.1696658097679995" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_4__stack1"><circle cx="461.18251928022" cy="464.78149100256" r="6.1696658097679995" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_5__stack1"><circle cx="461.18251928022" cy="433.93316195372" r="6.1696658097679995" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_6__stack1"><circle cx="461.18251928022" cy="403.08483290488" r="6.1696658097679995" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_7__stack1"><circle cx="461.18251928022" cy="372.23650385604" r="6.1696658097679995" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_1_0__stack1"><circle cx="744.215938303327" cy="418.5089974293" r="6.1696658097679995" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_1_1__stack1"><circle cx="918.508997429273" cy="418.5089974293" r="6.1696658097679995" fill="red" opacity="0"/></g><text class="sch-text" x="356.298200514164" y="323.650385604117" fill="#7e22ce" text-anchor="middle" dominant-baseline="middle" font-family="sans-serif" font-size="27.763496143955997px" transform="rotate(0, 356.298200514164, 323.650385604117)">U1</text><text class="sch-text" x="602.6992287917735" y="396.915167095112" fill="#047857" text-anchor="middle" dominant-baseline="middle" font-family="sans-serif" font-size="27.763496143955997px" transform="rotate(0, 602.6992287917735, 396.915167095112)">XXXXXXXXXXXXXX</text><rect class="schematic-box sch-box" x="328.53470437020803" y="304.370179948592" width="55.52699228791198" height="38.56041131105002" stroke-width="3.0848329048839997px" stroke="rgb(132, 0, 0)" fill="transparent" stroke-dasharray="24.678663239071998 12.339331619535999"/>
74
+ </g>
75
+ </svg>
@@ -0,0 +1,71 @@
1
+ <svg width="2416" height="1200" viewBox="0 0 2416 1200" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Solver debug visualization on the left and Circuit JSON schematic on the right">
2
+ <g transform="translate(0, 0) scale(1.875, 1.875) translate(0, 0)">
3
+ <rect width="100%" height="100%" fill="white"/><g><polyline data-points="0.5,-0.1 1,-0.1 1,0.5" data-type="line" data-label="" points="413.33333333333337,394.66666666666663 600,394.66666666666663 600,170.66666666666666" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="0.5,0.3 0.95,0.3" data-type="line" data-label="" points="413.33333333333337,245.33333333333331 581.3333333333333,245.33333333333331" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="0.5,0.1 0.95,0.1" data-type="line" data-label="" points="413.33333333333337,320 581.3333333333333,320" fill="none" stroke="purple" stroke-width="1px"/></g><g><rect data-type="rect" data-label="U1" data-x="0" data-y="0.1" x="40" y="170.66666666666669" width="373.33333333333337" height="298.66666666666663" fill="hsl(164, 100%, 50%, 0.8)" stroke="black" stroke-width="0.0026785714285714286"/></g><g><rect data-type="rect" data-label="INLINE netId: SCL
4
+ axis: x
5
+ side: y+" data-x="0.725" data-y="0.41" x="441.33333333333337" y="181.86666666666667" width="111.99999999999994" height="44.79999999999998" fill="hsl(196, 100%, 50%, 0.35)" stroke="black" stroke-width="0.0026785714285714286"/></g><g><rect data-type="rect" data-label="INLINE netId: SDA
6
+ axis: x
7
+ side: y+" data-x="0.725" data-y="0.21000000000000002" x="441.33333333333337" y="256.5333333333333" width="111.99999999999994" height="44.80000000000001" fill="hsl(216, 100%, 50%, 0.35)" stroke="black" stroke-width="0.0026785714285714286"/></g><text data-type="text" data-label="SCL" data-x="0.575" data-y="0.41" x="441.3333333333333" y="204.26666666666665" fill="green" font-size="44.8" font-family="sans-serif" text-anchor="start" dominant-baseline="central">SCL</text><text data-type="text" data-label="SDA" data-x="0.575" data-y="0.21000000000000002" x="441.3333333333333" y="278.9333333333333" fill="green" font-size="44.8" font-family="sans-serif" text-anchor="start" dominant-baseline="central">SDA</text><g><circle data-type="point" data-label="U1.scl
8
+ x+" data-x="0.5" data-y="0.3" cx="413.33333333333337" cy="245.33333333333331" r="3" fill="hsl(202, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.sda
9
+ x+" data-x="0.5" data-y="0.1" cx="413.33333333333337" cy="320" r="3" fill="hsl(222, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.vcc
10
+ x+" data-x="0.5" data-y="-0.1" cx="413.33333333333337" cy="394.66666666666663" r="3" fill="hsl(196, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="inline anchor
11
+ SCL" data-x="0.725" data-y="0.3" cx="497.3333333333333" cy="245.33333333333331" r="3" fill="green"/></g><g><circle data-type="point" data-label="inline anchor
12
+ SDA" data-x="0.725" data-y="0.1" cx="497.3333333333333" cy="320" r="3" fill="green"/></g><g id="crosshair" style="display: none"><line id="crosshair-h" y1="0" y2="640" stroke="#666" stroke-width="0.5"/><line id="crosshair-v" x1="0" x2="640" stroke="#666" stroke-width="0.5"/><text id="coordinates" font-family="monospace" font-size="12" fill="#666"></text></g><script><![CDATA[
13
+ document.currentScript.parentElement.addEventListener('mousemove', (e) => {
14
+ const svg = e.currentTarget;
15
+ const rect = svg.getBoundingClientRect();
16
+ const x = e.clientX - rect.left;
17
+ const y = e.clientY - rect.top;
18
+ const crosshair = svg.getElementById('crosshair');
19
+ const h = svg.getElementById('crosshair-h');
20
+ const v = svg.getElementById('crosshair-v');
21
+ const coords = svg.getElementById('coordinates');
22
+
23
+ crosshair.style.display = 'block';
24
+ h.setAttribute('x1', '0');
25
+ h.setAttribute('x2', '640');
26
+ h.setAttribute('y1', y);
27
+ h.setAttribute('y2', y);
28
+ v.setAttribute('x1', x);
29
+ v.setAttribute('x2', x);
30
+ v.setAttribute('y1', '0');
31
+ v.setAttribute('y2', '640');
32
+
33
+ // Calculate real coordinates using inverse transformation
34
+ const matrix = {"a":373.3333333333333,"c":0,"e":226.66666666666669,"b":0,"d":-373.3333333333333,"f":357.3333333333333};
35
+ // Manually invert and apply the affine transform
36
+ // Since we only use translate and scale, we can directly compute:
37
+ // x' = (x - tx) / sx
38
+ // y' = (y - ty) / sy
39
+ const sx = matrix.a;
40
+ const sy = matrix.d;
41
+ const tx = matrix.e;
42
+ const ty = matrix.f;
43
+ const realPoint = {
44
+ x: (x - tx) / sx,
45
+ y: (y - ty) / sy // Flip y back since we used negative scale
46
+ }
47
+
48
+ coords.textContent = `(${realPoint.x.toFixed(2)}, ${realPoint.y.toFixed(2)})`;
49
+ coords.setAttribute('x', (x + 5).toString());
50
+ coords.setAttribute('y', (y - 5).toString());
51
+ });
52
+ document.currentScript.parentElement.addEventListener('mouseleave', () => {
53
+ document.currentScript.parentElement.getElementById('crosshair').style.display = 'none';
54
+ });
55
+ ]]></script>
56
+ </g>
57
+ <g transform="translate(1216, 200)">
58
+ <style>
59
+ .boundary { fill: rgb(245, 241, 237); }
60
+ .schematic-boundary { fill: none; stroke: #fff; }
61
+ .component { fill: none; stroke: rgb(132, 0, 0); }
62
+ .chip { fill: rgb(255, 255, 194); stroke: rgb(132, 0, 0); }
63
+ .component-pin { fill: none; stroke: rgb(132, 0, 0); }
64
+ .text { font-family: sans-serif; fill: rgb(0, 150, 0); }
65
+ .pin-number { fill: rgb(169, 0, 0); }
66
+ .port-label { fill: rgb(0, 100, 100); }
67
+ .component-name { fill: rgb(0, 100, 100); }
68
+
69
+ </style><rect class="boundary" x="0" y="0" width="1200" height="800"/><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_0__stack1"><path d="M 628.1081081080999 497.29729729734 L 844.3243243243 497.29729729734 L 844.3243243243 237.8378378379" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="69.189189189184px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 628.1081081080999 497.29729729734 L 844.3243243243 497.29729729734 L 844.3243243243 237.8378378379" stroke="rgb(0, 150, 0)" fill="none" stroke-width="8.648648648648px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_1__stack1"><path d="M 628.1081081080999 324.32432432438 L 822.70270270268 324.32432432438" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="69.189189189184px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 628.1081081080999 324.32432432438 L 822.70270270268 324.32432432438" stroke="rgb(0, 150, 0)" fill="none" stroke-width="8.648648648648px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_2__stack1"><path d="M 628.1081081080999 410.81081081086 L 822.70270270268 410.81081081086" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="69.189189189184px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 628.1081081080999 410.81081081086 L 822.70270270268 410.81081081086" stroke="rgb(0, 150, 0)" fill="none" stroke-width="8.648648648648px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_0__stack1"/><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_1__stack1"/><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_2__stack1"/><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_0__stack1"><rect class="component chip sch-component-body" x="368.64864864866" y="237.8378378379" width="86.48648648647998" height="345.94594594592" stroke-width="8.648648648648px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="368.64864864866" y="237.8378378379" width="86.48648648647998" height="345.94594594592" fill="transparent"/><text class="sch-text" x="411.8918918919" y="410.81081081086" fill="#0f172a" text-anchor="middle" dominant-baseline="middle" font-family="sans-serif" font-size="77.837837837832px" transform="rotate(0, 411.8918918919, 410.81081081086)">U1</text><line class="component-pin sch-component-pin sch-port-line" x1="455.13513513514" y1="324.32432432438" x2="628.1081081080999" y2="324.32432432438" stroke-width="8.648648648648px"/><g class="sch-port" data-schematic-port-id="source_port_0_0__stack1"><rect x="619.459459459452" y="315.67567567573195" width="17.297297297296" height="17.297297297296" opacity="0"/></g><text class="pin-number sch-pin-number" x="541.62162162162" y="315.675675675732" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="64.86486486486px" transform=""></text><text class="pin-number sch-pin-label" x="411.8918918919" y="324.32432432438" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="64.86486486486px" transform="">scl</text><line class="component-pin sch-component-pin sch-port-line" x1="455.13513513514" y1="410.81081081086" x2="628.1081081080999" y2="410.81081081086" stroke-width="8.648648648648px"/><g class="sch-port" data-schematic-port-id="source_port_0_1__stack1"><rect x="619.459459459452" y="402.162162162212" width="17.297297297296" height="17.297297297296" opacity="0"/></g><text class="pin-number sch-pin-number" x="541.62162162162" y="402.162162162212" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="64.86486486486px" transform=""></text><text class="pin-number sch-pin-label" x="411.8918918919" y="410.81081081086" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="64.86486486486px" transform="">sda</text><line class="component-pin sch-component-pin sch-port-line" x1="455.13513513514" y1="497.29729729734" x2="628.1081081080999" y2="497.29729729734" stroke-width="8.648648648648px"/><g class="sch-port" data-schematic-port-id="source_port_0_2__stack1"><rect x="619.459459459452" y="488.64864864869196" width="17.297297297296" height="17.297297297296" opacity="0"/></g><text class="pin-number sch-pin-number" x="541.62162162162" y="488.648648648692" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="64.86486486486px" transform=""></text><text class="pin-number sch-pin-label" x="411.8918918919" y="497.29729729734" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="64.86486486486px" transform="">vcc</text></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_0__stack1"><circle cx="628.1081081080999" cy="324.32432432438" r="17.297297297296" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_1__stack1"><circle cx="628.1081081080999" cy="410.81081081086" r="17.297297297296" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_2__stack1"><circle cx="628.1081081080999" cy="497.29729729734" r="17.297297297296" fill="red" opacity="0"/></g><text class="sch-text" x="725.40540540539" y="276.756756756816" fill="#047857" text-anchor="middle" dominant-baseline="middle" font-family="sans-serif" font-size="51.891891891887994px" transform="rotate(0, 725.40540540539, 276.756756756816)">XXX</text><text class="sch-text" x="725.40540540539" y="363.243243243296" fill="#047857" text-anchor="middle" dominant-baseline="middle" font-family="sans-serif" font-size="51.891891891887994px" transform="rotate(0, 725.40540540539, 363.243243243296)">XXX</text>
70
+ </g>
71
+ </svg>
@@ -11,8 +11,10 @@ const inlineConnection = (
11
11
  pinIds: [string, string],
12
12
  fallbackNetLabelWidth: number,
13
13
  inlineNetLabelWidth: number,
14
+ netLabelText?: string,
14
15
  ): InputDirectConnection => ({
15
16
  netId,
17
+ netLabelText,
16
18
  pinIds,
17
19
  allowInlineNetLabel: true,
18
20
  fallbackNetLabelWidth,
@@ -52,7 +54,7 @@ const routedInputProblem: InputProblem = {
52
54
  },
53
55
  ],
54
56
  directConnections: [
55
- inlineConnection("OUT_A_P", ["J4.1", "U1.4"], 0.96, 0.64),
57
+ inlineConnection("OUT_A_P", ["J4.1", "U1.4"], 0.96, 0.64, "OUT A+"),
56
58
  inlineConnection("OUT_A_N", ["J4.2", "U1.6"], 0.96, 0.64),
57
59
  inlineConnection("OUT_B_N", ["J4.3", "U1.7"], 0.96, 0.64),
58
60
  inlineConnection("OUT_B_P", ["J4.4", "U1.9"], 0.96, 0.64),
@@ -104,6 +106,11 @@ test("fallback label width does not split routable inline connections", () => {
104
106
  (placement) => placement.stubTracePath === undefined,
105
107
  ),
106
108
  ).toBe(true)
109
+ expect(
110
+ output.inlineNetLabelPlacements.find(
111
+ (placement) => placement.netId === "OUT_A_P",
112
+ )?.netLabelText,
113
+ ).toBe("OUT A+")
107
114
 
108
115
  expect(solver).toMatchSolverSnapshot(import.meta.path)
109
116
  })
@@ -129,6 +136,7 @@ test("fallback label width sizes anchored labels when routing is skipped", () =>
129
136
  directConnections: [
130
137
  {
131
138
  netId: "SIGNAL",
139
+ netLabelText: "User-facing signal",
132
140
  pinIds: ["U1.1", "U2.1"],
133
141
  allowInlineNetLabel: true,
134
142
  fallbackNetLabelWidth: 0.96,
@@ -149,4 +157,5 @@ test("fallback label width sizes anchored labels when routing is skipped", () =>
149
157
  expect(Math.max(fallbackPlacement!.width, fallbackPlacement!.height)).toBe(
150
158
  0.96,
151
159
  )
160
+ expect(fallbackPlacement!.netLabelText).toBe("User-facing signal")
152
161
  })
@@ -0,0 +1,102 @@
1
+ import { expect, test } from "bun:test"
2
+ import { InlineNetLabelSolver } from "lib/solvers/InlineNetLabelSolver/InlineNetLabelSolver"
3
+ import type { NetLabelPlacement } from "lib/solvers/NetLabelPlacementSolver/NetLabelPlacementSolver"
4
+ import type { SolvedTracePath } from "lib/solvers/SchematicTraceLinesSolver/SchematicTraceLinesSolver"
5
+ import type { InputProblem } from "lib/types/InputProblem"
6
+ import "tests/fixtures/matcher"
7
+
8
+ test("terminal inline-label stubs stop before an unrelated trace", () => {
9
+ const inputProblem: InputProblem = {
10
+ chips: [
11
+ {
12
+ chipId: "U1",
13
+ center: { x: 0, y: 0.1 },
14
+ width: 1,
15
+ height: 0.8,
16
+ pins: [
17
+ { pinId: "U1.scl", x: 0.5, y: 0.3, _facingDirection: "x+" },
18
+ { pinId: "U1.sda", x: 0.5, y: 0.1, _facingDirection: "x+" },
19
+ { pinId: "U1.vcc", x: 0.5, y: -0.1, _facingDirection: "x+" },
20
+ ],
21
+ },
22
+ ],
23
+ directConnections: [],
24
+ netConnections: [
25
+ {
26
+ netId: "SCL",
27
+ pinIds: ["U1.scl"],
28
+ allowInlineNetLabel: true,
29
+ inlineNetLabelWidth: 0.3,
30
+ inlineNetLabelHeight: 0.12,
31
+ },
32
+ {
33
+ netId: "SDA",
34
+ pinIds: ["U1.sda"],
35
+ allowInlineNetLabel: true,
36
+ inlineNetLabelWidth: 0.3,
37
+ inlineNetLabelHeight: 0.12,
38
+ },
39
+ ],
40
+ availableNetLabelOrientations: {
41
+ SCL: ["x+"],
42
+ SDA: ["x+"],
43
+ },
44
+ }
45
+ const netLabelPlacements: NetLabelPlacement[] = [
46
+ {
47
+ globalConnNetId: "SCL",
48
+ netId: "SCL",
49
+ mspConnectionPairIds: [],
50
+ pinIds: ["U1.scl"],
51
+ orientation: "x+",
52
+ anchorPoint: { x: 0.5, y: 0.3 },
53
+ center: { x: 0.8, y: 0.3 },
54
+ width: 0.3,
55
+ height: 0.12,
56
+ },
57
+ {
58
+ globalConnNetId: "SDA",
59
+ netId: "SDA",
60
+ mspConnectionPairIds: [],
61
+ pinIds: ["U1.sda"],
62
+ orientation: "x+",
63
+ anchorPoint: { x: 0.5, y: 0.1 },
64
+ center: { x: 0.8, y: 0.1 },
65
+ width: 0.3,
66
+ height: 0.12,
67
+ },
68
+ ]
69
+ const traces: SolvedTracePath[] = [
70
+ {
71
+ mspPairId: "available-net-orientation-VCC",
72
+ dcConnNetId: "VCC",
73
+ globalConnNetId: "VCC",
74
+ pins: [] as any,
75
+ tracePath: [
76
+ { x: 0.5, y: -0.1 },
77
+ { x: 1, y: -0.1 },
78
+ { x: 1, y: 0.5 },
79
+ ],
80
+ mspConnectionPairIds: [],
81
+ pinIds: ["U1.vcc"],
82
+ },
83
+ ]
84
+
85
+ const solver = new InlineNetLabelSolver({
86
+ inputProblem,
87
+ traces,
88
+ netLabelPlacements,
89
+ })
90
+ solver.solve()
91
+
92
+ const placements = solver.getOutput().inlineNetLabelPlacements
93
+ expect(placements).toHaveLength(2)
94
+ for (const placement of placements) {
95
+ const [start, end] = placement.stubTracePath!
96
+ expect(end.x).toBeCloseTo(0.95)
97
+ expect(end.x).toBeLessThan(1)
98
+ expect(end.x - start.x).toBeGreaterThanOrEqual(placement.width + 0.1)
99
+ }
100
+
101
+ expect(solver).toMatchSolverSnapshot(import.meta.path)
102
+ })
@@ -1,4 +1,6 @@
1
- <svg width="640" height="640" viewBox="0 0 640 640" xmlns="http://www.w3.org/2000/svg"><rect width="100%" height="100%" fill="white"/><g><polyline data-points="1.15,-0.30000000000000004 1.8499999999999996,-0.3000000000000007" data-type="line" data-label="" points="336.1256544502618,395.86387434554973 387.43455497382195,395.8638743455498" fill="none" stroke="hsl(160, 100%, 50%, 0.1)" stroke-width="1px"/></g><g><polyline data-points="2.95,-0.3000000000000007 3.6500000000000004,-0.3000000000000007" data-type="line" data-label="" points="468.0628272251309,395.8638743455498 519.3717277486911,395.8638743455498" fill="none" stroke="hsl(48, 100%, 50%, 0.1)" stroke-width="1px"/></g><g><polyline data-points="-1.15,0.30000000000000004 -1.1500000000000004,1.15" data-type="line" data-label="" points="167.5392670157068,351.8848167539267 167.5392670157068,289.58115183246076" fill="none" stroke="hsl(280, 100%, 50%, 0.1)" stroke-width="1px"/></g><g><polyline data-points="-1.15,0.10000000000000003 -1.85,0.10000000000000002" data-type="line" data-label="" points="167.5392670157068,366.5445026178011 116.2303664921466,366.5445026178011" fill="none" stroke="hsl(48, 100%, 50%, 0.1)" stroke-width="1px"/></g><g><polyline data-points="-1.15,0.30000000000000004 -1.3499999999999999,0.30000000000000004 -1.3499999999999999,0.7250000000000001 -1.1500000000000004,0.7250000000000001 -1.1500000000000004,1.15" data-type="line" data-label="" points="167.5392670157068,351.8848167539267 152.87958115183247,351.8848167539267 152.87958115183247,320.73298429319374 167.5392670157068,320.73298429319374 167.5392670157068,289.58115183246076" fill="none" stroke="red" stroke-width="1px" stroke-dasharray="4 4"/></g><g><polyline data-points="-1.15,0.30000000000000004 -1.1500000000000004,1.15" data-type="line" data-label="" points="167.5392670157068,351.8848167539267 167.5392670157068,289.58115183246076" fill="none" stroke="blue" stroke-width="1px" stroke-dasharray="5 5"/></g><g><polyline data-points="-1.15,0.30000000000000004 -1.3499999999999999,0.30000000000000004 -1.3499999999999999,0.7250000000000001 -1.1500000000000004,0.7250000000000001 -1.1500000000000004,1.15" data-type="line" data-label="" points="167.5392670157068,351.8848167539267 152.87958115183247,351.8848167539267 152.87958115183247,320.73298429319374 167.5392670157068,320.73298429319374 167.5392670157068,289.58115183246076" fill="none" stroke="green" stroke-width="1px"/></g><g><rect data-type="rect" data-label="schematic_component_0" data-x="0" data-y="0" x="167.5392670157068" y="337.22513089005236" width="168.58638743455498" height="73.29842931937173" fill="hsl(24, 100%, 50%, 0.1)" stroke="black" stroke-width="0.013642857142857144"/></g><g><rect data-type="rect" data-label="schematic_component_1" data-x="-1.1500000000000004" data-y="1.6700000000000002" x="129.4240837696335" y="213.3507853403141" width="76.2303664921466" height="76.23036649214663" fill="hsl(24, 100%, 50%, 0.1)" stroke="black" stroke-width="0.013642857142857144"/></g><g><rect data-type="rect" data-label="schematic_component_2" data-x="-2.37" data-y="0.10000000000000009" x="40.000000000000014" y="346.75392670157066" width="76.2303664921466" height="39.58115183246076" fill="hsl(24, 100%, 50%, 0.1)" stroke="black" stroke-width="0.013642857142857144"/></g><g><rect data-type="rect" data-label="schematic_component_3" data-x="2.4" data-y="-0.3000000000000007" x="387.43455497382195" y="365.07853403141365" width="80.62827225130894" height="61.57068062827227" fill="hsl(24, 100%, 50%, 0.1)" stroke="black" stroke-width="0.013642857142857144"/></g><g><rect data-type="rect" data-label="schematic_component_4" data-x="4.2" data-y="-0.3000000000000007" x="519.371727748691" y="365.07853403141365" width="80.62827225130889" height="61.57068062827227" fill="hsl(24, 100%, 50%, 0.1)" stroke="black" stroke-width="0.013642857142857144"/></g><g><circle data-type="point" data-label="U1.1
1
+ <svg width="2416" height="1200" viewBox="0 0 2416 1200" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Solver debug visualization on the left and Circuit JSON schematic on the right">
2
+ <g transform="translate(0, 0) scale(1.875, 1.875) translate(0, 0)">
3
+ <rect width="100%" height="100%" fill="white"/><g><polyline data-points="1.15,-0.30000000000000004 1.8499999999999996,-0.3000000000000007" data-type="line" data-label="" points="336.1256544502618,395.86387434554973 387.43455497382195,395.8638743455498" fill="none" stroke="hsl(160, 100%, 50%, 0.1)" stroke-width="1px"/></g><g><polyline data-points="2.95,-0.3000000000000007 3.6500000000000004,-0.3000000000000007" data-type="line" data-label="" points="468.0628272251309,395.8638743455498 519.3717277486911,395.8638743455498" fill="none" stroke="hsl(48, 100%, 50%, 0.1)" stroke-width="1px"/></g><g><polyline data-points="-1.15,0.30000000000000004 -1.1500000000000004,1.15" data-type="line" data-label="" points="167.5392670157068,351.8848167539267 167.5392670157068,289.58115183246076" fill="none" stroke="hsl(280, 100%, 50%, 0.1)" stroke-width="1px"/></g><g><polyline data-points="-1.15,0.10000000000000003 -1.85,0.10000000000000002" data-type="line" data-label="" points="167.5392670157068,366.5445026178011 116.2303664921466,366.5445026178011" fill="none" stroke="hsl(48, 100%, 50%, 0.1)" stroke-width="1px"/></g><g><polyline data-points="-1.15,0.30000000000000004 -1.3499999999999999,0.30000000000000004 -1.3499999999999999,0.7250000000000001 -1.1500000000000004,0.7250000000000001 -1.1500000000000004,1.15" data-type="line" data-label="" points="167.5392670157068,351.8848167539267 152.87958115183247,351.8848167539267 152.87958115183247,320.73298429319374 167.5392670157068,320.73298429319374 167.5392670157068,289.58115183246076" fill="none" stroke="red" stroke-width="1px" stroke-dasharray="4 4"/></g><g><polyline data-points="-1.15,0.30000000000000004 -1.1500000000000004,1.15" data-type="line" data-label="" points="167.5392670157068,351.8848167539267 167.5392670157068,289.58115183246076" fill="none" stroke="blue" stroke-width="1px" stroke-dasharray="5 5"/></g><g><polyline data-points="-1.15,0.30000000000000004 -1.3499999999999999,0.30000000000000004 -1.3499999999999999,0.7250000000000001 -1.1500000000000004,0.7250000000000001 -1.1500000000000004,1.15" data-type="line" data-label="" points="167.5392670157068,351.8848167539267 152.87958115183247,351.8848167539267 152.87958115183247,320.73298429319374 167.5392670157068,320.73298429319374 167.5392670157068,289.58115183246076" fill="none" stroke="green" stroke-width="1px"/></g><g><rect data-type="rect" data-label="schematic_component_0" data-x="0" data-y="0" x="167.5392670157068" y="337.22513089005236" width="168.58638743455498" height="73.29842931937173" fill="hsl(24, 100%, 50%, 0.1)" stroke="black" stroke-width="0.013642857142857144"/></g><g><rect data-type="rect" data-label="schematic_component_1" data-x="-1.1500000000000004" data-y="1.6700000000000002" x="129.4240837696335" y="213.3507853403141" width="76.2303664921466" height="76.23036649214663" fill="hsl(24, 100%, 50%, 0.1)" stroke="black" stroke-width="0.013642857142857144"/></g><g><rect data-type="rect" data-label="schematic_component_2" data-x="-2.37" data-y="0.10000000000000009" x="40.000000000000014" y="346.75392670157066" width="76.2303664921466" height="39.58115183246076" fill="hsl(24, 100%, 50%, 0.1)" stroke="black" stroke-width="0.013642857142857144"/></g><g><rect data-type="rect" data-label="schematic_component_3" data-x="2.4" data-y="-0.3000000000000007" x="387.43455497382195" y="365.07853403141365" width="80.62827225130894" height="61.57068062827227" fill="hsl(24, 100%, 50%, 0.1)" stroke="black" stroke-width="0.013642857142857144"/></g><g><rect data-type="rect" data-label="schematic_component_4" data-x="4.2" data-y="-0.3000000000000007" x="519.371727748691" y="365.07853403141365" width="80.62827225130889" height="61.57068062827227" fill="hsl(24, 100%, 50%, 0.1)" stroke="black" stroke-width="0.013642857142857144"/></g><g><circle data-type="point" data-label="U1.1
2
4
  x-" data-x="-1.15" data-y="0.30000000000000004" cx="167.5392670157068" cy="351.8848167539267" r="3" fill="hsl(319, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.2
3
5
  x-" data-x="-1.15" data-y="0.10000000000000003" cx="167.5392670157068" cy="366.5445026178011" r="3" fill="hsl(320, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.3
4
6
  x-" data-x="-1.15" data-y="-0.09999999999999998" cx="167.5392670157068" cy="381.2041884816754" r="3" fill="hsl(321, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.4
@@ -24,7 +26,7 @@ x+" data-x="4.75" data-y="-0.3000000000000007" cx="600" cy="395.8638743455498" r
24
26
  const h = svg.getElementById('crosshair-h');
25
27
  const v = svg.getElementById('crosshair-v');
26
28
  const coords = svg.getElementById('coordinates');
27
-
29
+
28
30
  crosshair.style.display = 'block';
29
31
  h.setAttribute('x1', '0');
30
32
  h.setAttribute('x2', '640');
@@ -43,13 +45,13 @@ x+" data-x="4.75" data-y="-0.3000000000000007" cx="600" cy="395.8638743455498" r
43
45
  // y' = (y - ty) / sy
44
46
  const sx = matrix.a;
45
47
  const sy = matrix.d;
46
- const tx = matrix.e;
48
+ const tx = matrix.e;
47
49
  const ty = matrix.f;
48
50
  const realPoint = {
49
51
  x: (x - tx) / sx,
50
52
  y: (y - ty) / sy // Flip y back since we used negative scale
51
53
  }
52
-
54
+
53
55
  coords.textContent = `(${realPoint.x.toFixed(2)}, ${realPoint.y.toFixed(2)})`;
54
56
  coords.setAttribute('x', (x + 5).toString());
55
57
  coords.setAttribute('y', (y - 5).toString());
@@ -57,4 +59,20 @@ x+" data-x="4.75" data-y="-0.3000000000000007" cx="600" cy="395.8638743455498" r
57
59
  document.currentScript.parentElement.addEventListener('mouseleave', () => {
58
60
  document.currentScript.parentElement.getElementById('crosshair').style.display = 'none';
59
61
  });
60
- ]]></script></svg>
62
+ ]]></script>
63
+ </g>
64
+ <g transform="translate(1216, 200)">
65
+ <style>
66
+ .boundary { fill: rgb(245, 241, 237); }
67
+ .schematic-boundary { fill: none; stroke: #fff; }
68
+ .component { fill: none; stroke: rgb(132, 0, 0); }
69
+ .chip { fill: rgb(255, 255, 194); stroke: rgb(132, 0, 0); }
70
+ .component-pin { fill: none; stroke: rgb(132, 0, 0); }
71
+ .text { font-family: sans-serif; fill: rgb(0, 150, 0); }
72
+ .pin-number { fill: rgb(169, 0, 0); }
73
+ .port-label { fill: rgb(0, 100, 100); }
74
+ .component-name { fill: rgb(0, 100, 100); }
75
+
76
+ </style><rect class="boundary" x="0" y="0" width="1200" height="800"/><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_0__stack1"><path d="M 308.91089108918504 452.42024202417 L 282.5082508251651 452.42024202417 L 282.5082508251651 396.3146314631275 L 308.91089108918493 396.3146314631275 L 308.91089108918493 340.20902090208506" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="21.122112211216px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 308.91089108918504 452.42024202417 L 282.5082508251651 452.42024202417 L 282.5082508251651 396.3146314631275 L 308.91089108918493 396.3146314631275 L 308.91089108918493 340.20902090208506" stroke="rgb(0, 150, 0)" fill="none" stroke-width="2.640264026402px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_0__stack1"/><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_0__stack1"><rect class="component chip sch-component-body" x="361.71617161722503" y="426.01760176015" width="198.01980198015002" height="132.01320132010005" stroke-width="2.640264026402px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="361.71617161722503" y="426.01760176015" width="198.01980198015002" height="132.01320132010005" fill="transparent"/><text class="sch-text" x="460.7260726073" y="492.0242024202" fill="#0f172a" text-anchor="middle" dominant-baseline="middle" font-family="sans-serif" font-size="23.762376237618px" transform="rotate(0, 460.7260726073, 492.0242024202)">U1</text><line class="component-pin sch-component-pin sch-port-line" x1="361.71617161722503" y1="452.42024202417" x2="308.91089108918504" y2="452.42024202417" stroke-width="2.640264026402px"/><g class="sch-port" data-schematic-port-id="source_port_0_0__stack1"><rect x="306.27062706278303" y="449.779977997768" width="5.280528052804" height="5.280528052804" opacity="0"/></g><text class="pin-number sch-pin-number" x="335.313531353205" y="449.779977997768" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="19.801980198015px" transform="">1</text><line class="component-pin sch-component-pin sch-port-line" x1="361.71617161722503" y1="478.82288228819004" x2="311.551155115587" y2="478.82288228819004" stroke-width="2.640264026402px"/><g class="sch-port" data-schematic-port-id="source_port_0_1__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="308.91089108918504" cy="478.82288228819004" r="2.640264026402" stroke-width="2.640264026402px"/><rect x="306.27062706278303" y="476.18261826178804" width="5.280528052804" height="5.280528052804" opacity="0"/></g><text class="pin-number sch-pin-number" x="335.313531353205" y="476.18261826178804" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="19.801980198015px" transform="">2</text><line class="component-pin sch-component-pin sch-port-line" x1="361.71617161722503" y1="505.22552255221" x2="311.551155115587" y2="505.22552255221" stroke-width="2.640264026402px"/><g class="sch-port" data-schematic-port-id="source_port_0_2__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="308.91089108918504" cy="505.22552255221" r="2.640264026402" stroke-width="2.640264026402px"/><rect x="306.27062706278303" y="502.585258525808" width="5.280528052804" height="5.280528052804" opacity="0"/></g><text class="pin-number sch-pin-number" x="335.313531353205" y="502.585258525808" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="19.801980198015px" transform="">3</text><line class="component-pin sch-component-pin sch-port-line" x1="361.71617161722503" y1="531.6281628162301" x2="311.551155115587" y2="531.6281628162301" stroke-width="2.640264026402px"/><g class="sch-port" data-schematic-port-id="source_port_0_3__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="308.91089108918504" cy="531.6281628162301" r="2.640264026402" stroke-width="2.640264026402px"/><rect x="306.27062706278303" y="528.9878987898281" width="5.280528052804" height="5.280528052804" opacity="0"/></g><text class="pin-number sch-pin-number" x="335.313531353205" y="528.987898789828" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="19.801980198015px" transform="">4</text><line class="component-pin sch-component-pin sch-port-line" x1="559.735973597375" y1="531.6281628162301" x2="609.900990099013" y2="531.6281628162301" stroke-width="2.640264026402px"/><g class="sch-port" data-schematic-port-id="source_port_0_4__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="612.541254125415" cy="531.6281628162301" r="2.640264026402" stroke-width="2.640264026402px"/><rect x="609.900990099013" y="528.9878987898281" width="5.280528052804" height="5.280528052804" opacity="0"/></g><text class="pin-number sch-pin-number" x="586.138613861395" y="528.987898789828" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="19.801980198015px" transform="">5</text><line class="component-pin sch-component-pin sch-port-line" x1="559.735973597375" y1="505.22552255221" x2="609.900990099013" y2="505.22552255221" stroke-width="2.640264026402px"/><g class="sch-port" data-schematic-port-id="source_port_0_5__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="612.541254125415" cy="505.22552255221" r="2.640264026402" stroke-width="2.640264026402px"/><rect x="609.900990099013" y="502.585258525808" width="5.280528052804" height="5.280528052804" opacity="0"/></g><text class="pin-number sch-pin-number" x="586.138613861395" y="502.58525852580806" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="19.801980198015px" transform="">6</text><line class="component-pin sch-component-pin sch-port-line" x1="559.735973597375" y1="478.82288228819004" x2="609.900990099013" y2="478.82288228819004" stroke-width="2.640264026402px"/><g class="sch-port" data-schematic-port-id="source_port_0_6__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="612.541254125415" cy="478.82288228819004" r="2.640264026402" stroke-width="2.640264026402px"/><rect x="609.900990099013" y="476.18261826178804" width="5.280528052804" height="5.280528052804" opacity="0"/></g><text class="pin-number sch-pin-number" x="586.138613861395" y="476.18261826178804" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="19.801980198015px" transform="">7</text><line class="component-pin sch-component-pin sch-port-line" x1="559.735973597375" y1="452.42024202417" x2="609.900990099013" y2="452.42024202417" stroke-width="2.640264026402px"/><g class="sch-port" data-schematic-port-id="source_port_0_7__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="612.541254125415" cy="452.42024202417" r="2.640264026402" stroke-width="2.640264026402px"/><rect x="609.900990099013" y="449.779977997768" width="5.280528052804" height="5.280528052804" opacity="0"/></g><text class="pin-number sch-pin-number" x="586.138613861395" y="449.779977997768" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="19.801980198015px" transform="">8</text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_1__stack1"><rect class="component-overlay sch-component-overlay" x="290.42904290437093" y="202.91529152918102" width="35.64356435642702" height="137.29372937290404" fill="transparent"/><path class="sch-component-symbol-path" d="M 308.91089108918493 253.08030803081903 L 326.07260726079795 287.403740374045" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.640264026402px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 290.42904290437093 287.403740374045 L 308.91089108918493 253.08030803081903" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.640264026402px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 326.07260726079795 287.403740374045 L 290.42904290437093 287.403740374045" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.640264026402px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 290.42904290437093 253.08030803081903 L 326.07260726079795 253.08030803081903" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.640264026402px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 308.91089108918493 287.403740374045 L 308.91089108918493 340.20902090208506" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.640264026402px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 308.91089108918493 202.91529152918102 L 308.91089108918493 251.76017601761805" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.640264026402px" stroke-linecap="round"/><text class="sch-component-name sch-component-text" x="278.5478547855619" y="272.88228822883406" stroke="rgb(245, 241, 237)" stroke-width="2.640264026402px" paint-order="stroke" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="end" dominant-baseline="middle" font-size="23.762376237618px">D1</text><text class="sch-component-text" x="349.8349834984159" y="271.562156215633" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="start" dominant-baseline="middle" font-size="23.762376237618px"></text><circle class="component-pin sch-component-pin" cx="308.91089108918493" cy="202.91529152918102" r="2.640264026402px" stroke-width="2.640264026402px" fill="none" stroke="rgb(132, 0, 0)"/></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_2__stack1"><rect class="component-overlay sch-component-overlay" x="79.20792079221101" y="461.661166116577" width="137.293729372904" height="35.643564356426964" fill="transparent"/><path class="sch-component-symbol-path" d="M 129.37293729384902 478.82288228819 L 163.696369637075 461.661166116577" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.640264026402px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 163.696369637075 497.304730473004 L 129.37293729384902 478.82288228819" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.640264026402px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 163.696369637075 461.661166116577 L 163.696369637075 497.304730473004" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.640264026402px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 129.37293729384902 497.304730473004 L 129.37293729384902 461.661166116577" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.640264026402px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 163.696369637075 478.82288228819 L 216.50165016511502 478.82288228819" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.640264026402px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 79.20792079221101 478.82288228819 L 128.05280528064802 478.82288228819" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.640264026402px" stroke-linecap="round"/><text class="sch-component-name sch-component-text" x="149.17491749186402" y="509.185918591813" stroke="rgb(245, 241, 237)" stroke-width="2.640264026402px" paint-order="stroke" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="middle" dominant-baseline="hanging" font-size="23.762376237618px">D2</text><text class="sch-component-text" x="147.85478547866302" y="437.898789878959" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="middle" dominant-baseline="ideographic" font-size="23.762376237618px"></text><circle class="component-pin sch-component-pin" cx="216.50165016511502" cy="478.82288228819" r="2.640264026402px" stroke-width="2.640264026402px" fill="none" stroke="rgb(132, 0, 0)"/><circle class="component-pin sch-component-pin" cx="79.20792079221101" cy="478.82288228819" r="2.640264026402px" stroke-width="2.640264026402px" fill="none" stroke="rgb(132, 0, 0)"/></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_3__stack1"><rect class="component-overlay sch-component-overlay" x="704.950495049485" y="492.8994499449523" width="145.21452145211015" height="77.45742574255547" fill="transparent"/><path class="sch-component-symbol-path" d="M 850.1650165015951 531.6281628162301 L 792.0792079207511 531.6281628162301" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.640264026402px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 763.036303630329 531.6281628162301 L 704.950495049485 531.6281628162301" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.640264026402px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 792.0792079207511 492.8994499449523 L 792.0792079207511 570.3568756875078" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.640264026402px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 763.036303630329 492.8994499449523 L 763.036303630329 570.3568756875078" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.640264026402px" stroke-linecap="round"/><text class="sch-component-name sch-component-text" x="777.55775577554" y="473.54235423538603" stroke="rgb(245, 241, 237)" stroke-width="2.640264026402px" paint-order="stroke" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="middle" dominant-baseline="ideographic" font-size="23.762376237618px">C1</text><text class="sch-component-text" x="777.55775577554" y="589.7139713970741" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="middle" dominant-baseline="hanging" font-size="23.762376237618px"></text><circle class="component-pin sch-component-pin" cx="704.950495049485" cy="531.6281628162301" r="2.640264026402px" stroke-width="2.640264026402px" fill="none" stroke="rgb(132, 0, 0)"/><circle class="component-pin sch-component-pin" cx="850.1650165015951" cy="531.6281628162301" r="2.640264026402px" stroke-width="2.640264026402px" fill="none" stroke="rgb(132, 0, 0)"/></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_4__stack1"><rect class="component-overlay sch-component-overlay" x="942.5742574256651" y="492.8994499449524" width="145.21452145210992" height="77.45742574255542" fill="transparent"/><path class="sch-component-symbol-path" d="M 1087.788778877775 531.6281628162301 L 1029.702970296931 531.6281628162301" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.640264026402px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 1000.660066006509 531.6281628162301 L 942.5742574256651 531.6281628162301" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.640264026402px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 1029.702970296931 492.8994499449524 L 1029.702970296931 570.3568756875078" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.640264026402px" stroke-linecap="round"/><path class="sch-component-symbol-path" d="M 1000.660066006509 492.8994499449524 L 1000.660066006509 570.3568756875078" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.640264026402px" stroke-linecap="round"/><text class="sch-component-name sch-component-text" x="1015.1815181517201" y="473.5423542353861" stroke="rgb(245, 241, 237)" stroke-width="2.640264026402px" paint-order="stroke" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="middle" dominant-baseline="ideographic" font-size="23.762376237618px">C2</text><text class="sch-component-text" x="1015.1815181517201" y="589.713971397074" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="middle" dominant-baseline="hanging" font-size="23.762376237618px"></text><circle class="component-pin sch-component-pin" cx="942.5742574256651" cy="531.6281628162301" r="2.640264026402px" stroke-width="2.640264026402px" fill="none" stroke="rgb(132, 0, 0)"/><circle class="component-pin sch-component-pin" cx="1087.788778877775" cy="531.6281628162301" r="2.640264026402px" stroke-width="2.640264026402px" fill="none" stroke="rgb(132, 0, 0)"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_0__stack1"><circle cx="308.91089108918504" cy="452.42024202417" r="5.280528052804" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_1__stack1"><circle cx="308.91089108918504" cy="478.82288228819004" r="5.280528052804" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_2__stack1"><circle cx="308.91089108918504" cy="505.22552255221" r="5.280528052804" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_3__stack1"><circle cx="308.91089108918504" cy="531.6281628162301" r="5.280528052804" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_4__stack1"><circle cx="612.541254125415" cy="531.6281628162301" r="5.280528052804" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_5__stack1"><circle cx="612.541254125415" cy="505.22552255221" r="5.280528052804" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_6__stack1"><circle cx="612.541254125415" cy="478.82288228819004" r="5.280528052804" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_7__stack1"><circle cx="612.541254125415" cy="452.42024202417" r="5.280528052804" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_1_0__stack1"><circle cx="308.91089108918493" cy="340.20902090208506" r="5.280528052804" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_1_1__stack1"><circle cx="308.91089108918493" cy="202.91529152918105" r="5.280528052804" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_2_0__stack1"><circle cx="216.501650165115" cy="478.82288228819004" r="5.280528052804" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_2_1__stack1"><circle cx="79.20792079221098" cy="478.82288228819" r="5.280528052804" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_3_0__stack1"><circle cx="737.95379537951" cy="531.6281628162301" r="5.280528052804" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_3_1__stack1"><circle cx="883.1683168316201" cy="531.6281628162301" r="5.280528052804" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_4_0__stack1"><circle cx="975.57755775569" cy="531.6281628162301" r="5.280528052804" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_4_1__stack1"><circle cx="1120.7920792078" cy="531.6281628162301" r="5.280528052804" fill="red" opacity="0"/></g>
77
+ </g>
78
+ </svg>
@@ -1,4 +1,6 @@
1
- <svg width="640" height="640" viewBox="0 0 640 640" xmlns="http://www.w3.org/2000/svg"><rect width="100%" height="100%" fill="white"/><g><polyline data-points="3.4,0.095 3.61,0.045" data-type="line" data-label="" points="261.78217821782187,306.13861386138615 378.21782178217813,333.86138613861385" fill="none" stroke="hsl(112, 100%, 50%, 0.1)" stroke-width="1px"/></g><g><polyline data-points="3.4,0.095 3.465,0.095 3.505,0.095 3.505,0.045 3.545,0.045 3.61,0.045" data-type="line" data-label="" points="261.78217821782187,306.13861386138615 297.82178217821775,306.13861386138615 320,306.13861386138615 320,333.86138613861385 342.17821782178225,333.86138613861385 378.21782178217813,333.86138613861385" fill="none" stroke="red" stroke-width="1px" stroke-dasharray="4 4"/></g><g><polyline data-points="3.4,0.095 3.61,0.045" data-type="line" data-label="" points="261.78217821782187,306.13861386138615 378.21782178217813,333.86138613861385" fill="none" stroke="blue" stroke-width="1px" stroke-dasharray="5 5"/></g><g><polyline data-points="3.4,0.095 3.465,0.095 3.505,0.095 3.505,0.045 3.545,0.045 3.61,0.045" data-type="line" data-label="" points="261.78217821782187,306.13861386138615 297.82178217821775,306.13861386138615 320,306.13861386138615 320,333.86138613861385 342.17821782178225,333.86138613861385 378.21782178217813,333.86138613861385" fill="none" stroke="green" stroke-width="1px"/></g><g><rect data-type="rect" data-label="D2" data-x="3.2" data-y="0.095" x="40" y="250.69306930693068" width="221.7821782178221" height="110.89108910891093" fill="hsl(358, 100%, 50%, 0.1)" stroke="black" stroke-width="0.0018035714285714283"/></g><g><rect data-type="rect" data-label="SW2" data-x="3.81" data-y="0.045" x="378.21782178217825" y="278.41584158415844" width="221.78217821782187" height="110.89108910891088" fill="hsl(70, 100%, 50%, 0.1)" stroke="black" stroke-width="0.0018035714285714283"/></g><g><circle data-type="point" data-label="D2.cathode
1
+ <svg width="2416" height="1200" viewBox="0 0 2416 1200" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Solver debug visualization on the left and Circuit JSON schematic on the right">
2
+ <g transform="translate(0, 0) scale(1.875, 1.875) translate(0, 0)">
3
+ <rect width="100%" height="100%" fill="white"/><g><polyline data-points="3.4,0.095 3.61,0.045" data-type="line" data-label="" points="261.78217821782187,306.13861386138615 378.21782178217813,333.86138613861385" fill="none" stroke="hsl(112, 100%, 50%, 0.1)" stroke-width="1px"/></g><g><polyline data-points="3.4,0.095 3.465,0.095 3.505,0.095 3.505,0.045 3.545,0.045 3.61,0.045" data-type="line" data-label="" points="261.78217821782187,306.13861386138615 297.82178217821775,306.13861386138615 320,306.13861386138615 320,333.86138613861385 342.17821782178225,333.86138613861385 378.21782178217813,333.86138613861385" fill="none" stroke="red" stroke-width="1px" stroke-dasharray="4 4"/></g><g><polyline data-points="3.4,0.095 3.61,0.045" data-type="line" data-label="" points="261.78217821782187,306.13861386138615 378.21782178217813,333.86138613861385" fill="none" stroke="blue" stroke-width="1px" stroke-dasharray="5 5"/></g><g><polyline data-points="3.4,0.095 3.465,0.095 3.505,0.095 3.505,0.045 3.545,0.045 3.61,0.045" data-type="line" data-label="" points="261.78217821782187,306.13861386138615 297.82178217821775,306.13861386138615 320,306.13861386138615 320,333.86138613861385 342.17821782178225,333.86138613861385 378.21782178217813,333.86138613861385" fill="none" stroke="green" stroke-width="1px"/></g><g><rect data-type="rect" data-label="D2" data-x="3.2" data-y="0.095" x="40" y="250.69306930693068" width="221.7821782178221" height="110.89108910891093" fill="hsl(358, 100%, 50%, 0.1)" stroke="black" stroke-width="0.0018035714285714283"/></g><g><rect data-type="rect" data-label="SW2" data-x="3.81" data-y="0.045" x="378.21782178217825" y="278.41584158415844" width="221.78217821782187" height="110.89108910891088" fill="hsl(70, 100%, 50%, 0.1)" stroke="black" stroke-width="0.0018035714285714283"/></g><g><circle data-type="point" data-label="D2.cathode
2
4
  x+" data-x="3.4" data-y="0.095" cx="261.78217821782187" cy="306.13861386138615" r="3" fill="hsl(22, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="SW2.pin1
3
5
  x-" data-x="3.61" data-y="0.045" cx="378.21782178217813" cy="333.86138613861385" r="3" fill="hsl(12, 100%, 50%, 0.8)"/></g><g id="crosshair" style="display: none"><line id="crosshair-h" y1="0" y2="640" stroke="#666" stroke-width="0.5"/><line id="crosshair-v" x1="0" x2="640" stroke="#666" stroke-width="0.5"/><text id="coordinates" font-family="monospace" font-size="12" fill="#666"></text></g><script><![CDATA[
4
6
  document.currentScript.parentElement.addEventListener('mousemove', (e) => {
@@ -43,4 +45,20 @@ x-" data-x="3.61" data-y="0.045" cx="378.21782178217813" cy="333.86138613861385"
43
45
  document.currentScript.parentElement.addEventListener('mouseleave', () => {
44
46
  document.currentScript.parentElement.getElementById('crosshair').style.display = 'none';
45
47
  });
46
- ]]></script></svg>
48
+ ]]></script>
49
+ </g>
50
+ <g transform="translate(1216, 200)">
51
+ <style>
52
+ .boundary { fill: rgb(245, 241, 237); }
53
+ .schematic-boundary { fill: none; stroke: #fff; }
54
+ .component { fill: none; stroke: rgb(132, 0, 0); }
55
+ .chip { fill: rgb(255, 255, 194); stroke: rgb(132, 0, 0); }
56
+ .component-pin { fill: none; stroke: rgb(132, 0, 0); }
57
+ .text { font-family: sans-serif; fill: rgb(0, 150, 0); }
58
+ .pin-number { fill: rgb(169, 0, 0); }
59
+ .port-label { fill: rgb(0, 100, 100); }
60
+ .component-name { fill: rgb(0, 100, 100); }
61
+
62
+ </style><rect class="boundary" x="0" y="0" width="1200" height="800"/><g class="trace sch-trace" data-layer="base" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_0__stack1"><path d="M 516.8 384 L 558.3999999999999 384 L 583.9999999999998 384 L 583.9999999999998 416 L 609.6000000000001 416 L 651.2 416" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="102.4px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 516.8 384 L 558.3999999999999 384 L 583.9999999999998 384 L 583.9999999999998 416 L 609.6000000000001 416 L 651.2 416" stroke="rgb(0, 150, 0)" fill="none" stroke-width="12.8px" stroke-linecap="round" stroke-linejoin="round"/></g><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_0__stack1"/><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_0__stack1"><rect class="component chip sch-component-body" x="356.8000000000002" y="320" width="63.99999999999977" height="128" stroke-width="12.8px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="356.8000000000002" y="320" width="63.99999999999977" height="128" fill="transparent"/><text class="sch-text" x="388.79999999999995" y="384" fill="#0f172a" text-anchor="middle" dominant-baseline="middle" font-family="sans-serif" font-size="64px" transform="rotate(0, 388.79999999999995, 384)">D2</text><line class="component-pin sch-component-pin sch-port-line" x1="420.79999999999995" y1="384" x2="516.8" y2="384" stroke-width="12.8px"/><g class="sch-port" data-schematic-port-id="source_port_0_0__stack1"><rect x="503.99999999999994" y="371.2" width="25.6" height="25.6" opacity="0"/></g><text class="pin-number sch-pin-number" x="468.79999999999995" y="371.2" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="96px" transform=""></text><text class="pin-number sch-pin-label" x="356.8000000000002" y="384" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="96px" transform="">cathode</text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_1__stack1"><rect class="component chip sch-component-body" x="747.2" y="352" width="64" height="128" stroke-width="12.8px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="747.2" y="352" width="64" height="128" fill="transparent"/><text class="sch-text" x="779.2" y="416" fill="#0f172a" text-anchor="middle" dominant-baseline="middle" font-family="sans-serif" font-size="64px" transform="rotate(0, 779.2, 416)">SW2</text><line class="component-pin sch-component-pin sch-port-line" x1="747.2" y1="416" x2="651.2" y2="416" stroke-width="12.8px"/><g class="sch-port" data-schematic-port-id="source_port_1_0__stack1"><rect x="638.4000000000001" y="403.2" width="25.6" height="25.6" opacity="0"/></g><text class="pin-number sch-pin-number" x="699.2" y="403.2" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="96px" transform=""></text><text class="pin-number sch-pin-label" x="811.2" y="416" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="96px" transform="">pin1</text></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_0__stack1"><circle cx="516.8" cy="384" r="25.6" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_1_0__stack1"><circle cx="651.2" cy="416" r="25.6" fill="red" opacity="0"/></g>
63
+ </g>
64
+ </svg>