30bool is_valid_bin_str(
const std::string &str) {
31 for (
const char &c : str) {
32 if (c !=
'0' && c !=
'1')
38bool is_valid_dec_str(
const std::string &str) {
39 for (
size_t i = str[0] ==
'-' ? 1 : 0, n = str.size(); i < n; ++i) {
40 if (str[i] <
'0' || str[i] >
'9')
46bool is_valid_hex_str(
const std::string &str) {
47 for (
size_t i = 0, n = str.size(); i < n; ++i) {
48 if ((str[i] <
'0' || str[i] >
'9') && (str[i] <
'a' || str[i] >
'f') &&
49 (str[i] <
'A' || str[i] >
'F')) {
57#if !defined(__GNUC__) && !defined(__clang__)
58static uint64_t clz_limb(uint64_t nbits_per_limb, mp_limb_t limb) {
62 for (w = 0, mask = 0; w < nbits_per_limb; ++w) {
64 if ((limb & ~mask) == 0)
67 return nbits_per_limb - 1 - w;
154 assert(!
c.is_null());
155 assert(!
t.is_null());
157 assert(
c.d_size == 1);
159 return c.is_true() ?
t : e;
173 assert(!value.empty());
247 if (
other.is_null()) {
266 if (
other.is_gmp()) {
276 if (
other.is_gmp()) {
296 if (
other.is_null()) {
305 if (
other.is_gmp()) {
313 if (!
other.is_gmp()) {
330 res =
d_size * util::hash::s_hash_primes[
j++];
336 p0 = util::hash::s_hash_primes[
j++];
337 if (
j == util::hash::s_n_primes)
339 p1 = util::hash::s_hash_primes[
j++];
340 if (
j == util::hash::s_n_primes)
343 x = ((
x >> 16) ^
x) *
p0;
344 x = ((
x >> 16) ^
x) *
p1;
345 res = ((
x >> 16) ^
x);
365 assert(!
bv.is_null());
383 return !
bv.is_null();
392 std::stringstream
res;
394 assert(
tmp[0] !=
'-');
412 std::stringstream
res;
433 assert(!
bv.is_null());
454 assert(!
bv.is_null());
982 assert(!
bv.is_null());
998 assert(!
bv.is_null());
1020 assert(!
bv.is_null());
1042 assert(!
bv.is_null());
1064 assert(!
bv.is_null());
1077 assert(!
bv.is_null());
1089 else if (
bv.d_val_uint64 != 0) {
1100 assert(!
bv.is_null());
1105 else if (
bv.d_val_uint64 != 0) {
1120 assert(!
bv.is_null());
1129 assert(!
bv0.is_null());
1130 assert(!
bv1.is_null());
1131 assert(
bv0.d_size ==
bv1.d_size);
1154 assert(!
bv0.is_null());
1155 assert(!
bv1.is_null());
1156 assert(
bv0.d_size ==
bv1.d_size);
1179 assert(!
bv0.is_null());
1180 assert(!
bv1.is_null());
1181 assert(
bv0.d_size ==
bv1.d_size);
1204 assert(!
bv0.is_null());
1205 assert(!
bv1.is_null());
1206 assert(
bv0.d_size == 1);
1207 assert(
bv1.d_size == 1);
1209 if (
bv0.is_false() ||
bv1.is_true()) {
1220 assert(!
bv0.is_null());
1221 assert(!
bv1.is_null());
1222 assert(
bv0.d_size ==
bv1.d_size);
1246 assert(!
bv0.is_null());
1247 assert(!
bv1.is_null());
1248 assert(
bv0.d_size ==
bv1.d_size);
1272 assert(!
bv0.is_null());
1273 assert(!
bv1.is_null());
1274 assert(
bv0.d_size ==
bv1.d_size);
1297 assert(!
bv0.is_null());
1298 assert(!
bv1.is_null());
1299 assert(
bv0.d_size ==
bv1.d_size);
1323 assert(!
bv0.is_null());
1324 assert(!
bv1.is_null());
1325 assert(
bv0.d_size ==
bv1.d_size);
1348 assert(!
bv0.is_null());
1349 assert(!
bv1.is_null());
1350 assert(
bv0.d_size ==
bv1.d_size);
1357 else if (
bv0.d_val_uint64 ==
bv1.d_val_uint64) {
1368 assert(!
bv0.is_null());
1369 assert(!
bv1.is_null());
1370 assert(
bv0.d_size ==
bv1.d_size);
1377 else if (
bv0.d_val_uint64 !=
bv1.d_val_uint64) {
1388 assert(!
bv0.is_null());
1389 assert(!
bv1.is_null());
1390 assert(
bv0.d_size ==
bv1.d_size);
1397 else if (
bv0.d_val_uint64 <
bv1.d_val_uint64) {
1408 assert(!
bv0.is_null());
1409 assert(!
bv1.is_null());
1410 assert(
bv0.d_size ==
bv1.d_size);
1417 else if (
bv0.d_val_uint64 <=
bv1.d_val_uint64) {
1428 assert(!
bv0.is_null());
1429 assert(!
bv1.is_null());
1430 assert(
bv0.d_size ==
bv1.d_size);
1437 else if (
bv0.d_val_uint64 >
bv1.d_val_uint64) {
1448 assert(!
bv0.is_null());
1449 assert(!
bv1.is_null());
1450 assert(
bv0.d_size ==
bv1.d_size);
1457 else if (
bv0.d_val_uint64 >=
bv1.d_val_uint64) {
1468 assert(!
bv0.is_null());
1469 assert(!
bv1.is_null());
1470 assert(
bv0.d_size ==
bv1.d_size);
1492 assert(!
bv0.is_null());
1493 assert(!
bv1.is_null());
1494 assert(
bv0.d_size ==
bv1.d_size);
1516 assert(!
bv0.is_null());
1517 assert(!
bv1.is_null());
1518 assert(
bv0.d_size ==
bv1.d_size);
1540 assert(!
bv0.is_null());
1541 assert(!
bv1.is_null());
1542 assert(
bv0.d_size ==
bv1.d_size);
1564 assert(!
bv.is_null());
1596 assert(!
bv.is_null());
1597 assert(!
shift.is_null());
1598 assert(
bv.d_size ==
shift.d_size);
1625 assert(!
bv.is_null());
1656 assert(!
bv.is_null());
1657 assert(!
shift.is_null());
1658 assert(
bv.d_size ==
shift.d_size);
1685 assert(!
bv.is_null());
1697 assert(!
bv.is_null());
1698 assert(!
shift.is_null());
1699 assert(
bv.d_size ==
shift.d_size);
1702 if (&
shift ==
this) {
1718 assert(!
bv0.is_null());
1719 assert(!
bv1.is_null());
1720 assert(
bv0.d_size ==
bv1.d_size);
1743 assert(!
bv0.is_null());
1744 assert(!
bv1.is_null());
1745 assert(
bv0.d_size ==
bv1.d_size);
1753 if (
bv1.is_zero()) {
1767 if (
bv1.is_zero()) {
1779 assert(!
bv0.is_null());
1780 assert(!
bv1.is_null());
1781 assert(
bv0.d_size ==
bv1.d_size);
1789 if (!
bv1.is_zero()) {
1801 if (!
bv1.is_zero()) {
1814 assert(!
bv0.is_null());
1815 assert(!
bv1.is_null());
1816 assert(
bv0.d_size ==
bv1.d_size);
1851 assert(!
bv0.is_null());
1852 assert(!
bv1.is_null());
1853 assert(
bv0.d_size ==
bv1.d_size);
1887 assert(!
bv0.is_null());
1888 assert(!
bv1.is_null());
1889 assert(
bv0.d_size ==
bv1.d_size);
1936 assert(!
bv0.is_null());
1937 assert(!
bv1.is_null());
1938 assert(
bv0.d_size ==
bv1.d_size);
1949 assert(!
bv0.is_null());
1950 assert(!
bv1.is_null());
1951 assert(
bv0.d_size ==
bv1.d_size);
1962 assert(!
bv0.is_null());
1963 assert(!
bv1.is_null());
1964 assert(
bv0.d_size ==
bv1.d_size);
1975 assert(!
bv0.is_null());
1976 assert(!
bv1.is_null());
1977 assert(
bv0.d_size ==
bv1.d_size);
1988 assert(!
bv0.is_null());
1989 assert(!
bv1.is_null());
1990 assert(
bv0.d_size ==
bv1.d_size);
2001 assert(!
bv0.is_null());
2002 assert(!
bv1.is_null());
2003 assert(
bv0.d_size ==
bv1.d_size);
2014 assert(!
bv0.is_null());
2015 assert(!
bv1.is_null());
2016 assert(
bv0.d_size ==
bv1.d_size);
2027 assert(!
bv0.is_null());
2028 assert(!
bv1.is_null());
2081 assert(!
bv.is_null());
2133 assert(!
bv.is_null());
2135 if (
n == 0 && &
bv ==
this)
2182 assert(!
bv.is_null());
2242 else if (&
bv !=
this) {
2267 assert(!
bv.is_null());
2320 assert(!
bv.is_null());
2368 assert(!
bv.is_null());
2369 assert(!
n.is_null());
2370 assert(
bv.d_size ==
n.d_size);
2375 if (!
n.shift_is_uint64(&
in)) {
2387 assert(!
bv.is_null());
2435 assert(!
bv.is_null());
2436 assert(!
n.is_null());
2437 assert(
bv.d_size ==
n.d_size);
2442 if (!
n.shift_is_uint64(&
in)) {
2454 assert(!
c.is_null());
2455 assert(!
t.is_null());
2457 assert(
c.d_size == 1);
2495 assert(!
bv.is_null());
2558 b.d_val_uint64 =
pb->d_val_uint64;
2564 while (!
b.is_zero()) {
2888 assert(
base.is_gmp());
2892 assert(!
base.is_gmp());
2912 assert(!
bv.is_null());
2925 if (
this ==
quot ||
this ==
rem) {
2971#define BZLA_BV_MASK_BITS_UINT64(size)
2996#if defined(__GNUC__) || defined(__clang__)
3095 assert(
shift.d_size <= 64);
BitVector & ibvsext(const BitVector &bv, uint64_t n)
BitVector bvmodinv() const
static BitVector mk_min_signed(uint64_t size)
BitVector bvumulo(const BitVector &bv) const
BitVector & ibveq(const BitVector &bv0, const BitVector &bv1)
BitVector bvredor() const
BitVector bvshl(uint64_t shift) const
BitVector bvudiv(const BitVector &bv) const
BitVector & ibvpow(const BitVector &base, const mpz_t exp)
uint64_t to_uint64(bool truncate=false) const
BitVector & ibvsdivo(const BitVector &bv0, const BitVector &bv1)
BitVector & ibvule(const BitVector &bv0, const BitVector &bv1)
BitVector bvusubo(const BitVector &bv) const
BitVector bvand(const BitVector &bv) const
BitVector & ibvsrem(const BitVector &bv0, const BitVector &bv1)
BitVector bvroli(uint64_t n) const
BitVector & ibvsub(const BitVector &bv0, const BitVector &bv1)
static BitVector mk_max_signed(uint64_t size)
BitVector bvslt(const BitVector &bv) const
uint64_t count_leading_ones() const
BitVector & ibvult(const BitVector &bv0, const BitVector &bv1)
static BitVector mk_one(uint64_t size)
BitVector & ibvsgt(const BitVector &bv0, const BitVector &bv1)
BitVector & ibvinc(const BitVector &bv)
BitVector & ibvsmod(const BitVector &bv0, const BitVector &bv1)
BitVector & ibvuaddo(const BitVector &bv0, const BitVector &bv1)
BitVector bvextract(uint64_t idx_hi, uint64_t idx_lo) const
BitVector bvshr(uint64_t shift) const
BitVector & ibvzext(const BitVector &bv, uint64_t n)
BitVector bvredand() const
static BitVector from_si(uint64_t size, int64_t value, bool truncate=false)
static uint64_t uint64_fdiv_r_2exp(uint64_t size, uint64_t val)
BitVector & ibvmodinv(const BitVector &bv)
uint64_t count_trailing_zeros() const
uint64_t count_trailing_ones() const
BitVector bvashr(uint64_t shift) const
bool operator!=(const BitVector &bv) const
bool is_min_signed() const
BitVector bvsle(const BitVector &bv) const
BitVector & ibvrori(const BitVector &bv, uint64_t n)
BitVector bveq(const BitVector &bv) const
BitVector & ibvxor(const BitVector &bv0, const BitVector &bv1)
BitVector bvsub(const BitVector &bv) const
BitVector bvnand(const BitVector &bv) const
BitVector & operator=(const BitVector &other)
bool is_sadd_overflow(const BitVector &bv) const
bool is_uadd_overflow(const BitVector &bv) const
BitVector & ibvnand(const BitVector &bv0, const BitVector &bv1)
static BitVector mk_ones(uint64_t size)
BitVector & ibvnot(const BitVector &bv)
BitVector & ibvite(const BitVector &c, const BitVector &t, const BitVector &e)
BitVector & ibvudiv(const BitVector &bv0, const BitVector &bv1)
BitVector bvsaddo(const BitVector &bv) const
BitVector bvsdiv(const BitVector &bv) const
BitVector & ibvxnor(const BitVector &bv0, const BitVector &bv1)
BitVector bvrori(uint64_t n) const
BitVector bvconcat(const BitVector &bv) const
BitVector & ibvor(const BitVector &bv0, const BitVector &bv1)
BitVector bvule(const BitVector &bv) const
BitVector & ibvredand(const BitVector &bv)
void flip_bit(uint64_t idx)
BitVector bvsext(uint64_t n) const
static BitVector mk_false()
BitVector bvurem(const BitVector &bv) const
bool is_sdiv_overflow(const BitVector &bv) const
void set_bit(uint64_t idx, bool value)
BitVector bvuge(const BitVector &bv) const
BitVector & ibvredxor(const BitVector &bv)
bool is_smul_overflow(const BitVector &bv) const
uint64_t get_limb(void *limb, uint64_t nbits_rem, bool zeros) const
uint64_t count_leading_zeros() const
BitVector bvsdivo(const BitVector &bv) const
BitVector & ibvuge(const BitVector &bv0, const BitVector &bv1)
BitVector & ibvextract(const BitVector &bv, uint64_t idx_hi, uint64_t idx_lo)
BitVector & ibvashr(const BitVector &bv, uint64_t shift)
BitVector & ibvsge(const BitVector &bv0, const BitVector &bv1)
static BitVector mk_zero(uint64_t size)
BitVector bvpow(const mpz_t exp) const
BitVector bvzext(uint64_t n) const
BitVector & ibvnor(const BitVector &bv0, const BitVector &bv1)
BitVector bvor(const BitVector &bv) const
void bvudivurem(const BitVector &bv, BitVector *quot, BitVector *rem) const
BitVector bvmul(const BitVector &bv) const
BitVector bvrol(const BitVector &n) const
std::string str(uint32_t base=2) const
BitVector & ibvumulo(const BitVector &bv0, const BitVector &bv1)
int32_t compare(const BitVector &bv) const
uint64_t count_leading(bool zeros) const
BitVector bvssubo(const BitVector &bv) const
BitVector bvxnor(const BitVector &bv) const
static BitVector mk_true()
bool is_power_of_two() const
BitVector bvsge(const BitVector &bv) const
BitVector & ibvsaddo(const BitVector &bv0, const BitVector &bv1)
BitVector & ibvadd(const BitVector &bv0, const BitVector &bv1)
BitVector & ibvsle(const BitVector &bv0, const BitVector &bv1)
BitVector bvnor(const BitVector &bv) const
static BitVector from_ui(uint64_t size, uint64_t value, bool truncate=false)
BitVector bvrepeat(uint64_t n) const
BitVector bvuaddo(const BitVector &bv) const
bool operator==(const BitVector &bv) const
BitVector bvsmulo(const BitVector &bv) const
BitVector bvredxor() const
BitVector & ibvrepeat(const BitVector &bv, uint64_t n)
BitVector & ibvneg(const BitVector &bv)
BitVector & ibvugt(const BitVector &bv0, const BitVector &bv1)
BitVector bvsmod(const BitVector &bv) const
void iset(uint64_t value)
BitVector & ibvsdiv(const BitVector &bv0, const BitVector &bv1)
BitVector & ibvshr(const BitVector &bv, uint64_t shift)
BitVector & ibvnego(const BitVector &bv)
BitVector & ibvslt(const BitVector &bv0, const BitVector &bv1)
BitVector bvadd(const BitVector &bv) const
BitVector & ibvroli(const BitVector &bv, uint64_t n)
BitVector & ibvimplies(const BitVector &bv0, const BitVector &bv1)
BitVector bvugt(const BitVector &bv) const
BitVector & ibvand(const BitVector &bv0, const BitVector &bv1)
BitVector & ibvrol(const BitVector &bv, const BitVector &n)
BitVector & ibvror(const BitVector &bv, const BitVector &n)
BitVector & ibvconcat(const BitVector &bv0, const BitVector &bv1)
BitVector bvimplies(const BitVector &bv) const
BitVector bvsrem(const BitVector &bv) const
bool shift_is_uint64(uint64_t *res) const
bool is_usub_overflow(const BitVector &bv) const
BitVector & ibvsmulo(const BitVector &bv0, const BitVector &bv1)
BitVector bvsgt(const BitVector &bv) const
BitVector & ibvredor(const BitVector &bv)
BitVector bvxor(const BitVector &bv) const
static BitVector bvite(const BitVector &c, const BitVector &t, const BitVector &e)
BitVector & ibvdec(const BitVector &bv)
BitVector bvult(const BitVector &bv) const
BitVector & ibvurem(const BitVector &bv0, const BitVector &bv1)
bool is_max_signed() const
bool is_neg_overflow() const
static constexpr size_t s_native_size
BitVector & ibvssubo(const BitVector &bv0, const BitVector &bv1)
bool is_ssub_overflow(const BitVector &bv) const
BitVector & ibvne(const BitVector &bv0, const BitVector &bv1)
BitVector & ibvusubo(const BitVector &bv0, const BitVector &bv1)
static bool fits_in_size(uint64_t size, const std::string &str, uint32_t base)
const mpz_t & gmp_value() const
int32_t signed_compare(const BitVector &bv) const
BitVector bvror(const BitVector &n) const
BitVector & ibvshl(const BitVector &bv, uint64_t shift)
BitVector bvne(const BitVector &bv) const
BitVector & ibvmul(const BitVector &bv0, const BitVector &bv1)
bool bit(uint64_t idx) const
bool is_umul_overflow(const BitVector &bv) const
std::ostream & operator<<(std::ostream &out, const BitVector &bv)
mpz_class uint64_to_mpz_class(uint64_t op)
void mpz_set_ull(mpz_t rop, uint64_t op)
void mpz_fdiv_r_2exp_ull(mpz_t r, const mpz_t n, uint64_t b)
void mpz_init_set_sll(mpz_t rop, int64_t op)
void mpz_fdiv_q_2exp_ull(mpz_t q, const mpz_t n, uint64_t b)
uint64_t mpz_get_ull(const mpz_t op)
void mpz_init_set_ull(mpz_t rop, uint64_t op)
size_t mpz_hash(const mpz_t op, uint64_t start)
void mpz_mul_2exp_ull(mpz_t rop, const mpz_t op1, uint64_t op2)