Skip to content

Commit 506ae6b

Browse files
authored
Merge pull request #88 from dyadav7/develop
Added end_lineno to indicate the last line number in always, module, …
2 parents 2a42539 + 4959ae8 commit 506ae6b

File tree

7 files changed

+92
-56
lines changed

7 files changed

+92
-56
lines changed

pyverilog/vparser/ast.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,10 @@ def show(self, buf=sys.stdout, offset=0, attrnames=False, showlineno=True):
4242
buf.write(attrstr)
4343

4444
if showlineno:
45-
buf.write(' (at %s)' % self.lineno)
45+
try:
46+
buf.write(' (from %s to %s)' %(self.lineno, self.end_lineno))
47+
except:
48+
buf.write(' (at %s)' % self.lineno)
4649

4750
buf.write('\n')
4851

pyverilog/vparser/parser.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -840,11 +840,13 @@ def p_assignment(self, p):
840840
'assignment : ASSIGN lvalue EQUALS rvalue SEMICOLON'
841841
p[0] = Assign(p[2], p[4], lineno=p.lineno(1))
842842
p.set_lineno(0, p.lineno(1))
843+
p[0].end_lineno = p.lineno(5)
843844

844845
def p_assignment_delay(self, p):
845846
'assignment : ASSIGN delays lvalue EQUALS delays rvalue SEMICOLON'
846847
p[0] = Assign(p[3], p[6], p[2], p[5], lineno=p.lineno(1))
847848
p.set_lineno(0, p.lineno(1))
849+
p[0].end_lineno = p.lineno(7)
848850

849851
# --------------------------------------------------------------------------
850852
def p_lpartselect_lpointer(self, p):
@@ -1299,21 +1301,25 @@ def p_always(self, p):
12991301
'always : ALWAYS senslist always_statement'
13001302
p[0] = Always(p[2], p[3], lineno=p.lineno(1))
13011303
p.set_lineno(0, p.lineno(1))
1304+
p[0].end_lineno = p[3].end_lineno
13021305

13031306
def p_always_ff(self, p):
13041307
'always_ff : ALWAYS_FF senslist always_statement'
13051308
p[0] = AlwaysFF(p[2], p[3], lineno=p.lineno(1))
13061309
p.set_lineno(0, p.lineno(1))
1310+
p[0].end_lineno = p[3].end_lineno
13071311

13081312
def p_always_comb(self, p):
13091313
'always_comb : ALWAYS_COMB senslist always_statement'
13101314
p[0] = AlwaysComb(p[2], p[3], lineno=p.lineno(1))
13111315
p.set_lineno(0, p.lineno(1))
1316+
p[0].end_lineno = p[3].end_lineno
13121317

13131318
def p_always_latch(self, p):
13141319
'always_latch : ALWAYS_LATCH senslist always_statement'
13151320
p[0] = AlwaysLatch(p[2], p[3], lineno=p.lineno(1))
13161321
p.set_lineno(0, p.lineno(1))
1322+
p[0].end_lineno = p[3].end_lineno
13171323

13181324
def p_sens_egde_paren(self, p):
13191325
'senslist : AT LPAREN edgesigs RPAREN'
@@ -1449,6 +1455,7 @@ def p_blocking_substitution(self, p):
14491455
'blocking_substitution : delays lvalue EQUALS delays rvalue SEMICOLON'
14501456
p[0] = BlockingSubstitution(p[2], p[5], p[1], p[4], lineno=p.lineno(2))
14511457
p.set_lineno(0, p.lineno(2))
1458+
p[0].end_lineno = p.lineno(6)
14521459

14531460
def p_blocking_substitution_base(self, p):
14541461
'blocking_substitution_base : delays lvalue EQUALS delays rvalue'
@@ -1460,6 +1467,7 @@ def p_nonblocking_substitution(self, p):
14601467
p[0] = NonblockingSubstitution(
14611468
p[2], p[5], p[1], p[4], lineno=p.lineno(2))
14621469
p.set_lineno(0, p.lineno(2))
1470+
p[0].end_lineno = p.lineno(6)
14631471

14641472
# --------------------------------------------------------------------------
14651473
def p_delays(self, p):
@@ -1493,11 +1501,13 @@ def p_block(self, p):
14931501
'block : BEGIN block_statements END'
14941502
p[0] = Block(p[2], lineno=p.lineno(1))
14951503
p.set_lineno(0, p.lineno(1))
1504+
p[0].end_lineno = p.lineno(3)
14961505

14971506
def p_block_empty(self, p):
14981507
'block : BEGIN END'
14991508
p[0] = Block((), lineno=p.lineno(1))
15001509
p.set_lineno(0, p.lineno(1))
1510+
p[0].end_lineno = p.lineno(2)
15011511

