diff --git a/lib/solvers/TraceCleanupSolver/TraceCleanupSolver.ts b/lib/solvers/TraceCleanupSolver/TraceCleanupSolver.ts index e9bac7ca3..a1188659d 100644 --- a/lib/solvers/TraceCleanupSolver/TraceCleanupSolver.ts +++ b/lib/solvers/TraceCleanupSolver/TraceCleanupSolver.ts @@ -20,11 +20,13 @@ interface TraceCleanupSolverInput { import { UntangleTraceSubsolver } from "./sub-solver/UntangleTraceSubsolver" import { is4PointRectangle } from "./is4PointRectangle" +import { mergeSameNetTraceSegments } from "./mergeSameNetTraceSegments" /** * Represents the different stages or steps within the trace cleanup pipeline. */ type PipelineStep = + | "merging_same_net_trace_segments" | "minimizing_turns" | "balancing_l_shapes" | "untangling_traces" @@ -66,10 +68,10 @@ export class TraceCleanupSolver extends BaseSolver { this.outputTraces = output.traces this.tracesMap = new Map(this.outputTraces.map((t) => [t.mspPairId, t])) this.activeSubSolver = null - this.pipelineStep = "minimizing_turns" + this.pipelineStep = "merging_same_net_trace_segments" } else if (this.activeSubSolver.failed) { this.activeSubSolver = null - this.pipelineStep = "minimizing_turns" + this.pipelineStep = "merging_same_net_trace_segments" } return } @@ -78,6 +80,9 @@ export class TraceCleanupSolver extends BaseSolver { case "untangling_traces": this._runUntangleTracesStep() break + case "merging_same_net_trace_segments": + this._runMergeSameNetTraceSegmentsStep() + break case "minimizing_turns": this._runMinimizeTurnsStep() break @@ -94,6 +99,14 @@ export class TraceCleanupSolver extends BaseSolver { }) } + private _runMergeSameNetTraceSegmentsStep() { + this.outputTraces = mergeSameNetTraceSegments(this.outputTraces, { + tolerance: Math.max(this.input.paddingBuffer * 4, 0.12), + }) + this.tracesMap = new Map(this.outputTraces.map((t) => [t.mspPairId, t])) + this.pipelineStep = "minimizing_turns" + } + private _runMinimizeTurnsStep() { if (this.traceIdQueue.length === 0) { this.pipelineStep = "balancing_l_shapes" diff --git a/lib/solvers/TraceCleanupSolver/mergeSameNetTraceSegments.ts b/lib/solvers/TraceCleanupSolver/mergeSameNetTraceSegments.ts new file mode 100644 index 000000000..0cbee8f29 --- /dev/null +++ b/lib/solvers/TraceCleanupSolver/mergeSameNetTraceSegments.ts @@ -0,0 +1,144 @@ +import type { Point } from "graphics-debug" +import type { SolvedTracePath } from "lib/solvers/SchematicTraceLinesSolver/SchematicTraceLinesSolver" +import { + isHorizontal, + isVertical, +} from "lib/solvers/SchematicTraceLinesSolver/SchematicTraceSingleLineSolver2/collisions" + +type SegmentOrientation = "horizontal" | "vertical" + +interface TraceSegment { + traceIndex: number + pointIndex: number + orientation: SegmentOrientation + coord: number + min: number + max: number + netKey: string +} + +const getTraceNetKey = (trace: SolvedTracePath) => + trace.userNetId ?? trace.globalConnNetId ?? trace.dcConnNetId + +const rangesOverlap = ( + aMin: number, + aMax: number, + bMin: number, + bMax: number, +) => Math.min(aMax, bMax) >= Math.max(aMin, bMin) + +const getInteriorOrthogonalSegments = ( + traces: SolvedTracePath[], +): TraceSegment[] => { + const segments: TraceSegment[] = [] + + traces.forEach((trace, traceIndex) => { + const netKey = getTraceNetKey(trace) + if (!netKey) return + + for ( + let pointIndex = 1; + pointIndex < trace.tracePath.length - 2; + pointIndex++ + ) { + const p1 = trace.tracePath[pointIndex]! + const p2 = trace.tracePath[pointIndex + 1]! + + if (isHorizontal(p1, p2)) { + segments.push({ + traceIndex, + pointIndex, + orientation: "horizontal", + coord: p1.y, + min: Math.min(p1.x, p2.x), + max: Math.max(p1.x, p2.x), + netKey, + }) + } else if (isVertical(p1, p2)) { + segments.push({ + traceIndex, + pointIndex, + orientation: "vertical", + coord: p1.x, + min: Math.min(p1.y, p2.y), + max: Math.max(p1.y, p2.y), + netKey, + }) + } + } + }) + + return segments +} + +const alignSegment = ( + tracePath: Point[], + segment: TraceSegment, + coord: number, +) => { + const p1 = tracePath[segment.pointIndex]! + const p2 = tracePath[segment.pointIndex + 1]! + const nextP1 = Object.create(Object.getPrototypeOf(p1)) + Object.defineProperties(nextP1, Object.getOwnPropertyDescriptors(p1)) + const nextP2 = Object.create(Object.getPrototypeOf(p2)) + Object.defineProperties(nextP2, Object.getOwnPropertyDescriptors(p2)) + + if (segment.orientation === "horizontal") { + nextP1.y = coord + nextP2.y = coord + } else { + nextP1.x = coord + nextP2.x = coord + } + + tracePath[segment.pointIndex] = nextP1 + tracePath[segment.pointIndex + 1] = nextP2 +} + +export const mergeSameNetTraceSegments = ( + traces: SolvedTracePath[], + { tolerance = 0.12 }: { tolerance?: number } = {}, +): SolvedTracePath[] => { + const nextTraces = traces.slice() + const mutableTraceIndexes = new Set() + + const getMutableTracePath = (traceIndex: number) => { + if (!mutableTraceIndexes.has(traceIndex)) { + const trace = traces[traceIndex]! + nextTraces[traceIndex] = { + ...trace, + tracePath: trace.tracePath.slice(), + } + mutableTraceIndexes.add(traceIndex) + } + + return nextTraces[traceIndex]!.tracePath + } + + const segments = getInteriorOrthogonalSegments(traces) + + for (let i = 0; i < segments.length; i++) { + const anchor = segments[i]! + + for (let j = i + 1; j < segments.length; j++) { + const candidate = segments[j]! + if (anchor.netKey !== candidate.netKey) continue + if (anchor.orientation !== candidate.orientation) continue + if (Math.abs(anchor.coord - candidate.coord) > tolerance) continue + if ( + !rangesOverlap(anchor.min, anchor.max, candidate.min, candidate.max) + ) { + continue + } + + alignSegment( + getMutableTracePath(candidate.traceIndex), + candidate, + anchor.coord, + ) + candidate.coord = anchor.coord + } + } + + return nextTraces +} diff --git a/tests/examples/__snapshots__/example01.snap.svg b/tests/examples/__snapshots__/example01.snap.svg index 2614ba80f..c4094727d 100644 --- a/tests/examples/__snapshots__/example01.snap.svg +++ b/tests/examples/__snapshots__/example01.snap.svg @@ -41,16 +41,13 @@ y+" data-x="-4" data-y="0.5" cx="67.72277227722776" cy="245.14851485148515" r="3 y-" data-x="-4" data-y="-0.5" cx="67.72277227722776" cy="356.03960396039605" r="3" fill="hsl(3, 100%, 50%, 0.8)" /> - + - + - + @@ -77,7 +74,7 @@ orientation: y-" data-x="-1.4" data-y="-0.7" cx="356.0396039603961" cy="378.2178 - + @@ -90,18 +87,15 @@ orientation: y-" data-x="-1.4" data-y="-0.7" cx="356.0396039603961" cy="378.2178 +globalConnNetId: connectivity_net0" data-x="-1.1" data-y="0.42500000000000016" x="378.21782178217825" y="228.51485148514848" width="22.178217821782198" height="49.9009900990099" fill="#ef444466" stroke="#ef4444" stroke-width="0.009017857142857143" /> +globalConnNetId: connectivity_net1" data-x="-1.5" data-y="0" x="320" y="289.5049504950495" width="49.90099009900996" height="22.17821782178214" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.009017857142857143" /> +globalConnNetId: connectivity_net2" data-x="-1.4" data-y="-0.9249999999999999" x="344.950495049505" y="378.2178217821782" width="22.178217821782198" height="49.9009900990099" fill="#00000066" stroke="#000000" stroke-width="0.009017857142857143" /> - + - + - + - + @@ -165,7 +161,7 @@ orientation: y+" data-x="1.4571549750000001" data-y="0.29999999999999966" cx="53 - + @@ -174,7 +170,7 @@ orientation: y+" data-x="1.4571549750000001" data-y="0.29999999999999966" cx="53 - + @@ -196,23 +192,19 @@ orientation: y+" data-x="1.4571549750000001" data-y="0.29999999999999966" cx="53 +globalConnNetId: connectivity_net0" data-x="-1.4574283249999997" data-y="1.5274186000000005" x="283.75416992460123" y="184.33736239143013" width="16.926952823252577" height="38.08564385231816" fill="#ef444466" stroke="#ef4444" stroke-width="0.011815475714285715" /> +globalConnNetId: connectivity_net1" data-x="-1.5071549750000002" data-y="-0.4250000000000004" x="279.54556663155927" y="349.5798500586337" width="16.92695282325252" height="38.085643852318185" fill="#00000066" stroke="#000000" stroke-width="0.011815475714285715" /> +globalConnNetId: connectivity_net1" data-x="1.9148566499999995" data-y="-1.2284186000000008" x="569.1667133165424" y="417.5769937562517" width="16.926952823252577" height="38.08564385231813" fill="#00000066" stroke="#000000" stroke-width="0.011815475714285715" /> +globalConnNetId: connectivity_net2" data-x="1.4571549750000001" data-y="0.5249999999999997" x="530.4292400172993" y="269.1768241481843" width="16.926952823252464" height="38.08564385231813" fill="#ef444466" stroke="#ef4444" stroke-width="0.011815475714285715" /> - + - + @@ -28,13 +26,11 @@ orientation: y-" data-x="0.31067575550000137" data-y="-0.5800832909999993" cx="4 +globalConnNetId: connectivity_net0" data-x="0.30397715550000004" data-y="0.8060832909999993" x="375.3918427720889" y="40" width="54.311810198852356" height="122.20157294741779" fill="#ef444466" stroke="#ef4444" stroke-width="0.003682440324999998" /> +globalConnNetId: connectivity_net0" data-x="0.31067575550000137" data-y="-0.8060832909999993" x="377.2109082310795" y="477.7984270525822" width="54.3118101988523" height="122.20157294741779" fill="#ef444466" stroke="#ef4444" stroke-width="0.003682440324999998" /> - + diff --git a/tests/examples/__snapshots__/example06.snap.svg b/tests/examples/__snapshots__/example06.snap.svg index 06393ee83..892b9fda1 100644 --- a/tests/examples/__snapshots__/example06.snap.svg +++ b/tests/examples/__snapshots__/example06.snap.svg @@ -17,8 +17,7 @@ x-" data-x="2.4487906999999995" data-y="-0.00027334999999961695" cx="516.6019026 x+" data-x="3.5512093000000005" data-y="0.00027334999999961695" cx="600" cy="318.8552321513003" r="3" fill="hsl(122, 100%, 50%, 0.8)" /> - + diff --git a/tests/examples/__snapshots__/example07.snap.svg b/tests/examples/__snapshots__/example07.snap.svg index 7098ddacf..11518ca6e 100644 --- a/tests/examples/__snapshots__/example07.snap.svg +++ b/tests/examples/__snapshots__/example07.snap.svg @@ -49,24 +49,19 @@ y+" data-x="1.7580660749999977" data-y="2.3025814000000002" cx="547.417910680137 y-" data-x="1.757519574999999" data-y="1.2" cx="547.3539750075635" cy="270.4175115470151" r="3" fill="hsl(126, 100%, 50%, 0.8)" /> - + - + - + - + - + @@ -136,28 +131,23 @@ orientation: x+" data-x="1.757519574999999" data-y="0.85" cx="547.3539750075635" +globalConnNetId: connectivity_net0" data-x="-1.8574283249999997" data-y="0.9762093000000004" x="112.7378861431207" y="270.2760341291854" width="23.398233329971788" height="52.64602499243642" fill="#ef444466" stroke="#ef4444" stroke-width="0.00854765388392857" /> +globalConnNetId: connectivity_net0" data-x="1.5999999999999999" data-y="-0.07499999999999998" x="517.2264594931378" y="393.2582365293668" width="23.39823332997173" height="52.64602499243648" fill="#ef444466" stroke="#ef4444" stroke-width="0.00854765388392857" /> +globalConnNetId: connectivity_net0" data-x="1.7580660749999977" data-y="2.5285814" x="535.7187940151516" y="88.66221107549416" width="23.39823332997173" height="52.64602499243642" fill="#ef444466" stroke="#ef4444" stroke-width="0.00854765388392857" /> +globalConnNetId: connectivity_net1" data-x="-2.31430995" data-y="-0.9762093000000004" x="59.28677181348735" y="498.6917639320694" width="23.398233329971788" height="52.64602499243642" fill="#00000066" stroke="#000000" stroke-width="0.00854765388392857" /> +globalConnNetId: connectivity_net2" data-x="1.982519574999999" data-y="0.85" x="547.3539750075635" y="299.6653032094798" width="52.64602499243654" height="23.39823332997173" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.00854765388392857" /> - + - + - + - + diff --git a/tests/examples/__snapshots__/example09.snap.svg b/tests/examples/__snapshots__/example09.snap.svg index a37ea0cd1..336bf206c 100644 --- a/tests/examples/__snapshots__/example09.snap.svg +++ b/tests/examples/__snapshots__/example09.snap.svg @@ -161,84 +161,64 @@ x-" data-x="3.4487093" data-y="2.0002732499999993" cx="513.0392817834438" cy="18 x+" data-x="4.5512907" data-y="1.9997267500000007" cx="574.7555654852287" cy="187.23902631248512" r="3" fill="hsl(7, 100%, 50%, 0.8)" /> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -292,7 +272,7 @@ orientation: x+" data-x="4.5512907" data-y="-2.0002732499999993" cx="574.7555654 - + @@ -307,7 +287,7 @@ orientation: x+" data-x="4.5512907" data-y="-2.0002732499999993" cx="574.7555654 - + @@ -372,7 +352,7 @@ globalConnNetId: connectivity_net2" data-x="-2.9240319749999992" data-y="-0.7752 +globalConnNetId: connectivity_net3" data-x="-1.3499999999999999" data-y="-0.22527324999999934" x="238.8371839325532" y="299.1877381296532" width="11.19487118171682" height="25.188460158862824" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.017865323928571427" /> +globalConnNetId: connectivity_net9" data-x="1.3499999999999999" data-y="-0.22472675000000067" x="389.9679448857301" y="299.15714814414923" width="11.194871181716792" height="25.188460158862824" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.017865323928571427" /> - + - + - + - + diff --git a/tests/examples/__snapshots__/example11.snap.svg b/tests/examples/__snapshots__/example11.snap.svg index a693a44f9..7cafd31dd 100644 --- a/tests/examples/__snapshots__/example11.snap.svg +++ b/tests/examples/__snapshots__/example11.snap.svg @@ -37,28 +37,22 @@ y-" data-x="1.03" data-y="-1.03" cx="472.6501766784452" cy="478.65724381625444" x+" data-x="1.48" data-y="-0.665" cx="536.2544169611307" cy="427.0671378091873" r="3" fill="hsl(220, 100%, 50%, 0.8)" /> - + - + - + - + - + - + diff --git a/tests/examples/__snapshots__/example12.snap.svg b/tests/examples/__snapshots__/example12.snap.svg index b65b97550..1d24c7f5e 100644 --- a/tests/examples/__snapshots__/example12.snap.svg +++ b/tests/examples/__snapshots__/example12.snap.svg @@ -29,20 +29,16 @@ x-" data-x="2.3099999999999996" data-y="0.01999999999999985" cx="445.34918276374 x+" data-x="3.41" data-y="0.01999999999999985" cx="576.1069836552749" cy="222.85555126300153" r="3" fill="hsl(122, 100%, 50%, 0.8)" /> - + - + - + - + @@ -60,7 +56,7 @@ orientation: y-" data-x="3.511" data-y="-0.4310000000000001" cx="588.11292719167 - + @@ -82,23 +78,19 @@ orientation: y-" data-x="3.511" data-y="-0.4310000000000001" cx="588.11292719167 +globalConnNetId: connectivity_net0" data-x="2.1099999999999994" data-y="0.42500000000000004" x="409.6879643387815" y="147.96699257057952" width="23.77414561664193" height="53.49182763744429" fill="#ef444466" stroke="#ef4444" stroke-width="0.008412500000000002" /> +globalConnNetId: connectivity_net1" data-x="1.5250000000000001" data-y="0" x="325.28974739970283" y="213.34589301634475" width="53.49182763744432" height="23.77414561664193" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008412500000000002" /> +globalConnNetId: connectivity_net2" data-x="1.8499999999999996" data-y="-2.0194553499999994" x="378.78157503714704" y="438.54117979197616" width="23.77414561664193" height="53.49182763744432" fill="#00000066" stroke="#000000" stroke-width="0.008412500000000002" /> +globalConnNetId: connectivity_net2" data-x="3.511" data-y="-0.6560000000000001" x="576.2258543833581" y="276.466249628529" width="23.77414561664193" height="53.49182763744432" fill="#00000066" stroke="#000000" stroke-width="0.008412500000000002" /> - + - + - + - + - + - + - + - + @@ -199,7 +191,7 @@ orientation: y+" data-x="1.96375" data-y="3" cx="417.91062100986653" cy="157.492 - + @@ -251,43 +243,35 @@ orientation: y+" data-x="1.96375" data-y="3" cx="417.91062100986653" cy="157.492 +globalConnNetId: connectivity_net3" data-x="3.75" data-y="-1.725" x="527.5217643644805" y="450.0058038305282" width="13.000580383052807" height="29.251305861868843" fill="#00000066" stroke="#000000" stroke-width="0.015383928571428571" /> +globalConnNetId: connectivity_net3" data-x="-2.125" data-y="-2.2249999999999996" x="145.6297156123041" y="482.5072547881602" width="13.000580383052835" height="29.251305861868843" fill="#00000066" stroke="#000000" stroke-width="0.015383928571428571" /> +globalConnNetId: connectivity_net4" data-x="1.475" data-y="0.225" x="379.6401625072548" y="323.25014509576323" width="13.000580383052807" height="29.251305861868843" fill="#ef444466" stroke="#ef4444" stroke-width="0.015383928571428571" /> +globalConnNetId: connectivity_net4" data-x="-1.301" data-y="-0.8490000000000001" x="199.19210679048172" y="393.0632617527569" width="13.000580383052807" height="29.251305861868843" fill="#ef444466" stroke="#ef4444" stroke-width="0.015383928571428571" /> +globalConnNetId: connectivity_net2" data-x="-1.9" data-y="0.225" x="160.25536854323852" y="323.25014509576323" width="13.000580383052835" height="29.251305861868843" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.015383928571428571" /> +globalConnNetId: connectivity_net0" data-x="-3.75" data-y="2.225" x="39.99999999999997" y="193.24434126523508" width="13.000580383052835" height="29.251305861868843" fill="#ef444466" stroke="#ef4444" stroke-width="0.015383928571428571" /> +globalConnNetId: connectivity_net0" data-x="2.2990000000000004" data-y="0.276" x="433.20255368543235" y="319.93499709808475" width="13.000580383052863" height="29.251305861868843" fill="#ef444466" stroke="#ef4444" stroke-width="0.015383928571428571" /> +globalConnNetId: connectivity_net1" data-x="1.96375" data-y="3.225" x="411.41033081834007" y="128.241439349971" width="13.000580383052807" height="29.25130586186887" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.015383928571428571" /> - + - + - + - + - + - + - + - + @@ -168,10 +160,10 @@ orientation: y+" data-x="1.4755000000000003" data-y="-1.2944553500000002" cx="44 - + - + @@ -196,43 +188,35 @@ orientation: y+" data-x="1.4755000000000003" data-y="-1.2944553500000002" cx="44 +globalConnNetId: connectivity_net4" data-x="1.3010000000000002" data-y="-0.7260000000000001" x="419.16307692307697" y="335.1630769230769" width="17.230769230769226" height="38.769230769230774" fill="#00000066" stroke="#000000" stroke-width="0.011607142857142856" /> +globalConnNetId: connectivity_net4" data-x="-1.2000000000000002" data-y="-2.6750000000000003" x="203.6923076923077" y="503.0769230769231" width="17.230769230769255" height="38.76923076923083" fill="#00000066" stroke="#000000" stroke-width="0.011607142857142856" /> +globalConnNetId: connectivity_net1" data-x="-1.6250000000000002" data-y="-0.30000000000000004" x="156.30769230769232" y="309.2307692307692" width="38.769230769230774" height="17.230769230769226" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.011607142857142856" /> +globalConnNetId: connectivity_net3" data-x="1.6250000000000002" data-y="0.09999999999999998" x="436.3076923076924" y="274.7692307692308" width="38.769230769230774" height="17.230769230769226" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.011607142857142856" /> +globalConnNetId: connectivity_net5" data-x="-1.3010000000000002" data-y="0.7260000000000001" x="194.99076923076925" y="210.0676923076923" width="17.230769230769255" height="38.769230769230745" fill="#ef444466" stroke="#ef4444" stroke-width="0.011607142857142856" /> +globalConnNetId: connectivity_net5" data-x="3.2" data-y="0.525" x="582.7692307692308" y="227.3846153846154" width="17.230769230769283" height="38.769230769230745" fill="#ef444466" stroke="#ef4444" stroke-width="0.011607142857142856" /> +globalConnNetId: connectivity_net0" data-x="-1.5500000000000003" data-y="0.32500000000000007" x="173.53846153846155" y="244.6153846153846" width="17.230769230769226" height="38.769230769230745" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.011607142857142856" /> +globalConnNetId: connectivity_net2" data-x="1.4000000000000001" data-y="-1.5194553500000003" x="427.69230769230774" y="403.5223070769231" width="17.230769230769283" height="38.76923076923083" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.011607142857142856" /> - + - + - + - + - + - + - + - + - + @@ -882,48 +873,39 @@ orientation: y-" data-x="-2.49" data-y="-2.9000000000000004" cx="295.58784676354 +globalConnNetId: connectivity_net0" data-x="-1.3099999999999998" data-y="1.4250000000000016" x="348.85072655217965" y="311.4927344782034" width="9.863496257155475" height="22.192866578599705" fill="#ef444466" stroke="#ef4444" stroke-width="0.020276785714285723" /> +globalConnNetId: connectivity_net0" data-x="0.29250000000000076" data-y="6.9300000000000015" x="427.8819903126376" y="40.00000000000006" width="9.863496257155475" height="22.192866578599705" fill="#ef444466" stroke="#ef4444" stroke-width="0.020276785714285723" /> +globalConnNetId: connectivity_net6" data-x="-1.3099999999999998" data-y="3.0250000000000017" x="348.85072655217965" y="232.58476442095986" width="9.863496257155475" height="22.192866578599762" fill="#ef444466" stroke="#ef4444" stroke-width="0.020276785714285723" /> +globalConnNetId: connectivity_net6" data-x="-3.7550000000000003" data-y="4.193333333333335" x="228.26948480845445" y="174.96550711874357" width="9.863496257155447" height="22.192866578599705" fill="#ef444466" stroke="#ef4444" stroke-width="0.020276785714285723" /> +globalConnNetId: connectivity_net9" data-x="-2.25" data-y="-1.4000000000000004" x="296.327608982827" y="456.97930427124606" width="22.192866578599705" height="9.863496257155475" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.020276785714285723" /> +globalConnNetId: connectivity_net8" data-x="-2.25" data-y="2.200000000000001" x="296.327608982827" y="279.4363716424482" width="22.192866578599705" height="9.863496257155475" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.020276785714285723" /> +globalConnNetId: connectivity_net10" data-x="0.29250000000000076" data-y="4.980000000000002" x="427.8819903126376" y="136.16908850726549" width="9.863496257155475" height="22.192866578599705" fill="#00000066" stroke="#000000" stroke-width="0.020276785714285723" /> +globalConnNetId: connectivity_net10" data-x="-3.7550000000000003" data-y="2.2433333333333345" x="228.26948480845445" y="271.13459562600906" width="9.863496257155447" height="22.192866578599705" fill="#00000066" stroke="#000000" stroke-width="0.020276785714285723" /> +globalConnNetId: connectivity_net10" data-x="-2.49" data-y="-3.1250000000000004" x="290.6560986349626" y="535.8872743284896" width="9.863496257155418" height="22.192866578599705" fill="#00000066" stroke="#000000" stroke-width="0.020276785714285723" /> - + - + - + - + @@ -70,7 +66,7 @@ orientation: y+" data-x="0.749" data-y="2.105" cx="258.288" cy="174.064000000000 - + @@ -81,6 +77,9 @@ orientation: y+" data-x="0.749" data-y="2.105" cx="258.288" cy="174.064000000000 + + + @@ -89,23 +88,19 @@ orientation: y+" data-x="0.749" data-y="2.105" cx="258.288" cy="174.064000000000 +globalConnNetId: connectivity_net0" data-x="1.3010000000000002" data-y="-0.7260000000000001" x="308.91200000000003" y="465.93600000000004" width="22.400000000000034" height="50.39999999999998" fill="#00000066" stroke="#000000" stroke-width="0.008928571428571428" /> +globalConnNetId: connectivity_net0" data-x="1.449" data-y="1.4289999999999998" x="325.48800000000006" y="224.57600000000002" width="22.399999999999977" height="50.400000000000034" fill="#00000066" stroke="#000000" stroke-width="0.008928571428571428" /> +globalConnNetId: connectivity_net1" data-x="1.074" data-y="1.0025" x="269.48800000000006" y="286.344" width="50.39999999999998" height="22.400000000000034" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008928571428571428" /> +globalConnNetId: connectivity_net2" data-x="0.749" data-y="2.33" x="247.08800000000002" y="123.66399999999999" width="22.400000000000034" height="50.400000000000034" fill="#ef444466" stroke="#ef4444" stroke-width="0.008928571428571428" /> - + - + - + - + @@ -121,23 +117,19 @@ orientation: y+" data-x="3.3000000000000003" data-y="-0.3000000000000007" cx="49 +globalConnNetId: connectivity_net2" data-x="-1.575" data-y="0.30000000000000004" x="119.89528795811518" y="344.5549738219895" width="32.98429319371729" height="14.659685863874358" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.013642857142857144" /> +globalConnNetId: connectivity_net3" data-x="-1.3499999999999999" data-y="-0.12499999999999997" x="145.5497382198953" y="366.5445026178011" width="14.659685863874358" height="32.984293193717235" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.013642857142857144" /> +globalConnNetId: connectivity_net0" data-x="1.4999999999999998" data-y="-0.07500000000000037" x="354.45026178010465" y="362.8795811518325" width="14.659685863874358" height="32.98429319371729" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.013642857142857144" /> +globalConnNetId: connectivity_net1" data-x="3.3000000000000003" data-y="-0.0750000000000007" x="486.38743455497377" y="362.8795811518325" width="14.659685863874415" height="32.98429319371729" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.013642857142857144" /> - + - + - + - + - + @@ -139,7 +134,7 @@ orientation: x+" data-x="1.757519574999999" data-y="-2" cx="493.97982495355666" - + @@ -167,28 +162,23 @@ orientation: x+" data-x="1.757519574999999" data-y="-2" cx="493.97982495355666" +globalConnNetId: connectivity_net0" data-x="-1.8574283249999997" data-y="0.9762093000000004" x="161.39522395803996" y="196.79342126794842" width="17.905209437554532" height="40.28672123449769" fill="#ef444466" stroke="#ef4444" stroke-width="0.011169933571428573" /> +globalConnNetId: connectivity_net0" data-x="1.5790330374999988" data-y="2.7275814000000005" x="469.0480260561722" y="40" width="17.90520943755456" height="40.28672123449769" fill="#ef444466" stroke="#ef4444" stroke-width="0.011169933571428573" /> +globalConnNetId: connectivity_net1" data-x="-2.31430995" data-y="-0.9762093000000004" x="120.4924180390637" y="371.58574098183345" width="17.905209437554532" height="40.28672123449769" fill="#00000066" stroke="#000000" stroke-width="0.011169933571428573" /> +globalConnNetId: connectivity_net2" data-x="1.982519574999999" data-y="0.85" x="493.97982495355666" y="219.2831969137558" width="40.28672123449769" height="17.905209437554532" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.011169933571428573" /> +globalConnNetId: connectivity_net3" data-x="1.982519574999999" data-y="-2" x="493.97982495355666" y="474.43243139890774" width="40.28672123449769" height="17.90520943755456" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.011169933571428573" />