Skip to content

Commit 366d927

Browse files
committed
SMV: use NuSMV's operator precedence
1 parent bd3e3a1 commit 366d927

File tree

7 files changed

+41
-22
lines changed

7 files changed

+41
-22
lines changed

CHANGELOG

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# EBMC 5.8
22

3+
* SMV: use NuSMV's operator precedence, as opposed to CMU SMV's
34
* AIG/netlist engine: fix for conversion of extract bits operator
45
* Verilog: semantic fix for output register ports
56
* SystemVerilog: cover sequence
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
CORE
22
s_until1.sv
33
--smv-netlist
4-
^LTLSPEC \(\!node144\) U node151$
5-
^LTLSPEC \(TRUE\) U node158$
4+
^LTLSPEC \!node144 U node151$
5+
^LTLSPEC TRUE U node158$
66
^EXIT=0$
77
^SIGNAL=0$
88
--

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)

src/smvlang/expr2smv_class.h

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

3636
// In NuSMV 2.6., ! (not) has a high precedence (above ::), whereas
3737
// in the CMU SMV implementation it has the same as other boolean operators.
38-
// We use the CMU SMV precedence for !.
38+
// We use the NuSMV precedence for !.
3939
// Like CMU SMV, we give the same precedence to -> and <->, to avoid ambiguity.
4040
// Note that the precedence of mod in the CMU SMV differs from NuSMV's.
4141
// We use NuSMV's.
4242
enum class precedencet
4343
{
4444
MAX = 16,
4545
INDEX = 15, // [ ] , [ : ]
46-
CONCAT = 14, // ::
46+
NOT = 14, // !
4747
UMINUS = 13, // - (unary minus)
48-
MULT = 12, // * / mod
49-
PLUS = 11, // + -
50-
SHIFT = 10, // << >>
51-
UNION = 9, // union
52-
IN = 8, // in
53-
REL = 7, // = != < > <= >=
54-
TEMPORAL = 6, // AX, AF, etc.
55-
NOT = 5, // !
48+
CONCAT = 12, // ::
49+
MULT = 11, // * / mod
50+
PLUS = 10, // + -
51+
SHIFT = 9, // << >>
52+
UNION = 8, // union
53+
IN = 7, // in
54+
REL = 6, // = != < > <= >=
55+
TEMPORAL = 5, // AX, AF, etc.
5656
AND = 4, // &
5757
OR = 3, // | xor xnor
5858
IF = 2, // (• ? • : •)
@@ -74,6 +74,26 @@ class expr2smvt
7474
-> <->
7575
*/
7676

77+
/* From https://nusmv.fbk.eu/userman/v27/nusmv.pdf
78+
79+
The order of parsing precedence for operators from high to low is:
80+
[ ] , [ : ]
81+
!
82+
- (unary minus)
83+
::
84+
* / mod
85+
+ -
86+
<< >>
87+
union
88+
in
89+
= != < > <= >=
90+
&
91+
| xor xnor
92+
(• ? • : •)
93+
<->
94+
->
95+
*/
96+
7797
struct resultt
7898
{
7999
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
@@ -327,20 +327,18 @@ static smv_parse_treet::modulet &new_module(YYSTYPE &module_name)
327327
%right IMPLIES_Token
328328
%left EQUIV_Token
329329
%left IF_Token
330-
%left xor_Token xnor_Token
331-
%left OR_Token
330+
%left OR_Token xor_Token xnor_Token
332331
%left AND_Token
333-
%left NOT_Token
334332
%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
335333
%left EQUAL_Token NOTEQUAL_Token LT_Token GT_Token LE_Token GE_Token
336334
%left union_Token
337335
%left in_Token
338-
%left mod_Token /* Precedence from CMU SMV, different from NuSMV */
339336
%left LTLT_Token GTGT_Token
340337
%left PLUS_Token MINUS_Token
341-
%left TIMES_Token DIVIDE_Token
338+
%left TIMES_Token DIVIDE_Token mod_Token /* mod precedence from NuSMV, different from CMU SMV */
342339
%left COLONCOLON_Token
343340
%left UMINUS /* supplies precedence for unary minus */
341+
%left NOT_Token
344342
%left DOT_Token
345343

346344
%%

0 commit comments

Comments
 (0)