Skip to content

Commit e0e0ffd

Browse files
committed
SMV: precedence of !
NuSMV uses a different precedence of the not operator ! than CMU SMV. This commit special-cases this operator, and adds parentheses to avoid this ambigutity.
1 parent 78d038d commit e0e0ffd

File tree

3 files changed

+21
-6
lines changed

3 files changed

+21
-6
lines changed

regression/smv/range-type/range_type4.desc

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ range_type4.smv
33
--bound 10
44
^EXIT=0$
55
^SIGNAL=0$
6-
^\[spec1\] AG \(!x = 6\): PROVED up to bound 10$
6+
^\[spec1\] AG !\(x = 6\): PROVED up to bound 10$
77
--
88
^warning: ignoring

regression/smv/word/bitwise1.desc

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
CORE
22
bitwise1.smv
33

4-
^\[.*\] !0ud8_123 = 0ud8_132: PROVED$
5-
^\[.*\] !0sd8_123 = -0sd8_124: PROVED$
4+
^\[.*\] !\(0ud8_123 = 0ud8_132\): PROVED$
5+
^\[.*\] !\(0sd8_123 = -0sd8_124\): PROVED$
66
^\[.*\] \(0ud8_123 \& 0ud8_7\) = 0ud8_3: PROVED$
77
^\[.*\] \(0ud8_123 \| 0ud8_7\) = 0ud8_127: PROVED$
88
^\[.*\] \(0ud8_123 xor 0ud8_7\) = 0ud8_124: PROVED$

src/smvlang/expr2smv.cpp

+18-3
Original file line numberDiff line numberDiff line change
@@ -227,13 +227,28 @@ expr2smvt::resultt expr2smvt::convert_unary(
227227
const std::string &symbol,
228228
precedencet precedence)
229229
{
230-
auto op_rec = convert_rec(src.op());
230+
auto &op = src.op();
231+
232+
auto op_rec = convert_rec(op);
233+
234+
// We special-case negation (!), since the precedence
235+
// of this operator changed between CMU SMV and NuSMV.
236+
237+
// clang-format off
238+
bool parentheses =
239+
op.operands().size() == 1 ? false
240+
: src.id() == ID_not ? true
241+
: precedence >= op_rec.p;
242+
// clang-format on
231243

232244
std::string dest = symbol;
233-
if(precedence > op_rec.p)
245+
246+
if(parentheses)
234247
dest += '(';
248+
235249
dest += op_rec.s;
236-
if(precedence > op_rec.p)
250+
251+
if(parentheses)
237252
dest += ')';
238253

239254
return {precedence, std::move(dest)};

0 commit comments

Comments
 (0)