Skip to content

Commit f9a5c68

Browse files
committed
SVA: parentheses around the arguments of ##
This adds parentheses around the arguments of SVA ## to avoid ambiguity.
1 parent a6a73c2 commit f9a5c68

File tree

5 files changed

+33
-42
lines changed

5 files changed

+33
-42
lines changed

regression/ebmc-spot/sva-buechi/sequence_repetition5.desc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
CORE
22
../../verilog/SVA/sequence_repetition5.sv
33
--buechi --bound 20
4-
^\[.*\] main\.pulse ##1 \!main\.pulse \[\*1:9\] ##1 main.pulse: PROVED up to bound 20$
5-
^\[.*\] main\.pulse ##1 \!main\.pulse \[\*1:8\] ##1 main.pulse: REFUTED$
4+
^\[.*\] main\.pulse ##1 \(\!main\.pulse \[\*1:9\]\) ##1 main.pulse: PROVED up to bound 20$
5+
^\[.*\] main\.pulse ##1 \(\!main\.pulse \[\*1:8\]\) ##1 main.pulse: REFUTED$
66
^EXIT=10$
77
^SIGNAL=0$
88
--

regression/verilog/SVA/empty_sequence1.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ CORE
22
empty_sequence1.sv
33
--bound 5
44
^\[main\.p0\] 1 \[\*0\]: REFUTED$
5-
^\[main\.p1\] 1 \[\*0\] ##1 main\.x == 0: REFUTED$
5+
^\[main\.p1\] \(1 \[\*0\]\) ##1 main\.x == 0: REFUTED$
66
^EXIT=10$
77
^SIGNAL=0$
88
--

regression/verilog/SVA/sequence_repetition5.desc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
CORE
22
sequence_repetition5.sv
33
--bound 20
4-
^\[.*\] main\.pulse ##1 \!main\.pulse \[\*1:9\] ##1 main.pulse: PROVED up to bound 20$
5-
^\[.*\] main\.pulse ##1 \!main\.pulse \[\*1:8\] ##1 main.pulse: REFUTED$
4+
^\[.*\] main\.pulse ##1 \(\!main\.pulse \[\*1:9\]\) ##1 main.pulse: PROVED up to bound 20$
5+
^\[.*\] main\.pulse ##1 \(\!main\.pulse \[\*1:8\]\) ##1 main.pulse: REFUTED$
66
^EXIT=10$
77
^SIGNAL=0$
88
--

src/verilog/expr2verilog.cpp

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,8 @@ Function: expr2verilogt::convert_sva_cycle_delay
141141
142142
\*******************************************************************/
143143

