Skip to content

Commit 3f9a991

Browse files
committed
dataflow_sort
1 parent 746e22d commit 3f9a991

File tree

3 files changed

+1140
-0
lines changed

3 files changed

+1140
-0
lines changed

examples/dataflow_sort/Makefile

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
TARGET=$(shell ls *.py | grep -v test | grep -v parsetab.py)
2+
ARGS=
3+
4+
PYTHON=python3
5+
#PYTHON=python
6+
#OPT=-m pdb
7+
#OPT=-m cProfile -s time
8+
#OPT=-m cProfile -o profile.rslt
9+
10+
.PHONY: all
11+
all: test
12+
13+
.PHONY: run
14+
run:
15+
$(PYTHON) $(OPT) $(TARGET) $(ARGS)
16+
17+
.PHONY: test
18+
test:
19+
$(PYTHON) -m pytest -vv
20+
21+
.PHONY: check
22+
check:
23+
$(PYTHON) $(OPT) $(TARGET) $(ARGS) > tmp.v
24+
iverilog -tnull -Wall tmp.v
25+
rm -f tmp.v
26+
27+
.PHONY: clean
28+
clean:
29+
rm -rf *.pyc __pycache__ parsetab.py .cache *.out *.png *.dot tmp.v uut.vcd
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
from __future__ import absolute_import
2+
from __future__ import print_function
3+
import sys
4+
import os
5+
import math
6+
7+
# the next line can be removed after installation
8+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
9+
10+
from veriloggen import *
11+
import veriloggen.dataflow as dataflow
12+
13+
def mux(cond, x, y):
14+
if dataflow.is_dataflow_object(cond, x, y):
15+
return dataflow.Mux(cond, x, y)
16+
return x if cond else y
17+
18+
def compare(x, y):
19+
cond = x < y
20+
small = mux(cond, x, y)
21+
large = mux(cond, y, x)
22+
return small, large
23+
24+
def network(values, num):
25+
ret = []
26+
x = values[0]
27+
28+
for i in range(num):
29+
small, large = compare(x, values[i+1])
30+
ret.append(small)
31+
x = large
32+
33+
ret.append(x)
34+
35+
for i in range(num+1, len(values)):
36+
ret.append( values[i] )
37+
38+
return ret
39+
40+
def sort(values):
41+
num = len(values)
42+
for i in range(num):
43+
values = network(values, num-i-1)
44+
return values
45+
46+
def mkSort(numports=4):
47+
values = [ dataflow.Variable('din%d' % i) for i in range(numports) ]
48+
rslt = sort(values)
49+
50+
for i, r in enumerate(rslt):
51+
r.output('dout%d' % i)
52+
53+
df = dataflow.Dataflow(*rslt)
54+
m = df.to_module('sort')
55+
56+
return m
57+
58+
def mkTest(numports=4):
59+
60+
m = Module('test')
61+
62+
# target instance
63+
main = mkSort(numports)
64+
65+
params = m.copy_params(main)
66+
ports = m.copy_sim_ports(main)
67+
68+
clk = ports['CLK']
69+
rst = ports['RST']
70+
71+
din = [ ports['din%d' % i] for i in range(numports) ]
72+
dout = [ ports['dout%d' % i] for i in range(numports) ]
73+
74+
uut = m.Instance(main, 'uut',
75+
params=m.connect_params(main),
76+
ports=m.connect_ports(main))
77+
78+
reset_done = m.Reg('reset_done', initval=0)
79+
reset_stmt = []
80+
for i, d in enumerate(din):
81+
reset_stmt.append( d(0) )
82+
83+
simulation.setup_waveform(m, uut)
84+
simulation.setup_clock(m, clk, hperiod=5)
85+
init = simulation.setup_reset(m, rst, reset_stmt, period=100)
86+
87+
nclk = simulation.next_clock
88+
89+
init.add(
90+
Delay(1000),
91+
reset_done(1),
92+
nclk(clk),
93+
Delay(100000),
94+
Systask('finish'),
95+
)
96+
97+
fsm = FSM(m, 'fsm', clk, rst)
98+
99+
fsm.goto_next(cond=reset_done)
100+
101+
for i, d in enumerate(din):
102+
fsm.add( d(100 - i) )
103+
104+
fsm.goto_next()
105+
106+
for i in range(int(math.log(numports, 2)) * 8):
107+
for d in dout:
108+
fsm.add( Systask('display', '%s = %d', d.name, d))
109+
fsm.add( Systask('display', '----') )
110+
fsm.goto_next()
111+
112+
fsm.add( Systask('finish') )
113+
fsm.make_always()
114+
115+
return m
116+
117+
if __name__ == '__main__':
118+
n = 4
119+
test = mkTest(n)
120+
verilog = test.to_verilog('tmp.v')
121+
#print(verilog)
122+
123+
# run simulator (Icarus Verilog)
124+
sim = simulation.Simulator(test)
125+
rslt = sim.run()
126+
print(rslt)
127+
128+
## only target RTL
129+
#main = mkSort(n)
130+
#verilog = main.to_verilog('tmp.v')
131+
#print(verilog)
132+
133+
values = [ 100 - i for i in range(n) ]
134+
rslt = sort(values)
135+
print(rslt)

0 commit comments

Comments
 (0)