Skip to content

Commit 026cfe6

Browse files
committed
Handle multi-line macros
make more robust, one more test.
1 parent 17e7175 commit 026cfe6

File tree

4 files changed

+47
-1
lines changed

4 files changed

+47
-1
lines changed

regression/verilog/assert4/main.v

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module main();
2+
`define SIZE 31
3+
`define plus_binary(a,b) \
4+
a+b
5+
6+
reg [`SIZE:0] x;
7+
wire clk;
8+
9+
initial x=1;
10+
11+
always @(posedge clk) x<=`plus_binary(x,1);
12+
13+
always assert property1: x!=10;
14+
15+
endmodule

regression/verilog/assert4/test.desc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
main.v
3+
--module main --bound 20 --trace
4+
^EXIT=10$
5+
^SIGNAL=0$
6+
^Counterexample:$
7+
\[main.property.property1\] .* FAILURE$
8+
--
9+
^warning: ignoring

src/verilog/verilog_language.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Author: Daniel Kroening, [email protected]
77
\*******************************************************************/
88

99
#include <sstream>
10+
#include <iostream>
1011

1112
#include <util/suffix.h>
1213

@@ -40,6 +41,10 @@ bool verilog_languaget::parse(
4041
if(preprocess(instream, path, str))
4142
return true;
4243

44+
std::cerr << "--------------------------------------------------\n";
45+
std::cerr << str.str();
46+
std::cerr << "\n--------------------------------------------------\n";
47+
4348
verilog_parser.set_file(path);
4449
verilog_parser.in=&str;
4550
verilog_parser.set_message_handler(get_message_handler());

src/verilog/verilog_preprocessor.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -496,18 +496,35 @@ void verilog_preprocessort::directive()
496496
tptr++;
497497
}
498498

499+
auto old_tptr = tptr;
500+
// maybe skip whitespace between name and paramlist
501+
while (*tptr == ' ' || *tptr == '\t' || *tptr == '\n')
502+
tptr++;
503+
499504
// is there a parameter list?
500505
if(*tptr=='(')
501506
{
507+
// we don't expect any extra parentheses inside parameter list
502508
while (*(++tptr) != ')')
503509
param_string.push_back(*tptr);
504510
++tptr; // get past the closing parenthesis
505-
}
511+
} else
512+
tptr = old_tptr;
506513

507514
// skip whitespace
508515
while(*tptr==' ' || *tptr=='\t') tptr++;
509516

510517
value=tptr;
518+
// handle multi-line macros
519+
while (value.back() == '\\') {
520+
value.pop_back();
521+
files.back().getline(line);
522+
tptr = line.c_str();
523+
// remove indentation
524+
while (*tptr == ' ' || *tptr == '\t')
525+
tptr++;
526+
value += tptr;
527+
}
511528

512529
// remove trailing whitespace
513530

0 commit comments

Comments
 (0)