Skip to content

Commit 5a86004

Browse files
committed
dataflow_stencil is updated for the updated fixed library.
1 parent d241216 commit 5a86004

File tree

1 file changed

+71
-69
lines changed

1 file changed

+71
-69
lines changed

examples/dataflow_stencil/dataflow_stencil.py

Lines changed: 71 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,34 @@
66
from functools import reduce
77

88
# the next line can be removed after installation
9-
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
9+
sys.path.insert(0, os.path.dirname(os.path.dirname(
10+
os.path.dirname(os.path.abspath(__file__)))))
1011

1112
from veriloggen import *
1213
import veriloggen.dataflow as dataflow
1314
import veriloggen.types.ram as ram
1415
import veriloggen.types.fixed as fixed
1516

17+
1618
def stencil(coe, data):
17-
data = map(lambda x,y: x*y, data, coe)
18-
rslt = reduce(lambda x,y: x+y, data)
19+
data = map(lambda x, y: x * y, data, coe)
20+
rslt = reduce(lambda x, y: x + y, data)
1921
return rslt
20-
22+
23+
2124
def mkStencilPipeline2D(coe=None, size=3, width=32, point=16):
2225
# size-port stream inputs
23-
iports = [ dataflow.Variable('idata%d'%i, valid='ivalid%d'%i,
24-
width=width, point=point, signed=True)
25-
for i in range(size) ]
26+
iports = [dataflow.Variable('idata%d' % i, valid='ivalid%d' % i,
27+
width=width, point=point, signed=True)
28+
for i in range(size)]
2629

2730
if coe is None:
28-
coe = [ [ dataflow.Constant(1.0/(1.0*size*size), point=point) for i in range(size) ]
29-
for j in range(size) ]
30-
31+
coe = [[dataflow.Constant(1.0 / (1.0 * size * size), point=point) for i in range(size)]
32+
for j in range(size)]
33+
3134
# source data
32-
data = [ [ d.prev(j) for j in range(size) ] for d in iports ]
33-
35+
data = [[d.prev(j) for j in range(size)] for d in iports]
36+
3437
# from 2D list to 1D list
3538
data_list = []
3639
coe_list = []
@@ -40,19 +43,20 @@ def mkStencilPipeline2D(coe=None, size=3, width=32, point=16):
4043

4144
# computation by calling standard method
4245
rslt = stencil(coe_list, data_list)
43-
46+
4447
rslt.output('odata', valid='ovalid')
45-
48+
4649
df = dataflow.Dataflow(rslt)
4750
m = df.to_module('stencil_pipeline_2d')
4851

49-
#try:
52+
# try:
5053
# df.draw_graph()
51-
#except:
54+
# except:
5255
# print('Dataflow graph could not be generated.', file=sys.stderr)
5356

5457
return m
5558

59+
5660
def mkStencil(n=16, size=3, datawidth=32, point=16, coe_test=False):
5761
m = Module('stencil')
5862

@@ -63,23 +67,23 @@ def mkStencil(n=16, size=3, datawidth=32, point=16, coe_test=False):
6367

6468
start = m.Input('start')
6569
busy = m.OutputReg('busy', initval=0)
66-
70+
6771
done = m.TmpReg(initval=0)
6872

6973
# external RAM I/F
70-
ext_src_rams = [ ram.RAMSlaveInterface(m, 'ext_src_ram%d' % i,
71-
datawidth=datawidth, addrwidth=addrwidth)
72-
for i in range(size) ]
74+
ext_src_rams = [ram.RAMSlaveInterface(m, 'ext_src_ram%d' % i,
75+
datawidth=datawidth, addrwidth=addrwidth)
76+
for i in range(size)]
7377
ext_dst_ram = ram.RAMSlaveInterface(m, 'ext_dst_ram',
7478
datawidth=datawidth, addrwidth=addrwidth)
75-
79+
7680
# RAM
7781
addrwidth = int(math.log(n, 2)) * 2
78-
79-
src_rams = [ ram.SyncRAMManager(m, 'src_ram%d' % i, clk, rst,
80-
datawidth=datawidth, addrwidth=addrwidth, numports=2)
81-
for i in range(size) ]
82-
82+
83+
src_rams = [ram.SyncRAMManager(m, 'src_ram%d' % i, clk, rst,
84+
datawidth=datawidth, addrwidth=addrwidth, numports=2)
85+
for i in range(size)]
86+
8387
dst_ram = ram.SyncRAMManager(m, 'dst_ram', clk, rst,
8488
datawidth=datawidth, addrwidth=addrwidth, numports=2)
8589

