Skip to content

Commit 46dd058

Browse files
committed
Merge branch 'develop' into feature_axi_stream
2 parents f224a09 + 74e007e commit 46dd058

File tree

4 files changed

+75
-53
lines changed

4 files changed

+75
-53
lines changed

veriloggen/stream/graph.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,10 @@ def visit__Accumulator(self, node):
212212
peripheries=peripheries)
213213

214214
right = self.visit(node.right)
215+
if node.size is not None:
216+
size = self.visit(node.size)
217+
if node.interval is not None:
218+
interval = self.visit(node.interval)
215219
initval = self.visit(node.initval)
216220
if node.dependency is not None:
217221
dependency = self.visit(node.dependency)
@@ -220,6 +224,10 @@ def visit__Accumulator(self, node):
220224
if node.reset is not None:
221225
reset = self.visit(node.reset)
222226
self.graph.add_edge(right, node, label='data')
227+
if node.size is not None:
228+
self.graph.add_edge(size, node, label='size')
229+
if node.interval is not None:
230+
self.graph.add_edge(interval, node, label='interval')
223231
self.graph.add_edge(initval, node, label='initval')
224232
if node.dependency is not None:
225233
self.graph.add_edge(dependency, node, label='dependency')

veriloggen/stream/scheduler.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,13 +121,20 @@ def visit__Accumulator(self, node):
121121
if node._has_start_stage():
122122
return node._get_end_stage()
123123
right = self.visit(node.right)
124+
size = self.visit(node.size) if node.size is not None else None
125+
interval = (self.visit(node.interval)
126+
if node.interval is not None else None)
124127
initval = self.visit(node.initval)
125128
dependency = (self.visit(node.dependency)
126129
if node.dependency is not None else None)
127130
enable = self.visit(node.enable) if node.enable is not None else None
128131
reset = self.visit(node.reset) if node.reset is not None else None
129-
mine = self.max_stage(right, initval, dependency, enable, reset)
132+
mine = self.max_stage(right, size, interval, initval, dependency, enable, reset)
130133
node.right = self.fill_gap(node.right, mine)
134+
if node.size is not None:
135+
node.size = self.fill_gap(node.size, mine)
136+
if node.interval is not None:
137+
node.interval = self.fill_gap(node.interval, mine)
131138
node.initval = self.fill_gap(node.initval, mine)
132139
if node.enable is not None:
133140
node.enable = self.fill_gap(node.enable, mine)

veriloggen/stream/stypes.py

Lines changed: 50 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -2465,13 +2465,13 @@ class _Accumulator(_UnaryOperator):
24652465
latency = 1
24662466
ops = (vtypes.Plus, )
24672467

