Skip to content

Commit e4ca7ad

Browse files
authored
Merge pull request #1382 from diffblue/smv-operator-precedence
SMV: use NuSMV's operator precedence
2 parents b93b299 + 94d5998 commit e4ca7ad

10 files changed

Lines changed: 47 additions & 27 deletions

File tree

CHANGELOG

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
* SMV: removed legacy keywords EXTERN and switch
55

6+
* SMV: use NuSMV's operator precedence, as opposed to CMU SMV's
7+
68
# EBMC 5.11
79

810
* SystemVerilog: $unit::

regression/ebmc/smv-netlist/assignment.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
CORE
22
assignment.sv
33
--smv-netlist --simple-netlist
4-
^LTLSPEC G \(\!nondet\[5\]\)$
4+
^LTLSPEC G \!nondet\[5\]$
55
^EXIT=0$
66
^SIGNAL=0$
77
--

regression/ebmc/smv-netlist/s_until1.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
CORE
22
s_until1.sv
33
--smv-netlist
4-
^LTLSPEC \(\!node144\) U node51$
4+
^LTLSPEC \!node144 U node51$
55
^LTLSPEC TRUE U node151$
66
^EXIT=0$
77
^SIGNAL=0$

regression/ebmc/smv-word-level/smv1.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ smv1.smv
1010
^INIT range_type = 1$
1111
^INIT signed_bit_vector = 0sd20_1$
1212
^INIT unsigned_bit_vector = 0ud20_1$
13-
^TRANS next\(bool_type\) = \(!bool_type\)$
13+
^TRANS next\(bool_type\) = !bool_type$
1414
^TRANS next\(range_type\) = 2$
1515
^TRANS next\(signed_bit_vector\) = 0sd20_2$
1616
^TRANS next\(unsigned_bit_vector\) = 0ud20_2$

regression/smv/word/bitwise1.desc

Lines changed: 2 additions & 2 deletions
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 .*$

regression/smv/word/bitwise1.smv

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
MODULE main
22

33
-- negation
4-
SPEC (!uwconst(123, 8)) = uwconst(132, 8)
5-
SPEC (!swconst(123, 8)) = swconst(-124, 8)
4+
SPEC !uwconst(123, 8) = uwconst(132, 8)
5+
SPEC !swconst(123, 8) = swconst(-124, 8)
66

77
-- and
88
SPEC (uwconst(123, 8) & uwconst(7, 8)) = uwconst(3, 8)

regression/smv/word/bitwise_not1.desc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ CORE
22
bitwise_not1.smv
33

44
^\[spec1\] !\(0ud2_1 = 0ud2_3\): PROVED.*$
5-
^\[spec2\] \(!0ud2_1\) = 0ud2_3: REFUTED.*$
6-
^\[spec3\] !\(0ud2_1 = 0ud2_3\): PROVED.*$
5+
^\[spec2\] !0ud2_1 = 0ud2_3: REFUTED.*$
6+
^\[spec3\] !0ud2_1 = 0ud2_3: REFUTED.*$
77
^EXIT=10$
88
^SIGNAL=0$
99
--

regression/smv/word/bitwise_not2.desc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
CORE
22
bitwise_not2.smv
33

4-
^\[spec1\] \(!\(0ud1_1 :: 0ud1_1\)\) = 0ud2_1: REFUTED$
4+
^\[spec1\] !\(0ud1_1 :: 0ud1_1\) = 0ud2_1: REFUTED$
55
^\[spec2\] \(!0ud1_1\) :: 0ud1_1 = 0ud2_1: PROVED .*$
6-
^\[spec3\] \(!\(0ud1_1 :: 0ud1_1\)\) = 0ud2_1: REFUTED$
7-
^\[spec4\] !\(0ud1_1 :: 0ud1_1 = 0ud2_1\): PROVED .*$
6+
^\[spec3\] \(!0ud1_1\) :: 0ud1_1 = 0ud2_1: PROVED .*$
7+
^\[spec4\] \(!0ud1_1\) :: 0ud1_1 = 0ud2_1: PROVED .*$
88
^EXIT=10$
99
^SIGNAL=0$
1010
--

