Skip to content

Commit f04a6cd

Browse files
committed
Merge branch 'leonardt-master' into develop
2 parents d1931ff + c6a414e commit f04a6cd

File tree

3 files changed

+42
-11
lines changed

3 files changed

+42
-11
lines changed

pyverilog/vparser/ast.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@
1414

1515
class Node(object):
1616
'''Abstact class for every element in parser'''
17-
17+
1818
def children(self):
1919
pass
20-
20+
2121
def show(self, buf=sys.stdout, offset=0, attrnames=False, showlineno=True):
2222
indent = 2
2323
lead = ' ' * offset
@@ -35,7 +35,7 @@ def show(self, buf=sys.stdout, offset=0, attrnames=False, showlineno=True):
3535
buf.write('\n')
3636
for c in self.children():
3737
c.show(buf, offset + indent, attrnames, showlineno)
38-
38+
3939
def __eq__(self, other):
4040
if type(self) != type(other): return False
4141
self_attrs = tuple( [ getattr(self, a) for a in self.attr_names ] )
@@ -45,10 +45,10 @@ def __eq__(self, other):
4545
for i, c in enumerate(self.children()):
4646
if c != other_children[i]: return False
4747
return True
48-
48+
4949
def __ne__(self, other):
5050
return not self.__eq__(other)
51-
51+
5252
def __hash__(self):
5353
s = hash(tuple([getattr(self, a) for a in self.attr_names]))
5454
c = hash(self.children())
@@ -458,6 +458,12 @@ def children(self):
458458
if self.statement: nodelist.append(self.statement)
459459
return tuple(nodelist)
460460

461+
class AlwaysFF(Always):
462+
pass
463+
464+
class AlwaysComb(Always):
465+
pass
466+
461467
class SensList(Node):
462468
attr_names = ()
463469
def __init__(self, list, lineno=0):
@@ -553,6 +559,8 @@ def children(self):
553559

554560
class CasexStatement(CaseStatement): pass
555561

562+
class UniqueCaseStatement(CaseStatement): pass
563+
556564
class Case(Node):
557565
attr_names = ()
558566
def __init__(self, cond, statement, lineno=0):

pyverilog/vparser/lexer.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@ def token(self):
4343
keywords = (
4444
'MODULE', 'ENDMODULE', 'BEGIN', 'END', 'GENERATE', 'ENDGENERATE', 'GENVAR',
4545
'FUNCTION', 'ENDFUNCTION', 'TASK', 'ENDTASK',
46-
'INPUT', 'INOUT', 'OUTPUT', 'TRI', 'REG', 'WIRE', 'INTEGER', 'REAL', 'SIGNED',
46+
'INPUT', 'INOUT', 'OUTPUT', 'TRI', 'REG', 'LOGIC', 'WIRE', 'INTEGER', 'REAL', 'SIGNED',
4747
'PARAMETER', 'LOCALPARAM', 'SUPPLY0', 'SUPPLY1',
48-
'ASSIGN', 'ALWAYS', 'SENS_OR', 'POSEDGE', 'NEGEDGE', 'INITIAL',
49-
'IF', 'ELSE', 'FOR', 'WHILE', 'CASE', 'CASEX', 'ENDCASE', 'DEFAULT',
48+
'ASSIGN', 'ALWAYS', 'ALWAYS_FF', 'ALWAYS_COMB', 'SENS_OR', 'POSEDGE', 'NEGEDGE', 'INITIAL',
49+
'IF', 'ELSE', 'FOR', 'WHILE', 'CASE', 'CASEX', 'UNIQUE', 'ENDCASE', 'DEFAULT',
5050
'WAIT', 'FOREVER', 'DISABLE', 'FORK', 'JOIN',
5151
)
5252

@@ -266,18 +266,18 @@ def dump_tokens(text):
266266
def my_error_func(msg, a, b):
267267
sys.write(msg + "\n")
268268
sys.exit()
269-
269+
270270
lexer = VerilogLexer(error_func=my_error_func)
271271
lexer.build()
272272
lexer.input(text)
273273

274274
ret = []
275-
275+
276276
# Tokenize
277277
while True:
278278
tok = lexer.token()
279279
if not tok: break # No more input
280280
ret.append("%s %s %d %s %d\n" %
281281
(tok.value, tok.type, tok.lineno, lexer.filename, tok.lexpos))
282-
282+
283283
return ''.join(ret)

pyverilog/vparser/parser.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ def p_moduledef(self, p):
115115
p[0] = ModuleDef(name=p[2], paramlist=p[3], portlist=p[4], items=p[5],
116116
default_nettype=self.get_default_nettype(), lineno=p.lineno(1))
117117
p.set_lineno(0, p.lineno(1))
118+
p[0].end_lineno = p.lineno(6)
118119

119120
def p_modulename(self, p):
120121
'modulename : ID'
@@ -299,6 +300,11 @@ def p_sigtype_reg(self, p):
299300
p[0] = p[1]
300301
p.set_lineno(0, p.lineno(1))
301302

303+
def p_sigtype_logic(self, p):
304+
'sigtype : LOGIC'
305+
p[0] = p[1]
306+
p.set_lineno(0, p.lineno(1))
307+
302308
def p_sigtype_wire(self, p):
303309
'sigtype : WIRE'
304310
p[0] = p[1]
@@ -458,6 +464,8 @@ def p_standard_item(self, p):
458464
| genvardecl
459465
| assignment
460466
| always
467+
| always_ff
468+
| always_comb
461469
| initial
462470
| instance
463471
| function
@@ -1255,6 +1263,14 @@ def p_always(self, p):
12551263
p[0] = Always(p[2], p[3], lineno=p.lineno(1))
12561264
p.set_lineno(0, p.lineno(1))
12571265

1266+
def p_always_ff(self, p):
1267+
'always_ff : ALWAYS_FF senslist always_statement'
1268+
p[0] = AlwaysFF(p[2], p[3], lineno=p.lineno(1))
1269+
1270+
def p_always_comb(self, p):
1271+
'always_comb : ALWAYS_COMB senslist always_statement'
1272+
p[0] = AlwaysComb(p[2], p[3], lineno=p.lineno(1))
1273+
12581274
def p_sens_egde_paren(self, p):
12591275
'senslist : AT LPAREN edgesigs RPAREN'
12601276
p[0] = SensList(p[3], lineno=p.lineno(1))
@@ -1357,6 +1373,7 @@ def p_basic_statement(self, p):
13571373
"""basic_statement : if_statement
13581374
| case_statement
13591375
| casex_statement
1376+
| unique_case_statement
13601377
| for_statement
13611378
| while_statement
13621379
| event_statement
@@ -1599,6 +1616,12 @@ def p_casex_statement(self, p):
15991616
p[0] = CasexStatement(p[3], p[5], lineno=p.lineno(1))
16001617
p.set_lineno(0, p.lineno(1))
16011618

1619+
def p_unique_case_statement(self, p):
1620+
'unique_case_statement : UNIQUE CASE LPAREN case_comp RPAREN casecontent_statements ENDCASE'
1621+
p[0] = UniqueCaseStatement(p[3], p[5], lineno=p.lineno(1))
1622+
p.set_lineno(0, p.lineno(1))
1623+
1624+
16021625
def p_case_comp(self, p):
16031626
'case_comp : expression'
16041627
p[0] = p[1]

0 commit comments

Comments
 (0)