@@ -94,7 +98,6 @@ def mkStencil(n=16, size=3, datawidth=32, point=16, coe_test=False):
9498
read_count = m.Reg('read_count', 32, initval=0)
9599
read_addr = m.Reg('read_addr', 32, initval=0)
96100

97-
98101
read_fsm(
99102
read_addr(0),
100103
read_count(0),
@@ -111,7 +114,7 @@ def mkStencil(n=16, size=3, datawidth=32, point=16, coe_test=False):
111114
read_addr.inc(),
112115
read_count.inc()
113116
)
114-
117+
115118
idata = []
116119
ivalid = []
117120
for i, src_ram in enumerate(src_rams):
@@ -135,33 +138,32 @@ def mkStencil(n=16, size=3, datawidth=32, point=16, coe_test=False):
135138

136139
read_fsm.make_always()
137140

138-
139141
# instance
140142
odata = m.Wire('odata', datawidth)
141143
ovalid = m.Wire('ovalid')
142-
144+
143145
ports = []
144-
ports.append( ('CLK', clk) )
145-
ports.append( ('RST', rst) )
146-
146+
ports.append(('CLK', clk))
147+
ports.append(('RST', rst))
148+
147149
for i, (d, v) in enumerate(zip(idata, ivalid)):
148-
ports.append( ('idata%d' % i, d) )
149-
ports.append( ('ivalid%d' % i, v) )
150+
ports.append(('idata%d' % i, d))
151+
ports.append(('ivalid%d' % i, v))
150152

151-
ports.append( ('odata', odata) )
152-
ports.append( ('ovalid', ovalid) )
153+
ports.append(('odata', odata))
154+
ports.append(('ovalid', ovalid))
153155

154156
coe = None
155157
if coe_test:
156-
coe = [ [ dataflow.Constant(1, point=point) for i in range(size) ]
157-
for j in range(size) ]
158+
coe = [[dataflow.Constant(1, point=point) for i in range(size)]
159+
for j in range(size)]
158160
point = 0
159-
161+
160162
st = mkStencilPipeline2D(size=3, width=datawidth, point=point, coe=coe)
161163
m.Instance(st, 'inst_stencil', ports=ports)
162164