15021512
def p_block_statements(self, p):
15031513
'block_statements : block_statements block_statement'
@@ -1519,11 +1529,13 @@ def p_namedblock(self, p):
15191529
'namedblock : BEGIN COLON ID namedblock_statements END'
15201530
p[0] = Block(p[4], p[3], lineno=p.lineno(1))
15211531
p.set_lineno(0, p.lineno(1))
1532+
p[0].end_lineno = p.lineno(5)
15221533

15231534
def p_namedblock_empty(self, p):
15241535
'namedblock : BEGIN COLON ID END'
15251536
p[0] = Block((), p[3], lineno=p.lineno(1))
15261537
p.set_lineno(0, p.lineno(1))
1538+
p[0].end_lineno = p.lineno(4)
15271539

15281540
def p_namedblock_statements(self, p):
15291541
'namedblock_statements : namedblock_statements namedblock_statement'
@@ -1568,21 +1580,25 @@ def p_if_statement(self, p):
15681580
'if_statement : IF LPAREN cond RPAREN true_statement ELSE else_statement'
15691581
p[0] = IfStatement(p[3], p[5], p[7], lineno=p.lineno(1))
15701582
p.set_lineno(0, p.lineno(1))
1583+
p[0].end_lineno = p[7].end_lineno
15711584

15721585
def p_if_statement_woelse(self, p):
15731586
'if_statement : IF LPAREN cond RPAREN true_statement'
15741587
p[0] = IfStatement(p[3], p[5], None, lineno=p.lineno(1))
15751588
p.set_lineno(0, p.lineno(1))
1589+
p[0].end_lineno = p[5].end_lineno
15761590

15771591
def p_if_statement_delay(self, p):
15781592
'if_statement : delays IF LPAREN cond RPAREN true_statement ELSE else_statement'
15791593
p[0] = IfStatement(p[4], p[6], p[8], lineno=p.lineno(2))
15801594
p.set_lineno(0, p.lineno(2))
1595+
p[0].end_lineno = p[8].end_lineno
15811596

15821597
def p_if_statement_woelse_delay(self, p):
15831598
'if_statement : delays IF LPAREN cond RPAREN true_statement'
15841599
p[0] = IfStatement(p[4], p[6], None, lineno=p.lineno(2))
15851600
p.set_lineno(0, p.lineno(2))
1601+
p[0].end_lineno = p[6].end_lineno
15861602

15871603
def p_cond(self, p):
15881604
'cond : expression'
@@ -1660,21 +1676,25 @@ def p_case_statement(self, p):
16601676
'case_statement : CASE LPAREN case_comp RPAREN casecontent_statements ENDCASE'
16611677
p[0] = CaseStatement(p[3], p[5], lineno=p.lineno(1))
16621678
p.set_lineno(0, p.lineno(1))
1679+
p[0].end_lineno = p.lineno(6)
16631680

16641681
def p_casex_statement(self, p):
16651682
'casex_statement : CASEX LPAREN case_comp RPAREN casecontent_statements ENDCASE'
16661683
p[0] = CasexStatement(p[3], p[5], lineno=p.lineno(1))
16671684
p.set_lineno(0, p.lineno(1))
1685+
p[0].end_lineno = p.lineno(6)
16681686

16691687
def p_casez_statement(self, p):
16701688
'casez_statement : CASEZ LPAREN case_comp RPAREN casecontent_statements ENDCASE'
16711689
p[0] = CasezStatement(p[3], p[5], lineno=p.lineno(1))
16721690
p.set_lineno(0, p.lineno(1))
1691+
p[0].end_lineno = p.lineno(6)
16731692

16741693
def p_unique_case_statement(self, p):
16751694
'unique_case_statement : UNIQUE CASE LPAREN case_comp RPAREN casecontent_statements ENDCASE'
16761695
p[0] = UniqueCaseStatement(p[3], p[5], lineno=p.lineno(1))
16771696
p.set_lineno(0, p.lineno(1))
1697+
p[0].end_lineno = p.lineno(7)
16781698

16791699
def p_case_comp(self, p):
16801700
'case_comp : expression'
@@ -1760,6 +1780,7 @@ def p_instance(self, p):
17601780
p[0] = InstanceList(p[1], p[2], tuple(
17611781
instancelist), lineno=p.lineno(1))
17621782
p.set_lineno(0, p.lineno(1))
1783+
p[0].end_lineno = p.lineno(4)
17631784

