Skip to content

Commit f16bea1

Browse files
committed
thread.stream.set_source_empty
1 parent 2671e1a commit f16bea1

File tree

1 file changed

+54
-2
lines changed

1 file changed

+54
-2
lines changed

veriloggen/thread/stream.py

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def TmpStream(m, clk, rst,
3838

3939
class Stream(BaseStream):
4040
__intrinsics__ = ('set_source', 'set_source_pattern', 'set_source_multidim',
41-
'set_source_multipattern',
41+
'set_source_multipattern', 'set_source_empty',
4242
'set_sink', 'set_sink_pattern', 'set_sink_multidim',
4343
'set_sink_multipattern',
4444
'set_sink_empty', 'set_constant',
@@ -142,7 +142,8 @@ def source(self, name=None, datawidth=None, point=0, signed=True):
142142
var.source_idle = self.module.Reg('_%s_idle' % prefix, initval=1)
143143
self.source_idle_map[name] = var.source_idle
144144

145-
# 3'b001: set_source, 3'b010: set_source_pattern, 3'b100: set_source_multipattern
145+
# 3'b000: set_source_empty, 3'b001: set_source,
146+
# 3'b010: set_source_pattern, 3'b100: set_source_multipattern
146147
var.source_mode = self.module.Reg('_%s_source_mode' % prefix, mode_width,
147148
initval=mode_idle)
148149

@@ -178,7 +179,12 @@ def source(self, name=None, datawidth=None, point=0, signed=True):
178179
var.source_ram_rvalid = self.module.Reg('_%s_source_ram_rvalid' % prefix,
179180
initval=0)
180181

182+
var.has_source_empty = False
183+
var.source_empty_data = self.module.Reg('_%s_source_empty_data' % prefix,
184+
datawidth, initval=0)
185+
181186
self.seq(
187+
var.source_idle(var.source_idle),
182188
var.source_ram_rvalid(0)
183189
)
184190

@@ -498,6 +504,52 @@ def set_source_multipattern(self, fsm, name, ram, offsets, patterns, port=0):
498504

499505
fsm.goto_next()
500506

507+
def set_source_empty(self, fsm, name, value=0):
508+
509+
if not self.stream_synthesized:
510+
self._implement_stream()
511+
512+
if isinstance(name, str):
513+
var = self.var_name_map[name]
514+
elif isinstance(name, vtypes.Str):
515+
name = name.value
516+
var = self.var_name_map[name]
517+
elif isinstance(name, int):
518+
var = self.var_id_map[name]
519+
elif isinstance(name, vtypes.Int):
520+
name = name.value
521+
var = self.var_id_map[name]
522+
else:
523+
raise TypeError('Unsupported index name')
524+
525+
if name not in self.sources:
526+
raise NameError("No such stream '%s'" % name)
527+
528+
set_cond = self._set_flag(fsm)
529+
530+
self.seq.If(set_cond)(
531+
var.source_mode(mode_idle),
532+
var.source_empty_data(value)
533+
)
534+
535+
if var.has_source_empty:
536+
return
537+
538+
source_start = vtypes.Ands(self.start,
539+
vtypes.And(var.source_mode, mode_idle))
540+
541+
self.seq.If(source_start)(
542+
var.source_idle(1)
543+
)
544+
545+
wdata = var.source_empty_data
546+
wenable = source_start
547+
var.write(wdata, wenable)
548+
549+
var.has_source_empty = True
550+
551+
fsm.goto_next()
552+
501553
def set_sink(self, fsm, name, ram, offset, size, stride=1, port=0):
502554
""" intrinsic method to assign RAM property to a sink stream """
503555

0 commit comments

Comments
 (0)