@@ -21,33 +21,75 @@ class expr2smvt
21
21
{
22
22
}
23
23
24
- bool convert_nondet_choice (const exprt &src, std::string &dest, unsigned precedence);
24
+ protected:
25
+ // In NuSMV 2.6., ! (not) has a high precedence (above ::), whereas
26
+ // in the CMU SMV implementation it has the same as other boolean operators.
27
+ // We use the CMU SMV precedence.
28
+ enum class precedencet
29
+ {
30
+ MAX = 17 ,
31
+ INDEX = 16 , // [ ] , [ : ]
32
+ CONCAT = 15 , // ::
33
+ UMINUS = 14 , // - (unary minus)
34
+ MULT = 13 , // * / mod
35
+ PLUS = 12 , // + -
36
+ SHIFT = 11 , // << >>
37
+ UNION = 10 , // union
38
+ IN = 9 , // in
39
+ REL = 8 , // = != < > <= >=
40
+ TEMPORAL = 7 , // AX, AF, etc.
41
+ NOT = 6 , // !
42
+ AND = 5 , // &
43
+ OR = 4 , // | xor xnor
44
+ IF = 3 , // (• ? • : •)
45
+ IFF = 2 , // <->
46
+ IMPLIES = 1 // ->
47
+ };
48
+
49
+ public:
50
+ bool convert_nondet_choice (
51
+ const exprt &src,
52
+ std::string &dest,
53
+ precedencet precedence);
25
54
26
- bool convert_binary (const exprt &src, std::string &dest, const std::string &symbol, unsigned precedence);
55
+ bool convert_binary (
56
+ const exprt &src,
57
+ std::string &dest,
58
+ const std::string &symbol,
59
+ precedencet precedence);
27
60
28
61
bool convert_unary (
29
62
const unary_exprt &,
30
63
std::string &dest,
31
64
const std::string &symbol,
32
- unsigned precedence);
65
+ precedencet precedence);
33
66
34
67
bool
35
- convert_index (const index_exprt &, std::string &dest, unsigned precedence);
68
+ convert_index (const index_exprt &, std::string &dest, precedencet precedence);
36
69
37
- bool convert (const exprt &src, std::string &dest, unsigned &precedence);
70
+ bool convert (const exprt &src, std::string &dest, precedencet &precedence);
38
71
39
72
bool convert (const exprt &src, std::string &dest);
40
73
41
- bool
42
- convert_symbol (const symbol_exprt &, std::string &dest, unsigned &precedence);
74
+ bool convert_symbol (
75
+ const symbol_exprt &,
76
+ std::string &dest,
77
+ precedencet &precedence);
43
78
44
- bool convert_next_symbol (const exprt &src, std::string &dest, unsigned &precedence);
79
+ bool convert_next_symbol (
80
+ const exprt &src,
81
+ std::string &dest,
82
+ precedencet &precedence);
45
83
46
- bool convert_constant (const exprt &src, std::string &dest, unsigned &precedence);
84
+ bool convert_constant (
85
+ const exprt &src,
86
+ std::string &dest,
87
+ precedencet &precedence);
47
88
48
89
bool convert_cond (const exprt &src, std::string &dest);
49
90
50
- bool convert_norep (const exprt &src, std::string &dest, unsigned &precedence);
91
+ bool
92
+ convert_norep (const exprt &src, std::string &dest, precedencet &precedence);
51
93
52
94
bool convert (const typet &src, std::string &dest);
53
95
@@ -94,8 +136,6 @@ The order of precedence from high to low is
94
136
95
137
*/
96
138
97
- #define SMV_MAX_PRECEDENCE 21
98
-
99
139
/* ******************************************************************\
100
140
101
141
Function: expr2smvt::convert_nondet_choice
@@ -111,7 +151,7 @@ Function: expr2smvt::convert_nondet_choice
111
151
bool expr2smvt::convert_nondet_choice (
112
152
const exprt &src,
113
153
std::string &dest,
114
- unsigned precedence)
154
+ precedencet precedence)
115
155
{
116
156
dest=" { " ;
117
157
@@ -187,7 +227,7 @@ bool expr2smvt::convert_binary(
187
227
const exprt &src,
188
228
std::string &dest,
189
229
const std::string &symbol,
190
- unsigned precedence)
230
+ precedencet precedence)
191
231
{
192
232
if (src.operands ().size ()<2 )
193
233
return convert_norep (src, dest, precedence);
@@ -206,7 +246,7 @@ bool expr2smvt::convert_binary(
206
246
}
207
247
208
248
std::string op;
209
- unsigned p;
249
+ precedencet p;
210
250
211
251
if (convert (*it, op, p)) return true ;
212
252
@@ -234,10 +274,10 @@ bool expr2smvt::convert_unary(
234
274
const unary_exprt &src,
235
275
std::string &dest,
236
276
const std::string &symbol,
237
- unsigned precedence)
277
+ precedencet precedence)
238
278
{
239
279
std::string op;
240
- unsigned p;
280
+ precedencet p;
241
281
242
282
if (convert (src.op (), op, p))
243
283
return true ;
@@ -265,10 +305,10 @@ Function: expr2smvt::convert_index
265
305
bool expr2smvt::convert_index (
266
306
const index_exprt &src,
267
307
std::string &dest,
268
- unsigned precedence)
308
+ precedencet precedence)
269
309
{
270
310
std::string op;
271
- unsigned p;
311
+ precedencet p;
272
312
273
313
if (convert (src.op0 (), op, p)) return true ;
274
314
@@ -300,9 +340,9 @@ Function: expr2smvt::convert_norep
300
340
bool expr2smvt::convert_norep (
301
341
const exprt &src,
302
342
std::string &dest,
303
- unsigned &precedence)
343
+ precedencet &precedence)
304
344
{
305
- precedence=SMV_MAX_PRECEDENCE ;
345
+ precedence = precedencet::MAX ;
306
346
dest=src.pretty ();
307
347
return false ;
308
348
}
@@ -322,9 +362,9 @@ Function: expr2smvt::convert_symbol
322
362
bool expr2smvt::convert_symbol (
323
363
const symbol_exprt &src,
324
364
std::string &dest,
325
- unsigned &precedence)
365
+ precedencet &precedence)
326
366
{
327
- precedence=SMV_MAX_PRECEDENCE ;
367
+ precedence = precedencet::MAX ;
328
368
329
369
auto &symbol = ns.lookup (src);
330
370
@@ -348,7 +388,7 @@ Function: expr2smvt::convert_next_symbol
348
388
bool expr2smvt::convert_next_symbol (
349
389
const exprt &src,
350
390
std::string &dest,
351
- unsigned &precedence)
391
+ precedencet &precedence)
352
392
{
353
393
std::string tmp;
354
394
convert_symbol (
@@ -374,9 +414,9 @@ Function: expr2smvt::convert_constant
374
414
bool expr2smvt::convert_constant (
375
415
const exprt &src,
376
416
std::string &dest,
377
- unsigned &precedence)
417
+ precedencet &precedence)
378
418
{
379
- precedence=SMV_MAX_PRECEDENCE ;
419
+ precedence = precedencet::MAX ;
380
420
381
421
const typet &type=src.type ();
382
422
const std::string &value=src.get_string (ID_value);
@@ -414,19 +454,19 @@ Function: expr2smvt::convert
414
454
bool expr2smvt::convert (
415
455
const exprt &src,
416
456
std::string &dest,
417
- unsigned &precedence)
457
+ precedencet &precedence)
418
458
{
419
- precedence=SMV_MAX_PRECEDENCE ;
459
+ precedence = precedencet::MAX ;
420
460
421
461
if (src.id ()==ID_plus)
422
- return convert_binary (src, dest, " +" , precedence= 15 );
462
+ return convert_binary (src, dest, " +" , precedence = precedencet::PLUS );
423
463
424
464
else if (src.id ()==ID_minus)
425
465
{
426
466
if (src.operands ().size ()<2 )
427
467
return convert_norep (src, dest, precedence);
428
- else
429
- return convert_binary (src, dest, " -" , precedence= 15 );
468
+ else
469
+ return convert_binary (src, dest, " -" , precedence = precedencet::PLUS );
430
470
}
431
471
432
472
else if (src.id ()==ID_unary_minus)
@@ -435,55 +475,67 @@ bool expr2smvt::convert(
435
475
return convert_norep (src, dest, precedence);
436
476
else
437
477
return convert_unary (
438
- to_unary_minus_expr (src), dest, " -" , precedence = 17 );
478
+ to_unary_minus_expr (src), dest, " -" , precedence = precedencet::UMINUS );
439
479
}
440
480
441
481
else if (src.id ()==ID_index)
442
- return convert_index (to_index_expr (src), dest, precedence = 20 );
482
+ return convert_index (
483
+ to_index_expr (src), dest, precedence = precedencet::INDEX);
443
484
444
485
else if (src.id ()==ID_mult || src.id ()==ID_div)
445
- return convert_binary (src, dest, src.id_string (), precedence=16 );
486
+ return convert_binary (
487
+ src, dest, src.id_string (), precedence = precedencet::MULT);
446
488
447
489
else if (src.id ()==ID_lt || src.id ()==ID_gt ||
448
490
src.id ()==ID_le || src.id ()==ID_ge)
449
- return convert_binary (src, dest, src.id_string (), precedence=11 );
491
+ return convert_binary (
492
+ src, dest, src.id_string (), precedence = precedencet::REL);
450
493
451
494
else if (src.id ()==ID_equal)
452
495
{
453
496
if (src.get_bool (ID_C_smv_iff))
454
- return convert_binary (src, dest, " <->" , precedence = 16 );
497
+ return convert_binary (src, dest, " <->" , precedence = precedencet::IFF );
455
498
else
456
- return convert_binary (src, dest, " =" , precedence = 11 );
499
+ return convert_binary (src, dest, " =" , precedence = precedencet::REL );
457
500
}
458
501
459
502
else if (src.id ()==ID_notequal)
460
- return convert_binary (src, dest, " !=" , precedence= 11 );
503
+ return convert_binary (src, dest, " !=" , precedence = precedencet::REL );
461
504
462
505
else if (src.id ()==ID_not)
463
- return convert_unary (to_not_expr (src), dest, " !" , precedence = 6 );
506
+ return convert_unary (
507
+ to_not_expr (src), dest, " !" , precedence = precedencet::NOT);
464
508
465
509
else if (src.id ()==ID_and)
466
- return convert_binary (src, dest, " &" , precedence= 5 );
510
+ return convert_binary (src, dest, " &" , precedence = precedencet::AND );
467
511
468
512
else if (src.id ()==ID_or)
469
- return convert_binary (src, dest, " |" , precedence= 4 );
513
+ return convert_binary (src, dest, " |" , precedence = precedencet::OR );
470
514
471
515
else if (src.id ()==ID_implies)
472
- return convert_binary (src, dest, " ->" , precedence= 2 );
516
+ return convert_binary (src, dest, " ->" , precedence = precedencet::IMPLIES );
473
517
474
518
else if (
475
519
src.id () == ID_AG || src.id () == ID_EG || src.id () == ID_AF ||
476
520
src.id () == ID_EF || src.id () == ID_AX || src.id () == ID_EX ||
477
521
src.id () == ID_G || src.id () == ID_F || src.id () == ID_X)
522
+ {
478
523
return convert_unary (
479
- to_unary_expr (src), dest, src.id_string () + " " , precedence = 7 );
524
+ to_unary_expr (src),
525
+ dest,
526
+ src.id_string () + " " ,
527
+ precedence = precedencet::TEMPORAL);
528
+ }
480
529
481
530
else if (
482
531
src.id () == ID_AU || src.id () == ID_EU || src.id () == ID_AR ||
483
532
src.id () == ID_ER || src.id () == ID_U || src.id () == ID_R)
484
533
{
485
534
return convert_binary (
486
- to_binary_expr (src), dest, src.id_string (), precedence = 7 );
535
+ to_binary_expr (src),
536
+ dest,
537
+ src.id_string (),
538
+ precedence = precedencet::TEMPORAL);
487
539
}
488
540
489
541
else if (src.id ()==ID_symbol)
@@ -530,7 +582,7 @@ Function: expr2smvt::convert
530
582
531
583
bool expr2smvt::convert (const exprt &src, std::string &dest)
532
584
{
533
- unsigned precedence;
585
+ precedencet precedence;
534
586
return convert (src, dest, precedence);
535
587
}
536
588
0 commit comments