@@ -1118,6 +1118,17 @@ namespace z3 {
1118
1118
friend expr min (expr const & a, expr const & b);
1119
1119
friend expr max (expr const & a, expr const & b);
1120
1120
1121
+ friend expr bv2int (expr const & a, bool is_signed);
1122
+ friend expr int2bv (expr const & a, unsigned n);
1123
+ friend expr bvadd_no_overflow (expr const & a, expr const & b);
1124
+ friend expr bvadd_no_underflow (expr const & a, expr const & b);
1125
+ friend expr bvsub_no_overflow (expr const & a, expr const & b);
1126
+ friend expr bvsub_no_underflow (expr const & a, expr const & b);
1127
+ friend expr bvsdiv_no_overflow (expr const & a, expr const & b);
1128
+ friend expr bvneg_no_overflow (expr const & a);
1129
+ friend expr bvmul_no_overflow (expr const & a, expr const & b, bool is_signed);
1130
+ friend expr bvmul_no_underflow (expr const & a, expr const & b);
1131
+
1121
1132
expr rotate_left (unsigned i) { Z3_ast r = Z3_mk_rotate_left (ctx (), i, *this ); ctx ().check_error (); return expr (ctx (), r); }
1122
1133
expr rotate_right (unsigned i) { Z3_ast r = Z3_mk_rotate_right (ctx (), i, *this ); ctx ().check_error (); return expr (ctx (), r); }
1123
1134
expr repeat (unsigned i) { Z3_ast r = Z3_mk_repeat (ctx (), i, *this ); ctx ().check_error (); return expr (ctx (), r); }
@@ -1625,6 +1636,7 @@ namespace z3 {
1625
1636
return expr (a.ctx (), r);
1626
1637
}
1627
1638
1639
+
1628
1640
/* *
1629
1641
\brief Create the if-then-else expression <tt>ite(c, t, e)</tt>
1630
1642
@@ -1740,6 +1752,41 @@ namespace z3 {
1740
1752
*/
1741
1753
inline expr zext (expr const & a, unsigned i) { return to_expr (a.ctx (), Z3_mk_zero_ext (a.ctx (), i, a)); }
1742
1754
1755
+ /* *
1756
+ \brief bit-vector and integer conversions.
1757
+ */
1758
+ inline expr bv2int (expr const & a, bool is_signed) { Z3_ast r = Z3_mk_bv2int (a.ctx (), a, is_signed); a.check_error (); return expr (a.ctx (), r); }
1759
+ inline expr int2bv (expr const & a, unsigned n) { Z3_ast r = Z3_mk_intbv2 (a.ctx (), a, n); a.check_error (); return expr (a.ctx (), r); }
1760
+
1761
+ /* *
1762
+ \brief bit-vector overflow/underflow checks
1763
+ */
1764
+ inline expr bvadd_no_overflow (expr const & a, expr const & b) {
1765
+ check_context (a, b); Z3_ast r = Z3_mk_bvadd_no_overflow (a.ctx (), a, b); a.check_error (); return expr (a.ctx (), r);
1766
+ }
1767
+ inline expr bvadd_no_underflow (expr const & a, expr const & b) {
1768
+ check_context (a, b); Z3_ast r = Z3_mk_bvadd_no_underflow (a.ctx (), a, b); a.check_error (); return expr (a.ctx (), r);
1769
+ }
1770
+ inline expr bvsub_no_overflow (expr const & a, expr const & b) {
1771
+ check_context (a, b); Z3_ast r = Z3_mk_bvsub_no_overflow (a.ctx (), a, b); a.check_error (); return expr (a.ctx (), r);
1772
+ }
1773
+ inline expr bvsub_no_underflow (expr const & a, expr const & b) {
1774
+ check_context (a, b); Z3_ast r = Z3_mk_bvsub_no_underflow (a.ctx (), a, b); a.check_error (); return expr (a.ctx (), r);
1775
+ }
1776
+ inline expr bvsdiv_no_overflow (expr const & a, expr const & b) {
1777
+ check_context (a, b); Z3_ast r = Z3_mk_bvsdiv_no_overflow (a.ctx (), a, b); a.check_error (); return expr (a.ctx (), r);
1778
+ }
1779
+ inline expr bvneg_no_overflow (expr const & a) {
1780
+ Z3_ast r = Z3_mk_bvneg_no_overflow (a.ctx (), a, b); a.check_error (); return expr (a.ctx (), r);
1781
+ }
1782
+ inline expr bvmul_no_overflow (expr const & a, expr const & b, bool is_signed) {
1783
+ check_context (a, b); Z3_ast r = Z3_mk_bvmul_no_overflow (a.ctx (), a, b, is_signed); a.check_error (); return expr (a.ctx (), r);
1784
+ }
1785
+ inline expr bvmul_no_underflow (expr const & a, expr const & b) {
1786
+ check_context (a, b); Z3_ast r = Z3_mk_bvmul_no_underflow (a.ctx (), a, b); a.check_error (); return expr (a.ctx (), r);
1787
+ }
1788
+
1789
+
1743
1790
/* *
1744
1791
\brief Sign-extend of the given bit-vector to the (signed) equivalent bitvector of size m+i, where m is the size of the given bit-vector.
1745
1792
*/
0 commit comments