@@ -38,7 +38,7 @@ def TmpStream(m, clk, rst,
3838
3939class 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