8
8
9
9
#include " expr2smv.h"
10
10
11
+ #include < util/arith_tools.h>
12
+ #include < util/bitvector_types.h>
11
13
#include < util/lispexpr.h>
12
14
#include < util/lispirep.h>
13
15
#include < util/namespace.h>
@@ -114,7 +116,7 @@ class expr2smvt
114
116
precedencet &precedence);
115
117
116
118
bool convert_constant (
117
- const exprt &src ,
119
+ const constant_exprt & ,
118
120
std::string &dest,
119
121
precedencet &precedence);
120
122
@@ -508,14 +510,13 @@ Function: expr2smvt::convert_constant
508
510
\*******************************************************************/
509
511
510
512
bool expr2smvt::convert_constant (
511
- const exprt &src,
513
+ const constant_exprt &src,
512
514
std::string &dest,
513
515
precedencet &precedence)
514
516
{
515
517
precedence = precedencet::MAX;
516
518
517
- const typet &type=src.type ();
518
- const std::string &value=src.get_string (ID_value);
519
+ const typet &type = src.type ();
519
520
520
521
if (type.id ()==ID_bool)
521
522
{
@@ -528,7 +529,19 @@ bool expr2smvt::convert_constant(
528
529
type.id ()==ID_natural ||
529
530
type.id ()==ID_range ||
530
531
type.id ()==ID_enumeration)
531
- dest=value;
532
+ {
533
+ dest = id2string (src.get_value ());
534
+ }
535
+ else if (type.id () == ID_signedbv || type.id () == ID_unsignedbv)
536
+ {
537
+ auto value_int = numeric_cast_v<mp_integer>(src);
538
+ auto value_abs = value_int < 0 ? -value_int : value_int;
539
+ auto minus = value_int < 0 ? " -" : " " ;
540
+ auto sign_specifier = type.id () == ID_signedbv ? ' s' : ' u' ;
541
+ auto word_width = to_bitvector_type (type).width ();
542
+ dest = minus + std::string (" 0" ) + sign_specifier + ' d' +
543
+ std::to_string (word_width) + ' _' + integer2string (value_abs);
544
+ }
532
545
else
533
546
return convert_norep (src, dest, precedence);
534
547
@@ -611,20 +624,25 @@ bool expr2smvt::convert(
611
624
return convert_unary (
612
625
to_not_expr (src), dest, " !" , precedence = precedencet::NOT);
613
626
614
- else if (src.id ()== ID_and)
627
+ else if (src.id () == ID_and || src. id () == ID_bitand )
615
628
return convert_binary (src, dest, " &" , precedence = precedencet::AND);
616
629
617
- else if (src.id ()== ID_or)
630
+ else if (src.id () == ID_or || src. id () == ID_bitor )
618
631
return convert_binary (src, dest, " |" , precedence = precedencet::OR);
619
632
620
- else if (src.id ()== ID_implies)
633
+ else if (src.id () == ID_implies || src. id () == ID_smv_bitimplies )
621
634
return convert_binary (src, dest, " ->" , precedence = precedencet::IMPLIES);
622
635
623
- else if (src.id () == ID_xor)
636
+ else if (src.id () == ID_xor || src. id () == ID_bitxor )
624
637
return convert_binary (src, dest, " xor" , precedence = precedencet::OR);
625
638
626
- else if (src.id () == ID_xnor)
627
- return convert_binary (src, dest, " xnor" , precedence = precedencet::OR);
639
+ else if (src.id () == ID_xnor || src.id () == ID_bitxnor)
640
+ {
641
+ if (src.get_bool (ID_C_smv_iff))
642
+ return convert_binary (src, dest, " <->" , precedence = precedencet::IFF);
643
+ else
644
+ return convert_binary (src, dest, " xnor" , precedence = precedencet::OR);
645
+ }
628
646
629
647
else if (
630
648
src.id () == ID_AG || src.id () == ID_EG || src.id () == ID_AF ||
@@ -716,7 +734,7 @@ bool expr2smvt::convert(
716
734
return convert_next_symbol (src, dest, precedence);
717
735
718
736
else if (src.id ()==ID_constant)
719
- return convert_constant (src, dest, precedence);
737
+ return convert_constant (to_constant_expr ( src) , dest, precedence);
720
738
721
739
else if (src.id ()==" smv_nondet_choice" )
722
740
return convert_nondet_choice (src, dest, precedence);
@@ -736,6 +754,24 @@ bool expr2smvt::convert(
736
754
else if (src.id ()==ID_cond)
737
755
return convert_cond (src, dest);
738
756
757
+ else if (src.id () == ID_concatenation)
758
+ {
759
+ return convert_binary (
760
+ to_binary_expr (src), dest, " ::" , precedence = precedencet::CONCAT);
761
+ }
762
+
763
+ else if (src.id () == ID_shl)
764
+ {
765
+ return convert_binary (
766
+ to_binary_expr (src), dest, " <<" , precedence = precedencet::SHIFT);
767
+ }
768
+
769
+ else if (src.id () == ID_lshr || src.id () == ID_ashr)
770
+ {
771
+ return convert_binary (
772
+ to_binary_expr (src), dest, " >>" , precedence = precedencet::SHIFT);
773
+ }
774
+
739
775
else // no SMV language expression for internal representation
740
776
return convert_norep (src, dest, precedence);
741
777
@@ -838,6 +874,16 @@ bool type2smv(const typet &type, std::string &code, const namespacet &ns)
838
874
code+=' )' ;
839
875
}
840
876
}
877
+ else if (type.id () == ID_signedbv)
878
+ {
879
+ code =
880
+ " signed word[" + std::to_string (to_signedbv_type (type).width ()) + ' ]' ;
881
+ }
882
+ else if (type.id () == ID_unsignedbv)
883
+ {
884
+ code =
885
+ " unsigned word[" + std::to_string (to_unsignedbv_type (type).width ()) + ' ]' ;
886
+ }
841
887
else
842
888
return true ;
843
889
0 commit comments