163-
skip_offset = int(math.floor(size/2))
164-
165+
skip_offset = int(math.floor(size / 2))
166+
165167
# write FSM
166168
write_fsm = FSM(m, 'write_fsm', clk, rst)
167169
write_count = m.Reg('write_count', 32, initval=0)
@@ -170,17 +172,17 @@ def mkStencil(n=16, size=3, datawidth=32, point=16, coe_test=False):
170172
write_fsm(
171173
done(0)
172174
)
173-
175+
174176
write_fsm.If(Ands(ovalid, write_count > skip_offset))(
175177
write_addr.inc()
176178
)
177-
179+
178180
dst_ram.write(0, write_addr, odata, write_fsm.then)
179-
181+
180182
write_fsm.If(ovalid)(
181183
write_count.inc(),
182184
)
183-
185+
184186
write_fsm.If(write_count == n)(
185187
write_count(0),
186188
write_addr(skip_offset),
@@ -192,10 +194,11 @@ def mkStencil(n=16, size=3, datawidth=32, point=16, coe_test=False):
192194

193195
return m
194196

197+
195198
def mkTest(n=16, size=3, datawidth=32, point=16, coe_test=False):
196199
if coe_test:
197200
point = 0
198-
201+
199202
m = Module('test')
200203

201204
addrwidth = int(math.log(n, 2))
@@ -204,23 +207,22 @@ def mkTest(n=16, size=3, datawidth=32, point=16, coe_test=False):
204207

205208
params = m.copy_params(main)
206209
ports = m.copy_sim_ports(main)
207-
210+
208211
clk = ports['CLK']
209212
rst = ports['RST']
210213

211214
start = ports['start']
212215
busy = ports['busy']
213-
216+
214217
uut = m.Instance(main, 'uut',
215218
params=m.connect_params(main),
216219
ports=m.connect_ports(main))
217220

218221
reset_done = m.Reg('reset_done', initval=0)
219222
reset_stmt = []
220-
reset_stmt.append( reset_done(0) )
221-
reset_stmt.append( start(0) )
223+
reset_stmt.append(reset_done(0))
224+
reset_stmt.append(start(0))
222225

223-
224226
# src RAM
225227
for i in range(3):
226228
addr = ports['ext_src_ram%d_addr' % i]
@@ -239,7 +241,6 @@ def mkTest(n=16, size=3, datawidth=32, point=16, coe_test=False):
239241
reset_stmt.append(addr(2))
240242
reset_stmt.append(wdata(0))
241243
reset_stmt.append(wenable(0))
242-
243244

244245
simulation.setup_waveform(m, uut)
245246
simulation.setup_clock(m, clk, hperiod=5)
@@ -256,12 +257,12 @@ def mkTest(n=16, size=3, datawidth=32, point=16, coe_test=False):
256257
)
257258

258259
fsm = FSM(m, 'fsm', clk, rst)
259-
260+
260261
fsm.goto_next(cond=reset_done)
261262

262263
for i in range(3):
263264
addr = ports['ext_src_ram%d_addr' % i]
264-
fsm.add( addr(-1) )
265+
fsm.add(addr(-1))
265266

266267
fsm.goto_next()
267268

@@ -270,25 +271,26 @@ def mkTest(n=16, size=3, datawidth=32, point=16, coe_test=False):
270271
rdata = ports['ext_src_ram%d_rdata' % i]
271272
wdata = ports['ext_src_ram%d_wdata' % i]
272273
wenable = ports['ext_src_ram%d_wenable' % i]
273-
next_addr = (addr+1) % (n*n)
274-
fsm.add( addr.inc() )
275-
fsm.add( wdata(fixed.FixedConst(90, point)) )
276-
fsm.add( wenable(1) )
277-
fsm.add( wenable(0), cond=AndList(wenable, addr==2**addrwidth-1) )
278-
279-
fsm.goto_next(cond=AndList(wenable, ports['ext_src_ram0_addr']==2**addrwidth-1))
280-
274+
next_addr = (addr + 1) % (n * n)
275+
fsm.add(addr.inc())
276+
fsm.add(wdata(fixed.FixedConst(90, point).raw))
277+
fsm.add(wenable(1))
278+
fsm.add(wenable(0), cond=AndList(wenable, addr == 2**addrwidth - 1))
279+
280+
fsm.goto_next(cond=AndList(
281+
wenable, ports['ext_src_ram0_addr'] == 2**addrwidth - 1))
282+
281283
fsm.goto_next(cond=Not(busy))
282-
283-
fsm.add( start(1) )
284-
fsm.add( start(0), delay=1 )
284+
285+
fsm.add(start(1))
286+
fsm.add(start(0), delay=1)
285287
fsm.goto_next()
286-
288+
287289
fsm.goto_next(cond=busy)
288290

289291
fsm.goto_next(cond=Not(busy))
290292

291-
fsm.add( Systask('finish') )
293+
fsm.add(Systask('finish'))
292294

293295
fsm.make_always()
294296

@@ -299,7 +301,7 @@ def mkTest(n=16, size=3, datawidth=32, point=16, coe_test=False):
299301
#test = mkTest(n, coe_test=True)
300302
test = mkTest(n)
301303
verilog = test.to_verilog('tmp.v')
302-
#print(verilog)
304+
# print(verilog)
303305

304306
# run simulator (Icarus Verilog)
305307
sim = simulation.Simulator(test)

0 commit comments

Comments
 (0)