1717
1818from pyverilog .vparser .ast import *
1919from pyverilog .utils .op2mark import op2mark
20+ from pyverilog .utils .op2mark import op2order
2021
2122DEFAULT_TEMPLATE_DIR = os .path .dirname (os .path .abspath (__file__ )) + '/template/'
2223
@@ -55,6 +56,11 @@ def escape(s):
5556 return s + ' '
5657 return s
5758
59+ def del_paren (s ):
60+ if s .startswith ('(' ) and s .endswith (')' ):
61+ return s [1 :- 1 ]
62+ return s
63+
5864class ASTCodeGenerator (ConvertVisitor ):
5965 def __init__ (self , indentsize = 2 ):
6066 self .env = Environment (loader = FileSystemLoader (DEFAULT_TEMPLATE_DIR ))
@@ -127,8 +133,8 @@ def visit_Width(self, node):
127133 filename = getfilename (node )
128134 template = self .env .get_template (filename )
129135 template_dict = {
130- 'msb' : self .visit (node .msb ),
131- 'lsb' : self .visit (node .lsb ),
136+ 'msb' : del_paren ( self .visit (node .msb ) ),
137+ 'lsb' : del_paren ( self .visit (node .lsb ) ),
132138 }
133139 rslt = template .render (template_dict )
134140 return rslt
@@ -137,8 +143,8 @@ def visit_Length(self, node):
137143 filename = getfilename (node )
138144 template = self .env .get_template (filename )
139145 template_dict = {
140- 'msb' : self .visit (node .msb ),
141- 'lsb' : self .visit (node .lsb ),
146+ 'msb' : del_paren ( self .visit (node .msb ) ),
147+ 'lsb' : del_paren ( self .visit (node .lsb ) ),
142148 }
143149 rslt = template .render (template_dict )
144150 return rslt
@@ -342,7 +348,7 @@ def visit_Ioport(self, node):
342348 def visit_Parameter (self , node ):
343349 filename = getfilename (node )
344350 template = self .env .get_template (filename )
345- value = self .visit (node .value )
351+ value = del_paren ( self .visit (node .value ) )
346352 template_dict = {
347353 'name' : escape (node .name ),
348354 'width' : '' if node .width is None or (value .startswith ('"' ) and value .endswith ('"' )) else self .visit (node .width ),
@@ -355,7 +361,7 @@ def visit_Parameter(self, node):
355361 def visit_Localparam (self , node ):
356362 filename = getfilename (node )
357363 template = self .env .get_template (filename )
358- value = self .visit (node .value )
364+ value = del_paren ( self .visit (node .value ) )
359365 template_dict = {
360366 'name' : escape (node .name ),
361367 'width' : '' if node .width is None or (value .startswith ('"' ) and value .endswith ('"' )) else self .visit (node .width ),
@@ -377,7 +383,7 @@ def visit_Decl(self, node):
377383 def visit_Concat (self , node ):
378384 filename = getfilename (node )
379385 template = self .env .get_template (filename )
380- items = [ self .visit (item ) for item in node .list ]
386+ items = [ del_paren ( self .visit (item ) ) for item in node .list ]
381387 template_dict = {
382388 'items' : items ,
383389 'len_items' : len (items ),
@@ -388,7 +394,7 @@ def visit_Concat(self, node):
388394 def visit_LConcat (self , node ):
389395 filename = getfilename (node )
390396 template = self .env .get_template (filename )
391- items = [ self .visit (item ) for item in node .list ]
397+ items = [ del_paren ( self .visit (item ) ) for item in node .list ]
392398 template_dict = {
393399 'items' : items ,
394400 'len_items' : len (items ),
@@ -400,8 +406,8 @@ def visit_Repeat(self, node):
400406 filename = getfilename (node )
401407 template = self .env .get_template (filename )
402408 template_dict = {
403- 'value' : self .visit (node .value ),
404- 'times' : self .visit (node .times ),
409+ 'value' : del_paren ( self .visit (node .value ) ),
410+ 'times' : del_paren ( self .visit (node .times ) ),
405411 }
406412 rslt = template .render (template_dict )
407413 return rslt
@@ -411,8 +417,8 @@ def visit_Partselect(self, node):
411417 template = self .env .get_template (filename )
412418 template_dict = {
413419 'var' : self .visit (node .var ),
414- 'msb' : self .visit (node .msb ),
415- 'lsb' : self .visit (node .lsb ),
420+ 'msb' : del_paren ( self .visit (node .msb ) ),
421+ 'lsb' : del_paren ( self .visit (node .lsb ) ),
416422 }
417423 rslt = template .render (template_dict )
418424 return rslt
@@ -422,7 +428,7 @@ def visit_Pointer(self, node):
422428 template = self .env .get_template (filename )
423429 template_dict = {
424430 'var' : self .visit (node .var ),
425- 'ptr' : self .visit (node .ptr ),
431+ 'ptr' : del_paren ( self .visit (node .ptr ) ),
426432 }
427433 rslt = template .render (template_dict )
428434 return rslt
@@ -431,7 +437,7 @@ def visit_Lvalue(self, node):
431437 filename = getfilename (node )
432438 template = self .env .get_template (filename )
433439 template_dict = {
434- 'var' : self .visit (node .var ),
440+ 'var' : del_paren ( self .visit (node .var ) ),
435441 }
436442 rslt = template .render (template_dict )
437443 return rslt
@@ -440,17 +446,30 @@ def visit_Rvalue(self, node):
440446 filename = getfilename (node )
441447 template = self .env .get_template (filename )
442448 template_dict = {
443- 'var' : self .visit (node .var ),
449+ 'var' : del_paren ( self .visit (node .var ) ),
444450 }
445451 rslt = template .render (template_dict )
446452 return rslt
447453
448454 def visit_Operator (self , node ):
449455 filename = getfilename (node )
450456 template = self .env .get_template (filename )
451- template_dict = {
452- 'left' : self .visit (node .left ),
453- 'right' : self .visit (node .right ),
457+ order = op2order (node .__class__ .__name__ )
458+ lorder = op2order (node .left .__class__ .__name__ )
459+ rorder = op2order (node .right .__class__ .__name__ )
460+ left = self .visit (node .left )
461+ right = self .visit (node .right )
462+ if ( isinstance (node .left , (Identifier , Value )) or
463+ ((not isinstance (node .left , (Sll , Srl , Sra ))) and
464+ (lorder is not None and lorder <= order )) ):
465+ left = del_paren (left )
466+ if ( isinstance (node .right , (Identifier , Value )) or
467+ ((not isinstance (node .right , (Sll , Srl , Sra ))) and
468+ (rorder is not None and order > rorder )) ):
469+ right = del_paren (right )
470+ template_dict = {
471+ 'left' : left ,
472+ 'right' : right ,
454473 'op' : op2mark (node .__class__ .__name__ ),
455474 }
456475 rslt = template .render (template_dict )
@@ -459,8 +478,11 @@ def visit_Operator(self, node):
459478 def visit_UnaryOperator (self , node ):
460479 filename = getfilename (node )
461480 template = self .env .get_template (filename )
481+ right = self .visit (node .right )
482+ if isinstance (node .right , (Identifier , Value )):
483+ right = del_paren (right )
462484 template_dict = {
463- 'right' : self . visit ( node . right ) ,
485+ 'right' : right ,
464486 'op' : op2mark (node .__class__ .__name__ ),
465487 }
466488 rslt = template .render (template_dict )
@@ -569,9 +591,9 @@ def visit_Cond(self, node):
569591 filename = getfilename (node )
570592 template = self .env .get_template (filename )
571593 template_dict = {
572- 'cond' : self .visit (node .cond ),
573- 'true_value' : self .visit (node .true_value ),
574- 'false_value' : self .visit (node .false_value ),
594+ 'cond' : del_paren ( self .visit (node .cond ) ),
595+ 'true_value' : del_paren ( self .visit (node .true_value ) ),
596+ 'false_value' : del_paren ( self .visit (node .false_value ) ),
575597 }
576598 rslt = template .render (template_dict )
577599 return rslt
@@ -659,7 +681,7 @@ def visit_IfStatement(self, node):
659681 true_statement = '' if node .true_statement is None else self .visit (node .true_statement )
660682 false_statement = '' if node .false_statement is None else self .visit (node .false_statement )
661683 template_dict = {
662- 'cond' : self .visit (node .cond ),
684+ 'cond' : del_paren ( self .visit (node .cond ) ),
663685 'true_statement' : true_statement ,
664686 'false_statement' : false_statement ,
665687 }
@@ -671,7 +693,7 @@ def visit_ForStatement(self, node):
671693 template = self .env .get_template (filename )
672694 template_dict = {
673695 'pre' : '' if node .pre is None else self .visit (node .pre ),
674- 'cond' : '' if node .cond is None else self .visit (node .cond ),
696+ 'cond' : '' if node .cond is None else del_paren ( self .visit (node .cond ) ),
675697 'post' : '' if node .post is None else self .visit (node .post ).replace (';' , '' ),
676698 'statement' : '' if node .statement is None else self .visit (node .statement ),
677699 }
@@ -682,7 +704,7 @@ def visit_WhileStatement(self, node):
682704 filename = getfilename (node )
683705 template = self .env .get_template (filename )
684706 template_dict = {
685- 'cond' : '' if node .cond is None else self .visit (node .cond ),
707+ 'cond' : '' if node .cond is None else del_paren ( self .visit (node .cond ) ),
686708 'statement' : '' if node .statement is None else self .visit (node .statement ),
687709 }
688710 rslt = template .render (template_dict )
@@ -692,7 +714,7 @@ def visit_CaseStatement(self, node):
692714 filename = getfilename (node )
693715 template = self .env .get_template (filename )
694716 template_dict = {
695- 'comp' : self .visit (node .comp ),
717+ 'comp' : del_paren ( self .visit (node .comp ) ),
696718 'caselist' : [ self .indent (self .visit (case )) for case in node .caselist ],
697719 }
698720 rslt = template .render (template_dict )
@@ -702,7 +724,7 @@ def visit_CasexStatement(self, node):
702724 filename = getfilename (node )
703725 template = self .env .get_template (filename )
704726 template_dict = {
705- 'comp' : self .visit (node .comp ),
727+ 'comp' : del_paren ( self .visit (node .comp ) ),
706728 'caselist' : [ self .indent (self .visit (case )) for case in node .caselist ],
707729 }
708730 rslt = template .render (template_dict )
@@ -711,7 +733,7 @@ def visit_CasexStatement(self, node):
711733 def visit_Case (self , node ):
712734 filename = getfilename (node )
713735 template = self .env .get_template (filename )
714- condlist = [ 'default' ] if node .cond is None else [ self .visit (c ) for c in node .cond ]
736+ condlist = [ 'default' ] if node .cond is None else [ del_paren ( self .visit (c ) ) for c in node .cond ]
715737 cond = []
716738 for c in condlist :
717739 cond .append (c )
@@ -746,7 +768,7 @@ def visit_EventStatement(self, node):
746768 filename = getfilename (node )
747769 template = self .env .get_template (filename )
748770 template_dict = {
749- 'senslist' : self .visit (node .senslist ),
771+ 'senslist' : del_paren ( self .visit (node .senslist ) ),
750772 }
751773 rslt = template .render (template_dict )
752774 return rslt
@@ -755,7 +777,7 @@ def visit_WaitStatement(self, node):
755777 filename = getfilename (node )
756778 template = self .env .get_template (filename )
757779 template_dict = {
758- 'cond' : self .visit (node .cond ),
780+ 'cond' : del_paren ( self .visit (node .cond ) ),
759781 'statement' : self .visit (node .statement ) if node .statement else '' ,
760782 }
761783 rslt = template .render (template_dict )
@@ -813,7 +835,7 @@ def visit_ParamArg(self, node):
813835 template = self .env .get_template (filename )
814836 template_dict = {
815837 'paramname' : '' if node .paramname is None else escape (node .paramname ),
816- 'argname' : '' if node .argname is None else self .visit (node .argname ),
838+ 'argname' : '' if node .argname is None else del_paren ( self .visit (node .argname ) ),
817839 }
818840 rslt = template .render (template_dict )
819841 return rslt
@@ -823,7 +845,7 @@ def visit_PortArg(self, node):
823845 template = self .env .get_template (filename )
824846 template_dict = {
825847 'portname' : '' if node .portname is None else escape (node .portname ),
826- 'argname' : '' if node .argname is None else self .visit (node .argname ),
848+ 'argname' : '' if node .argname is None else del_paren ( self .visit (node .argname ) ),
827849 }
828850 rslt = template .render (template_dict )
829851 return rslt
0 commit comments