Browse Source

improve substitute, update notebook output

devel
Stefan Holst 1 year ago
parent
commit
47ee8d5878
  1. 74
      examples/Introduction.ipynb
  2. 36
      src/kyupy/circuit.py

74
examples/Introduction.ipynb

@ -248,9 +248,9 @@ @@ -248,9 +248,9 @@
{
"data": {
"text/plain": [
"{'a': 0:__fork__\"a\" >3 >9,\n",
" 'b': 1:__fork__\"b\" >4 >10,\n",
" 's': 2:__fork__\"s\" <5 ,\n",
"{'a': 0:__fork__\"a\" >3 >9,\n",
" 'b': 1:__fork__\"b\" >4 >10,\n",
" 's': 2:__fork__\"s\" <5,\n",
" 'cout': 3:__fork__\"cout\" <14 >1,\n",
" 'cin': 5:__fork__\"cin\" <0 >7 >13,\n",
" 'axb': 7:__fork__\"axb\" <2 >6 >12,\n",
@ -398,9 +398,9 @@ @@ -398,9 +398,9 @@
{
"data": {
"text/plain": [
"[0:__fork__\"a\" >3 >9,\n",
" 1:__fork__\"b\" >4 >10,\n",
" 2:__fork__\"s\" <5 ,\n",
"[0:__fork__\"a\" >3 >9,\n",
" 1:__fork__\"b\" >4 >10,\n",
" 2:__fork__\"s\" <5,\n",
" 3:__fork__\"cout\" <14 >1,\n",
" 4:DFF\"cin\" <1 >0,\n",
" 5:__fork__\"cin\" <0 >7 >13,\n",
@ -636,7 +636,7 @@ @@ -636,7 +636,7 @@
{
"data": {
"text/plain": [
"[0:__fork__\"a\" >3 >9, 1:__fork__\"b\" >4 >10, 2:__fork__\"s\" <5 ]"
"[0:__fork__\"a\" >3 >9, 1:__fork__\"b\" >4 >10, 2:__fork__\"s\" <5]"
]
},
"execution_count": 22,
@ -667,10 +667,7 @@ @@ -667,10 +667,7 @@
{
"data": {
"text/plain": [
"[0:__fork__\"a\" >3 >9,\n",
" 1:__fork__\"b\" >4 >10,\n",
" 2:__fork__\"s\" <5 ,\n",
" 4:DFF\"cin\" <1 >0]"
"[0:__fork__\"a\" >3 >9, 1:__fork__\"b\" >4 >10, 2:__fork__\"s\" <5, 4:DFF\"cin\" <1 >0]"
]
},
"execution_count": 23,
@ -766,26 +763,26 @@ @@ -766,26 +763,26 @@
"data": {
"text/plain": [
"({name: \"b15\", cells: 10789, forks: 10749, lines: 32032, io_nodes: 111},\n",
" [21386:output\"BE_n[3]\" <31961 ,\n",
" 21387:output\"BE_n[2]\" <31962 ,\n",
" 21388:output\"BE_n[1]\" <31963 ,\n",
" 21389:output\"BE_n[0]\" <31964 ,\n",
" 21390:output\"Address[29]\" <31965 ,\n",
" 21391:output\"Address[28]\" <31966 ,\n",
" 21392:output\"Address[27]\" <31967 ,\n",
" 21393:output\"Address[26]\" <31968 ,\n",
" 21394:output\"Address[25]\" <31969 ,\n",
" 21395:output\"Address[24]\" <31970 ,\n",
" 21396:output\"Address[23]\" <31971 ,\n",
" 21397:output\"Address[22]\" <31972 ,\n",
" 21398:output\"Address[21]\" <31973 ,\n",
" 21399:output\"Address[20]\" <31974 ,\n",
" 21400:output\"Address[19]\" <31975 ,\n",
" 21401:output\"Address[18]\" <31976 ,\n",
" 21402:output\"Address[17]\" <31977 ,\n",
" 21403:output\"Address[16]\" <31978 ,\n",
" 21404:output\"Address[15]\" <31979 ,\n",
" 21405:output\"Address[14]\" <31980 ])"
" [21386:output\"BE_n[3]\" <31961,\n",
" 21387:output\"BE_n[2]\" <31962,\n",
" 21388:output\"BE_n[1]\" <31963,\n",
" 21389:output\"BE_n[0]\" <31964,\n",
" 21390:output\"Address[29]\" <31965,\n",
" 21391:output\"Address[28]\" <31966,\n",
" 21392:output\"Address[27]\" <31967,\n",
" 21393:output\"Address[26]\" <31968,\n",
" 21394:output\"Address[25]\" <31969,\n",
" 21395:output\"Address[24]\" <31970,\n",
" 21396:output\"Address[23]\" <31971,\n",
" 21397:output\"Address[22]\" <31972,\n",
" 21398:output\"Address[21]\" <31973,\n",
" 21399:output\"Address[20]\" <31974,\n",
" 21400:output\"Address[19]\" <31975,\n",
" 21401:output\"Address[18]\" <31976,\n",
" 21402:output\"Address[17]\" <31977,\n",
" 21403:output\"Address[16]\" <31978,\n",
" 21404:output\"Address[15]\" <31979,\n",
" 21405:output\"Address[14]\" <31980])"
]
},
"execution_count": 27,
@ -1167,8 +1164,8 @@ @@ -1167,8 +1164,8 @@
"name": "stdout",
"output_type": "stream",
"text": [
"0:__fork__\"a\" >3 >9\n",
"1:__fork__\"b\" >4 >10\n",
"0:__fork__\"a\" >3 >9\n",
"1:__fork__\"b\" >4 >10\n",
"4:DFF\"cin\" <1 >0\n",
"6:XOR\"axb\" <3 <4 >2\n",
"9:AND\"aab\" <9 <10 >8\n",
@ -1177,7 +1174,7 @@ @@ -1177,7 +1174,7 @@
"10:__fork__\"aab\" <8 >15\n",
"8:XOR\"s\" <6 <7 >5\n",
"11:AND\"axbacin\" <12 <13 >11\n",
"2:__fork__\"s\" <5 \n",
"2:__fork__\"s\" <5\n",
"12:__fork__\"axbacin\" <11 >16\n",
"13:OR\"cout\" <15 <16 >14\n",
"3:__fork__\"cout\" <14 >1\n"
@ -1312,10 +1309,7 @@ @@ -1312,10 +1309,7 @@
{
"data": {
"text/plain": [
"[0:__fork__\"a\" >3 >9,\n",
" 1:__fork__\"b\" >4 >10,\n",
" 2:__fork__\"s\" <5 ,\n",
" 4:DFF\"cin\" <1 >0]"
"[0:__fork__\"a\" >3 >9, 1:__fork__\"b\" >4 >10, 2:__fork__\"s\" <5, 4:DFF\"cin\" <1 >0]"
]
},
"execution_count": 37,
@ -2045,10 +2039,10 @@ @@ -2045,10 +2039,10 @@
"name": "stdout",
"output_type": "stream",
"text": [
"Waveforms : 64293.5 kiB\n",
"Waveforms : 64294.0 kiB\n",
"State Allocation Table : 129.3 kiB\n",
"Circuit Timing : 1034.1 kiB\n",
"Circuit Netlist : 750.8 kiB\n",
"Circuit Netlist : 1126.1 kiB\n",
"Sequential State : 726.0 kiB\n"
]
}

36
src/kyupy/circuit.py

@ -343,7 +343,7 @@ class Circuit: @@ -343,7 +343,7 @@ class Circuit:
the signal lines are connected appropriately. The number and arrangement
of the input and output ports must match the pins of the replaced node.
"""
impl_in_lines = [n.outs[0] for n in impl.io_nodes if len(n.outs) > 0]
impl_in_lines = [n.outs[0] for n in impl.io_nodes if len(n.ins) == 0]
impl_out_lines = [n.ins[0] for n in impl.io_nodes if len(n.ins) > 0]
node_in_lines = list(node.ins) + [None] * (len(impl_in_lines)-len(node.ins))
node_out_lines = list(node.outs) + [None] * (len(impl_out_lines)-len(node.outs))
@ -354,24 +354,28 @@ class Circuit: @@ -354,24 +354,28 @@ class Circuit:
node.remove()
node_map = dict()
ios = set(impl.io_nodes)
for n in impl.nodes:
for n in impl.nodes: # add all nodes to main circuit
if n not in ios:
node_map[n] = Node(self, node.name + '~' + n.name, n.kind)
for l in impl.lines:
if l in in_lines_map:
ll = in_lines_map[l]
if ll is not None:
ll.reader = node_map[l.reader]
ll.reader_pin = l.reader_pin
ll.reader.ins[ll.reader_pin] = ll
elif l in out_lines_map:
ll = out_lines_map[l]
if ll is not None:
ll.driver = node_map[l.driver]
ll.driver_pin = l.driver_pin
ll.driver.outs[ll.driver_pin] = ll
else:
elif len(n.outs) > 0 and len(n.ins) > 0: # output is also read by impl. circuit, need to add a fork.
node_map[n] = Node(self, node.name + '~' + n.name)
for l in impl.lines: # add all internal lines to main circuit
if l.reader in node_map and l.driver in node_map:
Line(self, (node_map[l.driver], l.driver_pin), (node_map[l.reader], l.reader_pin))
for l, ll in in_lines_map.items(): # connect inputs
if ll is None: continue
ll.reader = node_map[l.reader]
ll.reader_pin = l.reader_pin
ll.reader.ins[ll.reader_pin] = ll
for l, ll in out_lines_map.items(): # connect outputs
if ll is None: continue
if len(l.reader.outs) > 0: # output is also read by impl. circuit, connect to fork.
ll.driver = node_map[l.reader]
ll.driver_pin = len(l.reader.outs)
else:
ll.driver = node_map[l.driver]
ll.driver_pin = l.driver_pin
ll.driver.outs[ll.driver_pin] = ll
def copy(self):
"""Returns a deep copy of the circuit.

Loading…
Cancel
Save