适配多个接口

This commit is contained in:
锦恢 2025-01-02 05:28:44 +08:00
parent 4e52da5431
commit 7a6ed915d0
8 changed files with 510 additions and 23 deletions

View File

@ -5,7 +5,7 @@
<path id="Y" d="M0 0L20 0" fill="none" stroke-width="2" stroke="#000000" stroke-linecap="square" transform="translate(75 26)" />
<path id="B" d="M0 0L20 0" fill="none" stroke-width="2" stroke="#000000" stroke-linecap="square" transform="translate(0 52)" />
<path id="ROAD" d="M10.6066 0L0 10.6066" fill="none" stroke-width="2" stroke="#000000" stroke-linecap="square" transform="translate(21 42)" />
<path id="A" d="M0 0L20 0" fill="none" stroke-width="2" stroke="#000000" stroke-linecap="square" />
<path id="A" d="M0 0L20 0" fill="none" stroke-width="2" stroke="#000000" stroke-linecap="square"/>
<path id="ROAD" d="M0 0L10.6066 10.61" fill="none" stroke-width="2" stroke="#000000" stroke-linecap="square" transform="translate(21 1)" />
<g fill="#279BB0" fill-rule="evenodd" transform="translate(27 2)">
<path id="ge" d="M0 25C0 11.1929 11.1929 0 25 0C38.8071 0 50 11.1929 50 25C50 38.8071 38.8071 50 25 50C11.1929 50 0 38.8071 0 25Z" />

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

460
out.svg Normal file
View File

