@@ -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
+ TEMP = 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,53 +475,65 @@ 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
- return convert_binary (src, dest, " =" , precedence= 11 );
495
+ return convert_binary (src, dest, " =" , precedence = precedencet::REL );
453
496
454
497
else if (src.id ()==ID_notequal)
455
- return convert_binary (src, dest, " !=" , precedence= 11 );
498
+ return convert_binary (src, dest, " !=" , precedence = precedencet::REL );
456
499
457
500
else if (src.id ()==ID_not)
458
- return convert_unary (to_not_expr (src), dest, " !" , precedence = 6 );
501
+ return convert_unary (
502
+ to_not_expr (src), dest, " !" , precedence = precedencet::NOT);
459
503
460
504
else if (src.id ()==ID_and)
461
- return convert_binary (src, dest, " &" , precedence= 5 );
505
+ return convert_binary (src, dest, " &" , precedence = precedencet::AND );
462
506
463
507
else if (src.id ()==ID_or)
464
- return convert_binary (src, dest, " |" , precedence= 4 );
508
+ return convert_binary (src, dest, " |" , precedence = precedencet::OR );
465
509
466
510
else if (src.id ()==ID_implies)
467
- return convert_binary (src, dest, " ->" , precedence= 2 );
511
+ return convert_binary (src, dest, " ->" , precedence = precedencet::IMPLIES );
468
512
469
513
else if (src.id ()==ID_iff)
470
- return convert_binary (src, dest, " <->" , precedence= 3 );
514
+ return convert_binary (src, dest, " <->" , precedence = precedencet::IFF );
471
515
472
516
else if (
473
517
src.id () == ID_AG || src.id () == ID_EG || src.id () == ID_AF ||
474
518
src.id () == ID_EF || src.id () == ID_AX || src.id () == ID_EX ||
475
519
src.id () == ID_G || src.id () == ID_F || src.id () == ID_X)
520
+ {
476
521
return convert_unary (
477
- to_unary_expr (src), dest, src.id_string () + " " , precedence = 7 );
522
+ to_unary_expr (src),
523
+ dest,
524
+ src.id_string () + " " ,
525
+ precedence = precedencet::TEMP);
526
+ }
478
527
479
528
else if (
480
529
src.id () == ID_AU || src.id () == ID_EU || src.id () == ID_AR ||
481
530
src.id () == ID_ER || src.id () == ID_U || src.id () == ID_R)
482
531
{
483
532
return convert_binary (
484
- to_binary_expr (src), dest, src.id_string (), precedence = 7 );
533
+ to_binary_expr (src),
534
+ dest,
535
+ src.id_string (),
536
+ precedence = precedencet::TEMP);
485
537
}
486
538
487
539
else if (src.id ()==ID_symbol)
@@ -528,7 +580,7 @@ Function: expr2smvt::convert
528
580
529
581
bool expr2smvt::convert (const exprt &src, std::string &dest)
530
582
{
531
- unsigned precedence;
583
+ precedencet precedence;
532
584
return convert (src, dest, precedence);
533
585
}
534
586
0 commit comments