2468-
def __init__(self, right, size=None, initval=None, interval=None,
2468+
def __init__(self, right, size=None, interval=None, initval=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
2472+
self.interval = _to_constant(interval) if interval is not None else None
24722473
self.initval = (_to_constant(initval)
24732474
if initval is not None else _to_constant(0))
2474-
self.interval = _to_constant(interval) if interval is not None else None
24752475

24762476
if not isinstance(self.initval, _Constant):
24772477
raise TypeError("initval must be Constant, not '%s'" %
@@ -2662,21 +2662,21 @@ def _implement(self, m, seq, svalid=None, senable=None):
26622662
class ReduceAdd(_Accumulator):
26632663
ops = (vtypes.Plus, )
26642664

2665-
def __init__(self, right, size=None, initval=0, interval=None,
2665+
def __init__(self, right, size=None, interval=None, initval=0,
26662666
enable=None, reset=None, width=32, signed=True):
26672667
dependency = None
2668-
_Accumulator.__init__(self, right, size, initval, interval,
2668+
_Accumulator.__init__(self, right, size, interval, initval,
26692669
dependency, enable, reset, width, signed)
26702670
self.graph_label = 'ReduceAdd'
26712671

26722672

26732673
class ReduceSub(_Accumulator):
26742674
ops = (vtypes.Minus, )
26752675

2676-
def __init__(self, right, size=None, initval=0, interval=None,
2676+
def __init__(self, right, size=None, interval=None, initval=0,
26772677
enable=None, reset=None, width=32, signed=True):
26782678
dependency = None
2679-
_Accumulator.__init__(self, right, size, initval, interval,
2679+
_Accumulator.__init__(self, right, size, interval, initval,
26802680
dependency, enable, reset, width, signed)
26812681
self.graph_label = 'ReduceSub'
26822682

@@ -2685,10 +2685,10 @@ class ReduceMul(_Accumulator):
26852685
latency = 1
26862686
ops = (vtypes.Times, )
26872687

2688-
def __init__(self, right, size=None, initval=0, interval=None,
2688+
def __init__(self, right, size=None, interval=None, initval=0,
26892689
enable=None, reset=None, width=32, signed=True):
26902690
dependency = None
2691-
_Accumulator.__init__(self, right, size, initval, interval,
2691+
_Accumulator.__init__(self, right, size, interval, initval,
26922692
dependency, enable, reset, width, signed)
26932693
self.graph_label = 'ReduceMul'
26942694

@@ -2697,43 +2697,43 @@ class ReduceDiv(_Accumulator):
26972697
latency = 32
26982698
ops = ()
26992699

2700-
def __init__(self, right, size=None, initval=0, interval=None,
2700+
def __init__(self, right, size=None, interval=None, initval=0,
27012701
enable=None, reset=None, width=32, signed=True):
27022702
raise NotImplementedError()
27032703
dependency = None
2704-
_Accumulator.__init__(self, right, size, initval, interval,
2704+
_Accumulator.__init__(self, right, size, interval, initval,
27052705
dependency, enable, reset, width, signed)
27062706
self.graph_label = 'ReduceDiv'
27072707

27082708

27092709
class ReduceMax(_Accumulator):
27102710
ops = (lambda x, y: vtypes.Mux(x < y, y, x), )
27112711

2712-
def __init__(self, right, size=None, initval=0, interval=None,
2712+
def __init__(self, right, size=None, interval=None, initval=0,
27132713
enable=None, reset=None, width=32, signed=True):
27142714
dependency = None
2715-
_Accumulator.__init__(self, right, size, initval, interval,
2715+
_Accumulator.__init__(self, right, size, interval, initval,
27162716
dependency, enable, reset, width, signed)
27172717
self.graph_label = 'ReduceMax'
27182718

27192719

27202720
class ReduceMin(_Accumulator):
27212721
ops = (lambda x, y: vtypes.Mux(x > y, y, x), )
27222722

2723-
def __init__(self, right, size=None, initval=0, interval=None,
2723+
def __init__(self, right, size=None, interval=None, initval=0,
27242724
enable=None, reset=None, width=32, signed=True):
27252725
dependency = None
2726-
_Accumulator.__init__(self, right, size, initval, interval,
2726+
_Accumulator.__init__(self, right, size, interval, initval,
27272727
dependency, enable, reset, width, signed)
27282728
self.graph_label = 'ReduceMin'
27292729

27302730

27312731
class ReduceCustom(_Accumulator):
27322732

2733-
def __init__(self, ops, right, size=None, initval=0, interval=None,
2733+
def __init__(self, ops, right, size=None, interval=None, initval=0,
27342734
enable=None, reset=None, width=32, signed=True, label=None):
27352735
dependency = None
2736-
_Accumulator.__init__(self, right, size, initval, interval,
2736+
_Accumulator.__init__(self, right, size, interval, initval,
27372737
dependency, enable, reset, width, signed)
27382738
if not isinstance(ops, (tuple, list)):
27392739
ops = tuple([ops])
@@ -2743,10 +2743,10 @@ def __init__(self, ops, right, size=None, initval=0, interval=None,
27432743

27442744
class Counter(_Accumulator):
27452745

2746-
def __init__(self, size=None, step=1, initval=0, interval=None,
2746+
def __init__(self, size=None, step=1, interval=None, initval=0,
27472747
dependency=None, enable=None, reset=None, width=32, signed=False):
27482748

2749-
_Accumulator.__init__(self, step, size, initval, interval,
2749+
_Accumulator.__init__(self, step, size, interval, initval,
27502750
dependency, enable, reset, width, signed)
27512751
self.graph_label = 'Counter'
27522752

@@ -2827,7 +2827,8 @@ def _implement(self, m, seq, svalid=None, senable=None):
28272827
class Pulse(_Accumulator):
28282828
ops = ()
28292829

2830-
def __init__(self, size, dependency=None, enable=None, reset=None, interval=None):
2830+
def __init__(self, size, interval=None,
2831+
dependency=None, enable=None, reset=None):
28312832

28322833
right = 0
28332834
if dependency is not None:
@@ -2837,85 +2838,85 @@ def __init__(self, size, dependency=None, enable=None, reset=None, interval=None
28372838
width = 1
28382839
signed = False
28392840

2840-
_Accumulator.__init__(self, right, size, initval, interval,
2841+
_Accumulator.__init__(self, right, size, interval, initval,
28412842
dependency, enable, reset, width, signed)
28422843
self.graph_label = 'Pulse'
28432844

28442845

2845-
def _ReduceValid(cls, right, size, initval=0, interval=None,
2846+
def _ReduceValid(cls, right, size, interval=None, initval=0,
28462847
enable=None, reset=None, width=32, signed=True):
28472848

2848-
data = cls(right, size, initval, interval,
2849+
data = cls(right, size, interval, initval,
28492850
enable, reset, width, signed)
2850-
valid = Pulse(size, right, enable, reset)
2851+
valid = Pulse(size, dependency=right, enable=enable, reset=reset)
28512852

28522853
return data, valid
28532854

28542855

2855-
def ReduceAddValid(right, size, initval=0, interval=None,
2856+
def ReduceAddValid(right, size, interval=None, initval=0,
28562857
enable=None, reset=None, width=32, signed=True):
28572858

28582859
cls = ReduceAdd
2859-
return _ReduceValid(cls, right, size, initval, interval,
2860+
return _ReduceValid(cls, right, size, interval, initval,
28602861
enable, reset, width, signed)
28612862

28622863

2863-
def ReduceSubValid(right, size, initval=0, interval=None,
2864+
def ReduceSubValid(right, size, interval=None, initval=0,
28642865
enable=None, reset=None, width=32, signed=True):
28652866

28662867
cls = ReduceSub
2867-
return _ReduceValid(cls, right, size, initval, interval,
2868+
return _ReduceValid(cls, right, size, interval, initval,
28682869
enable, reset, width, signed)
28692870

28702871

2871-
def ReduceMulValid(right, size, initval=0, interval=None,
2872+
def ReduceMulValid(right, size, interval=None, initval=0,
28722873
enable=None, reset=None, width=32, signed=True):
28732874

28742875
cls = ReduceMul
2875-
return _ReduceValid(cls, right, size, initval, interval,
2876+
return _ReduceValid(cls, right, size, interval, initval,
28762877
enable, reset, width, signed)
28772878

28782879

2879-
def ReduceDivValid(right, size, initval=0, interval=None,
2880+
def ReduceDivValid(right, size, interval=None, initval=0,
28802881
enable=None, reset=None, width=32, signed=True):
28812882

28822883
cls = ReduceDiv
2883-
return _ReduceValid(cls, right, size, initval, interval,
2884+
return _ReduceValid(cls, right, size, interval, initval,
28842885
enable, reset, width, signed)
28852886

28862887

2887-
def ReduceMaxValid(right, size, initval=0, interval=None,
2888+
def ReduceMaxValid(right, size, interval=None, initval=0,
28882889
enable=None, reset=None, width=32, signed=True):
28892890

28902891
cls = ReduceMax
2891-
return _ReduceValid(cls, right, size, initval, interval,
2892+
return _ReduceValid(cls, right, size, interval, initval,
28922893
enable, reset, width, signed)
28932894

28942895

2895-
def ReduceMinValid(right, size, initval=0, interval=None,
2896+
def ReduceMinValid(right, size, interval=None, initval=0,
28962897
enable=None, reset=None, width=32, signed=True):
28972898

28982899
cls = ReduceMin
2899-
return _ReduceValid(cls, right, size, initval, interval,
2900+
return _ReduceValid(cls, right, size, interval, initval,
29002901
enable, reset, width, signed)
29012902

29022903

2903-
def ReduceCustomValid(ops, right, size, initval=0, interval=None,
2904+
def ReduceCustomValid(ops, right, size, interval=None, initval=0,
29042905
enable=None, reset=None, width=32, signed=True):
29052906

2906-
data = ReduceCustom(ops, right, size, initval, interval,
2907+
data = ReduceCustom(ops, right, size, interval, initval,
29072908
enable, reset, width, signed)
2908-
valid = Pulse(size, right, enable, reset)
2909+
valid = Pulse(size, dependency=right, enable=enable, reset=reset)
29092910

29102911
return data, valid
29112912

29122913

2913-
def CounterValid(size, step=1, initval=0, interval=None,
2914+
def CounterValid(size, step=1, interval=None, initval=0,
29142915
dependency=None, enable=None, reset=None, width=32, signed=False):
29152916

2916-
data = Counter(size, step, initval, interval,
2917+
data = Counter(size, step, interval, initval,
29172918
dependency, enable, reset, width, signed)
2918-
valid = Pulse(size, dependency, enable, reset)
2919+
valid = Pulse(size, dependency=dependency, enable=enable, reset=reset)
29192920

29202921
return data, valid
29212922

@@ -3576,10 +3577,10 @@ def enable(self):
35763577
return _and_vars(vtypes.Not(self.args[2].sig_data), when_cond)
35773578

35783579

3579-
def ReduceArgMax(right, size=None, initval=0, interval=None,
3580+
def ReduceArgMax(right, size=None, interval=None, initval=0,
35803581
enable=None, reset=None, width=32, signed=True):
35813582

3582-
_max = ReduceMax(right, size, initval, interval,
3583+
_max = ReduceMax(right, size, interval, initval,
35833584
enable, reset, width, signed)
35843585
counter = Counter(size, dependency=right, enable=enable, reset=reset)
35853586
update = NotEq(_max, _max.prev(1))
@@ -3588,10 +3589,10 @@ def ReduceArgMax(right, size=None, initval=0, interval=None,
35883589
return index, _max
35893590

35903591

3591-
def ReduceArgMin(right, size=None, initval=0, interval=None,
3592+
def ReduceArgMin(right, size=None, interval=None, initval=0,
35923593
enable=None, reset=None, width=32, signed=True):
35933594

3594-
_min = ReduceMin(right, size, initval, interval,
3595+
_min = ReduceMin(right, size, interval, initval,
35953596
enable, reset, width, signed)
35963597
counter = Counter(size, dependency=right, enable=enable, reset=reset)
35973598
update = NotEq(_min, reduce_min.prev(1))
@@ -3600,10 +3601,10 @@ def ReduceArgMin(right, size=None, initval=0, interval=None,
36003601
return index, _min
36013602

36023603

3603-
def ReduceArgMaxValid(right, size=None, initval=0, interval=None,
3604+
def ReduceArgMaxValid(right, size=None, interval=None, initval=0,
36043605
enable=None, reset=None, width=32, signed=True):
36053606

3606-
_max, valid = ReduceMaxValid(right, size, initval, interval,
3607+
_max, valid = ReduceMaxValid(right, size, interval, initval,
36073608
enable, reset, width, signed)
36083609
counter = Counter(size, dependency=right, enable=enable, reset=reset)
36093610
update = NotEq(_max, _max.prev(1))
@@ -3612,10 +3613,10 @@ def ReduceArgMaxValid(right, size=None, initval=0, interval=None,
36123613
return index, _max, valid
36133614

36143615

3615-
def ReduceArgMinValid(right, size=None, initval=0, interval=None,
3616+
def ReduceArgMinValid(right, size=None, interval=None, initval=0,
36163617
enable=None, reset=None, width=32, signed=True):
36173618

3618-
_min, valid = ReduceMinValid(right, size, initval, interval,
3619+
_min, valid = ReduceMinValid(right, size, interval, initval,
36193620
enable, reset, width, signed)
36203621
counter = Counter(size, dependency=right, enable=enable, reset=reset)
36213622
update = NotEq(_min, _min.prev(1))

veriloggen/stream/visitor.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,13 +125,15 @@ def visit__SpecialOperator(self, node):
125125
def visit__Accumulator(self, node):
126126
right = self.visit(node.right)
127127
size = self.visit(node.size) if node.size is not None else set()
128+
interval = (self.visit(node.interval)
129+
if node.interval is not None else set())
128130
initval = (self.visit(node.initval)
129131
if node.initval is not None else set())
130132
dependency = (self.visit(node.dependency)
131133
if node.dependency is not None else set())
132134
enable = self.visit(node.enable) if node.enable is not None else set()
133135
reset = self.visit(node.reset) if node.reset is not None else set()
134-
return right | size | initval | dependency | enable | reset
136+
return right | size | interval | initval | dependency | enable | reset
135137

136138
def visit_Substream(self, node):
137139
return self.visit__SpecialOperator(node)
@@ -195,6 +197,8 @@ def visit__SpecialOperator(self, node):
195197
def visit__Accumulator(self, node):
196198
right = self.visit(node.right)
197199
size = self.visit(node.size) if node.size is not None else set()
200+
interval = (self.visit(node.interval)
201+
if node.interval is not None else set())
198202
initval = (self.visit(node.initval)
199203
if node.initval is not None else set())
200204
dependency = (self.visit(node.dependency)
@@ -203,7 +207,7 @@ def visit__Accumulator(self, node):
203207
#reset = self.visit(node.reset) if node.reset is not None else set()
204208
reset = set()
205209
mine = set([node]) if node._has_output() else set()
206-
return right | size | initval | dependency | enable | reset | mine
210+
return right | size | interval | initval | dependency | enable | reset | mine
207211

208212
def visit_Substream(self, node):
209213
return self.visit__SpecialOperator(node)
@@ -276,14 +280,16 @@ def visit__SpecialOperator(self, node):
276280
def visit__Accumulator(self, node):
277281
right = self.visit(node.right)
278282
size = self.visit(node.size) if node.size is not None else set()
283+
interval = (self.visit(node.interval)
284+
if node.interval is not None else set())
279285
initval = (self.visit(node.initval)
280286
if node.initval is not None else set())
281287
dependency = (self.visit(node.dependency)
282288
if node.dependency is not None else set())
283289
enable = self.visit(node.enable) if node.enable is not None else set()
284290
reset = self.visit(node.reset) if node.reset is not None else set()
285291
mine = set([node])
286-
return right | size | initval | dependency | enable | reset | mine
292+
return right | size | interval | initval | dependency | enable | reset | mine
287293

288294
def visit_Substream(self, node):
289295
return self.visit__SpecialOperator(node)

0 commit comments

Comments
 (0)