17641785
def p_instance_or(self, p):
17651786
'instance : SENS_OR parameterlist instance_bodylist SEMICOLON'
@@ -1770,6 +1791,7 @@ def p_instance_or(self, p):
17701791
p[0] = InstanceList(p[1], p[2], tuple(
17711792
instancelist), lineno=p.lineno(1))
17721793
p.set_lineno(0, p.lineno(1))
1794+
p[0].end_lineno = p.lineno(4)
17731795

17741796
def p_instance_bodylist(self, p):
17751797
'instance_bodylist : instance_bodylist COMMA instance_body'
@@ -1799,6 +1821,7 @@ def p_instance_noname(self, p):
17991821
(), instance_array, lineno=p.lineno(1)))
18001822
p[0] = InstanceList(p[1], (), tuple(instancelist), lineno=p.lineno(1))
18011823
p.set_lineno(0, p.lineno(1))
1824+
p[0].end_lineno = p.lineno(3)
18021825

18031826
def p_instance_or_noname(self, p):
18041827
'instance : SENS_OR instance_bodylist_noname SEMICOLON'
@@ -1808,6 +1831,7 @@ def p_instance_or_noname(self, p):
18081831
(), instance_array, lineno=p.lineno(1)))
18091832
p[0] = InstanceList(p[1], (), tuple(instancelist), lineno=p.lineno(1))
18101833
p.set_lineno(0, p.lineno(1))
1834+
p[0].end_lineno = p.lineno(3)
18111835

18121836
def p_instance_bodylist_noname(self, p):
18131837
'instance_bodylist_noname : instance_bodylist_noname COMMA instance_body_noname'
@@ -1953,6 +1977,7 @@ def p_generate(self, p):
19531977
'generate : GENERATE generate_items ENDGENERATE'
19541978
p[0] = GenerateStatement(p[2], lineno=p.lineno(1))
19551979
p.set_lineno(0, p.lineno(1))
1980+
p[0].end_lineno = p.lineno(3)
19561981

19571982
def p_generate_items_empty(self, p):
19581983
'generate_items : empty'
@@ -1981,11 +2006,13 @@ def p_generate_block(self, p):
19812006
'generate_block : BEGIN generate_items END'
19822007
p[0] = Block(p[2], lineno=p.lineno(1))
19832008
p.set_lineno(0, p.lineno(1))
2009+
p[0].end_lineno = p.lineno(3)
19842010

19852011
def p_generate_named_block(self, p):
19862012
'generate_block : BEGIN COLON ID generate_items END'
19872013
p[0] = Block(p[4], p[3], lineno=p.lineno(1))
19882014
p.set_lineno(0, p.lineno(1))
2015+
p[0].end_lineno = p.lineno(5)
19892016

19902017
def p_generate_if(self, p):
19912018
'generate_if : IF LPAREN cond RPAREN gif_true_item ELSE gif_false_item'
@@ -2063,6 +2090,7 @@ def p_function(self, p):
20632090
'function : FUNCTION width ID SEMICOLON function_statement ENDFUNCTION'
20642091
p[0] = Function(p[3], p[2], p[5], lineno=p.lineno(1))
20652092
p.set_lineno(0, p.lineno(1))
2093+
p[0].end_lineno = p.lineno(6)
20662094

20672095
def p_function_nowidth(self, p):
20682096
'function : FUNCTION ID SEMICOLON function_statement ENDFUNCTION'
@@ -2072,6 +2100,7 @@ def p_function_nowidth(self, p):
20722100
lineno=p.lineno(1)),
20732101
p[4], lineno=p.lineno(1))
20742102
p.set_lineno(0, p.lineno(1))
2103+
p[0].end_lineno = p.lineno(5)
20752104

20762105
def p_function_integer(self, p):
20772106
'function : FUNCTION INTEGER ID SEMICOLON function_statement ENDFUNCTION'
@@ -2081,6 +2110,7 @@ def p_function_integer(self, p):
20812110
lineno=p.lineno(1)),
20822111
p[5], lineno=p.lineno(1))
20832112
p.set_lineno(0, p.lineno(1))
2113+
p[0].end_lineno = p.lineno(6)
20842114

20852115
def p_function_statement(self, p):
20862116
'function_statement : funcvardecls function_calc'
@@ -2231,16 +2261,19 @@ def p_single_statement_delays(self, p):
22312261
p[0] = SingleStatement(DelayStatement(
22322262
p[2], lineno=p.lineno(1)), lineno=p.lineno(1))
22332263
p.set_lineno(0, p.lineno(1))
2264+
p[0].end_lineno = p.lineno(3)
22342265