@ -0,0 +1,460 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:s="https://github.com/nturley/netlistsvg" width="569" height="868.5">
<style>svg {
stroke:#000;
fill:none;
}
text {
fill:#000;
stroke:none;
font-size:10px;
font-weight: bold;
font-family: "Courier New", monospace;
}
.nodelabel {
text-anchor: middle;
}
.inputPortLabel {
text-anchor: end;
}
.splitjoinBody {
fill:#000;
}</style>
<g s:type="add" transform="translate(94.66666666666667,699.5)" s:width="25" s:height="25" id="cell_$add$/dide/user/src/language/vlog/netlistview/netlistview.v:15$3">
<s:alias val="$add"/>
<circle r="12.5" cx="12.5" cy="12.5" class="cell_$add$/dide/user/src/language/vlog/netlistview/netlistview.v:15$3"/>
<line x1="7.5" x2="17.5" y1="12.5" y2="12.5" class="cell_$add$/dide/user/src/language/vlog/netlistview/netlistview.v:15$3"/>
<line x1="12.5" x2="12.5" y1="7.5" y2="17.5" class="cell_$add$/dide/user/src/language/vlog/netlistview/netlistview.v:15$3"/>
<g s:x="3" s:y="5" s:pid="A"/>
<g s:x="3" s:y="20" s:pid="B"/>
<g s:x="25" s:y="12.5" s:pid="Y"/>
</g>
<g s:type="and" transform="translate(365,814)" s:width="30" s:height="25" id="cell_$and$/dide/user/src/language/vlog/netlistview/netlistview.v:31$5">
<s:alias val="$and"/>
<s:alias val="$logic_and"/>
<s:alias val="$_AND_"/>
<path d="M0,0 L0,25 L15,25 A15 12.5 0 0 0 15,0 Z" class="cell_$and$/dide/user/src/language/vlog/netlistview/netlistview.v:31$5"/>
<g s:x="0" s:y="5" s:pid="A"/>
<g s:x="0" s:y="20" s:pid="B"/>
<g s:x="30" s:y="12.5" s:pid="Y"/>
</g>
<g s:type="and" transform="translate(365,19.5)" s:width="30" s:height="25" id="cell_$and$/dide/user/src/language/vlog/netlistview/netlistview.v:32$6">
<s:alias val="$and"/>
<s:alias val="$logic_and"/>
<s:alias val="$_AND_"/>
<path d="M0,0 L0,25 L15,25 A15 12.5 0 0 0 15,0 Z" class="cell_$and$/dide/user/src/language/vlog/netlistview/netlistview.v:32$6"/>
<g s:x="0" s:y="5" s:pid="A"/>
<g s:x="0" s:y="20" s:pid="B"/>
<g s:x="30" s:y="12.5" s:pid="Y"/>
</g>
<g s:type="dff" transform="translate(432,302)" s:width="30" s:height="40" id="cell_$procdff$12">
<s:alias val="$dff"/>
<s:alias val="$_DFF_"/>
<s:alias val="$_DFF_P_"/>
<rect width="30" height="40" x="0" y="0" class="cell_$procdff$12"/>
<path d="M0,35 L5,30 L0,25" class="cell_$procdff$12"/>
<g s:x="30" s:y="10" s:pid="Q"/>
<g s:x="0" s:y="30" s:pid="CLK"/>
<g s:x="0" s:y="30" s:pid="C"/>
<g s:x="0" s:y="10" s:pid="D"/>
</g>
<g s:type="dff" transform="translate(432,816.5)" s:width="30" s:height="40" id="cell_$procdff$13">
<s:alias val="$dff"/>
<s:alias val="$_DFF_"/>
<s:alias val="$_DFF_P_"/>
<rect width="30" height="40" x="0" y="0" class="cell_$procdff$13"/>
<path d="M0,35 L5,30 L0,25" class="cell_$procdff$13"/>
<g s:x="30" s:y="10" s:pid="Q"/>
<g s:x="0" s:y="30" s:pid="CLK"/>
<g s:x="0" s:y="30" s:pid="C"/>
<g s:x="0" s:y="10" s:pid="D"/>
</g>
<g s:type="dff" transform="translate(432,22)" s:width="30" s:height="40" id="cell_$procdff$14">
<s:alias val="$dff"/>
<s:alias val="$_DFF_"/>
<s:alias val="$_DFF_P_"/>
<rect width="30" height="40" x="0" y="0" class="cell_$procdff$14"/>
<path d="M0,35 L5,30 L0,25" class="cell_$procdff$14"/>
<g s:x="30" s:y="10" s:pid="Q"/>
<g s:x="0" s:y="30" s:pid="CLK"/>
<g s:x="0" s:y="30" s:pid="C"/>
<g s:x="0" s:y="10" s:pid="D"/>
</g>
<g s:type="dff" transform="translate(432,162)" s:width="30" s:height="40" id="cell_$procdff$15">
<s:alias val="$dff"/>
<s:alias val="$_DFF_"/>
<s:alias val="$_DFF_P_"/>
<rect width="30" height="40" x="0" y="0" class="cell_$procdff$15"/>
<path d="M0,35 L5,30 L0,25" class="cell_$procdff$15"/>
<g s:x="30" s:y="10" s:pid="Q"/>
<g s:x="0" s:y="30" s:pid="CLK"/>
<g s:x="0" s:y="30" s:pid="C"/>
<g s:x="0" s:y="10" s:pid="D"/>
</g>
<g s:type="dff" transform="translate(497,731.5)" s:width="30" s:height="40" id="cell_$procdff$16">
<s:alias val="$dff"/>
<s:alias val="$_DFF_"/>
<s:alias val="$_DFF_P_"/>
<rect width="30" height="40" x="0" y="0" class="cell_$procdff$16"/>
<path d="M0,35 L5,30 L0,25" class="cell_$procdff$16"/>
<g s:x="30" s:y="10" s:pid="Q"/>
<g s:x="0" s:y="30" s:pid="CLK"/>
<g s:x="0" s:y="30" s:pid="C"/>
<g s:x="0" s:y="10" s:pid="D"/>
</g>
<g s:type="dff" transform="translate(497,77)" s:width="30" s:height="40" id="cell_$procdff$17">
<s:alias val="$dff"/>
<s:alias val="$_DFF_"/>
<s:alias val="$_DFF_P_"/>
<rect width="30" height="40" x="0" y="0" class="cell_$procdff$17"/>
<path d="M0,35 L5,30 L0,25" class="cell_$procdff$17"/>
<g s:x="30" s:y="10" s:pid="Q"/>
<g s:x="0" s:y="30" s:pid="CLK"/>
<g s:x="0" s:y="30" s:pid="C"/>
<g s:x="0" s:y="10" s:pid="D"/>
</g>
<g s:type="dff" transform="translate(497,217)" s:width="30" s:height="40" id="cell_$procdff$18">
<s:alias val="$dff"/>
<s:alias val="$_DFF_"/>
<s:alias val="$_DFF_P_"/>
<rect width="30" height="40" x="0" y="0" class="cell_$procdff$18"/>
<path d="M0,35 L5,30 L0,25" class="cell_$procdff$18"/>
<g s:x="30" s:y="10" s:pid="Q"/>
<g s:x="0" s:y="30" s:pid="CLK"/>
<g s:x="0" s:y="30" s:pid="C"/>
<g s:x="0" s:y="10" s:pid="D"/>
</g>
<g s:type="eq" transform="translate(162.66666666666666,579)" s:width="25" s:height="25" id="cell_$procmux$10_CMP0">
<s:alias val="$eq"/>
<circle r="12.5" cx="12.5" cy="12.5" class="cell_$procmux$10_CMP0"/>
<line x1="7.5" x2="17.5" y1="10" y2="10" class="cell_$procmux$10_CMP0"/>
<line x1="7.5" x2="17.5" y1="15" y2="15" class="cell_$procmux$10_CMP0"/>
<g s:x="3" s:y="5" s:pid="A"/>
<g s:x="3" s:y="20" s:pid="B"/>
<g s:x="25" s:y="12.5" s:pid="Y"/>
</g>
<g s:type="not" transform="translate(163,639)" s:width="30" s:height="20" id="cell_$procmux$11_CMP0">
<s:alias val="$_NOT_"/>
<s:alias val="$not"/>
<s:alias val="$logic_not"/>
<path d="M0,0 L0,20 L20,10 Z" class="cell_$procmux$11_CMP0"/>
<circle cx="23" cy="10" r="3" class="cell_$procmux$11_CMP0"/>
<g s:x="0" s:y="10" s:pid="A"/>
<g s:x="25" s:y="10" s:pid="Y"/>
</g>
<g s:type="mux" transform="translate(309,292)" s:width="20" s:height="40" id="cell_$procmux$7">
<s:alias val="$pmux"/>
<s:alias val="$mux"/>
<s:alias val="$_MUX_"/>
<path d="M0,0 L20,10 L20,30 L0,40 Z" class="cell_$procmux$7"/>
<g s:x="0" s:y="10" s:pid="A"/>
<g s:x="0" s:y="30" s:pid="B"/>
<g s:x="10" s:y="35" s:pid="S"/>
<g s:x="20" s:y="20" s:pid="Y"/>
</g>
<g s:type="eq" transform="translate(162.66666666666666,436.5)" s:width="25" s:height="25" id="cell_$procmux$8_CMP0">
<s:alias val="$eq"/>
<circle r="12.5" cx="12.5" cy="12.5" class="cell_$procmux$8_CMP0"/>
<line x1="7.5" x2="17.5" y1="10" y2="10" class="cell_$procmux$8_CMP0"/>
<line x1="7.5" x2="17.5" y1="15" y2="15" class="cell_$procmux$8_CMP0"/>
<g s:x="3" s:y="5" s:pid="A"/>
<g s:x="3" s:y="20" s:pid="B"/>
<g s:x="25" s:y="12.5" s:pid="Y"/>
</g>
<g s:type="eq" transform="translate(162.66666666666666,496.5)" s:width="25" s:height="25" id="cell_$procmux$9_CMP0">
<s:alias val="$eq"/>
<circle r="12.5" cx="12.5" cy="12.5" class="cell_$procmux$9_CMP0"/>
<line x1="7.5" x2="17.5" y1="10" y2="10" class="cell_$procmux$9_CMP0"/>
<line x1="7.5" x2="17.5" y1="15" y2="15" class="cell_$procmux$9_CMP0"/>
<g s:x="3" s:y="5" s:pid="A"/>
<g s:x="3" s:y="20" s:pid="B"/>
<g s:x="25" s:y="12.5" s:pid="Y"/>
</g>
<g s:type="reduce_xor" transform="translate(364,159.5)" s:width="33" s:height="25" id="cell_$reduce_xor$/dide/user/src/language/vlog/netlistview/netlistview.v:30$4">
<s:alias val="$xor"/>
<s:alias val="$reduce_xor"/>
<s:alias val="$_XOR_"/>
<path d="M3,0 A30 25 0 0 1 3,25 A30 25 0 0 0 33,12.5 A30 25 0 0 0 3,0" class="cell_$reduce_xor$/dide/user/src/language/vlog/netlistview/netlistview.v:30$4"/>
<path d="M0,0 A30 25 0 0 1 0,25" class="cell_$reduce_xor$/dide/user/src/language/vlog/netlistview/netlistview.v:30$4"/>
<g s:x="3" s:y="5" s:pid="A"/>
<g s:x="3" s:y="20" s:pid="B"/>
<g s:x="33" s:y="12.5" s:pid="Y"/>
</g>
<g s:type="sub" transform="translate(94.66666666666667,74.5)" s:width="25" s:height="25" id="cell_$sub$/dide/user/src/language/vlog/netlistview/netlistview.v:14$2">
<s:alias val="$sub"/>
<circle r="12.5" cx="12.5" cy="12.5" class="cell_$sub$/dide/user/src/language/vlog/netlistview/netlistview.v:14$2"/>
<line x1="7.5" x2="17.5" y1="12.5" y2="12.5" class="cell_$sub$/dide/user/src/language/vlog/netlistview/netlistview.v:14$2"/>
<g s:x="3" s:y="5" s:pid="A"/>
<g s:x="3" s:y="20" s:pid="B"/>
<g s:x="25" s:y="12.5" s:pid="Y"/>
</g>
<g s:type="inputExt" transform="translate(367,248)" s:width="30" s:height="20" id="cell_clock">
<text x="15" y="-4" class="nodelabel cell_clock" s:attribute="ref">clock</text>
<s:alias val="$_inputExt_"/>
<path d="M0,0 L0,20 L15,20 L30,10 L15,0 Z" class="cell_clock"/>
<g s:x="28" s:y="10" s:pid="Y"/>
</g>
<g s:type="inputExt" transform="translate(157,381.5)" s:width="30" s:height="20" id="cell_data_in">
<text x="15" y="-4" class="nodelabel cell_data_in" s:attribute="ref">data_in</text>
<s:alias val="$_inputExt_"/>
<path d="M0,0 L0,20 L15,20 L30,10 L15,0 Z" class="cell_data_in"/>
<g s:x="28" s:y="10" s:pid="Y"/>
</g>
<g s:type="inputExt" transform="translate(12,809)" s:width="30" s:height="20" id="cell_up">
<text x="15" y="-4" class="nodelabel cell_up" s:attribute="ref">up</text>
<s:alias val="$_inputExt_"/>
<path d="M0,0 L0,20 L15,20 L30,10 L15,0 Z" class="cell_up"/>
<g s:x="28" s:y="10" s:pid="Y"/>
</g>
<g s:type="inputExt" transform="translate(12,564)" s:width="30" s:height="20" id="cell_down">
<text x="15" y="-4" class="nodelabel cell_down" s:attribute="ref">down</text>
<s:alias val="$_inputExt_"/>
<path d="M0,0 L0,20 L15,20 L30,10 L15,0 Z" class="cell_down"/>
<g s:x="28" s:y="10" s:pid="Y"/>
</g>
<g s:type="outputExt" transform="translate(497,816.5)" s:width="30" s:height="20" id="cell_carry_out">
<text x="15" y="-4" class="nodelabel cell_carry_out" s:attribute="ref">carry_out</text>
<s:alias val="$_outputExt_"/>
<path d="M30,0 L30,20 L15,20 L0,10 L15,0 Z" class="cell_carry_out"/>
<g s:x="0" s:y="10" s:pid="A"/>
</g>
<g s:type="outputExt" transform="translate(497,22)" s:width="30" s:height="20" id="cell_borrow_out">
<text x="15" y="-4" class="nodelabel cell_borrow_out" s:attribute="ref">borrow_out</text>
<s:alias val="$_outputExt_"/>
<path d="M30,0 L30,20 L15,20 L0,10 L15,0 Z" class="cell_borrow_out"/>
<g s:x="0" s:y="10" s:pid="A"/>
</g>
<g s:type="outputExt" transform="translate(497,302)" s:width="30" s:height="20" id="cell_count_out">
<text x="15" y="-4" class="nodelabel cell_count_out" s:attribute="ref">count_out</text>
<s:alias val="$_outputExt_"/>
<path d="M30,0 L30,20 L15,20 L0,10 L15,0 Z" class="cell_count_out"/>
<g s:x="0" s:y="10" s:pid="A"/>
</g>
<g s:type="outputExt" transform="translate(497,162)" s:width="30" s:height="20" id="cell_parity_out">
<text x="15" y="-4" class="nodelabel cell_parity_out" s:attribute="ref">parity_out</text>
<s:alias val="$_outputExt_"/>
<path d="M30,0 L30,20 L15,20 L0,10 L15,0 Z" class="cell_parity_out"/>
<g s:x="0" s:y="10" s:pid="A"/>
</g>
<g s:type="constant" transform="translate(12,709.5)" s:width="30" s:height="20" id="cell_11">
<text x="15" y="-4" class="nodelabel cell_11" s:attribute="ref">11</text>
<s:alias val="$_constant_"/>
<rect width="30" height="20" class="cell_11"/>
<g s:x="30" s:y="10" s:pid="Y"/>
</g>
<g s:type="constant" transform="translate(92,648.5)" s:width="30" s:height="20" id="cell_01">
<text x="15" y="-4" class="nodelabel cell_01" s:attribute="ref">01</text>
<s:alias val="$_constant_"/>
<rect width="30" height="20" class="cell_01"/>
<g s:x="30" s:y="10" s:pid="Y"/>
</g>
<g s:type="constant" transform="translate(92,506.5)" s:width="30" s:height="20" id="cell_10">
<text x="15" y="-4" class="nodelabel cell_10" s:attribute="ref">10</text>
<s:alias val="$_constant_"/>
<rect width="30" height="20" class="cell_10"/>
<g s:x="30" s:y="10" s:pid="Y"/>
</g>
<g s:type="constant" transform="translate(12,84.5)" s:width="30" s:height="20" id="cell_101">
<text x="15" y="-4" class="nodelabel cell_101" s:attribute="ref">101</text>
<s:alias val="$_constant_"/>
<rect width="30" height="20" class="cell_101"/>
<g s:x="30" s:y="10" s:pid="Y"/>
</g>
<g s:type="join" transform="translate(103,563.5)" s:width="4" s:height="40" id="cell_$join$,13,12,">
<rect width="5" height="40" class="splitjoinBody" s:generic="body"/>
<s:alias val="$_join_"/>
<g s:x="5" s:y="20" s:pid="out"/>
<g transform="translate(0,10)" s:x="0" s:y="10" s:pid="in0">
<text x="-3" y="-4" class="inputPortLabel">0</text>
</g>
<g transform="translate(0,30)" s:x="0" s:y="10" s:pid="in0">
<text x="-3" y="-4" class="inputPortLabel">1</text>
</g>
</g>
<g s:type="join" transform="translate(268,301.5)" s:width="4" s:height="40" id="cell_$join$,16,17,18,19,20,21,22,23,24,26,27,28,29,30,31,32,33,34,59,60,61,62,63,64,65,66,67,3,4,5,6,7,8,9,10,11,">
<rect width="5" height="80" class="splitjoinBody" s:generic="body"/>
<s:alias val="$_join_"/>
<g s:x="5" s:y="20" s:pid="out"/>
<g transform="translate(0,10)" s:x="0" s:y="10" s:pid="in0">
<text x="-3" y="-4" class="inputPortLabel">0:8</text>
</g>
<g transform="translate(0,30)" s:x="0" s:y="10" s:pid="in0">
<text x="-3" y="-4" class="inputPortLabel">9:17</text>
</g>
<g transform="translate(0,50)" s:x="0" s:y="10" s:pid="in0">
<text x="-3" y="-4" class="inputPortLabel">18:26</text>
</g>
<g transform="translate(0,70)" s:x="0" s:y="10" s:pid="in0">
<text x="-3" y="-4" class="inputPortLabel">27:35</text>
</g>
</g>
<g s:type="join" transform="translate(263.75,438.5)" s:width="4" s:height="40" id="cell_$join$,89,90,87,88,">
<rect width="5" height="80" class="splitjoinBody" s:generic="body"/>
<s:alias val="$_join_"/>
<g s:x="5" s:y="20" s:pid="out"/>
<g transform="translate(0,10)" s:x="0" s:y="10" s:pid="in0">
<text x="-3" y="-4" class="inputPortLabel">0</text>
</g>
<g transform="translate(0,30)" s:x="0" s:y="10" s:pid="in0">
<text x="-3" y="-4" class="inputPortLabel">1</text>
</g>
<g transform="translate(0,50)" s:x="0" s:y="10" s:pid="in0">
<text x="-3" y="-4" class="inputPortLabel">2</text>
</g>
<g transform="translate(0,70)" s:x="0" s:y="10" s:pid="in0">
<text x="-3" y="-4" class="inputPortLabel">3</text>
</g>
</g>
<g s:type="split" transform="translate(177.66666666666666,691.5)" s:width="5" s:height="40" id="cell_$split$,26,27,28,29,30,31,32,33,34,35,">
<rect width="5" height="40" class="splitjoinBody" s:generic="body"/>
<s:alias val="$_split_"/>
<g s:x="0" s:y="20" s:pid="in"/>
<g transform="translate(4,10)" s:x="4" s:y="10" s:pid="out0">
<text x="5" y="-4">9</text>
</g>
<g transform="translate(4,30)" s:x="4" s:y="10" s:pid="out0">
<text x="5" y="-4">0:8</text>
</g>
</g>
<g s:type="split" transform="translate(177.66666666666666,100)" s:width="5" s:height="40" id="cell_$split$,59,60,61,62,63,64,65,66,67,37,">
<rect width="5" height="40" class="splitjoinBody" s:generic="body"/>
<s:alias val="$_split_"/>
<g s:x="0" s:y="20" s:pid="in"/>
<g transform="translate(4,10)" s:x="4" s:y="10" s:pid="out0">
<text x="5" y="-4">9</text>
</g>
<g transform="translate(4,30)" s:x="4" s:y="10" s:pid="out0">
<text x="5" y="-4">0:8</text>
</g>
</g>
<line x1="462" x2="472" y1="312" y2="312" class="net_16,17,18,19,20,21,22,23,24"/>
<line x1="472" x2="472" y1="312" y2="678.5" class="net_16,17,18,19,20,21,22,23,24"/>
<line x1="472" x2="82" y1="678.5" y2="678.5" class="net_16,17,18,19,20,21,22,23,24"/>
<line x1="82" x2="82" y1="678.5" y2="704.5" class="net_16,17,18,19,20,21,22,23,24"/>
<line x1="82" x2="97.66666666666667" y1="704.5" y2="704.5" class="net_16,17,18,19,20,21,22,23,24"/>
<line x1="462" x2="472" y1="312" y2="312" class="net_16,17,18,19,20,21,22,23,24"/>
<line x1="472" x2="472" y1="312" y2="278" class="net_16,17,18,19,20,21,22,23,24"/>
<line x1="472" x2="82" y1="278" y2="278" class="net_16,17,18,19,20,21,22,23,24"/>
<line x1="82" x2="82" y1="278" y2="79.5" class="net_16,17,18,19,20,21,22,23,24"/>
<circle cx="472" cy="312" r="2" style="fill:#000" class="net_16,17,18,19,20,21,22,23,24"/>
<line x1="82" x2="97.66666666666667" y1="79.5" y2="79.5" class="net_16,17,18,19,20,21,22,23,24"/>
<line x1="462" x2="497" y1="312" y2="312" class="net_16,17,18,19,20,21,22,23,24"/>
<line x1="462" x2="472" y1="312" y2="312" class="net_16,17,18,19,20,21,22,23,24"/>
<line x1="472" x2="472" y1="312" y2="278" class="net_16,17,18,19,20,21,22,23,24"/>
<line x1="472" x2="349" y1="278" y2="278" class="net_16,17,18,19,20,21,22,23,24"/>
<line x1="349" x2="349" y1="278" y2="678.5" class="net_16,17,18,19,20,21,22,23,24"/>
<line x1="349" x2="219" y1="678.5" y2="678.5" class="net_16,17,18,19,20,21,22,23,24"/>
<line x1="219" x2="219" y1="678.5" y2="312" class="net_16,17,18,19,20,21,22,23,24"/>
<circle cx="219" cy="678.5" r="2" style="fill:#000" class="net_16,17,18,19,20,21,22,23,24"/>
<circle cx="349" cy="678.5" r="2" style="fill:#000" class="net_16,17,18,19,20,21,22,23,24"/>
<circle cx="349" cy="278" r="2" style="fill:#000" class="net_16,17,18,19,20,21,22,23,24"/>
<line x1="219" x2="268" y1="312" y2="312" class="net_16,17,18,19,20,21,22,23,24"/>
<line x1="42" x2="97.66666666666667" y1="719.5" y2="719.5" class="net_91,92"/>
<line x1="42" x2="62" y1="719.5" y2="719.5" class="net_91,92"/>
<line x1="62" x2="62" y1="719.5" y2="456.5" class="net_91,92"/>
<circle cx="62" cy="719.5" r="2" style="fill:#000" class="net_91,92"/>
<line x1="62" x2="165.66666666666666" y1="456.5" y2="456.5" class="net_91,92"/>
<line x1="40" x2="365" y1="819" y2="819" class="net_12"/>
<line x1="40" x2="72" y1="819" y2="819" class="net_12"/>
<line x1="72" x2="72" y1="819" y2="594" class="net_12"/>
<circle cx="72" cy="819" r="2" style="fill:#000" class="net_12"/>
<line x1="72" x2="103" y1="594" y2="594" class="net_12"/>
<line x1="182.66666666666666" x2="239" y1="702" y2="702" class="net_35"/>
<line x1="239" x2="239" y1="702" y2="834" class="net_35"/>
<line x1="239" x2="365" y1="834" y2="834" class="net_35"/>
<line x1="40" x2="52" y1="574" y2="574" class="net_13"/>
<line x1="52" x2="52" y1="574" y2="24.5" class="net_13"/>
<circle cx="52" cy="574" r="2" style="fill:#000" class="net_13"/>
<line x1="52" x2="365" y1="24.5" y2="24.5" class="net_13"/>
<line x1="40" x2="103" y1="574" y2="574" class="net_13"/>
<line x1="182.66666666666666" x2="209" y1="110.5" y2="110.5" class="net_37"/>
<line x1="209" x2="209" y1="110.5" y2="39.5" class="net_37"/>
<line x1="209" x2="365" y1="39.5" y2="39.5" class="net_37"/>
<line x1="395" x2="407" y1="258" y2="258" class="net_2"/>
<line x1="407" x2="407" y1="258" y2="332" class="net_2"/>
<circle cx="407" cy="258" r="2" style="fill:#000" class="net_2"/>
<circle cx="407" cy="332" r="2" style="fill:#000" class="net_2"/>
<line x1="407" x2="432" y1="332" y2="332" class="net_2"/>
<line x1="395" x2="407" y1="258" y2="258" class="net_2"/>
<line x1="407" x2="407" y1="258" y2="846.5" class="net_2"/>
<line x1="407" x2="432" y1="846.5" y2="846.5" class="net_2"/>
<line x1="395" x2="407" y1="258" y2="258" class="net_2"/>
<line x1="407" x2="407" y1="258" y2="52" class="net_2"/>
<line x1="407" x2="432" y1="52" y2="52" class="net_2"/>
<line x1="395" x2="407" y1="258" y2="258" class="net_2"/>
<line x1="407" x2="407" y1="258" y2="192" class="net_2"/>
<circle cx="407" cy="192" r="2" style="fill:#000" class="net_2"/>
<line x1="407" x2="432" y1="192" y2="192" class="net_2"/>
<line x1="395" x2="407" y1="258" y2="258" class="net_2"/>
<line x1="407" x2="407" y1="258" y2="761.5" class="net_2"/>
<circle cx="407" cy="761.5" r="2" style="fill:#000" class="net_2"/>
<line x1="407" x2="497" y1="761.5" y2="761.5" class="net_2"/>
<line x1="395" x2="407" y1="258" y2="258" class="net_2"/>
<line x1="407" x2="407" y1="258" y2="107" class="net_2"/>
<circle cx="407" cy="107" r="2" style="fill:#000" class="net_2"/>
<line x1="407" x2="497" y1="107" y2="107" class="net_2"/>
<line x1="395" x2="472" y1="258" y2="258" class="net_2"/>
<line x1="472" x2="472" y1="258" y2="247" class="net_2"/>
<line x1="472" x2="497" y1="247" y2="247" class="net_2"/>
<line x1="329" x2="432" y1="312" y2="312" class="net_39,40,41,42,43,44,45,46,47"/>
<line x1="329" x2="339" y1="312" y2="312" class="net_39,40,41,42,43,44,45,46,47"/>
<line x1="339" x2="339" y1="312" y2="227" class="net_39,40,41,42,43,44,45,46,47"/>
<circle cx="339" cy="312" r="2" style="fill:#000" class="net_39,40,41,42,43,44,45,46,47"/>
<circle cx="339" cy="227" r="2" style="fill:#000" class="net_39,40,41,42,43,44,45,46,47"/>
<line x1="339" x2="497" y1="227" y2="227" class="net_39,40,41,42,43,44,45,46,47"/>
<line x1="329" x2="339" y1="312" y2="312" class="net_39,40,41,42,43,44,45,46,47"/>
<line x1="339" x2="339" y1="312" y2="164.5" class="net_39,40,41,42,43,44,45,46,47"/>
<line x1="339" x2="367" y1="164.5" y2="164.5" class="net_39,40,41,42,43,44,45,46,47"/>
<line x1="395" x2="432" y1="826.5" y2="826.5" class="net_36"/>
<line x1="395" x2="432" y1="32" y2="32" class="net_38"/>
<line x1="397" x2="432" y1="172" y2="172" class="net_48"/>
<line x1="119.66666666666667" x2="132" y1="712" y2="712" class="net_26,27,28,29,30,31,32,33,34,35"/>
<line x1="132" x2="132" y1="712" y2="741.5" class="net_26,27,28,29,30,31,32,33,34,35"/>
<circle cx="132" cy="712" r="2" style="fill:#000" class="net_26,27,28,29,30,31,32,33,34,35"/>
<line x1="132" x2="497" y1="741.5" y2="741.5" class="net_26,27,28,29,30,31,32,33,34,35"/>
<line x1="119.66666666666667" x2="177.66666666666666" y1="712" y2="712" class="net_26,27,28,29,30,31,32,33,34,35"/>
<line x1="119.66666666666667" x2="497" y1="87" y2="87" class="net_59,60,61,62,63,64,65,66,67,37"/>
<line x1="119.66666666666667" x2="132" y1="87" y2="87" class="net_59,60,61,62,63,64,65,66,67,37"/>
<line x1="132" x2="132" y1="87" y2="120.5" class="net_59,60,61,62,63,64,65,66,67,37"/>
<circle cx="132" cy="87" r="2" style="fill:#000" class="net_59,60,61,62,63,64,65,66,67,37"/>
<line x1="132" x2="177.66666666666666" y1="120.5" y2="120.5" class="net_59,60,61,62,63,64,65,66,67,37"/>
<line x1="109" x2="165.66666666666666" y1="584" y2="584" class="net_13,12"/>
<line x1="109" x2="142" y1="584" y2="584" class="net_13,12"/>
<line x1="142" x2="142" y1="584" y2="649" class="net_13,12"/>
<circle cx="142" cy="584" r="2" style="fill:#000" class="net_13,12"/>
<line x1="142" x2="163" y1="649" y2="649" class="net_13,12"/>
<line x1="109" x2="142" y1="584" y2="584" class="net_13,12"/>
<line x1="142" x2="142" y1="584" y2="441.5" class="net_13,12"/>
<line x1="142" x2="165.66666666666666" y1="441.5" y2="441.5" class="net_13,12"/>
<line x1="109" x2="142" y1="584" y2="584" class="net_13,12"/>
<line x1="142" x2="142" y1="584" y2="501.5" class="net_13,12"/>
<circle cx="142" cy="501.5" r="2" style="fill:#000" class="net_13,12"/>
<line x1="142" x2="165.66666666666666" y1="501.5" y2="501.5" class="net_13,12"/>
<line x1="122" x2="132" y1="658.5" y2="658.5" class="net_93,94"/>
<line x1="132" x2="132" y1="658.5" y2="599" class="net_93,94"/>
<line x1="132" x2="165.66666666666666" y1="599" y2="599" class="net_93,94"/>
<line x1="274" x2="309" y1="322" y2="322" class="net_16,17,18,19,20,21,22,23,24,26,27,28,29,30,31,32,33,34,59,60,61,62,63,64,65,66,67,3,4,5,6,7,8,9,10,11"/>
<line x1="269.75" x2="319" y1="459" y2="459" class="net_89,90,87,88"/>
<line x1="319" x2="319" y1="459" y2="327" class="net_89,90,87,88"/>
<line x1="122" x2="165.66666666666666" y1="516.5" y2="516.5" class="net_97,98"/>
<line x1="42" x2="97.66666666666667" y1="94.5" y2="94.5" class="net_99,100,101"/>
<line x1="462" x2="497" y1="826.5" y2="826.5" class="net_14"/>
<line x1="462" x2="497" y1="32" y2="32" class="net_15"/>
<line x1="462" x2="497" y1="172" y2="172" class="net_25"/>
<line x1="182.66666666666666" x2="229" y1="722" y2="722" class="net_26,27,28,29,30,31,32,33,34"/>
<line x1="229" x2="229" y1="722" y2="332" class="net_26,27,28,29,30,31,32,33,34"/>
<line x1="229" x2="268" y1="332" y2="332" class="net_26,27,28,29,30,31,32,33,34"/>
<line x1="182.66666666666666" x2="239" y1="130.5" y2="130.5" class="net_59,60,61,62,63,64,65,66,67"/>
<line x1="239" x2="239" y1="130.5" y2="352" class="net_59,60,61,62,63,64,65,66,67"/>
<line x1="239" x2="268" y1="352" y2="352" class="net_59,60,61,62,63,64,65,66,67"/>
<line x1="185" x2="268.5" y1="391.5" y2="391.5" class="net_3,4,5,6,7,8,9,10,11"/>
<line x1="268.5" x2="268.5" y1="391.5" y2="372.5" class="net_3,4,5,6,7,8,9,10,11"/>
<line x1="187.66666666666666" x2="263.75" y1="449" y2="449" class="net_89"/>
<line x1="187.66666666666666" x2="209" y1="509" y2="509" class="net_90"/>
<line x1="209" x2="209" y1="509" y2="469" class="net_90"/>
<line x1="209" x2="263.75" y1="469" y2="469" class="net_90"/>
<line x1="187.66666666666666" x2="239" y1="591.5" y2="591.5" class="net_87"/>
<line x1="239" x2="239" y1="591.5" y2="489" class="net_87"/>
<line x1="239" x2="263.75" y1="489" y2="489" class="net_87"/>
<line x1="188" x2="264.25" y1="649" y2="649" class="net_88"/>
<line x1="264.25" x2="264.25" y1="649" y2="509.5" class="net_88"/>
</svg>

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -15,7 +15,7 @@
<script>
window.readNetFile = async () => {
const inputVcdFile = 'IF_ID.json';
const inputVcdFile = 'full_adder.json';
const skin = 'dide.skin';
const r1 = await fetch(inputVcdFile);
const r2 = await fetch(skin);
@ -23,7 +23,7 @@
const skinBinary = await r2.arrayBuffer();
return [ netJson, skinBinary ];
}
window.moduleName = 'IF_ID';
window.moduleName = 'full_adder';
// window.avoidWasm = 'avoid.wasm';
</script>
</head>

