@@ -63,7 +63,15 @@ def to_tuple(s):
6363class VerilogReadVisitor (object ):
6464 def __init__ (self ):
6565 self .m = None
66+ self .module_stack = []
6667
68+ def push_module (self , m ):
69+ self .module_stack .append (self .m )
70+ self .m = m
71+
72+ def pop_module (self ):
73+ self .m = self .module_stack .pop ()
74+
6775 def add_object (self , obj ):
6876 if isinstance (self .m , module .Module ):
6977 self .m .add_object (obj )
@@ -80,9 +88,11 @@ def visit(self, node):
8088
8189 def visit_ModuleDef (self , node ):
8290 # create new Verilog module
83- self .m = module .Module (node .name )
91+ m = module .Module (node .name )
92+ self .push_module (m )
8493 self .generic_visit (node )
85- return self .m
94+ self .pop_module ()
95+ return m
8696
8797 def visit_Paramlist (self , node ):
8898 params = []
@@ -120,7 +130,9 @@ def visit_Length(self, node):
120130
121131 def visit_Identifier (self , node ):
122132 if node .scope is not None :
123- raise ValueError ("Identifier with scope label is not currently supported." )
133+ labels = self .visit (node .scope )
134+ labels .append (node .name )
135+ return vtypes .Scope (* labels )
124136 if not isinstance (self .m , module .Module ):
125137 return vtypes .AnyType (node .name )
126138 return self .m .find_identifier (node .name )
@@ -491,6 +503,8 @@ def visit_NonblockingSubstitution(self, node):
491503 return vtypes .Subst (left , right , blk = False , ldelay = ldelay , rdelay = rdelay )
492504
493505 def visit_IfStatement (self , node ):
506+ if isinstance (self .m , (module .GenerateFor , module .GenerateIf )):
507+ return self ._visit_GenerateIf (node )
494508 condition = self .visit (node .cond )
495509 true_statement = self .visit (node .true_statement )
496510 false_statement = (self .visit (node .false_statement )
@@ -505,6 +519,8 @@ def visit_IfStatement(self, node):
505519 return _if
506520
507521 def visit_ForStatement (self , node ):
522+ if isinstance (self .m , (module .GenerateFor , module .GenerateIf )):
523+ return self ._visit_GenerateFor (node )
508524 pre = self .visit (node .pre )
509525 condition = self .visit (node .cond )
510526 post = self .visit (node .post )
@@ -543,10 +559,7 @@ def visit_Case(self, node):
543559
544560 def visit_Block (self , node ):
545561 statements = [ self .visit (statement ) for statement in node .statements ]
546- if node .scope is None : return statements
547- block = vtypes .NamedBlock (scope )
548- block .extends (statements )
549- return block
562+ return statements
550563
551564 def visit_Initial (self , node ):
552565 statement = to_tuple (self .visit (node .statement ))
@@ -587,6 +600,7 @@ def visit_Instance(self, node):
587600 if node .array is not None :
588601 raise ValueError ("Instance array is not currently supported." )
589602 instance = vtypes .Instance (module , instname , params , ports )
603+ self .add_object (instance )
590604 return instance
591605
592606 def visit_ParamArg (self , node ):
@@ -648,16 +662,83 @@ def visit_TaskCall(self, node):
648662 args = tuple ([ self .visit (arg ) for arg in ndoe .args ])
649663 call = vtypes .TaskCall (name , args )
650664 return call
665+
666+ def _visit_GenerateFor (self , item ):
667+ pre = self .visit (item .pre )
668+ cond = self .visit (item .cond )
669+ post = self .visit (item .post )
670+ scope = (item .statement .scope
671+ if isinstance (item .statement , vast .Block )
672+ else None )
673+ _for = module .GenerateFor (pre , cond , post , scope )
674+ ret = _for
675+ self .add_object (_for )
676+ self .push_module (_for )
677+ statement = self .visit (item .statement )
678+ self .pop_module ()
679+ return ret
680+
681+ def _visit_GenerateIf (self , item ):
682+ cond = self .visit (item .cond )
683+ true_scope = (item .true_statement .scope
684+ if isinstance (item .true_statement , vast .Block )
685+ else None )
686+ false_scope = (item .false_statement .scope
687+ if isinstance (item .false_statement , vast .Block )
688+ else None )
689+ _if_true = module .GenerateIf (cond , true_scope )
690+ ret = _if_true
691+ self .add_object (_if_true )
692+ self .push_module (_if_true )
693+ statement = self .visit (item .true_statement )
694+ self .pop_module ()
695+ _if_false = _if_true .Else (false_scope )
696+ self .push_module (_if_false )
697+ statement = self .visit (item .false_statement )
698+ self .pop_module ()
699+ return ret
700+
701+ def visit_GenerateStatement (self , node ):
702+ ret = []
703+ for item in node .items :
704+ if isinstance (item , vast .ForStatement ):
705+ ret .append ( self ._visit_GenerateFor (item ) )
706+ elif isinstance (item , vsat .IfStatement ):
707+ ret .append ( self ._visit_GenerateIf (item ) )
708+ else :
709+ raise TypeError ("Only generate-for and generate-if statements are supported." )
710+ return ret
711+
712+ def visit_SystemCall (self , node ):
713+ cmd = node .syscall
714+ args = tuple ([ self .visit (a ) for arg in node .args ])
715+ systask = vtypes .SystemTask (cmd , * args )
716+ return systask
717+
718+ def visit_IdentifierScopeLabel (self , node ):
719+ if node .loop is None :
720+ return node .name
721+ index = self .visit (node .loop )
722+ return vtypes .ScopeIndex (node .name , index )
723+
724+ def visit_IdentifierScope (self , node ):
725+ args = [ self .visit (label ) for label in node .labellist ]
726+ return args
651727
652- def visit_GenerateStatement (self , node ): pass
653- def visit_SystemCall (self , node ): pass
654- def visit_IdentifierScopeLabel (self , node ): pass
655- def visit_IdentifierScope (self , node ): pass
656- def visit_Pragma (self , node ): pass
657- def visit_PragmaEntry (self , node ): pass
658- def visit_Disable (self , node ): pass
659- def visit_ParallelBlock (self , node ): pass
660- def visit_SingleStatement (self , node ): pass
728+ def visit_Pragma (self , node ):
729+ raise TypeError ("Pragma is not currently supported." )
730+
731+ def visit_PragmaEntry (self , node ):
732+ raise TypeError ("Pragma is not currently supported." )
733+
734+ def visit_Disable (self , node ):
735+ raise TypeError ("Disable is not currently supported." )
736+
737+ def visit_ParallelBlock (self , node ):
738+ raise TypeError ("Fork/Join is not currently supported." )
739+
740+ def visit_SingleStatement (self , node ):
741+ return self .visit (node .statement )
661742
662743#-------------------------------------------------------------------------------
663744def to_ast (* filelist , ** opt ):
0 commit comments