@@ -12,6 +12,7 @@ Module Name:
12
12
--*/
13
13
14
14
#include " ast/ast_pp.h"
15
+ #include " ast/ast_ll_pp.h"
15
16
#include " ast/sls/bv_sls.h"
16
17
17
18
namespace bv {
@@ -178,7 +179,9 @@ namespace bv {
178
179
}
179
180
return m.are_equal (a, b);
180
181
}
182
+ case OP_DISTINCT:
181
183
default :
184
+ verbose_stream () << mk_bounded_pp (e, m) << " \n " ;
182
185
UNREACHABLE ();
183
186
break ;
184
187
}
@@ -511,14 +514,16 @@ namespace bv {
511
514
}
512
515
case OP_SIGN_EXT: {
513
516
auto & a = wval0 (e->get_arg (0 ));
514
- val.set (a.bits );
517
+ for (unsigned i = 0 ; i < a.bw ; ++i)
518
+ val.set (val.bits , i, a.get (a.bits , i));
515
519
bool sign = a.sign ();
516
520
val.set_range (val.bits , a.bw , val.bw , sign);
517
521
break ;
518
522
}
519
523
case OP_ZERO_EXT: {
520
524
auto & a = wval0 (e->get_arg (0 ));
521
- val.set (a.bits );
525
+ for (unsigned i = 0 ; i < a.bw ; ++i)
526
+ val.set (val.bits , i, a.get (a.bits , i));
522
527
val.set_range (val.bits , a.bw , val.bw , false );
523
528
break ;
524
529
}
@@ -1268,6 +1273,7 @@ namespace bv {
1268
1273
a.set (m_tmp, i, e.get (e.bits , i - sh));
1269
1274
for (unsigned i = 0 ; i < sh; ++i)
1270
1275
a.set (m_tmp, i, a.get (a.bits , i));
1276
+ a.clear_overflow_bits (m_tmp);
1271
1277
return a.try_set (m_tmp);
1272
1278
}
1273
1279
}
@@ -1500,7 +1506,7 @@ namespace bv {
1500
1506
}
1501
1507
1502
1508
bool sls_eval::try_repair_zero_ext (bvval const & e, bvval& a) {
1503
- for (unsigned i = 0 ; i < e .bw ; ++i)
1509
+ for (unsigned i = 0 ; i < a .bw ; ++i)
1504
1510
if (!a.get (a.fixed , i))
1505
1511
a.set (a.bits , i, e.get (e.bits , i));
1506
1512
return true ;
@@ -1509,21 +1515,25 @@ namespace bv {
1509
1515
bool sls_eval::try_repair_concat (bvval const & e, bvval& a, bvval& b, unsigned i) {
1510
1516
if (i == 0 ) {
1511
1517
for (unsigned i = 0 ; i < a.bw ; ++i)
1512
- if (!a.get (a.fixed , i))
1513
- a.set (a.bits , i, e.get (e.bits , i + b.bw ));
1518
+ a.set (m_tmp, i, e.get (e.bits , i + b.bw ));
1519
+ a.clear_overflow_bits (m_tmp);
1520
+ a.set_repair (random_bool (), m_tmp);
1514
1521
}
1515
1522
else {
1516
1523
for (unsigned i = 0 ; i < b.bw ; ++i)
1517
- if (!b.get (b.fixed , i))
1518
- b.set (b.bits , i, e.get (e.bits , i));
1524
+ b.set (m_tmp, i, e.get (e.bits , i));
1525
+ b.clear_overflow_bits (m_tmp);
1526
+ b.set_repair (random_bool (), m_tmp);
1519
1527
}
1520
1528
return true ;
1521
1529
}
1522
1530
1523
1531
bool sls_eval::try_repair_extract (bvval const & e, bvval& a, unsigned lo) {
1524
1532
for (unsigned i = 0 ; i < e.bw ; ++i)
1525
- if (!a.get (a.fixed , i + lo))
1526
- a.set (a.bits , i + lo, e.get (e.bits , i));
1533
+ if (a.get (a.fixed , i + lo) && a.get (a.bits , i + lo) != e.get (e.bits , i))
1534
+ return false ;
1535
+ for (unsigned i = 0 ; i < e.bw ; ++i)
1536
+ a.set (a.bits , i + lo, e.get (e.bits , i));
1527
1537
return true ;
1528
1538
}
1529
1539
@@ -1547,12 +1557,18 @@ namespace bv {
1547
1557
}
1548
1558
}
1549
1559
1550
- void sls_eval::repair_up (expr* e) {
1560
+ bool sls_eval::repair_up (expr* e) {
1551
1561
if (!is_app (e))
1552
- return ;
1553
- if (m.is_bool (e))
1554
- set (e, bval1 (to_app (e)));
1555
- else if (bv.is_bv (e))
1556
- wval0 (e).set (wval1 (to_app (e)));
1562
+ return false ;
1563
+ if (m.is_bool (e)) {
1564
+ auto b = bval1 (to_app (e));
1565
+ if (is_fixed0 (e))
1566
+ return b == bval0 (e);
1567
+ m_eval[e->get_id ()] = b;
1568
+ return true ;
1569
+ }
1570
+ if (bv.is_bv (e))
1571
+ return wval0 (e).try_set (wval1 (to_app (e)));
1572
+ return false ;
1557
1573
}
1558
1574
}
0 commit comments