Skip to content

Commit 131c637

Browse files
committed
dataflow viewer is updated.
1 parent 4a45c2d commit 131c637

File tree

3 files changed

+69
-26
lines changed

3 files changed

+69
-26
lines changed

tests/lib_dataflow_/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,5 @@ run:
1414

1515
.PHONY: clean
1616
clean:
17-
rm -rf *.pyc __pycache__ parsetab.py *.out .cache
17+
rm -rf *.pyc __pycache__ parsetab.py *.out .cache tmp.v uut.vcd *.png *.dot
1818
find . -maxdepth 1 -type d |grep "./" | xargs -I {} make clean -C {}

veriloggen/lib/dataflow.py

Lines changed: 64 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from __future__ import print_function
33
import os
44
import sys
5+
import copy
56
from functools import reduce
67

78
import veriloggen.vtypes as vtypes
@@ -109,7 +110,8 @@ def _accumulate(self, ops, data, width=None, initval=0, resetcond=None):
109110
tmp_data, tmp_valid, tmp_ready = self._make_tmp(raw_data, raw_valid, raw_ready,
110111
width, initval, acc_ops=ops)
111112
next_stage_id = stage_id + 1 if stage_id is not None else None
112-
ret = _DataflowVariable(self, next_stage_id, tmp_data, tmp_valid, tmp_ready, None, ops)
113+
ret = _DataflowVariable(self, next_stage_id, tmp_data, tmp_valid, tmp_ready,
114+
data, ops, resetcond)
113115
if resetcond is not None:
114116
ret.reset(resetcond, initval)
115117
self.vars.append(ret)
@@ -307,7 +309,8 @@ def __str__(self):
307309
class _DataflowNumeric(vtypes._Numeric): pass
308310

