@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.
- package/.agents/skills/schematic-trace-visualization/SKILL.md +7 -2
- package/dist/index.d.ts +31 -2
- package/dist/index.js +127 -46
- package/lib/solvers/InlineNetLabelSolver/InlineNetLabelSolver.ts +115 -6
- package/lib/solvers/NetLabelPlacementSolver/NetLabelPlacementSolver.ts +17 -1
- package/lib/solvers/NetLabelPlacementSolver/SingleNetLabelPlacementSolver/SingleNetLabelPlacementSolver.ts +2 -0
- package/lib/solvers/NetLabelPlacementSolver/SingleNetLabelPlacementSolver/solvePortOnlyPin.ts +2 -0
- package/lib/types/InputProblem.ts +27 -1
- package/package.json +8 -1
- package/site/examples/example51.page.tsx +4 -0
- package/tests/assets/example51.json +5102 -0
- package/tests/bug-reports/bug-report-20260706T213649Z/__snapshots__/bug-report-20260706T213649Z.snap.svg +751 -5
- package/tests/bug-reports/bug-report-20260706T220324Z/__snapshots__/bug-report-20260706T220324Z.snap.svg +660 -5
- package/tests/bug-reports/bug-report-20260707T020342Z/__snapshots__/bug-report-20260707T020342Z.snap.svg +44 -5
- package/tests/bug-reports/bug-report-20260707T092615Z/__snapshots__/bug-report-20260707T092615Z.snap.svg +394 -5
- package/tests/bug-reports/bug-report-20260707T134549Z/__snapshots__/bug-report-20260707T134549Z.snap.svg +170 -5
- package/tests/bug-reports/bug-report-20260707T134722Z/__snapshots__/bug-report-20260707T134722Z.snap.svg +79 -5
- package/tests/bug-reports/bug-report-20260707T140410Z/__snapshots__/bug-report-20260707T140410Z.snap.svg +219 -5
- package/tests/bug-reports/bug-report-20260707T141025Z/__snapshots__/bug-report-20260707T141025Z.snap.svg +65 -5
- package/tests/bug-reports/bug-report-20260707T141421Z/__snapshots__/bug-report-20260707T141421Z.snap.svg +142 -5
- package/tests/bug-reports/bug-report-20260707T230831Z/__snapshots__/bug-report-20260707T230831Z.snap.svg +100 -5
- package/tests/bug-reports/bug-report-20260708T053736Z/__snapshots__/bug-report-20260708T053736Z.snap.svg +23 -5
- package/tests/bug-reports/bug-report-20260708T055430Z/__snapshots__/bug-report-20260708T055430Z.snap.svg +58 -5
- package/tests/bug-reports/bug-report-20260708T095725Z/__snapshots__/bug-report-20260708T095725Z.snap.svg +86 -5
- package/tests/bug-reports/bug-report-20260716T144856Z/__snapshots__/bug-report-20260716T144856Z.snap.svg +226 -5
- package/tests/bug-reports/bug-report-20260717T022934Z/__snapshots__/bug-report-20260717T022934Z.snap.svg +191 -5
- package/tests/bug-reports/bug-report-20260717T031704Z/__snapshots__/bug-report-20260717T031704Z.snap.svg +30 -5
- package/tests/bug-reports/bug-report-20260717T042845Z/__snapshots__/bug-report-20260717T042845Z.snap.svg +37 -5
- package/tests/bug-reports/bug-report-20260721T221026Z/__snapshots__/bug-report-20260721T221026Z.snap.svg +580 -2
- package/tests/bug-reports/bug-report-20260724T175257Z/__snapshots__/bug-report-20260724T175257Z.snap.svg +44 -5
- package/tests/bug-reports/bug-report-20260728T144234Z/__snapshots__/bug-report-20260728T144234Z.snap.svg +107 -5
- package/tests/bug-reports/bug-report-20260728T225606Z/__snapshots__/bug-report-20260728T225606Z.snap.svg +114 -5
- package/tests/bug-reports/bug-report-20260730T061837Z/__snapshots__/bug-report-20260730T061837Z.snap.svg +121 -5
- package/tests/bug-reports/bug-report-20260731T052229Z/__snapshots__/bug-report-20260731T052229Z.snap.svg +51 -5
- package/tests/bug-reports/bug-report-20260804T095800Z/__snapshots__/bug-report-20260804T095800Z.snap.svg +212 -5
- package/tests/bug-reports/bug-report-20260804T171919Z/__snapshots__/bug-report-20260804T171919Z.snap.svg +569 -5
- package/tests/bug-reports/bug-report-20260804T225912Z/__snapshots__/bug-report-20260804T225912Z.snap.svg +37 -5
- package/tests/bug-reports/bug-report-20260805T061316Z/__snapshots__/bug-report-20260805T061316Z.snap.svg +289 -5
- package/tests/bug-reports/bug-report-20260806T061548Z/__snapshots__/bug-report-20260806T061548Z.snap.svg +289 -5
- package/tests/bug-reports/bug-report-20260806T093501Z/__snapshots__/bug-report-20260806T093501Z.snap.svg +149 -5
- package/tests/bug-reports/bug-report-20260811T075142Z/__snapshots__/bug-report-20260811T075142Z.snap.svg +93 -5
- package/tests/bug-reports/bug-report-20260815T073240Z/__snapshots__/bug-report-20260815T073240Z.snap.svg +79 -5
- package/tests/bug-reports/bug-report-20260819T091818Z/__snapshots__/bug-report-20260819T091818Z.snap.svg +244 -2
- package/tests/examples/__snapshots__/example01.snap.svg +44 -5
- package/tests/examples/__snapshots__/example02.snap.svg +51 -5
- package/tests/examples/__snapshots__/example03.snap.svg +86 -5
- package/tests/examples/__snapshots__/example04.snap.svg +30 -5
- package/tests/examples/__snapshots__/example05.snap.svg +30 -5
- package/tests/examples/__snapshots__/example06.snap.svg +30 -5
- package/tests/examples/__snapshots__/example07.snap.svg +58 -5
- package/tests/examples/__snapshots__/example08.snap.svg +37 -5
- package/tests/examples/__snapshots__/example09.snap.svg +149 -5
- package/tests/examples/__snapshots__/example10.snap.svg +65 -5
- package/tests/examples/__snapshots__/example11.snap.svg +51 -5
- package/tests/examples/__snapshots__/example12.snap.svg +51 -5
- package/tests/examples/__snapshots__/example13.snap.svg +72 -5
- package/tests/examples/__snapshots__/example14.snap.svg +79 -5
- package/tests/examples/__snapshots__/example15.snap.svg +86 -5
- package/tests/examples/__snapshots__/example16.snap.svg +51 -5
- package/tests/examples/__snapshots__/example17.snap.svg +51 -5
- package/tests/examples/__snapshots__/example18.snap.svg +58 -5
- package/tests/examples/__snapshots__/example19.snap.svg +44 -5
- package/tests/examples/__snapshots__/example20.snap.svg +44 -5
- package/tests/examples/__snapshots__/example21.snap.svg +72 -5
- package/tests/examples/__snapshots__/example22.snap.svg +51 -5
- package/tests/examples/__snapshots__/example23.snap.svg +51 -5
- package/tests/examples/__snapshots__/example24.snap.svg +51 -5
- package/tests/examples/__snapshots__/example25.snap.svg +86 -5
- package/tests/examples/__snapshots__/example26.snap.svg +51 -5
- package/tests/examples/__snapshots__/example27.snap.svg +72 -5
- package/tests/examples/__snapshots__/example28.snap.svg +44 -5
- package/tests/examples/__snapshots__/example29.snap.svg +324 -5
- package/tests/examples/__snapshots__/example30.snap.svg +107 -5
- package/tests/examples/__snapshots__/example31.snap.svg +37 -5
- package/tests/examples/__snapshots__/example32.snap.svg +149 -5
- package/tests/examples/__snapshots__/example33.snap.svg +93 -5
- package/tests/examples/__snapshots__/example34.snap.svg +51 -5
- package/tests/examples/__snapshots__/example35.snap.svg +58 -5
- package/tests/examples/__snapshots__/example36.snap.svg +44 -5
- package/tests/examples/__snapshots__/example37.snap.svg +72 -5
- package/tests/examples/__snapshots__/example38.snap.svg +30 -5
- package/tests/examples/__snapshots__/example39.snap.svg +37 -5
- package/tests/examples/__snapshots__/example40.snap.svg +100 -5
- package/tests/examples/__snapshots__/example41.snap.svg +44 -5
- package/tests/examples/__snapshots__/example42.snap.svg +65 -5
- package/tests/examples/__snapshots__/example43.snap.svg +58 -5
- package/tests/examples/__snapshots__/example44.snap.svg +107 -5
- package/tests/examples/__snapshots__/example45.snap.svg +51 -5
- package/tests/examples/__snapshots__/example46.snap.svg +93 -5
- package/tests/examples/__snapshots__/example47.snap.svg +93 -5
- package/tests/examples/__snapshots__/example48.snap.svg +65 -5
- package/tests/examples/__snapshots__/example49.snap.svg +177 -5
- package/tests/examples/__snapshots__/example50.snap.svg +93 -5
- package/tests/examples/__snapshots__/example51.snap.svg +952 -0
- package/tests/examples/example51.test.ts +12 -0
- package/tests/fixtures/convertSolverOutputToCircuitJson.test.ts +219 -0
- package/tests/fixtures/convertSolverOutputToCircuitJson.ts +1058 -0
- package/tests/fixtures/matcher.ts +45 -8
- package/tests/repros/__snapshots__/board-1273-trace-overlap-cycle.snap.svg +762 -2
- package/tests/repros/__snapshots__/board-15984-same-net-junction.snap.svg +111 -2
- package/tests/repros/__snapshots__/board1096-usb-label-overlap-iteration.snap.svg +167 -2
- package/tests/repros/__snapshots__/bugreport-001-gnd-overlap.snap.svg +65 -5
- package/tests/repros/__snapshots__/manufacturePartNumber-text-box.snap.svg +30 -5
- package/tests/repros/__snapshots__/netlabel-connector-through-rail-label.snap.svg +79 -5
- package/tests/repros/__snapshots__/repro-atmega328p-fault-pullup.snap.svg +65 -5
- package/tests/repros/__snapshots__/repro-atmega328p-missing-gnd-netlabel.snap.svg +149 -5
- package/tests/repros/__snapshots__/repro-board-589-regulator-section.snap.svg +55 -2
- package/tests/repros/__snapshots__/repro-board-648-esp12f-section.snap.svg +160 -2
- package/tests/repros/__snapshots__/repro-bq24074-battery-charger.snap.svg +135 -5
- package/tests/repros/__snapshots__/repro-bq25895-cross-net-trace-overlap.snap.svg +69 -2
- package/tests/repros/__snapshots__/repro-cc2340r5.snap.svg +86 -5
- package/tests/repros/__snapshots__/repro-core-555-power-cross-net-overlap.snap.svg +44 -5
- package/tests/repros/__snapshots__/repro-core-subcircuit-missing-ground.snap.svg +44 -5
- package/tests/repros/__snapshots__/repro-core-tb67s579ftg-inline-label-routing.snap.svg +260 -0
- package/tests/repros/__snapshots__/repro-example35-minimize-trace-crossing.snap.svg +335 -2
- package/tests/repros/__snapshots__/repro-ground-label-on-lower-rail-end.snap.svg +48 -2
- package/tests/repros/__snapshots__/repro-ina237-current-monitor.snap.svg +149 -5
- package/tests/repros/__snapshots__/repro-missing-trace-netlabel.snap.svg +72 -5
- package/tests/repros/__snapshots__/repro-netlabel-collision-687.snap.svg +100 -5
- package/tests/repros/__snapshots__/repro-netlabel-overlap-trace.snap.svg +51 -5
- package/tests/repros/__snapshots__/repro-nrf52810-clock-routing.snap.svg +90 -2
- package/tests/repros/__snapshots__/repro-power-group-rail-labels.snap.svg +37 -5
- package/tests/repros/__snapshots__/repro-rectifier-trace-overlap.snap.svg +44 -5
- package/tests/repros/__snapshots__/repro-rp2040-gamepad-trace-alignment.snap.svg +237 -2
- package/tests/repros/__snapshots__/repro-rp2040-usb-cc2-ground-overlap.snap.svg +72 -5
- package/tests/repros/__snapshots__/repro-rp2040-v3v3-label-placement.snap.svg +51 -5
- package/tests/repros/__snapshots__/repro-rp2040-zero-crystal-fallback-netlabels.snap.svg +30 -5
- package/tests/repros/__snapshots__/repro-ti-power-output-section.snap.svg +79 -5
- package/tests/repros/__snapshots__/repro-tida010076-j4-ground-bus.snap.svg +27 -2
- package/tests/repros/__snapshots__/repro-tida010076-page02.snap.svg +1150 -5
- package/tests/repros/__snapshots__/repro-tps61222-trace-intersection.snap.svg +51 -5
- package/tests/repros/__snapshots__/repro-type-c-16pin-self-connection.snap.svg +30 -5
- package/tests/repros/__snapshots__/repro-type-c-16pin-to-resistor.snap.svg +30 -5
- package/tests/repros/__snapshots__/repro-type-c-vbus-led-ground-label.snap.svg +44 -5
- package/tests/repros/__snapshots__/repro-usb-power-vbus-label-detour.snap.svg +685 -2
- package/tests/repros/__snapshots__/repro-vcc-pin1-detour.snap.svg +27 -2
- package/tests/repros/__snapshots__/repro129-host-custom-symbol-passives.snap.svg +51 -5
- package/tests/repros/__snapshots__/repro130-bq27441-fuel-gauge-trace-through-c1.snap.svg +100 -5
- package/tests/repros/__snapshots__/repro161-power-section-autolayout.snap.svg +107 -5
- package/tests/repros/__snapshots__/repro47-endpoint-obstacle-detour.snap.svg +51 -5
- package/tests/repros/__snapshots__/repro48-555-timer-vcc-rail-label.snap.svg +104 -2
- package/tests/repros/__snapshots__/repro5-escape-padded-text-obstacles.snap.svg +30 -5
- package/tests/repros/__snapshots__/repro51-overlap-junction-crossing.snap.svg +65 -5
- package/tests/repros/__snapshots__/repro84-stacked-gnd-label-orientation.snap.svg +27 -2
- package/tests/repros/__snapshots__/small-variant-resistor-facing-direction.snap.svg +58 -5
- package/tests/repros/__snapshots__/trace-overlap-box-resistor.snap.svg +37 -5
- package/tests/repros/assets/repro-core-tb67s579ftg-inline-label-routing.input.json +900 -0
- package/tests/repros/repro-core-tb67s579ftg-inline-label-routing.test.ts +40 -0
- package/tests/solvers/InlineNetLabelSolver/__snapshots__/fallback-net-label-width.snap.svg +25 -7
- package/tests/solvers/InlineNetLabelSolver/__snapshots__/inline-net-label-anchored-label-clearance.snap.svg +34 -2
- package/tests/solvers/InlineNetLabelSolver/__snapshots__/inline-net-label-port-stub.snap.svg +23 -5
- package/tests/solvers/InlineNetLabelSolver/__snapshots__/inline-net-label-two-pin-net.snap.svg +23 -5
- package/tests/solvers/InlineNetLabelSolver/__snapshots__/inline-net-label01.snap.svg +23 -5
- package/tests/solvers/InlineNetLabelSolver/__snapshots__/inline-net-label02.snap.svg +23 -5
- package/tests/solvers/InlineNetLabelSolver/__snapshots__/terminal-stub-trace-clearance.snap.svg +71 -0
- package/tests/solvers/InlineNetLabelSolver/fallback-net-label-width.test.ts +10 -1
- package/tests/solvers/InlineNetLabelSolver/terminal-stub-trace-clearance.test.ts +102 -0
- package/tests/solvers/SchematicTraceSingleLineSolver2/__snapshots__/SchematicTraceSingleLineSolver2_01-example17-d1_1-u1_1.snap.svg +23 -5
- package/tests/solvers/SchematicTraceSingleLineSolver2/__snapshots__/SchematicTraceSingleLineSolver2_repro47-short-opposing-pins.snap.svg +20 -2
- package/tests/solvers/TraceCleanupSolver/__snapshots__/TraceCleanupSolver.snap.svg +44 -5
- package/tests/solvers/TraceLabelOverlapAvoidanceSolver/__snapshots__/TraceLabelOverlapAvoidanceSolver.snap.svg +79 -5
- package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/__snapshots__/MergedNetLabelObstacles.snap.svg +44 -5
- package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/__snapshots__/OverlapAvoidanceStepSolver.snap.svg +23 -5
- package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/__snapshots__/SingleOverlapSolver.snap.svg +30 -5
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
<svg width="
|
|
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
|
|
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>
|
package/tests/solvers/InlineNetLabelSolver/__snapshots__/terminal-stub-trace-clearance.snap.svg
ADDED
|
@@ -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="
|
|
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
|
|
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="
|
|
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
|
|
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>
|