22from __future__ import print_function
33import os
44import sys
5+ import copy
56from functools import reduce
67
78import 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):
307309class _DataflowNumeric (vtypes ._Numeric ): pass
308310
309311class _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')
0 commit comments