8787 (r'generic\s*\(' , None , 'generic_list' ),
8888 (r'port\s*\(' , None , 'port_list' ),
8989 (r'end\s+\w+\s*;' , 'end_entity' , '#pop' ),
90+ (r'end\s+entity\s+\w+\s*;' , 'end_entity' , '#pop' ),
9091 (r'/\*' , 'block_comment' , 'block_comment' ),
9192 (r'--.*\n' , None ),
9293 ],
104105 (r'--.*\n' , None ),
105106 ],
106107 'generic_param_type' : [
107- (r'\s*(\w+)\s *' , 'generic_param_type' ),
108+ (r'\s*(\w+)[ \t\r\f\v] *' , 'generic_param_type' ),
108109 (r'\s*;\s*' , None , '#pop' ),
109110 (r"\s*:=\s*([\w']+)" , 'generic_param_default' ),
111+ (r'\)\s*;\s*--(.*)\n' , 'line_comment' , '#pop:2' ),
112+ (r'\n\s*\)\s*;\s*--(.*)\n' , 'generic_list_comment' , '#pop:2' ),
113+ (r'\n\s*' , None ),
110114 (r'\)\s*;' , 'end_generic' , '#pop:2' ),
111115 (r'--#(.*)\n' , 'metacomment' ),
112116 (r'/\*' , 'block_comment' , 'block_comment' ),
119123 (r'--#\s*{{(.*)}}\n' , 'section_meta' ),
120124 (r'--#(.*)\n' , 'metacomment' ),
121125 (r'/\*' , 'block_comment' , 'block_comment' ),
122- (r'--.* \n' , None ),
126+ (r'--(.*) \n' , 'line_comment' ),
123127 ],
124128 'port_param_type' : [
125129 (r'\s*(in|out|inout|buffer)\s+(\w+)\s*\(' , 'port_array_param_type' , 'array_range' ),
126- (r'\s*(in|out|inout|buffer)\s+(\w+)\s *' , 'port_param_type' ),
130+ (r'\s*(in|out|inout|buffer)\s+(\w+)[ \t\r\f\v] *' , 'port_param_type' ),
127131 (r'\s*;\s*' , None , '#pop' ),
128132 (r"\s*:=\s*([\w']+)" , 'port_param_default' ),
133+ (r'--(.*)\n' , 'line_comment' ),
134+ (r'\)\s*;\s*--(.*)\n' , 'line_comment' , '#pop:2' ),
135+ (r'\n\s*\)\s*;\s*--(.*)\n' , 'port_list_comment' , '#pop:2' ),
136+ (r'\n\s*' , None ),
129137 (r'\)\s*;' , 'end_port' , '#pop:2' ),
130138 (r'--#(.*)\n' , 'metacomment' ),
131139 (r'/\*' , 'block_comment' , 'block_comment' ),
132- (r'--.*\n' , None ),
133140 ],
134141 'array_range' : [
135142 (r'\(' , 'open_paren' , 'nested_parens' ),
@@ -168,13 +175,15 @@ class VhdlParameter(object):
168175 data_type (str): Type name for the parameter
169176 default_value (str): Default value of the parameter
170177 desc (str): Description from object metacomments
178+ param_desc (str): Description of the parameter
171179 '''
172- def __init__ (self , name , mode = None , data_type = None , default_value = None , desc = None ):
180+ def __init__ (self , name , mode = None , data_type = None , default_value = None , desc = None , param_desc = None ):
173181 self .name = name
174182 self .mode = mode
175183 self .data_type = data_type
176184 self .default_value = default_value
177185 self .desc = desc
186+ self .param_desc = None
178187
179188 def __str__ (self ):
180189 if self .mode is not None :
@@ -183,6 +192,8 @@ def __str__(self):
183192 param = '{} : {}' .format (self .name , self .data_type )
184193 if self .default_value is not None :
185194 param = '{} := {}' .format (param , self .default_value )
195+ if self .param_desc is not None :
196+ param = '{} --{}' .format (param , self .param_desc )
186197 return param
187198
188199 def __repr__ (self ):
@@ -294,7 +305,6 @@ def __repr__(self):
294305
295306class VhdlEntity (VhdlObject ):
296307 '''Entity declaration
297-
298308 Args:
299309 name (str): Name of the entity
300310 ports (list of VhdlParameter): Port parameters to the entity
@@ -381,18 +391,19 @@ def parse_vhdl(text):
381391 ports = []
382392 sections = []
383393 port_param_index = 0
384- last_item = None
394+ last_items = []
385395 array_range_start_pos = 0
386396
387397 objects = []
388398
389399 for pos , action , groups in lex .run (text ):
390400 if action == 'metacomment' :
391401 realigned = re .sub (r'^#+' , lambda m : ' ' * len (m .group (0 )), groups [0 ])
392- if last_item is None :
402+ if not last_items :
393403 metacomments .append (realigned )
394404 else :
395- last_item .desc = realigned
405+ for i in last_items :
406+ i .desc = realigned
396407 if action == 'section_meta' :
397408 sections .append ((port_param_index , groups [0 ]))
398409
@@ -448,7 +459,7 @@ def parse_vhdl(text):
448459 param_items = []
449460 kind = None
450461 name = None
451-
462+
452463 elif action == 'entity' :
453464 kind = 'entity'
454465 name = groups [0 ]
@@ -473,13 +484,17 @@ def parse_vhdl(text):
473484 elif action == 'generic_param_type' :
474485 ptype = groups [0 ]
475486
487+ last_items = []
476488 for i in param_items :
477- generics .append (VhdlParameter (i , 'in' , ptype ))
489+ p = VhdlParameter (i , 'in' , ptype )
490+ generics .append (p )
491+ last_items .append (p )
492+
478493 param_items = []
479- last_item = generics [- 1 ]
480494
481495 elif action == 'generic_param_default' :
482- last_item .default_value = groups [0 ]
496+ for i in last_items :
497+ i .default_value = groups [0 ]
483498
484499 elif action == 'port_param' :
485500 param_items .append (groups [0 ])
@@ -488,14 +503,17 @@ def parse_vhdl(text):
488503 elif action == 'port_param_type' :
489504 mode , ptype = groups
490505
506+ last_items = []
491507 for i in param_items :
492- ports .append (VhdlParameter (i , mode , ptype ))
508+ p = VhdlParameter (i , mode , ptype )
509+ ports .append (p )
510+ last_items .append (p )
493511
494512 param_items = []
495- last_item = ports [- 1 ]
496513
497514 elif action == 'port_param_default' :
498- last_item .default_value = groups [0 ]
515+ for i in last_items :
516+ i .default_value = groups [0 ]
499517
500518 elif action == 'port_array_param_type' :
501519 mode , ptype = groups
@@ -504,22 +522,24 @@ def parse_vhdl(text):
504522 elif action == 'array_range_end' :
505523 arange = text [array_range_start_pos :pos [0 ]+ 1 ]
506524
525+ last_items = []
507526 for i in param_items :
508- ports .append (VhdlParameter (i , mode , ptype + arange ))
527+ p = VhdlParameter (i , mode , ptype + arange )
528+ ports .append (p )
529+ last_items .append (p )
509530
510531 param_items = []
511- last_item = ports [- 1 ]
512532
513533 elif action == 'end_entity' :
514534 vobj = VhdlEntity (name , ports , generics , dict (sections ), metacomments )
515535 objects .append (vobj )
516- last_item = None
536+ last_items = []
517537 metacomments = []
518538
519539 elif action == 'end_component' :
520540 vobj = VhdlComponent (name , cur_package , ports , generics , dict (sections ), metacomments )
521541 objects .append (vobj )
522- last_item = None
542+ last_items = []
523543 metacomments = []
524544
525545 elif action == 'package' :
@@ -552,6 +572,11 @@ def parse_vhdl(text):
552572 name = None
553573 metacomments = []
554574
575+ elif action == 'line_comment' :
576+ for i in last_items :
577+ if not i .param_desc :
578+ i .param_desc = groups [0 ]
579+
555580 return objects
556581
557582
@@ -730,7 +755,7 @@ def _register_array_types(self, objects):
730755 subtypes = {o .name :o .base_type for o in objects if isinstance (o , VhdlSubtype )}
731756
732757 # Find all subtypes of an array type
733- for k ,v in subtypes .iteritems ():
758+ for k ,v in subtypes .items ():
734759 while v in subtypes : # Follow subtypes of subtypes
735760 v = subtypes [v ]
736761 if v in self .array_types :
@@ -757,9 +782,10 @@ def register_array_types_from_sources(self, source_files):
757782
758783 component acomp is
759784 port (
760- a,b,c : in std_ulogic;
761- f,g,h : inout bit
762- );
785+ a,b,c : in std_ulogic; -- no default value
786+ f,g,h : inout bit := '1' -- bit ports
787+ ); -- port list comment
788+
763789 end component;
764790
765791end package;
0 commit comments