@@ -30,7 +30,7 @@ namespace bv {
30
30
continue ;
31
31
app* a = to_app (e);
32
32
if (bv.is_bv (e))
33
- add_bit_vector (e );
33
+ add_bit_vector (a );
34
34
if (a->get_family_id () == basic_family_id)
35
35
init_eval_basic (a);
36
36
else if (a->get_family_id () == bv.get_family_id ())
@@ -40,7 +40,7 @@ namespace bv {
40
40
auto & v = wval (e);
41
41
for (unsigned i = 0 ; i < v.bw ; ++i)
42
42
m_tmp.set (i, eval (e, i));
43
- v.set ( m_tmp);
43
+ v.set_repair ( random_bool (), m_tmp);
44
44
}
45
45
else if (m.is_bool (e))
46
46
m_eval.setx (e->get_id (), eval (e, 0 ), false );
@@ -78,16 +78,21 @@ namespace bv {
78
78
return m_todo;
79
79
}
80
80
81
- bool sls_eval::add_bit_vector (expr* e) {
82
- auto bw = bv.get_bv_size (e);
81
+ bool sls_eval::add_bit_vector (app* e) {
83
82
m_values.reserve (e->get_id () + 1 );
84
83
if (m_values.get (e->get_id ()))
85
84
return false ;
86
- m_values.set (e->get_id (), alloc_valuation (bw));
85
+ auto v = alloc_valuation (e);
86
+ m_values.set (e->get_id (), v);
87
+ if (bv.is_sign_ext (e)) {
88
+ unsigned p = e->get_parameter (0 ).get_int ();
89
+ v->set_signed (p);
90
+ }
87
91
return true ;
88
92
}
89
93
90
- sls_valuation* sls_eval::alloc_valuation (unsigned bit_width) {
94
+ sls_valuation* sls_eval::alloc_valuation (app* e) {
95
+ auto bit_width = bv.get_bv_size (e);
91
96
auto * r = alloc (sls_valuation, bit_width);
92
97
while (m_tmp.size () < 2 * r->nw ) {
93
98
m_tmp.push_back (0 );
@@ -905,8 +910,14 @@ namespace bv {
905
910
}
906
911
907
912
bool sls_eval::try_repair_eq (bool is_true, bvval& a, bvval const & b) {
908
- if (is_true)
909
- return a.try_set (b.bits ());
913
+ if (is_true) {
914
+ if (m_rand () % 20 != 0 )
915
+ if (a.try_set (b.bits ()))
916
+ return true ;
917
+
918
+ a.get_variant (m_tmp, m_rand);
919
+ return a.set_repair (random_bool (), m_tmp);
920
+ }
910
921
else {
911
922
bool try_above = m_rand () % 2 == 0 ;
912
923
if (try_above) {
@@ -1004,22 +1015,26 @@ namespace bv {
1004
1015
// If this fails, set a to a random value
1005
1016
//
1006
1017
bool sls_eval::try_repair_add (bvect const & e, bvval& a, bvval const & b) {
1007
- a.set_sub (m_tmp, e, b.bits ());
1008
- if (a.try_set (m_tmp))
1009
- return true ;
1018
+ if (m_rand () % 20 != 0 ) {
1019
+ a.set_sub (m_tmp, e, b.bits ());
1020
+ if (a.try_set (m_tmp))
1021
+ return true ;
1022
+ }
1010
1023
a.get_variant (m_tmp, m_rand);
1011
1024
return a.set_repair (random_bool (), m_tmp);
1012
1025
}
1013
1026
1014
1027
bool sls_eval::try_repair_sub (bvect const & e, bvval& a, bvval & b, unsigned i) {
1015
- if (i == 0 )
1016
- // e = a - b -> a := e + b
1017
- a.set_add (m_tmp, e, b.bits ());
1018
- else
1019
- // b := a - e
1020
- b.set_sub (m_tmp, a.bits (), e);
1021
- if (a.try_set (m_tmp))
1022
- return true ;
1028
+ if (m_rand () % 20 != 0 ) {
1029
+ if (i == 0 )
1030
+ // e = a - b -> a := e + b
1031
+ a.set_add (m_tmp, e, b.bits ());
1032
+ else
1033
+ // b := a - e
1034
+ b.set_sub (m_tmp, a.bits (), e);
1035
+ if (a.try_set (m_tmp))
1036
+ return true ;
1037
+ }
1023
1038
// fall back to a random value
1024
1039
a.get_variant (m_tmp, m_rand);
1025
1040
return a.set_repair (random_bool (), m_tmp);
@@ -1045,6 +1060,11 @@ namespace bv {
1045
1060
return a.set_repair (random_bool (), m_tmp);
1046
1061
}
1047
1062
1063
+ if (m_rand () % 20 == 0 ) {
1064
+ a.get_variant (m_tmp, m_rand);
1065
+ return a.set_repair (random_bool (), m_tmp);
1066
+ }
1067
+
1048
1068
#if 0
1049
1069
verbose_stream() << "solve for " << e << "\n";
1050
1070
@@ -1125,7 +1145,11 @@ namespace bv {
1125
1145
if (parity_e > 0 && parity_b > 0 )
1126
1146
b.shift_right (m_tmp2, std::min (parity_b, parity_e));
1127
1147
a.set_mul (m_tmp, tb, m_tmp2);
1128
- return a.set_repair (random_bool (), m_tmp);
1148
+ if (a.set_repair (random_bool (), m_tmp))
1149
+ return true ;
1150
+
1151
+ a.get_variant (m_tmp, m_rand);
1152
+ return a.set_repair (random_bool (), m_tmp);
1129
1153
}
1130
1154
1131
1155
bool sls_eval::try_repair_bnot (bvect const & e, bvval& a) {
0 commit comments