Skip to content

Commit 66c8909

Browse files
Merge pull request #2 from KatCe/portLineComments
Store port line comments
2 parents 488464b + 5d05ca3 commit 66c8909

File tree

2 files changed

+52
-26
lines changed

2 files changed

+52
-26
lines changed

hdlparse/minilexer.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def __init__(self, tokens, flags=re.MULTILINE):
2222
self.tokens = {}
2323

2424
# Pre-process the state definitions
25-
for state, patterns in tokens.iteritems():
25+
for state, patterns in tokens.items():
2626
full_patterns = []
2727
for p in patterns:
2828
pat = re.compile(p[0], flags)
@@ -33,7 +33,7 @@ def __init__(self, tokens, flags=re.MULTILINE):
3333
if new_state and new_state.startswith('#pop'):
3434
try:
3535
new_state = -int(new_state.split(':')[1])
36-
except IndexError, ValueError:
36+
except (IndexError, ValueError):
3737
new_state = -1
3838

3939
full_patterns.append((pat, action, new_state))

hdlparse/vhdl_parser.py

+50-24
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
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
],
@@ -104,9 +105,12 @@
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'),
@@ -119,17 +123,20 @@
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

295306
class 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
765791
end package;

0 commit comments

Comments
 (0)