22352266
def p_single_statement_systemcall(self, p):
22362267
'single_statement : systemcall SEMICOLON'
22372268
p[0] = SingleStatement(p[1], lineno=p.lineno(1))
22382269
p.set_lineno(0, p.lineno(1))
2270+
p[0].end_lineno = p.lineno(2)
22392271

22402272
def p_single_statement_disable(self, p):
22412273
'single_statement : disable SEMICOLON'
22422274
p[0] = SingleStatement(p[1], lineno=p.lineno(1))
22432275
p.set_lineno(0, p.lineno(1))
2276+
p[0].end_lineno = p.lineno(2)
22442277

22452278
# fix me: to support task-call-statement
22462279
# def p_single_statement_taskcall(self, p):

tests/parser_test/test_par_delay.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
expected = """\
1515
Source: (at 3)
1616
Description: (at 3)
17-
ModuleDef: main (at 3)
17+
ModuleDef: main (from 3 to 22)
1818
Paramlist: (at 3)
1919
Decl: (at 5)
2020
Parameter: STEP, False (at 5)
@@ -38,21 +38,21 @@
3838
Localparam: DELAY, False (at 13)
3939
Rvalue: (at 13)
4040
IntConst: 10 (at 13)
41-
Always: (at 15)
41+
Always: (from 15 to 21)
4242
SensList: (at 15)
4343
Sens: posedge (at 15)
4444
Identifier: CLK (at 15)
45-
Block: None (at 15)
46-
IfStatement: (at 16)
45+
Block: None (from 15 to 21)
46+
IfStatement: (from 16 to 20)
4747
Identifier: RST (at 16)
48-
Block: None (at 16)
49-
NonblockingSubstitution: (at 17)
48+
Block: None (from 16 to 18)
49+
NonblockingSubstitution: (from 17 to 17)
5050
Lvalue: (at 17)
5151
Identifier: LED (at 17)
5252
Rvalue: (at 17)
5353
IntConst: 0 (at 17)
54-
Block: None (at 18)
55-
NonblockingSubstitution: (at 19)
54+
Block: None (from 18 to 20)
55+
NonblockingSubstitution: (from 19 to 19)
5656
Lvalue: (at 19)
5757
Identifier: LED (at 19)
5858
Rvalue: (at 19)

tests/parser_test/test_par_escape.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
expected = """\
1515
Source: (at 1)
1616
Description: (at 1)
17-
ModuleDef: \\1234 (at 1)
17+
ModuleDef: \\1234 (from 1 to 22)
1818
Paramlist: (at 0)
1919
Portlist: (at 2)
2020
Port: \\CLK~, None (at 3)
@@ -34,9 +34,9 @@
3434
Width: (at 11)
3535
IntConst: 31 (at 11)
3636
IntConst: 0 (at 11)
37-
GenerateStatement: (at 12)
37+
GenerateStatement: (from 12 to 17)
3838
ForStatement: (at 12)
39-
BlockingSubstitution: (at 12)
39+
BlockingSubstitution: (from 12 to 12)
4040
Lvalue: (at 12)
4141
Identifier: i (at 12)
4242
Rvalue: (at 12)
@@ -51,9 +51,9 @@
5151
Plus: (at 12)
5252
Identifier: i (at 12)
5353
IntConst: 1 (at 12)
54-
Block: \\1stLoop (at 12)
54+
Block: \\1stLoop (from 12 to 17)
5555
ForStatement: (at 13)
56-
BlockingSubstitution: (at 13)
56+
BlockingSubstitution: (from 13 to 13)
5757
Lvalue: (at 13)
5858
Identifier: j (at 13)
5959
Rvalue: (at 13)
@@ -68,13 +68,13 @@
6868
Plus: (at 13)
6969
Identifier: j (at 13)
7070
IntConst: 1 (at 13)
71-
Block: \\2ndLoop (at 13)
71+
Block: \\2ndLoop (from 13 to 16)
7272
Decl: (at 14)
7373
Wire: tmp, False (at 14)
7474
Width: (at 14)
7575
IntConst: 7 (at 14)
7676
IntConst: 0 (at 14)
77-
Assign: (at 15)
77+
Assign: (from 15 to 15)
7878
Lvalue: (at 15)
7979
Identifier: tmp (at 15)
8080
Rvalue: (at 15)
@@ -86,7 +86,7 @@
8686
Width: (at 19)
8787
IntConst: 7 (at 19)
8888
IntConst: 0 (at 19)
89-
Assign: (at 20)
89+
Assign: (from 20 to 20)
9090
Lvalue: (at 20)
9191
Identifier: rslt (at 20)
9292
Rvalue: (at 20)

0 commit comments

Comments
 (0)