src/smvlang/expr2smv_class.h

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,24 +40,24 @@ class expr2smvt
4040

4141
// In NuSMV 2.6., ! (not) has a high precedence (above ::), whereas
4242
// in the CMU SMV implementation it has the same as other boolean operators.
43-
// We use the CMU SMV precedence for !.
43+
// We use the NuSMV precedence for !.
4444
// Like CMU SMV, we give the same precedence to -> and <->, to avoid ambiguity.
4545
// Note that the precedence of mod in the CMU SMV differs from NuSMV's.
4646
// We use NuSMV's.
4747
enum class precedencet
4848
{
4949
MAX = 16,
5050
INDEX = 15, // [ ] , [ : ]
51-
CONCAT = 14, // ::
51+
NOT = 14, // !
5252
UMINUS = 13, // - (unary minus)
53-
MULT = 12, // * / mod
54-
PLUS = 11, // + -
55-
SHIFT = 10, // << >>
56-
UNION = 9, // union
57-
IN = 8, // in
58-
REL = 7, // = != < > <= >=
59-
TEMPORAL = 6, // AX, AF, etc.
60-
NOT = 5, // !
53+
CONCAT = 12, // ::
54+
MULT = 11, // * / mod
55+
PLUS = 10, // + -
56+
SHIFT = 9, // << >>
57+
UNION = 8, // union
58+
IN = 7, // in
59+
REL = 6, // = != < > <= >=
60+
TEMPORAL = 5, // AX, AF, etc.
6161
AND = 4, // &
6262
OR = 3, // | xor xnor
6363
IF = 2, // (• ? • : •)
@@ -79,6 +79,26 @@ class expr2smvt
7979
-> <->
8080
*/
8181

82+
/* From https://nusmv.fbk.eu/userman/v27/nusmv.pdf
83+
84+
The order of parsing precedence for operators from high to low is:
85+
[ ] , [ : ]
86+
!
87+
- (unary minus)
88+
::
89+
* / mod
90+
+ -
91+
<< >>
92+
union
93+
in
94+
= != < > <= >=
95+
&
96+
| xor xnor
97+
(• ? • : •)
98+
<->
99+
->
100+
*/
101+
82102
struct resultt
83103
{
84104
resultt(precedencet _p, std::string _s) : p(_p), s(std::move(_s))

src/smvlang/parser.y

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -288,21 +288,19 @@ static smv_parse_treet::modulet &new_module(YYSTYPE &location, YYSTYPE &module_n
288288
%right IMPLIES_Token
289289
%left EQUIV_Token
290290
%left IF_Token
291-
%left xor_Token xnor_Token
292-
%left OR_Token
291+
%left OR_Token xor_Token xnor_Token
293292
%left AND_Token
294-
%left NOT_Token
295293
%left EX_Token AX_Token EF_Token AF_Token EG_Token AG_Token E_Token A_Token U_Token R_Token V_Token F_Token G_Token H_Token O_Token S_Token T_Token X_Token Y_Token Z_Token EBF_Token ABF_Token EBG_Token ABG_Token
296294
%left EQUAL_Token NOTEQUAL_Token LT_Token GT_Token LE_Token GE_Token
297295
%left union_Token
298296
%left in_Token
299297
%left DOTDOT_Token /* precedence not documented */
300-
%left mod_Token /* Precedence from CMU SMV, different from NuSMV */
301298
%left LTLT_Token GTGT_Token
302299
%left PLUS_Token MINUS_Token
303-
%left TIMES_Token DIVIDE_Token
300+
%left TIMES_Token DIVIDE_Token mod_Token /* mod precedence from NuSMV, different from CMU SMV */
304301
%left COLONCOLON_Token
305302
%left UMINUS /* supplies precedence for unary minus */
303+
%left NOT_Token /* precedence from NuSMV, different from CMU SMV */
306304
%left DOT_Token '[' '('
307305

308306
%%

0 commit comments

Comments
 (0)