View File

@ -206,11 +206,14 @@ export class NetlistRender {
// debug
console.log(computedLayout);
// 底层模块
const topModule = this.nameToModule.get(this.topModuleName);
// 生成连接
await this.renderLine(g, computedLayout);
await this.renderLine(g, computedLayout, topModule);
// 生成实体
await this.renderEntity(g, computedLayout);
await this.renderEntity(g, computedLayout, topModule);
// svg 挂载为全局注册的 selection
this.selection = svg;
@ -288,8 +291,9 @@ export class NetlistRender {
* @description 绘制连线和交叉点
* @param {d3.Selection} parentSelection
* @param {ElkNode} computedLayout
* @param {Module} module
*/
async renderLine(parentSelection, computedLayout) {
async renderLine(parentSelection, computedLayout, module) {
this.wireRender = new WireRender(parentSelection, this);
this.crossDotRender = new CrossDotRender(parentSelection, this);
@ -304,6 +308,7 @@ export class NetlistRender {
const rangeTree = new RangeTreeMap();
for (const edge of computedLayout.edges) {
const width = module.id2EdgeCount.get(edge.id);
for (const section of edge.sections || []) {
const points = [];
points.push(section.startPoint);
@ -311,7 +316,7 @@ export class NetlistRender {
points.push(point);
}
points.push(section.endPoint);
this.wireRender.addAsD3DataItems(points, edge, id2port);
this.wireRender.addAsD3DataItems(points, edge, id2port, width);
// 加入 range tree 中
for (let i = 0; i < points.length - 1; ++ i) {
@ -585,7 +590,6 @@ export class NetlistRender {
elkNode.edges = [];
elkNode.layoutOptions = this.defaultLayoutOptions;
// elkNode.children.push(...portNodes);
elkNode.children.push(...cellNodes);
elkNode.children.push(...constantNodes);
@ -627,8 +631,11 @@ export class NetlistRender {
const parentSelection = s.parentSelection;
const layout = s.layout;
await this.renderLine(parentSelection, layout);
const { instances } = await this.renderEntity(parentSelection, layout);
const layoutName = layout.renderName || this.topModuleName;
const module = this.nameToModule.get(layoutName);
await this.renderLine(parentSelection, layout, module);
const { instances } = await this.renderEntity(parentSelection, layout, module);
const id2selection = new Map();
instances.each(function(data) {

View File

@ -330,7 +330,7 @@ export class Module {
continue;
}
if (conn.direction === 'input') {
if (connection.direction === 'output') {
const edgeId = makeEdgeId(conn.id, connection.id);
if (!id2EdgeCount.has(edgeId)) {
id2EdgeCount.set(edgeId, 0);

View File

@ -6,6 +6,7 @@ import { ConnectionRender } from './connection';
import { CellRender } from './cell';
import { CrossDotRender } from './cross-dot';
import { globalLookup } from '../global';
import { ConstantRender } from './constant';
export class RenderViewNode {
/**
@ -45,10 +46,15 @@ export class RenderViewNode {
*/
this.portRender = undefined;
/**
* @type {ConstantRender}
*/
this.constantRender = undefined;
/**
* @type {Map<string, RenderViewNode>}
*/
this.id2children = new Map;
this.id2children = new Map();
}
hasChild(id) {

View File

@ -39,8 +39,9 @@ export class WireRender {
* @param {import('../jsdoc').ElkPoint[]} points 长度至少为 2 的数组代表经历过的点集
* @param {import('../jsdoc').ElkEdge} edge
* @param {Map<string, import('../jsdoc').ElkPort>} id2port
* @param {number} width
*/
addAsD3DataItems(points, edge, id2port) {
addAsD3DataItems(points, edge, id2port, width) {
const linePaths = [];
const beginPoint = points.at(0);
@ -86,6 +87,7 @@ export class WireRender {
id: this.idCounter,
svg: lineSvg,
endPoint: points.at(-1),
width: width,
arrow: {
icon: direction + '-arrow',
x: arrowLocation.x,
@ -107,7 +109,6 @@ export class WireRender {
const arrowHeight = 12;
const arrowWidth = 12;
let lineSelections = this.selection.selectAll('path.lines')
.data(data)
.enter()
@ -115,8 +116,9 @@ export class WireRender {
.attr('d', d => d.svg)
.attr('class', 'connection-line')
.attr("fill", "none")
.attr('stroke', 'var(--wire-color)');
.attr('stroke', 'var(--wire-color)')
this.lineSelections = lineSelections;
const arrows = new Map();
let arrowSelections = this.selection.selectAll('svg.line-arrow')
@ -201,7 +203,10 @@ export class WireRender {
}
lineSelections
.attr('stroke-width', LINE_WIDTH)
.attr('stroke-width', d => {
const incrementWidth = globalSetting.boldMultiWidthWire ? 1 : 0;
return d.width > 1 ? LINE_WIDTH + incrementWidth: LINE_WIDTH;
})
.each(function (data) {
const selection = d3.select(this);
// const manager = _this.createDataManager(selection, data);

View File

@ -81,6 +81,9 @@ class SkinMeta {
const levelName = path.split('/')[1];
const cssName = levelName2CssName[levelName];
this.path = path;
this.svgString = svgString;
const color = `var(--${cssName}-color)`;
const fillColor = `var(--${cssName}-fill-color)`;
@ -128,9 +131,12 @@ class SkinMeta {
return 0;
}
const transform = pathElement.getAttribute('transform');
const yOffset = parseFloat(transform.split(' ').at(-1));
this.portToYOffset.set(portName, yOffset);
return yOffset;
if (transform) {
const yOffset = parseFloat(transform.split(' ').at(-1));
this.portToYOffset.set(portName, yOffset);
return yOffset;
}
return 0;
}
/**
@ -147,9 +153,12 @@ class SkinMeta {
return 0;
}
const transform = pathElement.getAttribute('transform');
const offsetnumber = transform.split('(').at(-1).split(' ').at(0);
const xOffset = parseFloat(offsetnumber);
this.portToXOffset.set(portName, xOffset);
return xOffset;
if (transform) {
const offsetnumber = transform.split('(').at(-1).split(' ').at(0);
const xOffset = parseFloat(offsetnumber);
this.portToXOffset.set(portName, xOffset);
return xOffset;
}
return 0;
}
}