diff --git a/examples/Introduction.ipynb b/examples/Introduction.ipynb index 2f0a352..251b27c 100644 --- a/examples/Introduction.ipynb +++ b/examples/Introduction.ipynb @@ -222,231 +222,255 @@ "\n", "\n", - "\n", "\n", - "\n", + "\n", "\n", "%3\n", - "\n", - "\n", - "0\n", - "\n", - "0\n", - "\n", - "1\n", - "\n", - "0 [4]\n", - "DFFX1\n", - "carry\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "\n", - "0\n", - "\n", - "1\n", - "__fork__\n", - "cin\n", - "\n", - "0\n", - "\n", - "\n", - "0:o0->1:i0\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "5\n", - "\n", - " \n", - "\n", - "5 [0]\n", - "input\n", - "clk\n", - "\n", - "0\n", - "\n", - "\n", - "6\n", - "\n", - "0\n", - "\n", - "6\n", - "__fork__\n", - "clk\n", - "\n", - "0\n", - "\n", - "\n", - "5:o0->6:i0\n", - "\n", - "\n", - "3\n", - "\n", + "\n", "\n", - "7\n", - "\n", - " \n", - "\n", - "7 [1]\n", - "input\n", - "a\n", - "\n", - "0\n", + "\n", + "7\n", + "\n", + " \n", + "\n", + "7 [1]\n", + "input\n", + "a\n", + "\n", + "0\n", "\n", "\n", - "8\n", - "\n", - "0\n", - "\n", - "8\n", - "__fork__\n", - "a\n", - "\n", - "0\n", + "\n", + "8\n", + "\n", + "0\n", + "\n", + "8\n", + "__fork__\n", + "a\n", + "\n", + "0\n", "\n", "\n", - "7:o0->8:i0\n", - "\n", - "\n", - "4\n", + "\n", + "7:o0->8:i0\n", + "\n", + "\n", + "4\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "0\n", + "\n", + "1\n", + "\n", + "0 [4]\n", + "DFFX1\n", + "carry\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "1\n", + "\n", + "0\n", + "\n", + "1\n", + "__fork__\n", + "cin\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "0:o0->1:i0\n", + "\n", + "\n", + "0\n", "\n", "\n", - "9\n", - "\n", - " \n", - "\n", - "9 [2]\n", - "input\n", - "b\n", - "\n", - "0\n", + "\n", + "9\n", + "\n", + " \n", + "\n", + "9 [2]\n", + "input\n", + "b\n", + "\n", + "0\n", "\n", "\n", - "10\n", - "\n", - "0\n", - "\n", - "10\n", - "__fork__\n", - "b\n", - "\n", - "0\n", + "\n", + "10\n", + "\n", + "0\n", + "\n", + "10\n", + "__fork__\n", + "b\n", + "\n", + "0\n", "\n", "\n", - "9:o0->10:i0\n", - "\n", - "\n", - "5\n", + "\n", + "9:o0->10:i0\n", + "\n", + "\n", + "5\n", "\n", - "\n", - "2\n", - "\n", - "0\n", - "\n", - "1\n", - "\n", - "2\n", - "\n", - "2\n", - "ADDFX1\n", - "adder\n", - "\n", - "0\n", - "\n", - "1\n", + "\n", + "\n", + "5\n", + "\n", + " \n", + "\n", + "5 [0]\n", + "input\n", + "clk\n", + "\n", + "0\n", "\n", - "\n", - "1:o0->2:i2\n", - "\n", - "\n", - "10\n", + "\n", + "\n", + "6\n", + "\n", + "0\n", + "\n", + "6\n", + "__fork__\n", + "clk\n", + "\n", + "0\n", "\n", - "\n", - "6:o0->0:i0\n", - "\n", - "\n", - "7\n", + "\n", + "\n", + "5:o0->6:i0\n", + "\n", + "\n", + "3\n", + "\n", + "\n", + "\n", + "2\n", + "\n", + "0\n", + "\n", + "1\n", + "\n", + "2\n", + "\n", + "2\n", + "ADDFX1\n", + "adder\n", + "\n", + "0\n", + "\n", + "1\n", "\n", "\n", - "8:o0->2:i0\n", - "\n", - "\n", - "8\n", + "\n", + "8:o0->2:i0\n", + "\n", + "\n", + "8\n", + "\n", + "\n", + "\n", + "1:o0->2:i2\n", + "\n", + "\n", + "10\n", "\n", "\n", - "10:o0->2:i1\n", - "\n", - "\n", - "9\n", + "\n", + "10:o0->2:i1\n", + "\n", + "\n", + "9\n", + "\n", + "\n", + "\n", + "6:o0->0:i0\n", + "\n", + "\n", + "7\n", "\n", "\n", - "3\n", - "\n", - "0\n", - "\n", - "3\n", - "__fork__\n", - "cout\n", - "\n", - "0\n", + "\n", + "3\n", + "\n", + "0\n", + "\n", + "3\n", + "__fork__\n", + "cout\n", + "\n", + "0\n", "\n", "\n", - "2:o0->3:i0\n", - "\n", - "\n", - "1\n", + "\n", + "2:o0->3:i0\n", + "\n", + "\n", + "1\n", "\n", "\n", - "4\n", - "\n", - "0\n", - "\n", - "4\n", - "__fork__\n", - "s\n", - "\n", - "0\n", + "\n", + "4\n", + "\n", + "0\n", + "\n", + "4\n", + "__fork__\n", + "s\n", + "\n", + "0\n", "\n", "\n", - "2:o1->4:i0\n", - "\n", - "\n", - "2\n", + "\n", + "2:o1->4:i0\n", + "\n", + "\n", + "2\n", "\n", "\n", - "3:o0->0:i1\n", - "\n", - "\n", - "6\n", + "\n", + "3:o0->0:i1\n", + "\n", + "\n", + "6\n", "\n", "\n", - "11\n", - "\n", - "0\n", - "\n", - "11 [3]\n", - "output\n", - "s\n", - "\n", - " \n", + "\n", + "11\n", + "\n", + "0\n", + "\n", + "11 [3]\n", + "output\n", + "s\n", + "\n", + " \n", "\n", "\n", - "4:o0->11:i0\n", - "\n", - "\n", - "11\n", + "\n", + "4:o0->11:i0\n", + "\n", + "\n", + "11\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, "execution_count": 7, @@ -1432,14 +1456,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "0:DFFX1\"carry\" <7 <6 >0\n", - "5:input\"clk\" >3\n", "7:input\"a\" >4\n", + "0:DFFX1\"carry\" <7 <6 >0\n", "9:input\"b\" >5\n", - "1:__fork__\"cin\" <0 >10\n", - "6:__fork__\"clk\" <3 >7\n", + "5:input\"clk\" >3\n", "8:__fork__\"a\" <4 >8\n", + "1:__fork__\"cin\" <0 >10\n", "10:__fork__\"b\" <5 >9\n", + "6:__fork__\"clk\" <3 >7\n", "2:ADDFX1\"adder\" <8 <9 <10 >1 >2\n", "3:__fork__\"cout\" <1 >6\n", "4:__fork__\"s\" <2 >11\n", @@ -1564,6 +1588,42 @@ "cell_type": "code", "execution_count": 39, "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "7:input\"a\" >4\n", + "5:input\"clk\" >3\n", + "0:DFF\"carry\" <6 <7 >12\n", + "9:input\"b\" >5\n", + "8:__fork__\"a\" <4 >8\n", + "6:__fork__\"clk\" <3 >7\n", + "12:__fork__\"carry~Q\" <12 >0\n", + "10:__fork__\"b\" <5 >9\n", + "13:__fork__\"adder~A\" <8 >14 >20\n", + "1:__fork__\"cin\" <0 >10\n", + "14:__fork__\"adder~B\" <9 >15 >21\n", + "15:__fork__\"adder~CI\" <10 >17 >19\n", + "16:XOR2\"adder~AB\" <14 <15 >13\n", + "17:__fork__\"adder~AB\" <13 >16 >18\n", + "2:XOR2\"adder\" <16 <17 >1\n", + "18:AO22\"adder~S\" <18 <19 <20 <21 >2\n", + "3:__fork__\"cout\" <1 >6\n", + "4:__fork__\"s\" <2 >11\n", + "11:output\"s\" <11\n" + ] + } + ], + "source": [ + "for n in adder.topological_order():\n", + " print(n)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, "outputs": [ { "data": { @@ -1571,383 +1631,424 @@ "\n", "\n", - "\n", "\n", - "\n", - "\n", + "\n", + "\n", "%3\n", - "\n", - "\n", - "0\n", - "\n", - "0\n", - "\n", - "1\n", - "\n", - "0 [4]\n", - "DFF\n", - "carry\n", - "\n", - "0\n", + "\n", + "\n", + "\n", + "7\n", + "\n", + " \n", + "\n", + "7 [1]\n", + "input\n", + "a\n", + "\n", + "0\n", "\n", - "\n", - "12\n", - "\n", - "0\n", - "\n", - "12\n", - "__fork__\n", - "carry~Q\n", - "\n", - "0\n", + "\n", + "\n", + "8\n", + "\n", + "0\n", + "\n", + "8\n", + "__fork__\n", + "a\n", + "\n", + "0\n", "\n", - "\n", - "0:o0->12:i0\n", - "\n", - "\n", - "12\n", + "\n", + "\n", + "7:o0->8:i0\n", + "\n", + "\n", + "4\n", "\n", "\n", - "5\n", - "\n", - " \n", - "\n", - "5 [0]\n", - "input\n", - "clk\n", - "\n", - "0\n", + "\n", + "5\n", + "\n", + " \n", + "\n", + "5 [0]\n", + "input\n", + "clk\n", + "\n", + "0\n", "\n", "\n", - "6\n", - "\n", - "0\n", - "\n", - "6\n", - "__fork__\n", - "clk\n", - "\n", - "0\n", + "\n", + "6\n", + "\n", + "0\n", + "\n", + "6\n", + "__fork__\n", + "clk\n", + "\n", + "0\n", "\n", "\n", - "5:o0->6:i0\n", - "\n", - "\n", - "3\n", + "\n", + "5:o0->6:i0\n", + "\n", + "\n", + "3\n", "\n", - "\n", - "7\n", - "\n", - " \n", - "\n", - "7 [1]\n", - "input\n", - "a\n", - "\n", - "0\n", + "\n", + "\n", + "0\n", + "\n", + "0\n", + "\n", + "1\n", + "\n", + "0 [4]\n", + "DFF\n", + "carry\n", + "\n", + "0\n", "\n", - "\n", - "8\n", - "\n", - "0\n", - "\n", - "8\n", - "__fork__\n", - "a\n", - "\n", - "0\n", + "\n", + "\n", + "12\n", + "\n", + "0\n", + "\n", + "12\n", + "__fork__\n", + "carry~Q\n", + "\n", + "0\n", "\n", - "\n", - "7:o0->8:i0\n", - "\n", - "\n", - "4\n", + "\n", + "\n", + "0:o0->12:i0\n", + "\n", + "\n", + "12\n", "\n", "\n", - "9\n", - "\n", - " \n", - "\n", - "9 [2]\n", - "input\n", - "b\n", - "\n", - "0\n", + "\n", + "9\n", + "\n", + " \n", + "\n", + "9 [2]\n", + "input\n", + "b\n", + "\n", + "0\n", "\n", "\n", - "10\n", - "\n", - "0\n", - "\n", - "10\n", - "__fork__\n", - "b\n", - "\n", - "0\n", + "\n", + "10\n", + "\n", + "0\n", + "\n", + "10\n", + "__fork__\n", + "b\n", + "\n", + "0\n", "\n", "\n", - "9:o0->10:i0\n", - "\n", - "\n", - "5\n", + "\n", + "9:o0->10:i0\n", + "\n", + "\n", + "5\n", "\n", - "\n", - "1\n", - "\n", - "0\n", - "\n", - "1\n", - "__fork__\n", - "cin\n", - "\n", - "0\n", + "\n", + "\n", + "13\n", + "\n", + "0\n", + "\n", + "13\n", + "__fork__\n", + "adder~A\n", + "\n", + "0\n", + "\n", + "1\n", "\n", - "\n", - "12:o0->1:i0\n", - "\n", - "\n", - "0\n", + "\n", + "\n", + "8:o0->13:i0\n", + "\n", + "\n", + "8\n", "\n", "\n", - "6:o0->0:i1\n", - "\n", - "\n", - "7\n", + "\n", + "6:o0->0:i1\n", + "\n", + "\n", + "7\n", "\n", - "\n", - "13\n", - "\n", - "0\n", - "\n", - "13\n", - "__fork__\n", - "adder~A\n", - "\n", - "0\n", - "\n", - "1\n", + "\n", + "\n", + "1\n", + "\n", + "0\n", + "\n", + "1\n", + "__fork__\n", + "cin\n", + "\n", + "0\n", "\n", - "\n", - "8:o0->13:i0\n", - "\n", - "\n", - "8\n", + "\n", + "\n", + "12:o0->1:i0\n", + "\n", + "\n", + "0\n", "\n", "\n", - "14\n", - "\n", - "0\n", - "\n", - "14\n", - "__fork__\n", - "adder~B\n", - "\n", - "0\n", - "\n", - "1\n", + "\n", + "14\n", + "\n", + "0\n", + "\n", + "14\n", + "__fork__\n", + "adder~B\n", + "\n", + "0\n", + "\n", + "1\n", "\n", "\n", - "10:o0->14:i0\n", - "\n", - "\n", - "9\n", - "\n", - "\n", - "15\n", - "\n", - "0\n", - "\n", - "15\n", - "__fork__\n", - "adder~CI\n", - "\n", - "0\n", - "\n", - "1\n", - "\n", - "\n", - "1:o0->15:i0\n", - "\n", - "\n", - "10\n", + "\n", + "10:o0->14:i0\n", + "\n", + "\n", + "9\n", "\n", "\n", - "16\n", - "\n", - "0\n", - "\n", - "1\n", - "\n", - "16\n", - "XOR2\n", - "adder~AB\n", - "\n", - "0\n", + "\n", + "16\n", + "\n", + "0\n", + "\n", + "1\n", + "\n", + "16\n", + "XOR2\n", + "adder~AB\n", + "\n", + "0\n", "\n", "\n", - "13:o0->16:i0\n", - "\n", - "\n", - "14\n", + "\n", + "13:o0->16:i0\n", + "\n", + "\n", + "14\n", "\n", "\n", - "18\n", - "\n", - "0\n", - "\n", - "1\n", - "\n", - "2\n", - "\n", - "3\n", - "\n", - "18\n", - "AO22\n", - "adder~S\n", - "\n", - "0\n", + "\n", + "18\n", + "\n", + "0\n", + "\n", + "1\n", + "\n", + "2\n", + "\n", + "3\n", + "\n", + "18\n", + "AO22\n", + "adder~S\n", + "\n", + "0\n", "\n", "\n", - "13:o1->18:i2\n", - "\n", - "\n", - "20\n", + "\n", + "13:o1->18:i2\n", + "\n", + "\n", + "20\n", + "\n", + "\n", + "\n", + "15\n", + "\n", + "0\n", + "\n", + "15\n", + "__fork__\n", + "adder~CI\n", + "\n", + "0\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "1:o0->15:i0\n", + "\n", + "\n", + "10\n", "\n", "\n", - "14:o0->16:i1\n", - "\n", - "\n", - "15\n", + "\n", + "14:o0->16:i1\n", + "\n", + "\n", + "15\n", "\n", "\n", - "14:o1->18:i3\n", - "\n", - "\n", - "21\n", + "\n", + "14:o1->18:i3\n", + "\n", + "\n", + "21\n", "\n", "\n", - "2\n", - "\n", - "0\n", - "\n", - "1\n", - "\n", - "2\n", - "XOR2\n", - "adder\n", - "\n", - "0\n", + "\n", + "2\n", + "\n", + "0\n", + "\n", + "1\n", + "\n", + "2\n", + "XOR2\n", + "adder\n", + "\n", + "0\n", "\n", "\n", - "15:o0->2:i1\n", - "\n", - "\n", - "17\n", + "\n", + "15:o0->2:i1\n", + "\n", + "\n", + "17\n", "\n", "\n", - "15:o1->18:i1\n", - "\n", - "\n", - "19\n", + "\n", + "15:o1->18:i1\n", + "\n", + "\n", + "19\n", "\n", "\n", - "17\n", - "\n", - "0\n", - "\n", - "17\n", - "__fork__\n", - "adder~AB\n", - "\n", - "0\n", - "\n", - "1\n", + "\n", + "17\n", + "\n", + "0\n", + "\n", + "17\n", + "__fork__\n", + "adder~AB\n", + "\n", + "0\n", + "\n", + "1\n", "\n", "\n", - "16:o0->17:i0\n", - "\n", - "\n", - "13\n", + "\n", + "16:o0->17:i0\n", + "\n", + "\n", + "13\n", "\n", "\n", - "17:o0->2:i0\n", - "\n", - "\n", - "16\n", + "\n", + "17:o0->2:i0\n", + "\n", + "\n", + "16\n", "\n", "\n", - "17:o1->18:i0\n", - "\n", - "\n", - "18\n", + "\n", + "17:o1->18:i0\n", + "\n", + "\n", + "18\n", "\n", "\n", - "3\n", - "\n", - "0\n", - "\n", - "3\n", - "__fork__\n", - "cout\n", - "\n", - "0\n", + "\n", + "3\n", + "\n", + "0\n", + "\n", + "3\n", + "__fork__\n", + "cout\n", + "\n", + "0\n", "\n", "\n", - "2:o0->3:i0\n", - "\n", - "\n", - "1\n", + "\n", + "2:o0->3:i0\n", + "\n", + "\n", + "1\n", "\n", "\n", - "4\n", - "\n", - "0\n", - "\n", - "4\n", - "__fork__\n", - "s\n", - "\n", - "0\n", + "\n", + "4\n", + "\n", + "0\n", + "\n", + "4\n", + "__fork__\n", + "s\n", + "\n", + "0\n", "\n", "\n", - "18:o0->4:i0\n", - "\n", - "\n", - "2\n", + "\n", + "18:o0->4:i0\n", + "\n", + "\n", + "2\n", "\n", "\n", - "3:o0->0:i0\n", - "\n", - "\n", - "6\n", + "\n", + "3:o0->0:i0\n", + "\n", + "\n", + "6\n", "\n", "\n", - "11\n", - "\n", - "0\n", - "\n", - "11 [3]\n", - "output\n", - "s\n", - "\n", - " \n", + "\n", + "11\n", + "\n", + "0\n", + "\n", + "11 [3]\n", + "output\n", + "s\n", + "\n", + " \n", "\n", "\n", - "4:o0->11:i0\n", - "\n", - "\n", - "11\n", + "\n", + "4:o0->11:i0\n", + "\n", + "\n", + "11\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 39, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" } @@ -1965,7 +2066,45 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [ + "adder.eliminate_1to1_forks()" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "7:input\"a\" >4\n", + "5:input\"clk\" >3\n", + "0:DFF\"carry\" <1 <3 >12\n", + "9:input\"b\" >5\n", + "10:__fork__\"adder~A\" <4 >14 >6\n", + "6:__fork__\"adder~CI\" <12 >8 >11\n", + "8:__fork__\"adder~B\" <5 >0 >10\n", + "4:XOR2\"adder~AB\" <14 <0 >13\n", + "3:__fork__\"adder~AB\" <13 >9 >7\n", + "2:XOR2\"adder\" <9 <8 >1\n", + "1:AO22\"adder~S\" <7 <11 <6 <10 >2\n", + "11:output\"s\" <2\n" + ] + } + ], + "source": [ + "for n in adder.topological_order():\n", + " print(n)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, "metadata": {}, "outputs": [ { @@ -1974,270 +2113,309 @@ "\n", "\n", - "\n", "\n", - "\n", - "\n", + "\n", + "\n", "%3\n", - "\n", - "\n", - "0\n", - "\n", - "0\n", - "\n", - "1\n", - "\n", - "0 [4]\n", - "DFF\n", - "carry\n", - "\n", - "0\n", + "\n", + "\n", + "\n", + "7\n", + "\n", + " \n", + "\n", + "7 [1]\n", + "input\n", + "a\n", + "\n", + "0\n", "\n", - "\n", - "6\n", - "\n", - "0\n", - "\n", - "6\n", - "__fork__\n", - "adder~CI\n", - "\n", - "0\n", - "\n", - "1\n", + "\n", + "\n", + "10\n", + "\n", + "0\n", + "\n", + "10\n", + "__fork__\n", + "adder~A\n", + "\n", + "0\n", + "\n", + "1\n", "\n", - "\n", - "0:o0->6:i0\n", - "\n", - "\n", - "12\n", + "\n", + "\n", + "7:o0->10:i0\n", + "\n", + "\n", + "4\n", "\n", "\n", - "5\n", - "\n", - " \n", - "\n", - "5 [0]\n", - "input\n", - "clk\n", - "\n", - "0\n", - "\n", - "\n", - "5:o0->0:i1\n", - "\n", - "\n", - "3\n", + "\n", + "5\n", + "\n", + " \n", + "\n", + "5 [0]\n", + "input\n", + "clk\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "_3_\n", + "\n", + "_3_\n", + "\n", + "\n", + "\n", + "5:o0->_3_\n", + "\n", + "\n", + "3\n", "\n", - "\n", - "7\n", - "\n", - " \n", - "\n", - "7 [1]\n", - "input\n", - "a\n", - "\n", - "0\n", + "\n", + "\n", + "0\n", + "\n", + "0\n", + "\n", + "1\n", + "\n", + "0 [4]\n", + "DFF\n", + "carry\n", + "\n", + "0\n", "\n", - "\n", - "10\n", - "\n", - "0\n", - "\n", - "10\n", - "__fork__\n", - "adder~A\n", - "\n", - "0\n", - "\n", - "1\n", + "\n", + "\n", + "6\n", + "\n", + "0\n", + "\n", + "6\n", + "__fork__\n", + "adder~CI\n", + "\n", + "0\n", + "\n", + "1\n", "\n", - "\n", - "7:o0->10:i0\n", - "\n", - "\n", - "4\n", + "\n", + "\n", + "0:o0->6:i0\n", + "\n", + "\n", + "12\n", "\n", "\n", - "9\n", - "\n", - " \n", - "\n", - "9 [2]\n", - "input\n", - "b\n", - "\n", - "0\n", + "\n", + "9\n", + "\n", + " \n", + "\n", + "9 [2]\n", + "input\n", + "b\n", + "\n", + "0\n", "\n", "\n", - "8\n", - "\n", - "0\n", - "\n", - "8\n", - "__fork__\n", - "adder~B\n", - "\n", - "0\n", - "\n", - "1\n", + "\n", + "8\n", + "\n", + "0\n", + "\n", + "8\n", + "__fork__\n", + "adder~B\n", + "\n", + "0\n", + "\n", + "1\n", "\n", "\n", - "9:o0->8:i0\n", - "\n", - "\n", - "5\n", + "\n", + "9:o0->8:i0\n", + "\n", + "\n", + "5\n", "\n", - "\n", - "2\n", - "\n", - "0\n", - "\n", - "1\n", - "\n", - "2\n", - "XOR2\n", - "adder\n", - "\n", - "0\n", + "\n", + "\n", + "4\n", + "\n", + "0\n", + "\n", + "1\n", + "\n", + "4\n", + "XOR2\n", + "adder~AB\n", + "\n", + "0\n", "\n", - "\n", - "6:o0->2:i1\n", - "\n", - "\n", - "8\n", + "\n", + "\n", + "10:o0->4:i0\n", + "\n", + "\n", + "14\n", "\n", "\n", - "1\n", - "\n", - "0\n", - "\n", - "1\n", - "\n", - "2\n", - "\n", - "3\n", - "\n", - "1\n", - "AO22\n", - "adder~S\n", - "\n", - "0\n", - "\n", - "\n", - "6:o1->1:i1\n", - "\n", - "\n", - "11\n", + "\n", + "1\n", + "\n", + "0\n", + "\n", + "1\n", + "\n", + "2\n", + "\n", + "3\n", + "\n", + "1\n", + "AO22\n", + "adder~S\n", + "\n", + "0\n", "\n", "\n", - "10:o1->1:i2\n", - "\n", - "\n", - "6\n", + "\n", + "10:o1->1:i2\n", + "\n", + "\n", + "6\n", "\n", - "\n", - "4\n", - "\n", - "0\n", - "\n", - "1\n", - "\n", - "4\n", - "XOR2\n", - "adder~AB\n", - "\n", - "0\n", + "\n", + "\n", + "2\n", + "\n", + "0\n", + "\n", + "1\n", + "\n", + "2\n", + "XOR2\n", + "adder\n", + "\n", + "0\n", "\n", - "\n", - "10:o0->4:i0\n", - "\n", - "\n", - "14\n", + "\n", + "\n", + "6:o0->2:i1\n", + "\n", + "\n", + "8\n", + "\n", + "\n", + "\n", + "6:o1->1:i1\n", + "\n", + "\n", + "11\n", "\n", "\n", - "8:o0->4:i1\n", - "\n", - "\n", - "0\n", + "\n", + "8:o0->4:i1\n", + "\n", + "\n", + "0\n", "\n", "\n", - "8:o1->1:i3\n", - "\n", - "\n", - "10\n", + "\n", + "8:o1->1:i3\n", + "\n", + "\n", + "10\n", "\n", "\n", - "3\n", - "\n", - "0\n", - "\n", - "3\n", - "__fork__\n", - "adder~AB\n", - "\n", - "0\n", - "\n", - "1\n", + "\n", + "3\n", + "\n", + "0\n", + "\n", + "3\n", + "__fork__\n", + "adder~AB\n", + "\n", + "0\n", + "\n", + "1\n", "\n", "\n", - "4:o0->3:i0\n", - "\n", - "\n", - "13\n", - "\n", - "\n", - "3:o1->1:i0\n", - "\n", - "\n", - "7\n", + "\n", + "4:o0->3:i0\n", + "\n", + "\n", + "13\n", "\n", "\n", - "3:o0->2:i0\n", - "\n", - "\n", - "9\n", + "\n", + "3:o0->2:i0\n", + "\n", + "\n", + "9\n", + "\n", + "\n", + "\n", + "3:o1->1:i0\n", + "\n", + "\n", + "7\n", "\n", "\n", - "2:o0->0:i0\n", - "\n", - "\n", - "1\n", + "\n", + "2:o0->0:i0\n", + "\n", + "\n", + "1\n", "\n", "\n", - "11\n", - "\n", - "0\n", - "\n", - "11 [3]\n", - "output\n", - "s\n", - "\n", - " \n", + "\n", + "11\n", + "\n", + "0\n", + "\n", + "11 [3]\n", + "output\n", + "s\n", + "\n", + " \n", "\n", "\n", - "1:o0->11:i0\n", - "\n", - "\n", - "2\n", + "\n", + "1:o0->11:i0\n", + "\n", + "\n", + "2\n", + "\n", + "\n", + "\n", + "_3_->0:i1\n", + "\n", + "\n", + "3\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 40, + "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "adder.eliminate_1to1_forks()\n", "adder.dot()" ] }, @@ -2250,7 +2428,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 44, "metadata": {}, "outputs": [ { @@ -2278,7 +2456,7 @@ " '__seq__': 417}" ] }, - "execution_count": 41, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" } @@ -2299,7 +2477,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 45, "metadata": {}, "outputs": [ { @@ -2488,7 +2666,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 46, "metadata": {}, "outputs": [ { @@ -2501,7 +2679,7 @@ " 0:DFF\"carry\" <1 <3 >12]" ] }, - "execution_count": 43, + "execution_count": 46, "metadata": {}, "output_type": "execute_result" } @@ -2523,7 +2701,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 47, "metadata": {}, "outputs": [ { @@ -2536,7 +2714,7 @@ " [0, 0, 0, 0, 3, 3, 3, 3]], dtype=uint8)" ] }, - "execution_count": 44, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } @@ -2562,7 +2740,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 48, "metadata": {}, "outputs": [ { @@ -2571,7 +2749,7 @@ "(5, 8)" ] }, - "execution_count": 45, + "execution_count": 48, "metadata": {}, "output_type": "execute_result" } @@ -2589,7 +2767,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 49, "metadata": {}, "outputs": [ { @@ -2620,7 +2798,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 50, "metadata": {}, "outputs": [], "source": [ @@ -2633,7 +2811,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 51, "metadata": {}, "outputs": [ { @@ -2642,7 +2820,7 @@ "528" ] }, - "execution_count": 48, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" } @@ -2653,7 +2831,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 52, "metadata": {}, "outputs": [ { @@ -2662,7 +2840,7 @@ "(528, 678)" ] }, - "execution_count": 49, + "execution_count": 52, "metadata": {}, "output_type": "execute_result" } @@ -2673,7 +2851,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 53, "metadata": {}, "outputs": [ { @@ -2682,7 +2860,7 @@ "(528, 678)" ] }, - "execution_count": 50, + "execution_count": 53, "metadata": {}, "output_type": "execute_result" } @@ -2693,7 +2871,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 54, "metadata": {}, "outputs": [ { @@ -2714,7 +2892,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 55, "metadata": {}, "outputs": [ { @@ -2749,7 +2927,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 56, "metadata": {}, "outputs": [], "source": [ @@ -2768,18 +2946,18 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 57, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "------------------------------------------------------------------------------------------------------X----XX--000110110011010011101101001011010010110100101101001001100110011001100110011001100011001100110011001100110011001110011001100110011001100110011001011101001011010010110100101101001011010010110100101101001011101100110011001101100110000010010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101011100110011001100110011001100110011111100001001011000100\n", - "--------------------------------------RFRRRRFRRFRRRR1R--------RXXRXRRR--------------------------------00F0F00--RR1RRXRF00011010XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX011X00XXX101X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X0XXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXRRXRXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX00000000000000000111111000001001RFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX11XXXXX\n", - "--------------------------------------1X111XX11X1XX1X11XX11XX111X11X11--------------------------------0-XXR00--F1FF1X0110011X01XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXFXX1XFFX1XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX0XFXFXFXF11110XX1XX1XXXXXXX1XXXX1XFR1F1XXXXXXXXXXXXXXXXX011101111000101101110111110001001000100010101011011001110111000X1XX11XXXXXXXX11XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX000X011111111111111111111111111111R0F1R0R001RR100FF1XXX\n", - "--------------------------------------------------------------XXXXXXXX--------------------------------0--FX00--F11F1XFRR00R01111XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX0XX1XXXXXRX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX111111111111111111111110X0XX10XXXXXXXXXRXXXRXRF1FFFRFRXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXXXXXXXXXXX0XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX11X1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX011001010010111111111\n", - "--------------------------------------------------------------FFXFFFFF--------------------------------0XXRR00--RF01FXRF00001XX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX010X010111111111X111111111111111X11100XX0101XXXXXX01XXXX01XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX1X1111X110111111XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX0RXRXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXXXX\n" + "------------------------------------------------------------------------------------------------------0----00--000110110011010011101101001011010010110100101101001001100110011001100110011001100011001100110011001100110011001110011001100110011001100110011001011101001011010010110100101101001011010010110100101101001011101100110011001101100110000010010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101011100110011001100110011001100110011111100001001011000100\n", + "--------------------------------------RFRRRRFRRFRRRR1R--------R11R1RRR--------------------------------00F0F00--RR1RRXRF00011010XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX011X00XXX101X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X0XXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXRRXRXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX00000000000000000111111000001001RFX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX1X0X0X1XXXXXXX11XXXXX\n", + "--------------------------------------10111001101001011001100111011011--------------------------------0-10R00--F1FF1X0110011001011X1X1X0X1X1X0X1X1X1X0X0X1X1X0X0X101001011001110XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXFXX1XFFX1XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX0XFXFXFXF11110XX1XX1XXXXXXX1XXXX1XFR1F1XXXXXXXXXXXXXXXXX011101111000101101110111110001001000100010101011011001110111000X1XX11XXXXXXXX11XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX000X011111111111111111111111111111R0F1R0R001RR100FF1XXX\n", + "--------------------------------------------------------------01100100--------------------------------0--F000--F11F1XFRR00R01111XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX0XX1XXXXXRX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX111111111111111111111110X0XX10XXXXXXXX0R000R0RF1FFFRFRXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXXXXXXXXXXX0XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX11X1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX011001010010111111111\n", + "--------------------------------------------------------------FF1FFFFF--------------------------------000RR00--RF01FXRF00001XX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX010X010111111111X111111111111111X11100XX0101XXXXXX01XXXX01XXXXXXXXXXXXXXXXXXXXXXXXXXXX11X1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX1X1111X110111111XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX0RXRXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX1X1X0X1XXXXXXX1XXXXXX\n" ] } ], @@ -2789,7 +2967,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 58, "metadata": {}, "outputs": [ { @@ -2817,7 +2995,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 59, "metadata": {}, "outputs": [], "source": [ @@ -2831,7 +3009,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 60, "metadata": {}, "outputs": [ { @@ -2864,7 +3042,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 61, "metadata": {}, "outputs": [], "source": [ @@ -2873,7 +3051,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 62, "metadata": {}, "outputs": [ { @@ -2882,7 +3060,7 @@ "(528, 3, 85)" ] }, - "execution_count": 59, + "execution_count": 62, "metadata": {}, "output_type": "execute_result" } @@ -2902,7 +3080,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 63, "metadata": {}, "outputs": [ { @@ -2911,7 +3089,7 @@ "(528, 680)" ] }, - "execution_count": 60, + "execution_count": 63, "metadata": {}, "output_type": "execute_result" } @@ -2931,7 +3109,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 64, "metadata": {}, "outputs": [], "source": [ @@ -2947,7 +3125,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 65, "metadata": {}, "outputs": [ { @@ -2981,7 +3159,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 66, "metadata": {}, "outputs": [ { @@ -2990,7 +3168,7 @@ "677" ] }, - "execution_count": 63, + "execution_count": 66, "metadata": {}, "output_type": "execute_result" } @@ -3010,7 +3188,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 67, "metadata": {}, "outputs": [], "source": [ @@ -3024,7 +3202,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 68, "metadata": {}, "outputs": [ { @@ -3054,7 +3232,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 69, "metadata": {}, "outputs": [ { @@ -3087,7 +3265,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 70, "metadata": {}, "outputs": [ { @@ -3096,7 +3274,7 @@ "1146" ] }, - "execution_count": 67, + "execution_count": 70, "metadata": {}, "output_type": "execute_result" } @@ -3127,7 +3305,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 71, "metadata": {}, "outputs": [], "source": [ @@ -3146,7 +3324,7 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 72, "metadata": {}, "outputs": [ { @@ -3155,7 +3333,7 @@ "(32032, 2, 2)" ] }, - "execution_count": 69, + "execution_count": 72, "metadata": {}, "output_type": "execute_result" } @@ -3173,7 +3351,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 73, "metadata": {}, "outputs": [ { @@ -3182,7 +3360,7 @@ "79010" ] }, - "execution_count": 70, + "execution_count": 73, "metadata": {}, "output_type": "execute_result" } @@ -3210,7 +3388,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 74, "metadata": {}, "outputs": [], "source": [ @@ -3228,17 +3406,17 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 75, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Waveforms : 66856.0 kiB\n", + "Waveforms : 65996.0 kiB\n", "State Allocation Table : 134.3 kiB\n", "Circuit Timing : 1074.1 kiB\n", - "Circuit Netlist : 1171.2 kiB\n", + "Circuit Netlist : 1156.0 kiB\n", "Sequential State : 726.0 kiB\n" ] } @@ -3265,21 +3443,23 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 76, "metadata": {}, "outputs": [], "source": [ "from kyupy import batchrange\n", "import numpy as np\n", + "from numba import config\n", + "config.CUDA_LOW_OCCUPANCY_WARNINGS = False\n", "\n", - "sims = 128 # transition_tests_zf.shape[-1] # Feel free to simulate all tests if CUDA is set up correctly.\n", + "sims = 128 #transition_tests_zf.shape[-1] # Feel free to simulate all tests if CUDA is set up correctly.\n", "\n", "wsim_results = np.zeros((11, wsim.s_len, sims)) # space to store all simulation results\n", "\n", "for offset, size in batchrange(sims, wsim.sims):\n", - " wsim.s[0] = (transition_tests_zf[:,offset:offset+size] >> 1) & 1 # initial value (bit 1)\n", - " wsim.s[1] = 0.0 # transition time\n", - " wsim.s[2] = transition_tests_zf[:,offset:offset+size] & 1 # final value (bit 0)\n", + " wsim.s[0,:,:size] = (transition_tests_zf[:,offset:offset+size] >> 1) & 1 # initial value (bit 1)\n", + " wsim.s[1,:,:size] = 0.0 # transition time\n", + " wsim.s[2,:,:size] = transition_tests_zf[:,offset:offset+size] & 1 # final value (bit 0)\n", " wsim.s_to_c()\n", " wsim.c_prop(sims=size)\n", " wsim.c_to_s(time=1.5) # capture at time 1.5\n", @@ -3308,7 +3488,7 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 77, "metadata": {}, "outputs": [ { @@ -3317,7 +3497,7 @@ "(11, 528, 128)" ] }, - "execution_count": 74, + "execution_count": 77, "metadata": {}, "output_type": "execute_result" } @@ -3335,7 +3515,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 78, "metadata": {}, "outputs": [ { @@ -3364,7 +3544,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 79, "metadata": {}, "outputs": [ { @@ -3373,7 +3553,7 @@ "127" ] }, - "execution_count": 76, + "execution_count": 79, "metadata": {}, "output_type": "execute_result" } @@ -3393,7 +3573,7 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 80, "metadata": {}, "outputs": [ { @@ -3402,7 +3582,7 @@ "1.0424000024795532" ] }, - "execution_count": 77, + "execution_count": 80, "metadata": {}, "output_type": "execute_result" } @@ -3420,7 +3600,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 81, "metadata": {}, "outputs": [ { @@ -3429,7 +3609,7 @@ "0.0" ] }, - "execution_count": 78, + "execution_count": 81, "metadata": {}, "output_type": "execute_result" } @@ -3447,7 +3627,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 82, "metadata": {}, "outputs": [ { @@ -3456,7 +3636,7 @@ "0" ] }, - "execution_count": 79, + "execution_count": 82, "metadata": {}, "output_type": "execute_result" } @@ -3489,7 +3669,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.9" + "version": "3.12.2" }, "vscode": { "interpreter": { diff --git a/src/kyupy/circuit.py b/src/kyupy/circuit.py index e387ffc..0191d26 100644 --- a/src/kyupy/circuit.py +++ b/src/kyupy/circuit.py @@ -669,13 +669,16 @@ class Circuit: ins = '|'.join([f'{i}' for i in range(len(n.ins))]) outs = '|'.join([f'{i}' for i in range(len(n.outs))]) io = f' [{s_dict[n]}]' if n in s_dict else '' - s.node(name=str(n.index), label = f'{{{{{ins}}}|{n.index}{io}\n{n.kind}\n{n.name}|{{{outs}}}}}', shape='record') + s.node(name=str(n.index), label = fr'{{{{{ins}}}|{n.index}{io}\n{n.kind}\n{n.name}|{{{outs}}}}}', shape='record') for l in self.lines: driver, reader = f'{l.driver.index}:o{l.driver_pin}', f'{l.reader.index}:i{l.reader_pin}' - if node_level[l.driver] >= node_level[l.reader]: + if node_level[l.driver] == node_level[l.reader]: + s.node(f'_{l.index}_') + dot.edge(driver, f'_{l.index}_', style='dotted', label=str(l.index)) + dot.edge(f'_{l.index}_', reader, style='dotted', label=str(l.index)) + elif node_level[l.driver] > node_level[l.reader]: dot.edge(driver, reader, style='dotted', label=str(l.index)) - pass else: dot.edge(driver, reader, label=str(l.index))