144-
expr2verilogt::resultt expr2verilogt::convert_sva_cycle_delay(
145-
const sva_cycle_delay_exprt &src,
146-
verilog_precedencet precedence)
144+
expr2verilogt::resultt
145+
expr2verilogt::convert_sva_cycle_delay(const sva_cycle_delay_exprt &src)
147146
{
148147
std::string dest="##";
149148

@@ -163,13 +162,13 @@ expr2verilogt::resultt expr2verilogt::convert_sva_cycle_delay(
163162

164163
auto rhs = convert_rec(src.rhs());
165164

166-
if(precedence > rhs.p)
165+
if(rhs.p == verilog_precedencet::MIN)
167166
dest += '(';
168167
dest += rhs.s;
169-
if(precedence > rhs.p)
168+
if(rhs.p == verilog_precedencet::MIN)
170169
dest += ')';
171170

172-
return {precedence, dest};
171+
return {verilog_precedencet::MIN, dest};
173172
}
174173

175174
/*******************************************************************\
@@ -224,33 +223,41 @@ Function: expr2verilogt::convert_sva_sequence_concatenation
224223
225224
\*******************************************************************/
226225

227-
expr2verilogt::resultt expr2verilogt::convert_sva_sequence_concatenation(
228-
const binary_exprt &src,
229-
verilog_precedencet precedence)
226+
expr2verilogt::resultt
227+
expr2verilogt::convert_sva_sequence_concatenation(const binary_exprt &src)
230228
{
231-
if(src.operands().size()!=2)
232-
return convert_norep(src);
233-
234229
std::string dest;
235230

236231
auto op0 = convert_rec(src.op0());
237232
auto op1 = convert_rec(src.op1());
238233

239-
if(precedence > op0.p)
234+
bool lhs_paren = op0.p == verilog_precedencet::MIN &&
235+
src.op0().id() != ID_sva_sequence_concatenation &&
236+
src.op0().id() != ID_sva_cycle_delay &&
237+
src.op0().id() != ID_sva_cycle_delay_plus &&
238+
src.op0().id() != ID_sva_cycle_delay_star;
239+
240+
if(lhs_paren)
240241
dest += '(';
241242
dest += op0.s;
242-
if(precedence > op0.p)
243+
if(lhs_paren)
243244
dest += ')';
244245

245246
dest+=' ';
246247

247-
if(precedence > op0.p)
248+
bool rhs_paren = op1.p == verilog_precedencet::MIN &&
249+
src.op1().id() != ID_sva_sequence_concatenation &&
250+
src.op1().id() != ID_sva_cycle_delay &&
251+
src.op1().id() != ID_sva_cycle_delay_plus &&
252+
src.op1().id() != ID_sva_cycle_delay_star;
253+
254+
if(rhs_paren)
248255
dest += '(';
249256
dest += op1.s;
250-
if(precedence > op0.p)
257+
if(rhs_paren)
251258
dest += ')';
252259

253-
return {precedence, dest};
260+
return {verilog_precedencet::MIN, dest};
254261
}
255262

256263
/*******************************************************************\
@@ -1838,9 +1845,7 @@ expr2verilogt::resultt expr2verilogt::convert_rec(const exprt &src)
18381845
convert_sva_binary("#=#", to_binary_expr(src));
18391846

18401847
else if(src.id()==ID_sva_cycle_delay)
1841-
return convert_sva_cycle_delay(
1842-
to_sva_cycle_delay_expr(src), precedence = verilog_precedencet::MIN);
1843-
// not sure about precedence
1848+
return convert_sva_cycle_delay(to_sva_cycle_delay_expr(src));
18441849

18451850
else if(src.id() == ID_sva_strong)
18461851
return convert_function("strong", src);
@@ -1862,9 +1867,7 @@ expr2verilogt::resultt expr2verilogt::convert_rec(const exprt &src)
18621867
}
18631868

18641869
else if(src.id()==ID_sva_sequence_concatenation)
1865-
return convert_sva_sequence_concatenation(
1866-
to_binary_expr(src), precedence = verilog_precedencet::MIN);
1867-
// not sure about precedence
1870+
return convert_sva_sequence_concatenation(to_binary_expr(src));
18681871

18691872
else if(src.id() == ID_sva_sequence_first_match)
18701873
return convert_sva_sequence_first_match(
@@ -1885,16 +1888,6 @@ expr2verilogt::resultt expr2verilogt::convert_rec(const exprt &src)
18851888
convert_sva_binary("within", to_binary_expr(src));
18861889
// not sure about precedence
18871890

1888-
else if(src.id() == ID_sva_sequence_within)
1889-
return convert_sva_sequence_concatenation(
1890-
to_binary_expr(src), precedence = verilog_precedencet::MIN);
1891-
// not sure about precedence
1892-
1893-
else if(src.id() == ID_sva_sequence_throughout)
1894-
return convert_sva_sequence_concatenation(
1895-
to_binary_expr(src), precedence = verilog_precedencet::MIN);
1896-
// not sure about precedence
1897-
18981891
else if(src.id()==ID_sva_always)
18991892
return precedence = verilog_precedencet::MIN,
19001893
convert_sva_unary("always", to_sva_always_expr(src));

src/verilog/expr2verilog_class.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,13 +156,11 @@ class expr2verilogt
156156

157157
resultt convert_with(const with_exprt &, verilog_precedencet);
158158

159-
resultt
160-
convert_sva_cycle_delay(const sva_cycle_delay_exprt &, verilog_precedencet);
159+
resultt convert_sva_cycle_delay(const sva_cycle_delay_exprt &);
161160

162161
resultt convert_sva_if(const sva_if_exprt &);
163162

164-
resultt
165-
convert_sva_sequence_concatenation(const binary_exprt &, verilog_precedencet);
163+
resultt convert_sva_sequence_concatenation(const binary_exprt &);
166164

167165
resultt
168166
convert_sva_sequence_first_match(const sva_sequence_first_match_exprt &);

0 commit comments

Comments
 (0)