@@ -2465,13 +2465,15 @@ class _Accumulator(_UnaryOperator):
24652465 latency = 1
24662466 ops = (vtypes .Plus , )
24672467
2468- def __init__ (self , right , size = None , interval = None , initval = None ,
2468+ def __init__ (self , right , size = None , interval = None , initval = None , offset = None ,
24692469 dependency = None , enable = None , reset = None , width = 32 , signed = True ):
24702470
24712471 self .size = _to_constant (size ) if size is not None else None
24722472 self .interval = _to_constant (interval ) if interval is not None else None
24732473 self .initval = (_to_constant (initval )
24742474 if initval is not None else _to_constant (0 ))
2475+ self .offset = (_to_constant (offset )
2476+ if offset is not None else None )
24752477
24762478 if not isinstance (self .initval , _Constant ):
24772479 raise TypeError ("initval must be Constant, not '%s'" %
@@ -2664,8 +2666,9 @@ class ReduceAdd(_Accumulator):
26642666
26652667 def __init__ (self , right , size = None , interval = None , initval = 0 ,
26662668 enable = None , reset = None , width = 32 , signed = True ):
2669+ offset = None
26672670 dependency = None
2668- _Accumulator .__init__ (self , right , size , interval , initval ,
2671+ _Accumulator .__init__ (self , right , size , interval , initval , offset ,
26692672 dependency , enable , reset , width , signed )
26702673 self .graph_label = 'ReduceAdd'
26712674
@@ -2675,8 +2678,9 @@ class ReduceSub(_Accumulator):
26752678
26762679 def __init__ (self , right , size = None , interval = None , initval = 0 ,
26772680 enable = None , reset = None , width = 32 , signed = True ):
2681+ offset = None
26782682 dependency = None
2679- _Accumulator .__init__ (self , right , size , interval , initval ,
2683+ _Accumulator .__init__ (self , right , size , interval , initval , offset ,
26802684 dependency , enable , reset , width , signed )
26812685 self .graph_label = 'ReduceSub'
26822686
@@ -2687,8 +2691,9 @@ class ReduceMul(_Accumulator):
26872691
26882692 def __init__ (self , right , size = None , interval = None , initval = 0 ,
26892693 enable = None , reset = None , width = 32 , signed = True ):
2694+ offset = None
26902695 dependency = None
2691- _Accumulator .__init__ (self , right , size , interval , initval ,
2696+ _Accumulator .__init__ (self , right , size , interval , initval , offset ,
26922697 dependency , enable , reset , width , signed )
26932698 self .graph_label = 'ReduceMul'
26942699
@@ -2700,8 +2705,9 @@ class ReduceDiv(_Accumulator):
27002705 def __init__ (self , right , size = None , interval = None , initval = 0 ,
27012706 enable = None , reset = None , width = 32 , signed = True ):
27022707 raise NotImplementedError ()
2708+ offset = None
27032709 dependency = None
2704- _Accumulator .__init__ (self , right , size , interval , initval ,
2710+ _Accumulator .__init__ (self , right , size , interval , initval , offset ,
27052711 dependency , enable , reset , width , signed )
27062712 self .graph_label = 'ReduceDiv'
27072713
@@ -2711,8 +2717,9 @@ class ReduceMax(_Accumulator):
27112717
27122718 def __init__ (self , right , size = None , interval = None , initval = 0 ,
27132719 enable = None , reset = None , width = 32 , signed = True ):
2720+ offset = None
27142721 dependency = None
2715- _Accumulator .__init__ (self , right , size , interval , initval ,
2722+ _Accumulator .__init__ (self , right , size , interval , initval , offset ,
27162723 dependency , enable , reset , width , signed )
27172724 self .graph_label = 'ReduceMax'
27182725
@@ -2722,8 +2729,9 @@ class ReduceMin(_Accumulator):
27222729
27232730 def __init__ (self , right , size = None , interval = None , initval = 0 ,
27242731 enable = None , reset = None , width = 32 , signed = True ):
2732+ offset = None
27252733 dependency = None
2726- _Accumulator .__init__ (self , right , size , interval , initval ,
2734+ _Accumulator .__init__ (self , right , size , interval , initval , offset ,
27272735 dependency , enable , reset , width , signed )
27282736 self .graph_label = 'ReduceMin'
27292737
@@ -2732,8 +2740,9 @@ class ReduceCustom(_Accumulator):
27322740
27332741 def __init__ (self , ops , right , size = None , interval = None , initval = 0 ,
27342742 enable = None , reset = None , width = 32 , signed = True , label = None ):
2743+ offset = None
27352744 dependency = None
2736- _Accumulator .__init__ (self , right , size , interval , initval ,
2745+ _Accumulator .__init__ (self , right , size , interval , initval , offset ,
27372746 dependency , enable , reset , width , signed )
27382747 if not isinstance (ops , (tuple , list )):
27392748 ops = tuple ([ops ])
@@ -2743,10 +2752,10 @@ def __init__(self, ops, right, size=None, interval=None, initval=0,
27432752
27442753class Counter (_Accumulator ):
27452754
2746- def __init__ (self , size = None , step = 1 , interval = None , initval = 0 ,
2755+ def __init__ (self , size = None , step = 1 , interval = None , initval = 0 , offset = None ,
27472756 dependency = None , enable = None , reset = None , width = 32 , signed = False ):
27482757
2749- _Accumulator .__init__ (self , step , size , interval , initval ,
2758+ _Accumulator .__init__ (self , step , size , interval , initval , offset ,
27502759 dependency , enable , reset , width , signed )
27512760 self .graph_label = 'Counter'
27522761
@@ -2759,6 +2768,7 @@ def _implement(self, m, seq, svalid=None, senable=None):
27592768 interval_data = self .interval .sig_data if self .interval is not None else None
27602769
27612770 initval_data = self .initval .sig_data
2771+ offset_data = self .offset .sig_data if self .offset is not None else None
27622772 width = self .bit_length ()
27632773 signed = self .get_signed ()
27642774
@@ -2770,7 +2780,10 @@ def _implement(self, m, seq, svalid=None, senable=None):
27702780 initval = initval_data , signed = signed )
27712781
27722782 next_count_value = count + step
2773- if self .size is not None :
2783+ if self .size is not None and self .offset is not None :
2784+ next_count_value = vtypes .Mux (count >= size_data - step ,
2785+ offset_data , next_count_value )
2786+ elif self .size is not None :
27742787 next_count_value = vtypes .Mux (count >= size_data - step ,
27752788 next_count_value - size_data , next_count_value )
27762789
@@ -2835,10 +2848,11 @@ def __init__(self, size, interval=None,
28352848 right = dependency
28362849
28372850 initval = 0
2851+ offset = None
28382852 width = 1
28392853 signed = False
28402854
2841- _Accumulator .__init__ (self , right , size , interval , initval ,
2855+ _Accumulator .__init__ (self , right , size , interval , initval , offset ,
28422856 dependency , enable , reset , width , signed )
28432857 self .graph_label = 'Pulse'
28442858
@@ -2911,10 +2925,10 @@ def ReduceCustomValid(ops, right, size, interval=None, initval=0,
29112925 return data , valid
29122926
29132927
2914- def CounterValid (size , step = 1 , interval = None , initval = 0 ,
2928+ def CounterValid (size , step = 1 , interval = None , initval = 0 , offset = None ,
29152929 dependency = None , enable = None , reset = None , width = 32 , signed = False ):
29162930
2917- data = Counter (size , step , interval , initval ,
2931+ data = Counter (size , step , interval , initval , offset ,
29182932 dependency , enable , reset , width , signed )
29192933 valid = Pulse (size , dependency = dependency , enable = enable , reset = reset )
29202934
0 commit comments