309311
class _DataflowVariable(_DataflowNumeric):
310-
def __init__(self, pipe, stage_id, data, valid=None, ready=None, src_data=None, ops=None):
312+
def __init__(self, pipe, stage_id, data, valid=None, ready=None,
313+
src_data=None, ops=None, resetcond=None, initval=None):
311314
self.pipe = pipe
312315
self.stage_id = stage_id
313316
self.data = data
@@ -316,6 +319,8 @@ def __init__(self, pipe, stage_id, data, valid=None, ready=None, src_data=None,
316319
self.src_data = src_data
317320
self.dst_data = None
318321
self.ops = ops
322+
self.resetcond = resetcond
323+
self.initval = initval
319324
self.prev_dict = {}
320325
self.preg_dict = {}
321326
if self.ready is not None:
@@ -382,6 +387,8 @@ def output(self, data, valid=None, ready=None, nobuf=False):
382387
ovar.dst_data = _DataflowInterface(data, valid, ready, output=True)
383388

384389
def reset(self, cond, initval=0):
390+
self.resetcond = cond
391+
self.initval = initval
385392
self.pipe.seq.add( self.data(initval), cond=cond )
386393
if self.valid is not None:
387394
self.pipe.seq.add( self.valid(0), cond=cond )
@@ -392,7 +399,7 @@ def bit_length(self):
392399
def _add_preg(self, stage_id, var):
393400
self.preg_dict[stage_id] = var
394401

395-
def _get_preg(self, stage_id=None):
402+
def _get_preg(self, stage_id):
396403
if stage_id is None:
397404
return self
398405
if stage_id == self.stage_id:
@@ -606,23 +613,33 @@ def __init__(self, df):
606613

607614
def draw(self, filename='out.png', prog='dot'):
608615
for var in self.df.vars:
609-
self.visit(var)
616+
# traverse from only output nodes
617+
if isinstance(var.dst_data, _DataflowInterface):
618+
self.visit(var)
610619

611620
self.graph.write('out.dot')
612621
self.graph.layout(prog=prog)
613622
self.graph.draw(filename)
614623

615-
def _add_node(self, node, label=None, color='black', shape='box'):
624+
def _add_node(self, node, label=None, color='black', shape='box', style='solid'):
616625
if label is None:
617-
self.graph.add_node(str(node), color=color, shape=shape)
626+
self.graph.add_node(id(node), color=color, shape=shape, style=style)
618627
else:
619-
self.graph.add_node(str(node), label=label, color=color, shape=shape)
628+
self.graph.add_node(id(node), label=label, color=color, shape=shape, style=style)
620629

621630
def _add_edge(self, start, end, color='black', label=None, style='solid'):
631+
if isinstance(start, (bool, int, str, float)):
632+
# to append multiple first-class objects with same values
633+
start = copy.deepcopy(vtypes._Constant(start))
634+
self._add_node(start, label=str(start), shape='invtriangle')
635+
if isinstance(end, (bool, int, str, float)):
636+
# to append multiple first-class objects with same values
637+
end = copy.deepcopy(vtypes._Constant(end))
638+
self._add_node(end, label=str(end), shape='invtriangle')
622639
if label:
623-
self.graph.add_edge(str(start), str(end), color=color, label=label, style=style)
640+
self.graph.add_edge(id(start), id(end), color=color, label=label, style=style)
624641
else:
625-
self.graph.add_edge(str(start), str(end), color=color, style=style)
642+
self.graph.add_edge(id(start), id(end), color=color, style=style)
626643

627644
def _max_stage_id(self, *args):
628645
maxval = None
@@ -643,24 +660,30 @@ def visit__DataflowInterface(self, node):
643660
self._add_node(node, label=str(node), shape='invtrapezium')
644661

645662
def visit__DataflowVariable(self, node):
646-
if node.src_data is not None:
663+
if node.src_data is not None and not node.ops:
647664
self._add_node(node, label=str(node.data), shape='box')
648665
self.visit(node.src_data)
649666
self._add_edge(node.src_data, node)
650-
if node.src_data is None and node.ops:
667+
if node.src_data is not None and node.ops:
651668
label = [ str(node.data) ]
652669
for op in node.ops:
653-
label.append(vtypes.op2mark(op))
654-
self._add_node(node, label=' '.join(label), shape='box')
670+
label.append(vtypes.op2mark(op.__name__))
671+
label.append('=')
672+
self._add_node(node, label=''.join(label), shape='box', style='rounded')
673+
self.visit(node.src_data)
674+
self._add_edge(node.src_data, node)
675+
if node.resetcond:
676+
self.visit(node.resetcond)
677+
self._add_edge(node.resetcond, node, label='RST', style='dashed')
655678
if isinstance(node.dst_data, _DataflowInterface):
656679
self.visit(node.dst_data)
657680
self._add_edge(node, node.dst_data)
658681

659682
def visit__Variable(self, node):
660-
self._add_node(node, label=node.name, shape='invhouse')
683+
self._add_node(node, label=node.name, shape='invtriangle')
661684

662685
def visit__Constant(self, node):
663-
self._add_node(node, label=node.value, shape='invhouse')
686+
self._add_node(node, label=node.value, shape='invtriangle')
664687

665688
def visit__BinaryOperator(self, node):
666689
mark = vtypes.op2mark(node.__class__.__name__)
@@ -672,6 +695,8 @@ def visit__BinaryOperator(self, node):
672695
left = left._get_preg(maxid)
673696
if hasattr(right, '_get_preg'):
674697
right = right._get_preg(maxid)
698+
self.visit(left)
699+
self.visit(right)
675700
self._add_edge(left, node, label='L')
676701
self._add_edge(right, node, label='R')
677702

@@ -691,8 +716,10 @@ def visit_Pointer(self, node):
691716
var = var._get_preg(maxid)
692717
if hasattr(pos, '_get_preg'):
693718
pos = pos._get_preg(maxid)
719+
self.visit(var)
720+
self.visit(pos)
694721
self._add_edge(var, node, label='V')
695-
self._add_edge(pos, node, label='P')
722+
self._add_edge(pos, node, label='P', style='dashed')
696723

697724
def visit_Slice(self, node):
698725
mark = 'slice'
@@ -707,9 +734,12 @@ def visit_Slice(self, node):
707734
msb = msb._get_preg(maxid)
708735
if hasattr(lsb, '_get_preg'):
709736
lsb = lsb._get_preg(maxid)
737+
self.visit(var)
738+
self.visit(msb)
739+
self.visit(lsb)
710740
self._add_edge(var, node, label='V')
711-
self._add_edge(msb, node, label='M')
712-
self._add_edge(lsb, node, label='L')
741+
self._add_edge(msb, node, label='M', style='dashed')
742+
self._add_edge(lsb, node, label='L', style='dashed')
713743

714744
def visit_Cat(self, node):
715745
mark = 'cat'
@@ -718,6 +748,7 @@ def visit_Cat(self, node):
718748
for var in node.vars:
719749
if hasattr(var, '_get_preg'):
720750
var = var._get_preg(maxid)
751+
self.visit(var)
721752
self._add_edge(var, node)
722753

723754
def visit_Repeat(self, node):
@@ -730,8 +761,10 @@ def visit_Repeat(self, node):
730761
var = var._get_preg(maxid)
731762
if hasattr(times, '_get_preg'):
732763
times = times._get_preg(maxid)
764+
self.visit(var)
765+
self.visit(times)
733766
self._add_edge(var, node, label='V')
734-
self._add_edge(times, node, label='T')
767+
self._add_edge(times, node, label='T', style='dashed')
735768

736769
def visit_Cond(self, node):
737770
mark = 'cond'
@@ -746,18 +779,25 @@ def visit_Cond(self, node):
746779
true_value = true_value._get_preg(maxid)
747780
if hasattr(false_value, '_get_preg'):
748781
false_value = false_value._get_preg(maxid)
749-
self._add_edge(condition, node, label='C')
782+
self.visit(condition)
783+
self.visit(true_value)
784+
self.visit(false_value)
785+
self._add_edge(condition, node, label='C', style='dashed')
750786
self._add_edge(true_value, node, label='T')
751787
self._add_edge(false_value, node, label='F')
752788

753789
def visit_bool(self, node):
754-
self._add_node(node, label=str(node), shape='invhouse')
790+
pass
791+
#self._add_node(node, label=str(node), shape='invtriangle')
755792

756793
def visit_int(self, node):
757-
self._add_node(node, label=str(node), shape='invhouse')
794+
pass
795+
#self._add_node(node, label=str(node), shape='invtriangle')
758796

759797
def visit_str(self, node):
760-
self._add_node(node, label=str(node), shape='invhouse')
798+
pass
799+
#self._add_node(node, label=str(node), shape='invtriangle')
761800

762801
def visit_float(self, node):
763-
self._add_node(node, label=str(node), shape='invhouse')
802+
pass
803+
#self._add_node(node, label=str(node), shape='invtriangle')

veriloggen/vtypes.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,9 @@ class Supply(_ParameterVairable): pass
274274
#-------------------------------------------------------------------------------
275275
class _Constant(_Numeric):
276276
def __init__(self, value, width=None, base=None):
277+
self.value = value
278+
self.width = width
279+
self.base = base
277280
self._type_check_value(value)
278281
self._type_check_width(width)
279282
self._type_check_base(base)
@@ -282,7 +285,7 @@ def _type_check_width(self, width): pass
282285
def _type_check_base(self, base): pass
283286

284287
def __str__(self):
285-
return str(value)
288+
return str(self.value)
286289

287290
class Int(_Constant):
288291
def __init__(self, value, width=None, base=None, signed=False):

0 commit comments

Comments
 (0)