@tscircuit/schematic-trace-solver 0.0.177 → 0.0.178
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +4 -1
- package/dist/index.js +286 -120
- package/lib/solvers/AvailableNetOrientationSolver/AvailableNetOrientationSolver.ts +1 -0
- package/lib/solvers/SchematicTracePipelineSolver/SchematicTracePipelineSolver.ts +6 -1
- package/lib/solvers/TraceCleanupSolver/TraceCleanupSolver.ts +25 -0
- package/lib/solvers/TraceCleanupSolver/rerouteGeneratedNetLabelConnectorCrossings.ts +194 -0
- package/lib/solvers/TraceCleanupSolver/sub-solver/findIntersectionsWithObstacles.ts +19 -5
- package/lib/solvers/TraceCleanupSolver/sub-solver/generateLShapeRerouteCandidates.ts +35 -5
- package/package.json +1 -1
- package/tests/repros/__snapshots__/repro-wireless-mouse-charger-section.snap.svg +2 -2
- package/tests/solvers/TraceCleanupSolver/alignSameNetRails-pipeline-label-connector.test.ts +4 -2
- package/tests/solvers/TraceCleanupSolver/reroute-generated-net-label-connector-crossings.test.ts +160 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<svg width="1200" height="2016" viewBox="0 0 1200 2016" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Solver debug visualization on top and Circuit JSON schematic on the bottom">
|
|
2
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="-40.38,-0.2 -39.78,-4" data-type="line" data-label="" points="104.73988439306368,334.5664739884393 124.16184971098278,457.57225433526014" fill="none" stroke="hsl(240, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="-34.32,3 -29.560000000000002,3" data-type="line" data-label="" points="300.90173410404645,230.98265895953756 454.98265895953773,230.98265895953756" fill="none" stroke="hsl(32, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="-28.36,3 -37.62,-0.1" data-type="line" data-label="" points="493.82658959537594,230.98265895953756 194.08092485549173,331.32947976878614" fill="none" stroke="hsl(48, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="-40.38,0 -38.22,-4" data-type="line" data-label="" points="104.73988439306368,328.09248554913296 174.6589595375724,457.57225433526014" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-40.38,0 -34,-3.3800000000000003" data-type="line" data-label="" points="104.73988439306368,328.09248554913296 311.26011560693655,437.50289017341044" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-38.22,-4 -34,-3.3800000000000003" data-type="line" data-label="" points="174.6589595375724,457.57225433526014 311.26011560693655,437.50289017341044" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-37.62,0.1 -34,-2.6199999999999997" data-type="line" data-label="" points="194.08092485549173,324.8554913294798 311.26011560693655,412.9017341040462" fill="none" stroke="hsl(271, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-40.38,0.2 -35.76,3" data-type="line" data-label="" points="104.73988439306368,321.6184971098266 254.2890173410408,230.98265895953756" fill="none" stroke="hsl(319, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-40.38,-0.2 -40.580000000000005,-0.2 -40.580000000000005,-4 -39.78,-4" data-type="line" data-label="" points="104.73988439306368,334.5664739884393 98.26589595375731,334.5664739884393 98.26589595375731,457.57225433526014 124.16184971098278,457.57225433526014" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-34.32,3 -29.560000000000002,3" data-type="line" data-label="" points="300.90173410404645,230.98265895953756 454.98265895953773,230.98265895953756" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-38.22,-4 -34,-4 -34,-3.3800000000000003" data-type="line" data-label="" points="174.6589595375724,457.57225433526014 311.26011560693655,457.57225433526014 311.26011560693655,437.50289017341044" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-28.36,3 -28.16,3 -28.16,-0.1 -37.62,-0.1" data-type="line" data-label="" points="493.82658959537594,230.98265895953756 500.3005780346823,230.98265895953756 500.3005780346823,331.32947976878614 194.08092485549173,331.32947976878614" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-28,-0.1 -28.1,-0.1 -28.1,-0.2 -28.241,-0.2 -28.241,-0.30100000000000005" data-type="line" data-label="" points="505.47976878612735,331.32947976878614 502.24277456647417,331.32947976878614 502.24277456647417,334.5664739884393 497.67861271676327,334.5664739884393 497.67861271676327,337.835838150289" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-37.62,0.1 -37.319,0.1 -37.319,0.30100000000000005" data-type="line" data-label="" points="194.08092485549173,324.8554913294798 203.82427745664745,324.8554913294798 203.82427745664745,318.3491329479769" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-28,0.1 -28.501,0.1 -28.501,0.15100000000000002" data-type="line" data-label="" points="505.47976878612735,324.8554913294798 489.2624277456649,324.8554913294798 489.2624277456649,323.2046242774567" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-35.76,3 -36.300999999999995,3 -36.300999999999995,3.351" data-type="line" data-label="" points="254.2890173410408,230.98265895953756 236.77687861271716,230.98265895953756 236.77687861271716,219.6208092485549" fill="none" stroke="purple" stroke-width="1px"/></g><g><rect data-type="rect" data-label="schematic_component_0" data-x="-39" data-y="0" x="104.73988439306356" y="318.3815028901734" width="89.34104046242805" height="19.421965317919103" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03089285714285714"/></g><g><rect data-type="rect" data-label="schematic_component_1" data-x="-39" data-y="-4" x="124.16184971098278" y="446.5664739884393" width="50.49710982658962" height="22.011560693641627" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03089285714285714"/></g><g><rect data-type="rect" data-label="schematic_component_2" data-x="-33.447500000000005" data-y="-3" x="296.69364161849717" y="412.9017341040462" width="64.90173410404623" height="24.601156069364208" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03089285714285714"/></g><g><rect data-type="rect" data-label="schematic_component_3" data-x="-35.04" data-y="3" x="254.2890173410408" y="219.97687861271675" width="46.612716763005665" height="22.011560693641627" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03089285714285714"/></g><g><rect data-type="rect" data-label="schematic_component_4" data-x="-28.96" data-y="3" x="454.98265895953773" y="211.8843930635838" width="38.843930635838205" height="38.196531791907546" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03089285714285714"/></g><g><rect data-type="rect" data-label="schematic_component_5" data-x="-27" data-y="0" x="505.47976878612735" y="318.3815028901734" width="64.73988439306368" height="19.421965317919103" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03089285714285714"/></g><g><rect data-type="rect" data-label="MCP73831T-2ACI/OT" data-x="-38.959999999999994" data-y="-0.43" x="117.68786127167687" y="339.0982658959538" width="66.03468208092454" height="5.826589595375708" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03089285714285714"/></g><g><rect data-type="rect" data-label="U_CHARGER" data-x="-39.44" data-y="0.41500000000000004" x="115.74566473988466" y="310.6127167630058" width="38.843930635838205" height="8.09248554913296" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03089285714285714"/></g><g><rect data-type="rect" data-label="S2B-PH-SM4-TB(LF)(SN)" data-x="-26.340000000000003" data-y="-0.43" x="518.4277456647401" y="339.0982658959538" width="81.57225433526003" height="5.826589595375708" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03089285714285714"/></g><g><rect data-type="rect" data-label="J_BAT_PROTECTED" data-x="-26.700000000000003" data-y="0.41500000000000004" x="516.4855491329481" y="310.6127167630058" width="62.15028901734104" height="8.09248554913296" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03089285714285714"/></g><g><rect data-type="rect" data-label="netId: .LED_CHARGE > .cathode to .U_CHARGER > .STAT
|
|
3
|
+
<rect width="100%" height="100%" fill="white"/><g><polyline data-points="-40.38,-0.2 -39.78,-4" data-type="line" data-label="" points="104.73988439306368,334.5664739884393 124.16184971098278,457.57225433526014" fill="none" stroke="hsl(240, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="-34.32,3 -29.560000000000002,3" data-type="line" data-label="" points="300.90173410404645,230.98265895953756 454.98265895953773,230.98265895953756" fill="none" stroke="hsl(32, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="-28.36,3 -37.62,-0.1" data-type="line" data-label="" points="493.82658959537594,230.98265895953756 194.08092485549173,331.32947976878614" fill="none" stroke="hsl(48, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="-40.38,0 -38.22,-4" data-type="line" data-label="" points="104.73988439306368,328.09248554913296 174.6589595375724,457.57225433526014" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-40.38,0 -34,-3.3800000000000003" data-type="line" data-label="" points="104.73988439306368,328.09248554913296 311.26011560693655,437.50289017341044" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-38.22,-4 -34,-3.3800000000000003" data-type="line" data-label="" points="174.6589595375724,457.57225433526014 311.26011560693655,437.50289017341044" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-37.62,0.1 -34,-2.6199999999999997" data-type="line" data-label="" points="194.08092485549173,324.8554913294798 311.26011560693655,412.9017341040462" fill="none" stroke="hsl(271, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-40.38,0.2 -35.76,3" data-type="line" data-label="" points="104.73988439306368,321.6184971098266 254.2890173410408,230.98265895953756" fill="none" stroke="hsl(319, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="-40.38,-0.2 -40.580000000000005,-0.2 -40.580000000000005,-4 -39.78,-4" data-type="line" data-label="" points="104.73988439306368,334.5664739884393 98.26589595375731,334.5664739884393 98.26589595375731,457.57225433526014 124.16184971098278,457.57225433526014" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-34.32,3 -29.560000000000002,3" data-type="line" data-label="" points="300.90173410404645,230.98265895953756 454.98265895953773,230.98265895953756" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-38.22,-4 -34,-4 -34,-3.3800000000000003" data-type="line" data-label="" points="174.6589595375724,457.57225433526014 311.26011560693655,457.57225433526014 311.26011560693655,437.50289017341044" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-28.36,3 -28.16,3 -28.16,0.6709999999999999 -33.26049999999999,0.6709999999999999 -33.26049999999999,-0.1 -37.62,-0.1" data-type="line" data-label="" points="493.82658959537594,230.98265895953756 500.3005780346823,230.98265895953756 500.3005780346823,306.37225433526015 335.197687861272,306.37225433526015 335.197687861272,331.32947976878614 194.08092485549173,331.32947976878614" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-28,-0.1 -28.1,-0.1 -28.1,-0.2 -28.241,-0.2 -28.241,-0.30100000000000005" data-type="line" data-label="" points="505.47976878612735,331.32947976878614 502.24277456647417,331.32947976878614 502.24277456647417,334.5664739884393 497.67861271676327,334.5664739884393 497.67861271676327,337.835838150289" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-37.62,0.1 -37.319,0.1 -37.319,0.30100000000000005" data-type="line" data-label="" points="194.08092485549173,324.8554913294798 203.82427745664745,324.8554913294798 203.82427745664745,318.3491329479769" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-28,0.1 -28.501,0.1 -28.501,0.15100000000000002" data-type="line" data-label="" points="505.47976878612735,324.8554913294798 489.2624277456649,324.8554913294798 489.2624277456649,323.2046242774567" fill="none" stroke="purple" stroke-width="1px"/></g><g><polyline data-points="-35.76,3 -36.300999999999995,3 -36.300999999999995,3.351" data-type="line" data-label="" points="254.2890173410408,230.98265895953756 236.77687861271716,230.98265895953756 236.77687861271716,219.6208092485549" fill="none" stroke="purple" stroke-width="1px"/></g><g><rect data-type="rect" data-label="schematic_component_0" data-x="-39" data-y="0" x="104.73988439306356" y="318.3815028901734" width="89.34104046242805" height="19.421965317919103" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03089285714285714"/></g><g><rect data-type="rect" data-label="schematic_component_1" data-x="-39" data-y="-4" x="124.16184971098278" y="446.5664739884393" width="50.49710982658962" height="22.011560693641627" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03089285714285714"/></g><g><rect data-type="rect" data-label="schematic_component_2" data-x="-33.447500000000005" data-y="-3" x="296.69364161849717" y="412.9017341040462" width="64.90173410404623" height="24.601156069364208" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03089285714285714"/></g><g><rect data-type="rect" data-label="schematic_component_3" data-x="-35.04" data-y="3" x="254.2890173410408" y="219.97687861271675" width="46.612716763005665" height="22.011560693641627" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03089285714285714"/></g><g><rect data-type="rect" data-label="schematic_component_4" data-x="-28.96" data-y="3" x="454.98265895953773" y="211.8843930635838" width="38.843930635838205" height="38.196531791907546" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03089285714285714"/></g><g><rect data-type="rect" data-label="schematic_component_5" data-x="-27" data-y="0" x="505.47976878612735" y="318.3815028901734" width="64.73988439306368" height="19.421965317919103" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.03089285714285714"/></g><g><rect data-type="rect" data-label="MCP73831T-2ACI/OT" data-x="-38.959999999999994" data-y="-0.43" x="117.68786127167687" y="339.0982658959538" width="66.03468208092454" height="5.826589595375708" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03089285714285714"/></g><g><rect data-type="rect" data-label="U_CHARGER" data-x="-39.44" data-y="0.41500000000000004" x="115.74566473988466" y="310.6127167630058" width="38.843930635838205" height="8.09248554913296" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03089285714285714"/></g><g><rect data-type="rect" data-label="S2B-PH-SM4-TB(LF)(SN)" data-x="-26.340000000000003" data-y="-0.43" x="518.4277456647401" y="339.0982658959538" width="81.57225433526003" height="5.826589595375708" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03089285714285714"/></g><g><rect data-type="rect" data-label="J_BAT_PROTECTED" data-x="-26.700000000000003" data-y="0.41500000000000004" x="516.4855491329481" y="310.6127167630058" width="62.15028901734104" height="8.09248554913296" fill="rgba(160, 0, 220, 0.14)" stroke="black" stroke-width="0.03089285714285714"/></g><g><rect data-type="rect" data-label="netId: .LED_CHARGE > .cathode to .U_CHARGER > .STAT
|
|
4
4
|
globalConnNetId: connectivity_net2" data-x="-28.16" data-y="3.9" x="497.0635838150291" y="172.71676300578036" width="6.473988439306368" height="58.26589595375722" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.03089285714285714"/></g><g><rect data-type="rect" data-label="netId: GND
|
|
5
5
|
globalConnNetId: connectivity_net3" data-x="-40.591" data-y="0" x="91.11213872832377" y="324.8554913294798" width="13.595375722543395" height="6.473988439306368" fill="#00000066" stroke="#000000" stroke-width="0.03089285714285714"/></g><g><rect data-type="rect" data-label="netId: GND
|
|
6
6
|
globalConnNetId: connectivity_net3" data-x="-34" data-y="-4.21" x="303.49132947976886" y="457.57225433526014" width="15.537572254335373" height="13.595375722543338" fill="#00000066" stroke="#000000" stroke-width="0.03089285714285714"/></g><g><rect data-type="rect" data-label="netId: GND
|
|
@@ -96,7 +96,7 @@ orientation: y+" data-x="-31.94" data-y="3" cx="377.9421965317922" cy="230.98265
|
|
|
96
96
|
.port-label { fill: rgb(0, 100, 100); }
|
|
97
97
|
.component-name { fill: rgb(0, 100, 100); }
|
|
98
98
|
|
|
99
|
-
</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 158.83794288106174 429.37390863511996 L 146.1640286130414 429.37390863511996 L 146.1640286130414 670.1782797275 L 196.8596856851218 670.1782797275" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="10.139131414416001px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 158.83794288106174 429.37390863511996 L 146.1640286130414 429.37390863511996 L 146.1640286130414 670.1782797275 L 196.8596856851218 670.1782797275" stroke="rgb(0, 150, 0)" fill="none" stroke-width="1.2673914268020001px" 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 542.8575452020677 226.59128034679998 L 844.4967047809439 226.59128034679998" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="10.139131414416001px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 542.8575452020677 226.59128034679998 L 844.4967047809439 226.59128034679998" stroke="rgb(0, 150, 0)" fill="none" stroke-width="1.2673914268020001px" 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 295.716216975678 670.1782797275 L 563.1358080309001 670.1782797275 L 563.1358080309001 630.889145496638" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="10.139131414416001px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 295.716216975678 670.1782797275 L 563.1358080309001 670.1782797275 L 563.1358080309001 630.889145496638" stroke="rgb(0, 150, 0)" fill="none" stroke-width="1.2673914268020001px" 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_3__stack1"><path d="M 920.540190389064 226.59128034679998 L 933.2141046570839 226.59128034679998 L 933.2141046570839 423.03695150110997 L 333.73795977973805 423.03695150110997" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="10.139131414416001px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 920.540190389064 226.59128034679998 L 933.2141046570839 226.59128034679998 L 933.2141046570839 423.03695150110997 L 333.73795977973805 423.03695150110997" stroke="rgb(0, 150, 0)" fill="none" stroke-width="1.2673914268020001px" 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_4__stack1"><path d="M 943.3532360714999 423.03695150110997 L 937.0162789374899 423.03695150110997 L 937.0162789374899 429.37390863511996 L 928.0811693785358 429.37390863511996 L 928.0811693785358 435.77423534047006" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="10.139131414416001px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 943.3532360714999 423.03695150110997 L 937.0162789374899 423.03695150110997 L 937.0162789374899 429.37390863511996 L 928.0811693785358 429.37390863511996 L 928.0811693785358 435.77423534047006" stroke="rgb(0, 150, 0)" fill="none" stroke-width="1.2673914268020001px" 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_5__stack1"><path d="M 333.73795977973805 410.36303723309 L 352.81220075310785 410.36303723309 L 352.81220075310785 397.6257533937299" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="10.139131414416001px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 333.73795977973805 410.36303723309 L 352.81220075310785 410.36303723309 L 352.81220075310785 397.6257533937299" stroke="rgb(0, 150, 0)" fill="none" stroke-width="1.2673914268020001px" 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_6__stack1"><path d="M 943.3532360714999 410.36303723309 L 911.6050808301097 410.36303723309 L 911.6050808301097 407.13118909474485" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="10.139131414416001px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 943.3532360714999 410.36303723309 L 911.6050808301097 410.36303723309 L 911.6050808301097 407.13118909474485" stroke="rgb(0, 150, 0)" fill="none" stroke-width="1.2673914268020001px" 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_7__stack1"><path d="M 451.60536247232403 226.59128034679998 L 417.3224243773302 226.59128034679998 L 417.3224243773302 204.34856080642487" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="10.139131414416001px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 451.60536247232403 226.59128034679998 L 417.3224243773302 226.59128034679998 L 417.3224243773302 204.34856080642487" stroke="rgb(0, 150, 0)" fill="none" stroke-width="1.2673914268020001px" 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="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_3__stack1"/><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_4__stack1"/><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_5__stack1"/><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_6__stack1"/><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_7__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="184.18577141710148" y="397.68912296507" width="124.20435982659683" height="38.021742804059954" stroke-width="1.2673914268020001px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="184.18577141710148" y="397.68912296507" width="124.20435982659683" height="38.021742804059954" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="308.3901312436983" y1="423.03695150110997" x2="333.73795977973805" y2="423.03695150110997" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_0_0__stack1"><rect x="332.470568352936" y="421.76956007430795" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="321.0640455117177" y="421.769560074308" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform=""></text><text class="pin-number sch-pin-label" x="302.0531741096879" y="423.03695150110997" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="9.505435701015px" transform="">STAT</text><line class="component-pin sch-component-pin sch-port-line" x1="184.18577141710148" y1="416.6999943671" x2="160.1053343078638" y2="416.6999943671" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_0_1__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="158.83794288106174" cy="416.6999943671" r="1.2673914268020001" stroke-width="1.2673914268020001px"/><rect x="157.57055145425974" y="415.43260294029795" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="171.51185714908206" y="415.43260294029795" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform=""></text><text class="pin-number sch-pin-label" x="190.52272855111187" y="416.6999943671" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="9.505435701015px" transform="">VSS</text><line class="component-pin sch-component-pin sch-port-line" x1="308.3901312436983" y1="410.36303723309" x2="333.73795977973805" y2="410.36303723309" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_0_2__stack1"><rect x="332.470568352936" y="409.09564580628796" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="321.0640455117177" y="409.09564580628796" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform=""></text><text class="pin-number sch-pin-label" x="302.0531741096879" y="410.36303723309" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="9.505435701015px" transform="">VBAT</text><line class="component-pin sch-component-pin sch-port-line" x1="184.18577141710148" y1="404.02608009908" x2="160.1053343078638" y2="404.02608009908" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_0_3__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="158.83794288106174" cy="404.02608009908" r="1.2673914268020001" stroke-width="1.2673914268020001px"/><rect x="157.57055145425974" y="402.75868867227797" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="171.51185714908206" y="402.75868867227797" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform=""></text><text class="pin-number sch-pin-label" x="190.52272855111187" y="404.02608009908" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="9.505435701015px" transform="">VDD</text><line class="component-pin sch-component-pin sch-port-line" x1="184.18577141710148" y1="429.37390863511996" x2="158.83794288106174" y2="429.37390863511996" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_0_4__stack1"><rect x="157.57055145425974" y="428.10651720831794" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="171.51185714908206" y="428.106517208318" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform=""></text><text class="pin-number sch-pin-label" x="190.52272855111187" y="429.37390863511996" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="9.505435701015px" transform="">PROG</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="222.20751422116155" y="648.632625471866" width="48.16087421847669" height="43.091308511267925" stroke-width="1.2673914268020001px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="222.20751422116155" y="648.632625471866" width="48.16087421847669" height="43.091308511267925" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="222.20751422116155" y1="670.1782797275" x2="196.8596856851218" y2="670.1782797275" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_1_0__stack1"><rect x="195.5922942583198" y="668.910888300698" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="209.53359995314213" y="668.9108883006979" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform=""></text><text class="pin-number sch-pin-label" x="228.54447135517194" y="670.1782797275" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="9.505435701015px" transform="">anode</text><line class="component-pin sch-component-pin sch-port-line" x1="270.36838843963824" y1="670.1782797275" x2="295.716216975678" y2="670.1782797275" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_1_1__stack1"><rect x="294.44882554887596" y="668.910888300698" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="283.04230270765765" y="668.9108883006979" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform=""></text><text class="pin-number sch-pin-label" x="264.03143130562785" y="670.1782797275" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="9.505435701015px" transform="">cathode</text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_2__stack1"><rect class="component chip sch-component-body" x="534.6195009278549" y="603.640229820395" width="127.05599053690003" height="6.3369571340099355" stroke-width="1.2673914268020001px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="534.6195009278549" y="603.640229820395" width="127.05599053690003" height="6.3369571340099355" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="563.1358080309001" y1="603.640229820395" x2="563.1358080309001" y2="583.9956627049639" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_2_0__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="563.1358080309001" cy="582.728271278162" r="1.2673914268020001" stroke-width="1.2673914268020001px"/><rect x="561.8684166040981" y="581.46087985136" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="561.8684166040975" y="593.1842505492784" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform="rotate(-90 561.8684166040975 593.1842505492784)">1</text><line class="component-pin sch-component-pin sch-port-line" x1="563.1358080309001" y1="609.9771869544049" x2="563.1358080309001" y2="630.889145496638" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_2_1__stack1"><rect x="561.8684166040981" y="629.621754069836" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="561.8684166040975" y="620.4331662255215" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform="rotate(-90 561.8684166040975 620.4331662255215)">2</text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_3__stack1"><rect class="component chip sch-component-body" x="476.9531910083638" y="205.04562609116596" width="40.556525657664224" height="43.09130851126804" stroke-width="1.2673914268020001px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="476.9531910083638" y="205.04562609116596" width="40.556525657664224" height="43.09130851126804" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="476.9531910083638" y1="226.59128034679998" x2="451.60536247232403" y2="226.59128034679998" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_3_0__stack1"><rect x="450.337971045522" y="225.32388891999798" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="464.27927674034436" y="225.32388891999796" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform=""></text><text class="pin-number sch-pin-label" x="483.29014814237416" y="226.59128034679998" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="9.505435701015px" transform="">anode</text><line class="component-pin sch-component-pin sch-port-line" x1="517.509716666028" y1="226.59128034679998" x2="542.8575452020677" y2="226.59128034679998" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_3_1__stack1"><rect x="541.5901537752658" y="225.32388891999798" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="530.1836309340479" y="225.32388891999796" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform=""></text><text class="pin-number sch-pin-label" x="511.17275953201806" y="226.59128034679998" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="9.505435701015px" transform="">cathode</text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_4__stack1"><rect class="component chip sch-component-body" x="869.8445333169836" y="189.20323325614095" width="25.347828536040424" height="74.77609418131806" stroke-width="1.2673914268020001px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="869.8445333169836" y="189.20323325614095" width="25.347828536040424" height="74.77609418131806" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="869.8445333169836" y1="226.59128034679998" x2="844.4967047809439" y2="226.59128034679998" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_4_0__stack1"><rect x="843.2293133541419" y="225.32388891999798" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="857.1706190489638" y="225.32388891999796" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform=""></text><text class="pin-number sch-pin-label" x="876.1814904509938" y="226.59128034679998" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="9.505435701015px" transform="">anode</text><line class="component-pin sch-component-pin sch-port-line" x1="895.1923618530241" y1="226.59128034679998" x2="920.540190389064" y2="226.59128034679998" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_4_1__stack1"><rect x="919.2727989622621" y="225.32388891999798" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="907.8662761210439" y="225.32388891999796" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform=""></text><text class="pin-number sch-pin-label" x="888.8554047190139" y="226.59128034679998" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="9.505435701015px" transform="">cathode</text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_5__stack1"><rect class="component chip sch-component-body" x="968.7010646075398" y="397.68912296507" width="76.04348560812014" height="38.021742804059954" stroke-width="1.2673914268020001px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="968.7010646075398" y="397.68912296507" width="76.04348560812014" height="38.021742804059954" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="968.7010646075398" y1="410.36303723309" x2="943.3532360714999" y2="410.36303723309" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_5_0__stack1"><rect x="942.0858446446979" y="409.09564580628796" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="956.02715033952" y="409.09564580628796" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform="">1</text><line class="component-pin sch-component-pin sch-port-line" x1="968.7010646075398" y1="423.03695150110997" x2="943.3532360714999" y2="423.03695150110997" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_5_1__stack1"><rect x="942.0858446446979" y="421.76956007430795" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="956.02715033952" y="421.769560074308" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform="">2</text><line class="component-pin sch-component-pin sch-port-line" x1="1044.74455021566" y1="423.03695150110997" x2="1068.824987324898" y2="423.03695150110997" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_5_2__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="1070.0923787517" cy="423.03695150110997" r="1.2673914268020001" stroke-width="1.2673914268020001px"/><rect x="1068.8249873248978" y="421.76956007430795" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="1057.41846448368" y="421.769560074308" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform="">3</text><line class="component-pin sch-component-pin sch-port-line" x1="1044.74455021566" y1="410.36303723309" x2="1068.824987324898" y2="410.36303723309" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_5_3__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="1070.0923787517" cy="410.36303723309" r="1.2673914268020001" stroke-width="1.2673914268020001px"/><rect x="1068.8249873248978" y="409.09564580628796" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="1057.41846448368" y="409.09564580628796" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform="">4</text></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_0__stack1"><circle cx="333.73795977973805" cy="423.03695150110997" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_1__stack1"><circle cx="158.83794288106174" cy="416.6999943671" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_2__stack1"><circle cx="333.73795977973805" cy="410.36303723309" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_3__stack1"><circle cx="158.83794288106174" cy="404.02608009908" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_4__stack1"><circle cx="158.83794288106174" cy="429.37390863511996" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_1_0__stack1"><circle cx="196.8596856851218" cy="670.1782797275" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_1_1__stack1"><circle cx="295.716216975678" cy="670.1782797275" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_2_0__stack1"><circle cx="563.1358080309001" cy="582.728271278162" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_2_1__stack1"><circle cx="563.1358080309001" cy="630.889145496638" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_3_0__stack1"><circle cx="451.60536247232403" cy="226.59128034679998" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_3_1__stack1"><circle cx="542.8575452020677" cy="226.59128034679998" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_4_0__stack1"><circle cx="844.4967047809439" cy="226.59128034679998" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_4_1__stack1"><circle cx="920.540190389064" cy="226.59128034679998" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_5_0__stack1"><circle cx="943.3532360714999" cy="410.36303723309" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_5_1__stack1"><circle cx="943.3532360714999" cy="423.03695150110997" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_5_2__stack1"><circle cx="1070.0923787517" cy="423.03695150110997" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_5_3__stack1"><circle cx="1070.0923787517" cy="410.36303723309" r="2.5347828536040002" fill="red" opacity="0"/></g><path class="net-label sch-net-label" data-circuit-json-type="schematic_net_label" data-schematic-net-label-id="schematic_net_label_0__stack1" d="
|
|
99
|
+
</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 158.83794288106174 429.37390863511996 L 146.1640286130414 429.37390863511996 L 146.1640286130414 670.1782797275 L 196.8596856851218 670.1782797275" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="10.139131414416001px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 158.83794288106174 429.37390863511996 L 146.1640286130414 429.37390863511996 L 146.1640286130414 670.1782797275 L 196.8596856851218 670.1782797275" stroke="rgb(0, 150, 0)" fill="none" stroke-width="1.2673914268020001px" 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 542.8575452020677 226.59128034679998 L 844.4967047809439 226.59128034679998" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="10.139131414416001px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 542.8575452020677 226.59128034679998 L 844.4967047809439 226.59128034679998" stroke="rgb(0, 150, 0)" fill="none" stroke-width="1.2673914268020001px" 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 295.716216975678 670.1782797275 L 563.1358080309001 670.1782797275 L 563.1358080309001 630.889145496638" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="10.139131414416001px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 295.716216975678 670.1782797275 L 563.1358080309001 670.1782797275 L 563.1358080309001 630.889145496638" stroke="rgb(0, 150, 0)" fill="none" stroke-width="1.2673914268020001px" 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_3__stack1"><path d="M 920.540190389064 226.59128034679998 L 933.2141046570839 226.59128034679998 L 933.2141046570839 374.17901199789287 L 609.9976060369045 374.17901199789287 L 609.9976060369045 423.03695150110997 L 333.73795977973805 423.03695150110997" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="10.139131414416001px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 920.540190389064 226.59128034679998 L 933.2141046570839 226.59128034679998 L 933.2141046570839 374.17901199789287 L 609.9976060369045 374.17901199789287 L 609.9976060369045 423.03695150110997 L 333.73795977973805 423.03695150110997" stroke="rgb(0, 150, 0)" fill="none" stroke-width="1.2673914268020001px" 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_4__stack1"><path d="M 943.3532360714999 423.03695150110997 L 937.0162789374899 423.03695150110997 L 937.0162789374899 429.37390863511996 L 928.0811693785358 429.37390863511996 L 928.0811693785358 435.77423534047006" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="10.139131414416001px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 943.3532360714999 423.03695150110997 L 937.0162789374899 423.03695150110997 L 937.0162789374899 429.37390863511996 L 928.0811693785358 429.37390863511996 L 928.0811693785358 435.77423534047006" stroke="rgb(0, 150, 0)" fill="none" stroke-width="1.2673914268020001px" 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_5__stack1"><path d="M 333.73795977973805 410.36303723309 L 352.81220075310785 410.36303723309 L 352.81220075310785 397.6257533937299" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="10.139131414416001px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 333.73795977973805 410.36303723309 L 352.81220075310785 410.36303723309 L 352.81220075310785 397.6257533937299" stroke="rgb(0, 150, 0)" fill="none" stroke-width="1.2673914268020001px" 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_6__stack1"><path d="M 943.3532360714999 410.36303723309 L 911.6050808301097 410.36303723309 L 911.6050808301097 407.13118909474485" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="10.139131414416001px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 943.3532360714999 410.36303723309 L 911.6050808301097 410.36303723309 L 911.6050808301097 407.13118909474485" stroke="rgb(0, 150, 0)" fill="none" stroke-width="1.2673914268020001px" 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_7__stack1"><path d="M 451.60536247232403 226.59128034679998 L 417.3224243773302 226.59128034679998 L 417.3224243773302 204.34856080642487" class="trace-invisible-hover-outline sch-trace-hitbox" stroke="rgb(0, 150, 0)" fill="none" stroke-width="10.139131414416001px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path class="sch-trace-path" d="M 451.60536247232403 226.59128034679998 L 417.3224243773302 226.59128034679998 L 417.3224243773302 204.34856080642487" stroke="rgb(0, 150, 0)" fill="none" stroke-width="1.2673914268020001px" 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="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_3__stack1"/><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_4__stack1"/><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_5__stack1"/><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_6__stack1"/><g class="trace-overlays sch-trace-overlays" data-layer="overlay" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_7__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="184.18577141710148" y="397.68912296507" width="124.20435982659683" height="38.021742804059954" stroke-width="1.2673914268020001px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="184.18577141710148" y="397.68912296507" width="124.20435982659683" height="38.021742804059954" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="308.3901312436983" y1="423.03695150110997" x2="333.73795977973805" y2="423.03695150110997" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_0_0__stack1"><rect x="332.470568352936" y="421.76956007430795" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="321.0640455117177" y="421.769560074308" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform=""></text><text class="pin-number sch-pin-label" x="302.0531741096879" y="423.03695150110997" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="9.505435701015px" transform="">STAT</text><line class="component-pin sch-component-pin sch-port-line" x1="184.18577141710148" y1="416.6999943671" x2="160.1053343078638" y2="416.6999943671" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_0_1__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="158.83794288106174" cy="416.6999943671" r="1.2673914268020001" stroke-width="1.2673914268020001px"/><rect x="157.57055145425974" y="415.43260294029795" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="171.51185714908206" y="415.43260294029795" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform=""></text><text class="pin-number sch-pin-label" x="190.52272855111187" y="416.6999943671" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="9.505435701015px" transform="">VSS</text><line class="component-pin sch-component-pin sch-port-line" x1="308.3901312436983" y1="410.36303723309" x2="333.73795977973805" y2="410.36303723309" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_0_2__stack1"><rect x="332.470568352936" y="409.09564580628796" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="321.0640455117177" y="409.09564580628796" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform=""></text><text class="pin-number sch-pin-label" x="302.0531741096879" y="410.36303723309" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="9.505435701015px" transform="">VBAT</text><line class="component-pin sch-component-pin sch-port-line" x1="184.18577141710148" y1="404.02608009908" x2="160.1053343078638" y2="404.02608009908" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_0_3__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="158.83794288106174" cy="404.02608009908" r="1.2673914268020001" stroke-width="1.2673914268020001px"/><rect x="157.57055145425974" y="402.75868867227797" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="171.51185714908206" y="402.75868867227797" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform=""></text><text class="pin-number sch-pin-label" x="190.52272855111187" y="404.02608009908" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="9.505435701015px" transform="">VDD</text><line class="component-pin sch-component-pin sch-port-line" x1="184.18577141710148" y1="429.37390863511996" x2="158.83794288106174" y2="429.37390863511996" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_0_4__stack1"><rect x="157.57055145425974" y="428.10651720831794" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="171.51185714908206" y="428.106517208318" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform=""></text><text class="pin-number sch-pin-label" x="190.52272855111187" y="429.37390863511996" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="9.505435701015px" transform="">PROG</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="222.20751422116155" y="648.632625471866" width="48.16087421847669" height="43.091308511267925" stroke-width="1.2673914268020001px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="222.20751422116155" y="648.632625471866" width="48.16087421847669" height="43.091308511267925" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="222.20751422116155" y1="670.1782797275" x2="196.8596856851218" y2="670.1782797275" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_1_0__stack1"><rect x="195.5922942583198" y="668.910888300698" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="209.53359995314213" y="668.9108883006979" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform=""></text><text class="pin-number sch-pin-label" x="228.54447135517194" y="670.1782797275" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="9.505435701015px" transform="">anode</text><line class="component-pin sch-component-pin sch-port-line" x1="270.36838843963824" y1="670.1782797275" x2="295.716216975678" y2="670.1782797275" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_1_1__stack1"><rect x="294.44882554887596" y="668.910888300698" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="283.04230270765765" y="668.9108883006979" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform=""></text><text class="pin-number sch-pin-label" x="264.03143130562785" y="670.1782797275" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="9.505435701015px" transform="">cathode</text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_2__stack1"><rect class="component chip sch-component-body" x="534.6195009278549" y="603.640229820395" width="127.05599053690003" height="6.3369571340099355" stroke-width="1.2673914268020001px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="534.6195009278549" y="603.640229820395" width="127.05599053690003" height="6.3369571340099355" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="563.1358080309001" y1="603.640229820395" x2="563.1358080309001" y2="583.9956627049639" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_2_0__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="563.1358080309001" cy="582.728271278162" r="1.2673914268020001" stroke-width="1.2673914268020001px"/><rect x="561.8684166040981" y="581.46087985136" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="561.8684166040975" y="593.1842505492784" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform="rotate(-90 561.8684166040975 593.1842505492784)">1</text><line class="component-pin sch-component-pin sch-port-line" x1="563.1358080309001" y1="609.9771869544049" x2="563.1358080309001" y2="630.889145496638" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_2_1__stack1"><rect x="561.8684166040981" y="629.621754069836" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="561.8684166040975" y="620.4331662255215" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform="rotate(-90 561.8684166040975 620.4331662255215)">2</text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_3__stack1"><rect class="component chip sch-component-body" x="476.9531910083638" y="205.04562609116596" width="40.556525657664224" height="43.09130851126804" stroke-width="1.2673914268020001px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="476.9531910083638" y="205.04562609116596" width="40.556525657664224" height="43.09130851126804" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="476.9531910083638" y1="226.59128034679998" x2="451.60536247232403" y2="226.59128034679998" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_3_0__stack1"><rect x="450.337971045522" y="225.32388891999798" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="464.27927674034436" y="225.32388891999796" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform=""></text><text class="pin-number sch-pin-label" x="483.29014814237416" y="226.59128034679998" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="9.505435701015px" transform="">anode</text><line class="component-pin sch-component-pin sch-port-line" x1="517.509716666028" y1="226.59128034679998" x2="542.8575452020677" y2="226.59128034679998" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_3_1__stack1"><rect x="541.5901537752658" y="225.32388891999798" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="530.1836309340479" y="225.32388891999796" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform=""></text><text class="pin-number sch-pin-label" x="511.17275953201806" y="226.59128034679998" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="9.505435701015px" transform="">cathode</text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_4__stack1"><rect class="component chip sch-component-body" x="869.8445333169836" y="189.20323325614095" width="25.347828536040424" height="74.77609418131806" stroke-width="1.2673914268020001px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="869.8445333169836" y="189.20323325614095" width="25.347828536040424" height="74.77609418131806" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="869.8445333169836" y1="226.59128034679998" x2="844.4967047809439" y2="226.59128034679998" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_4_0__stack1"><rect x="843.2293133541419" y="225.32388891999798" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="857.1706190489638" y="225.32388891999796" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform=""></text><text class="pin-number sch-pin-label" x="876.1814904509938" y="226.59128034679998" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="start" dominant-baseline="middle" font-size="9.505435701015px" transform="">anode</text><line class="component-pin sch-component-pin sch-port-line" x1="895.1923618530241" y1="226.59128034679998" x2="920.540190389064" y2="226.59128034679998" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_4_1__stack1"><rect x="919.2727989622621" y="225.32388891999798" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="907.8662761210439" y="225.32388891999796" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform=""></text><text class="pin-number sch-pin-label" x="888.8554047190139" y="226.59128034679998" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="end" dominant-baseline="middle" font-size="9.505435701015px" transform="">cathode</text></g><g class="sch-component" data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_5__stack1"><rect class="component chip sch-component-body" x="968.7010646075398" y="397.68912296507" width="76.04348560812014" height="38.021742804059954" stroke-width="1.2673914268020001px" fill="rgb(255, 255, 194)" stroke="rgb(132, 0, 0)"/><rect class="component-overlay sch-component-overlay" x="968.7010646075398" y="397.68912296507" width="76.04348560812014" height="38.021742804059954" fill="transparent"/><line class="component-pin sch-component-pin sch-port-line" x1="968.7010646075398" y1="410.36303723309" x2="943.3532360714999" y2="410.36303723309" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_5_0__stack1"><rect x="942.0858446446979" y="409.09564580628796" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="956.02715033952" y="409.09564580628796" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform="">1</text><line class="component-pin sch-component-pin sch-port-line" x1="968.7010646075398" y1="423.03695150110997" x2="943.3532360714999" y2="423.03695150110997" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_5_1__stack1"><rect x="942.0858446446979" y="421.76956007430795" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="956.02715033952" y="421.769560074308" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform="">2</text><line class="component-pin sch-component-pin sch-port-line" x1="1044.74455021566" y1="423.03695150110997" x2="1068.824987324898" y2="423.03695150110997" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_5_2__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="1070.0923787517" cy="423.03695150110997" r="1.2673914268020001" stroke-width="1.2673914268020001px"/><rect x="1068.8249873248978" y="421.76956007430795" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="1057.41846448368" y="421.769560074308" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform="">3</text><line class="component-pin sch-component-pin sch-port-line" x1="1044.74455021566" y1="410.36303723309" x2="1068.824987324898" y2="410.36303723309" stroke-width="1.2673914268020001px"/><g class="sch-port" data-schematic-port-id="source_port_5_3__stack1"><circle class="component-pin sch-component-pin sch-port-terminal" cx="1070.0923787517" cy="410.36303723309" r="1.2673914268020001" stroke-width="1.2673914268020001px"/><rect x="1068.8249873248978" y="409.09564580628796" width="2.5347828536040002" height="2.5347828536040002" opacity="0"/></g><text class="pin-number sch-pin-number" x="1057.41846448368" y="409.09564580628796" style="font-family: sans-serif;" fill="rgb(169, 0, 0)" text-anchor="middle" dominant-baseline="auto" font-size="9.505435701015px" transform="">4</text></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_0__stack1"><circle cx="333.73795977973805" cy="423.03695150110997" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_1__stack1"><circle cx="158.83794288106174" cy="416.6999943671" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_2__stack1"><circle cx="333.73795977973805" cy="410.36303723309" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_3__stack1"><circle cx="158.83794288106174" cy="404.02608009908" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_0_4__stack1"><circle cx="158.83794288106174" cy="429.37390863511996" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_1_0__stack1"><circle cx="196.8596856851218" cy="670.1782797275" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_1_1__stack1"><circle cx="295.716216975678" cy="670.1782797275" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_2_0__stack1"><circle cx="563.1358080309001" cy="582.728271278162" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_2_1__stack1"><circle cx="563.1358080309001" cy="630.889145496638" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_3_0__stack1"><circle cx="451.60536247232403" cy="226.59128034679998" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_3_1__stack1"><circle cx="542.8575452020677" cy="226.59128034679998" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_4_0__stack1"><circle cx="844.4967047809439" cy="226.59128034679998" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_4_1__stack1"><circle cx="920.540190389064" cy="226.59128034679998" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_5_0__stack1"><circle cx="943.3532360714999" cy="410.36303723309" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_5_1__stack1"><circle cx="943.3532360714999" cy="423.03695150110997" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_5_2__stack1"><circle cx="1070.0923787517" cy="423.03695150110997" r="2.5347828536040002" fill="red" opacity="0"/></g><g class="schematic-port-hover sch-port-hover" data-schematic-port-id="source_port_5_3__stack1"><circle cx="1070.0923787517" cy="410.36303723309" r="2.5347828536040002" fill="red" opacity="0"/></g><path class="net-label sch-net-label" data-circuit-json-type="schematic_net_label" data-schematic-net-label-id="schematic_net_label_0__stack1" d="
|
|
100
100
|
M 933.2141046570839,226.59128034679998
|
|
101
101
|
L 926.8771475230739,223.16932349443456
|
|
102
102
|
L 926.877147523074,112.11203740186467
|
|
@@ -35,8 +35,10 @@ test("pipeline does not stretch a real loop toward a generated label connector",
|
|
|
35
35
|
|
|
36
36
|
const traces = solver.traceCleanupSolver2!.getOutput().traces
|
|
37
37
|
const realTrace = traces.find((trace) => trace.mspPairId === "U3.3-U3.7")!
|
|
38
|
-
const
|
|
39
|
-
|
|
38
|
+
const [labelConnectorTraceId] =
|
|
39
|
+
solver.availableNetOrientationSolver!.netLabelConnectorTraceIds
|
|
40
|
+
const labelConnector = traces.find(
|
|
41
|
+
(trace) => trace.mspPairId === labelConnectorTraceId,
|
|
40
42
|
)!
|
|
41
43
|
expect(realTrace.tracePath).toEqual([
|
|
42
44
|
{ x: 1.4, y: -0.3 },
|
package/tests/solvers/TraceCleanupSolver/reroute-generated-net-label-connector-crossings.test.ts
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { expect, test } from "bun:test"
|
|
2
|
+
import { getPathLength } from "lib/solvers/Example28Solver/geometry"
|
|
3
|
+
import type { SolvedTracePath } from "lib/solvers/SchematicTraceLinesSolver/SchematicTraceLinesSolver"
|
|
4
|
+
import { rerouteGeneratedNetLabelConnectorCrossings } from "lib/solvers/TraceCleanupSolver/rerouteGeneratedNetLabelConnectorCrossings"
|
|
5
|
+
import { findPerpendicularPathCrossings } from "lib/solvers/TraceCleanupSolver/sub-solver/findIntersectionsWithObstacles"
|
|
6
|
+
|
|
7
|
+
const makeTrace = ({
|
|
8
|
+
mspPairId,
|
|
9
|
+
globalConnNetId,
|
|
10
|
+
tracePath,
|
|
11
|
+
pinIds,
|
|
12
|
+
}: {
|
|
13
|
+
mspPairId: string
|
|
14
|
+
globalConnNetId: string
|
|
15
|
+
tracePath: Array<{ x: number; y: number }>
|
|
16
|
+
pinIds: string[]
|
|
17
|
+
}): SolvedTracePath => {
|
|
18
|
+
const firstPoint = tracePath[0]!
|
|
19
|
+
const lastPoint = tracePath.at(-1)!
|
|
20
|
+
return {
|
|
21
|
+
mspPairId,
|
|
22
|
+
dcConnNetId: globalConnNetId,
|
|
23
|
+
globalConnNetId,
|
|
24
|
+
pins: [
|
|
25
|
+
{
|
|
26
|
+
pinId: pinIds[0]!,
|
|
27
|
+
chipId: `${mspPairId}-start-chip`,
|
|
28
|
+
...firstPoint,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
pinId: pinIds[1] ?? pinIds[0]!,
|
|
32
|
+
chipId: `${mspPairId}-end-chip`,
|
|
33
|
+
...lastPoint,
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
pinIds,
|
|
37
|
+
mspConnectionPairIds: [mspPairId],
|
|
38
|
+
tracePath,
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const signalTrace = makeTrace({
|
|
43
|
+
mspPairId: "signal-trace",
|
|
44
|
+
globalConnNetId: "signal-net",
|
|
45
|
+
pinIds: ["signal-a", "signal-b"],
|
|
46
|
+
tracePath: [
|
|
47
|
+
{ x: 1, y: 3 },
|
|
48
|
+
{ x: 2, y: 3 },
|
|
49
|
+
{ x: 2, y: 0 },
|
|
50
|
+
{ x: -6, y: 0 },
|
|
51
|
+
],
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
const connectorTrace = makeTrace({
|
|
55
|
+
mspPairId: "vbat-label-connector",
|
|
56
|
+
globalConnNetId: "vbat-net",
|
|
57
|
+
pinIds: ["vbat"],
|
|
58
|
+
tracePath: [
|
|
59
|
+
{ x: 3, y: 1 },
|
|
60
|
+
{ x: 1.5, y: 1 },
|
|
61
|
+
{ x: 1.5, y: 1.5 },
|
|
62
|
+
],
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
const vbatLabel = {
|
|
66
|
+
globalConnNetId: "vbat-net",
|
|
67
|
+
pinIds: ["vbat"],
|
|
68
|
+
anchorPoint: { x: 1.5, y: 1.5 },
|
|
69
|
+
center: { x: 1.5, y: 1.7 },
|
|
70
|
+
width: 1,
|
|
71
|
+
height: 0.4,
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const inputProblem = { chips: [], textBoxes: [] } as any
|
|
75
|
+
|
|
76
|
+
test("reroutes a component trace through an equally short clean corridor", () => {
|
|
77
|
+
const result = rerouteGeneratedNetLabelConnectorCrossings({
|
|
78
|
+
inputProblem,
|
|
79
|
+
traces: [signalTrace, connectorTrace],
|
|
80
|
+
netLabelPlacements: [vbatLabel as any],
|
|
81
|
+
mergedLabelNetIdMap: {},
|
|
82
|
+
clearance: 0.1,
|
|
83
|
+
eligibleTraceIds: new Set([signalTrace.mspPairId]),
|
|
84
|
+
connectorTraceIds: new Set([connectorTrace.mspPairId]),
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
expect(result.reroutedTraceCount).toBe(1)
|
|
88
|
+
expect(result.traces[1]!.tracePath).toEqual(connectorTrace.tracePath)
|
|
89
|
+
expect(getPathLength(result.traces[0]!.tracePath)).toBeLessThanOrEqual(
|
|
90
|
+
getPathLength(signalTrace.tracePath),
|
|
91
|
+
)
|
|
92
|
+
expect(
|
|
93
|
+
findPerpendicularPathCrossings(
|
|
94
|
+
result.traces[0]!.tracePath,
|
|
95
|
+
result.traces[1]!.tracePath,
|
|
96
|
+
{ includeTerminalSegments: true },
|
|
97
|
+
),
|
|
98
|
+
).toEqual([])
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
test("preserves a crossing when avoiding it would lengthen the routed trace", () => {
|
|
102
|
+
const straightSignal = makeTrace({
|
|
103
|
+
mspPairId: "straight-signal",
|
|
104
|
+
globalConnNetId: "signal-net",
|
|
105
|
+
pinIds: ["signal-a", "signal-b"],
|
|
106
|
+
tracePath: [
|
|
107
|
+
{ x: -2, y: 0 },
|
|
108
|
+
{ x: 2, y: 0 },
|
|
109
|
+
],
|
|
110
|
+
})
|
|
111
|
+
const verticalConnector = makeTrace({
|
|
112
|
+
mspPairId: "vertical-label-connector",
|
|
113
|
+
globalConnNetId: "label-net",
|
|
114
|
+
pinIds: ["label-pin"],
|
|
115
|
+
tracePath: [
|
|
116
|
+
{ x: 0, y: -1 },
|
|
117
|
+
{ x: 0, y: 1 },
|
|
118
|
+
],
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
const result = rerouteGeneratedNetLabelConnectorCrossings({
|
|
122
|
+
inputProblem,
|
|
123
|
+
traces: [straightSignal, verticalConnector],
|
|
124
|
+
netLabelPlacements: [],
|
|
125
|
+
mergedLabelNetIdMap: {},
|
|
126
|
+
clearance: 0.1,
|
|
127
|
+
eligibleTraceIds: new Set([straightSignal.mspPairId]),
|
|
128
|
+
connectorTraceIds: new Set([verticalConnector.mspPairId]),
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
expect(result.reroutedTraceCount).toBe(0)
|
|
132
|
+
expect(result.traces[0]!.tracePath).toEqual(straightSignal.tracePath)
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
test("allows crossings between generated label connectors", () => {
|
|
136
|
+
const otherConnector = makeTrace({
|
|
137
|
+
mspPairId: "other-label-connector",
|
|
138
|
+
globalConnNetId: "other-label-net",
|
|
139
|
+
pinIds: ["other-label-pin"],
|
|
140
|
+
tracePath: [
|
|
141
|
+
{ x: 2, y: 0 },
|
|
142
|
+
{ x: 2, y: 2 },
|
|
143
|
+
],
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
const result = rerouteGeneratedNetLabelConnectorCrossings({
|
|
147
|
+
inputProblem,
|
|
148
|
+
traces: [connectorTrace, otherConnector],
|
|
149
|
+
netLabelPlacements: [vbatLabel as any],
|
|
150
|
+
mergedLabelNetIdMap: {},
|
|
151
|
+
clearance: 0.1,
|
|
152
|
+
connectorTraceIds: new Set([
|
|
153
|
+
connectorTrace.mspPairId,
|
|
154
|
+
otherConnector.mspPairId,
|
|
155
|
+
]),
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
expect(result.reroutedTraceCount).toBe(0)
|
|
159
|
+
expect(result.traces).toEqual([connectorTrace, otherConnector])
|
|
160
|
+
})
|