87
87
(r'generic\s*\(' , None , 'generic_list' ),
88
88
(r'port\s*\(' , None , 'port_list' ),
89
89
(r'end\s+\w+\s*;' , 'end_entity' , '#pop' ),
90
+ (r'end\s+entity\s+\w+\s*;' , 'end_entity' , '#pop' ),
90
91
(r'/\*' , 'block_comment' , 'block_comment' ),
91
92
(r'--.*\n' , None ),
92
93
],
104
105
(r'--.*\n' , None ),
105
106
],
106
107
'generic_param_type' : [
107
- (r'\s*(\w+)\s *' , 'generic_param_type' ),
108
+ (r'\s*(\w+)[ \t\r\f\v] *' , 'generic_param_type' ),
108
109
(r'\s*;\s*' , None , '#pop' ),
109
110
(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 ),
110
114
(r'\)\s*;' , 'end_generic' , '#pop:2' ),
111
115
(r'--#(.*)\n' , 'metacomment' ),
112
116
(r'/\*' , 'block_comment' , 'block_comment' ),
119
123
(r'--#\s*{{(.*)}}\n' , 'section_meta' ),
120
124
(r'--#(.*)\n' , 'metacomment' ),
121
125
(r'/\*' , 'block_comment' , 'block_comment' ),
122
- (r'--.* \n' , None ),
126
+ (r'--(.*) \n' , 'line_comment' ),
123
127
],
124
128
'port_param_type' : [
125
129
(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' ),
127
131
(r'\s*;\s*' , None , '#pop' ),
128
132
(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 ),
129
137
(r'\)\s*;' , 'end_port' , '#pop:2' ),
130
138
(r'--#(.*)\n' , 'metacomment' ),
131
139
(r'/\*' , 'block_comment' , 'block_comment' ),
132
- (r'--.*\n' , None ),
133
140
],
134
141
'array_range' : [
135
142
(r'\(' , 'open_paren' , 'nested_parens' ),
@@ -168,13 +175,15 @@ class VhdlParameter(object):
168
175
data_type (str): Type name for the parameter
169
176
default_value (str): Default value of the parameter
170
177
desc (str): Description from object metacomments
178
+ param_desc (str): Description of the parameter
171
179
'''
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 ):
173
181
self .name = name
174
182
self .mode = mode
175
183
self .data_type = data_type
176
184
self .default_value = default_value
177
185
self .desc = desc
186
+ self .param_desc = None
178
187
179
188
def __str__ (self ):
180
189
if self .mode is not None :
@@ -183,6 +192,8 @@ def __str__(self):
183
192
param = '{} : {}' .format (self .name , self .data_type )
184
193
if self .default_value is not None :
185
194
param = '{} := {}' .format (param , self .default_value )
195
+ if self .param_desc is not None :
196
+ param = '{} --{}' .format (param , self .param_desc )
186
197
return param
187
198
188
199
def __repr__ (self ):
@@ -294,7 +305,6 @@ def __repr__(self):
294
305
295
306
class VhdlEntity (VhdlObject ):
296
307
'''Entity declaration
297
-
298
308
Args:
299
309
name (str): Name of the entity
300
310
ports (list of VhdlParameter): Port parameters to the entity
@@ -381,18 +391,19 @@ def parse_vhdl(text):
381
391
ports = []
382
392
sections = []
383
393
port_param_index = 0
384
- last_item = None
394
+ last_items = []
385
395
array_range_start_pos = 0
386
396
387
397
objects = []
388
398
389
399
for pos , action , groups in lex .run (text ):
390
400
if action == 'metacomment' :
391
401
realigned = re .sub (r'^#+' , lambda m : ' ' * len (m .group (0 )), groups [0 ])
392
- if last_item is None :
402
+ if not last_items :
393
403
metacomments .append (realigned )
394
404
else :
395
- last_item .desc = realigned
405
+ for i in last_items :
406
+ i .desc = realigned
396
407
if action == 'section_meta' :
397
408
sections .append ((port_param_index , groups [0 ]))
398
409
@@ -448,7 +459,7 @@ def parse_vhdl(text):
448
459
param_items = []
449
460
kind = None
450
461
name = None
451
-
462
+
452
463
elif action == 'entity' :
453
464
kind = 'entity'
454
465
name = groups [0 ]
@@ -473,13 +484,17 @@ def parse_vhdl(text):
473
484
elif action == 'generic_param_type' :
474
485
ptype = groups [0 ]
475
486
487
+ last_items = []
476
488
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
+
478
493
param_items = []
479
- last_item = generics [- 1 ]
480
494
481
495
elif action == 'generic_param_default' :
482
- last_item .default_value = groups [0 ]
496
+ for i in last_items :
497
+ i .default_value = groups [0 ]
483
498
484
499
elif action == 'port_param' :
485
500
param_items .append (groups [0 ])
@@ -488,14 +503,17 @@ def parse_vhdl(text):
488
503
elif action == 'port_param_type' :
489
504
mode , ptype = groups
490
505
506
+ last_items = []
491
507
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 )
493
511
494
512
param_items = []
495
- last_item = ports [- 1 ]
496
513
497
514
elif action == 'port_param_default' :
498
- last_item .default_value = groups [0 ]
515
+ for i in last_items :
516
+ i .default_value = groups [0 ]
499
517
500
518
elif action == 'port_array_param_type' :
501
519
mode , ptype = groups
@@ -504,22 +522,24 @@ def parse_vhdl(text):
504
522
elif action == 'array_range_end' :
505
523
arange = text [array_range_start_pos :pos [0 ]+ 1 ]
506
524
525
+ last_items = []
507
526
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 )
509
530
510
531
param_items = []
511
- last_item = ports [- 1 ]
512
532
513
533
elif action == 'end_entity' :
514
534
vobj = VhdlEntity (name , ports , generics , dict (sections ), metacomments )
515
535
objects .append (vobj )
516
- last_item = None
536
+ last_items = []
517
537
metacomments = []
518
538
519
539
elif action == 'end_component' :
520
540
vobj = VhdlComponent (name , cur_package , ports , generics , dict (sections ), metacomments )
521
541
objects .append (vobj )
522
- last_item = None
542
+ last_items = []
523
543
metacomments = []
524
544
525
545
elif action == 'package' :
@@ -552,6 +572,11 @@ def parse_vhdl(text):
552
572
name = None
553
573
metacomments = []
554
574
575
+ elif action == 'line_comment' :
576
+ for i in last_items :
577
+ if not i .param_desc :
578
+ i .param_desc = groups [0 ]
579
+
555
580
return objects
556
581
557
582
@@ -730,7 +755,7 @@ def _register_array_types(self, objects):
730
755
subtypes = {o .name :o .base_type for o in objects if isinstance (o , VhdlSubtype )}
731
756
732
757
# Find all subtypes of an array type
733
- for k ,v in subtypes .iteritems ():
758
+ for k ,v in subtypes .items ():
734
759
while v in subtypes : # Follow subtypes of subtypes
735
760
v = subtypes [v ]
736
761
if v in self .array_types :
@@ -757,9 +782,10 @@ def register_array_types_from_sources(self, source_files):
757
782
758
783
component acomp is
759
784
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
+
763
789
end component;
764
790
765
791
end package;
0 commit comments