/* * Same thing for x and y stored as arrays of words */ static void test_shift(uint32_t *x, uint32_t *y, uint32_t n) { uint32_t lshl[2]; uint32_t lshr[2]; uint32_t ashr[2]; assert(0 < n && n <= 64); bvconst_normalize(x, n); bvconst_normalize(y, n); bvconst_lshl(lshl, x, y, n); bvconst_lshr(lshr, x, y, n); bvconst_ashr(ashr, x, y, n); printf(" a = "); bvconst_print(stdout, x, n); printf("\n"); printf(" b = "); bvconst_print(stdout, y, n); printf("\n"); printf(" lshl(a, b) = "); bvconst_print(stdout, lshl, n); printf("\n"); printf(" lshr(a, b) = "); bvconst_print(stdout, lshr, n); printf("\n"); printf(" ashr(a, b) = "); bvconst_print(stdout, ashr, n); printf("\n\n"); }
static void print_token(token_t tk) { uint32_t n; char *s; int32_t code; printf("---> Token %s\n", smt_token_to_string(tk)); printf(" pos = %"PRIu64", line = %"PRIu32", column = %"PRIu32"\n", lexer.tk_pos, lexer.tk_line, lexer.tk_column); n = current_token_length(&lexer); s = current_token_value(&lexer); if (n > 0) { printf(" value: %s\n", s); printf(" length: %"PRIu32"\n", n); } switch (tk) { case SMT_TK_BV_BINCONSTANT: if (n < 5) { printf("***** ERROR ******\n"); } else { n = n - 5; // remove bvbin prefix if (n < 100) { code = bvconst_set_from_string(bitvector, n, s + 5); if (code < 0) { printf("***** ERROR ******\n"); } else { printf(" val: "); bvconst_print(stdout, bitvector, n); printf("\n\n"); } } } break; case SMT_TK_BV_HEXCONSTANT: if (n < 5) { printf("***** ERROR ******\n"); } else { n = n - 5; // remove bvhex prefix and null terminator if (n < 100) { code = bvconst_set_from_hexa_string(bitvector, n, s + 5); if (code < 0) { printf("***** ERROR ******\n"); } else { printf(" val: "); bvconst_print(stdout, bitvector, 4 * n); printf("\n\n"); } } } break; } }
static void test_buffer(bvarith_buffer_t *b) { bvmlist_t *m; printf("Buffer %p: ", b); print_bvarith_buffer(stdout, b); printf("\n"); test_buffer_pred("is_zero", b, bvarith_buffer_is_zero); test_buffer_pred("is_constant", b, bvarith_buffer_is_constant); printf(" size: %"PRIu32"\n", bvarith_buffer_size(b)); printf(" bitsize: %"PRIu32"\n", bvarith_buffer_bitsize(b)); printf(" width: %"PRIu32"\n", bvarith_buffer_width(b)); printf(" degree: %"PRIu32"\n", bvarith_buffer_degree(b)); if (! bvarith_buffer_is_zero(b)) { printf(" main term: "); print_pprod0(stdout, bvarith_buffer_main_term(b)); printf("\n"); m = bvarith_buffer_main_mono(b); printf(" main monomial: "); bvconst_print(stdout, m->coeff, b->bitsize); printf(" * "); print_pprod0(stdout, m->prod); printf("\n"); } printf("---\n"); }
/* * Print buffer b */ static void print_bv_monomial(FILE *f, uint32_t *coeff, pprod_t *r, uint32_t n, bool first) { if (! first) { fprintf(f, " + "); } bvconst_print(f, coeff, n); if (! pp_is_empty(r)) { fprintf(f, " "); print_pprod0(f, r); } }
/* * Test convertions to mpz */ static void test_signed_conversion(uint32_t *a, uint32_t n) { mpz_t z; printf("Signed conversion: "); bvconst_print(stdout, a, n); signed_bv2mpz(z, n, a); printf(" = "); mpz_out_str(stdout, 10, z); printf("\n"); mpz_clear(z); }
static void test_set_extend(uint32_t size1, uint32_t size2) { uint32_t *bv1, *bv2; uint32_t i, w1, w2; assert(size1 >= size2); w1 = (size1 + 31) >> 5; w2 = (size2 + 31) >> 5; bv1 = bvconst_alloc(w1); bv2 = bvconst_alloc(w2); printf("=== test_set_extend: size1 = %"PRIu32", size2 = %"PRIu32" ===\n", size1, size2); for (i=0; i<20; i++) { random_vector(vector, size2); bvconst_set_array(bv2, vector, size2); printf("%"PRIu32" to %"PRIu32" bits\n", size2, size1); printf("bv2 = "); bvconst_print(stdout, bv2, size2); printf("\n"); bvconst_set_extend(bv1, size1, bv2, size2, 0); printf("ext(bv2, %"PRIu32", 0) = ", size1); bvconst_print(stdout, bv1, size1); printf("\n"); bvconst_set_extend(bv1, size1, bv2, size2, 1); printf("ext(bv2, %"PRIu32", 1) = ", size1); bvconst_print(stdout, bv1, size1); printf("\n"); bvconst_set_extend(bv1, size1, bv2, size2, -1); printf("sgnext(bv2, %"PRIu32", 0) = ", size1); bvconst_print(stdout, bv1, size1); printf("\n\n"); } printf("===\n"); bvconst_free(bv1, w1); bvconst_free(bv2, w2); }
static void print_bvmlist_mono(FILE *f, uint32_t *coeff, pprod_t *r, uint32_t n, bool first) { uint32_t w; w = (n + 31) >> 5; if (pp_is_empty(r)) { if (!first) fprintf(f, " + "); bvconst_print(f, coeff, n); } else if (bvconst_is_one(coeff, w)) { if (!first) fprintf(f, " + "); print_bv_pprod(f, r); } else if (bvconst_is_minus_one(coeff, n)) { if (!first) fprintf(f, " "); fprintf(f, "- "); print_bv_pprod(f, r); } else { if (!first) fprintf(f, " + "); bvconst_print(f, coeff, n); fprintf(f, " "); print_bv_pprod(f, r); } }
// monomial c * x: n = number of bits static void print_bv_mono(FILE *f, uint32_t *c, thvar_t x, uint32_t n, bool first) { uint32_t w; w = (n + 31) >> 5; // number of words in c if (bvconst_is_one(c, w)) { if (first) { if (x == const_idx) { fputs("1", f); } else { print_bvvar(f, x); } } else { fputs(" + ", f); print_bvvar(f, x); } } else if (bvconst_is_minus_one(c, n)) { if (first) { if (x == const_idx) { fputs("-1", f); } else { fputs("- ", f); print_bvvar(f, x); } } else { fputs(" - ", f); print_bvvar(f, x); } } else { if (! first) { fputs(" + ", f); } bvconst_print(f, c, n); if (x != const_idx) { fputs(" * ", f); print_bvvar(f, x); } } }
int main() { int32_t i, j, n; alloc_constants(); printf("a = "); bvconst_print(stdout, a, 128); printf("\n"); printf("iszero(a) = %d\n", bvconst_is_zero(a, 4)); bvconst_add_one(a, 4); printf("a+1 = "); bvconst_print(stdout, a, 128); printf("\n"); printf("iszero(a+1) = %d\n", bvconst_is_zero(a, 4)); bvconst_sub_one(a, 4); printf("a+1-1 = "); bvconst_print(stdout, a, 128); printf("\n"); printf("iszero(a+1-1) = %d\n", bvconst_is_zero(a, 4)); bvconst_sub_one(a, 4); printf("a+1-2 = "); bvconst_print(stdout, a, 128); printf("\n"); printf("iszero(a+1-2) = %d\n", bvconst_is_zero(a, 4)); printf("b = "); bvconst_print(stdout, b, 128); printf("\n"); printf("iszero(b) = %d\n", bvconst_is_zero(b, 4)); bvconst_add_one(b, 4); printf("b+1 = "); bvconst_print(stdout, b, 128); printf("\n"); printf("iszero(b+1) = %d\n", bvconst_is_zero(b, 4)); bvconst_sub_one(b, 4); bvconst_sub_one(b, 4); printf("b-1 = "); bvconst_print(stdout, b, 128); printf("\n"); printf("iszero(b-1) = %d\n", bvconst_is_zero(b, 4)); printf("c = "); bvconst_print(stdout, c, 128); printf("\n"); printf("iszero(c) = %d\n", bvconst_is_zero(c, 4)); printf("d = "); bvconst_print(stdout, d, 128); printf("\n"); printf("iszero(d) = %d\n", bvconst_is_zero(d, 4)); printf("e = "); bvconst_print(stdout, e, 128); printf("\n"); printf("iszero(e) = %d\n", bvconst_is_zero(e, 4)); printf("e := a * b\n"); bvconst_mul2(e, 4, a, b); printf("e = "); bvconst_print(stdout, e, 128); printf("\n\n"); random_vector(vector, 32); bvconst_set_array(a, vector, 32); printf("a = "); bvconst_print(stdout, a, 32); printf("\n"); random_vector(vector, 73); bvconst_set_array(b, vector, 73); printf("b = "); bvconst_print(stdout, b, 73); printf("\n"); bvconst_concat(c, a, 32, b, 73); printf("conc(a, b) = "); bvconst_print(stdout, c, 105); printf("\n"); bvconst_concat(d, b, 73, a, 32); printf("conc(b, a) = "); bvconst_print(stdout, d, 105); printf("\n\n"); // random_vector(vector, 63); bvconst_set_minus_one(a, 4); // random_vector(vector, 63); bvconst_clear(b, 4); for (n=2; n<=128; n++) { for (i=1; i<n; i++) { printf("--- n = %"PRId32", i = %"PRId32" ---\n", n, i); printf("a = "); bvconst_print(stdout, a, i); printf("\n"); printf("b = "); bvconst_print(stdout, b, n - i); printf("\n"); bvconst_concat(c, a, i, b, n - i); bvconst_concat(d, b, n - i, a, i); printf("conc(a, b) = "); bvconst_print(stdout, c, n); printf("\n"); printf("conc(b, a) = "); bvconst_print(stdout, d, n); printf("\n\n"); } } // exit(0); for (n=20; n>0; n--) { random_vector(vector, 20); bvconst_set_array(a, vector, 20); printf("a = "); bvconst_print(stdout, a, 20); printf("\n"); for (i=0; i<=20-n; i++) { bvconst_extract(b, a, i, i+n); printf("a[%2"PRId32", %2"PRId32") = ", i, i+n); bvconst_print(stdout, b, n); printf("\n"); } printf("\n"); } for (n=50; n>20; n--) { random_vector(vector, 62); bvconst_set_array(a, vector, 62); printf("a = "); bvconst_print(stdout, a, 62); printf("\n"); for (i=0; i<=62-n; i++) { bvconst_extract(b, a, i, i+n); printf("a[%2"PRId32", %2"PRId32") = ", i, i+n); bvconst_print(stdout, b, n); printf("\n"); } printf("\n"); } random_vector(vector, 20); bvconst_set_array(a, vector, 20); printf("a = "); bvconst_print(stdout, a, 20); printf("\n"); bvconst_set_extend(b, 31, a, 20, 0); printf("ext(a, 31, 0) = "); bvconst_print(stdout, b, 31); printf("\n"); bvconst_set_extend(b, 31, a, 20, 1); printf("ext(a, 31, 1) = "); bvconst_print(stdout, b, 31); printf("\n"); bvconst_set_extend(b, 31, a, 20, -1); printf("sgnext(a, 31) = "); bvconst_print(stdout, b, 31); printf("\n\n"); random_vector(vector, 20); bvconst_set_array(a, vector, 20); printf("a = "); bvconst_print(stdout, a, 20); printf("\n"); bvconst_set_extend(b, 31, a, 20, 0); printf("ext(a, 31, 0) = "); bvconst_print(stdout, b, 31); printf("\n"); bvconst_set_extend(b, 31, a, 20, 1); printf("ext(a, 31, 1) = "); bvconst_print(stdout, b, 31); printf("\n"); bvconst_set_extend(b, 31, a, 20, -1); printf("sgnext(a, 31) = "); bvconst_print(stdout, b, 31); printf("\n\n"); random_vector(vector, 20); bvconst_set_array(a, vector, 20); printf("a = "); bvconst_print(stdout, a, 20); printf("\n"); bvconst_set_extend(b, 31, a, 20, 0); printf("ext(a, 31, 0) = "); bvconst_print(stdout, b, 31); printf("\n"); bvconst_set_extend(b, 31, a, 20, 1); printf("ext(a, 31, 1) = "); bvconst_print(stdout, b, 31); printf("\n"); bvconst_set_extend(b, 31, a, 20, -1); printf("sgnext(a, 31) = "); bvconst_print(stdout, b, 31); printf("\n\n"); random_vector(vector, 20); bvconst_set_array(a, vector, 20); printf("a = "); bvconst_print(stdout, a, 20); printf("\n"); bvconst_set_extend(b, 31, a, 20, 0); printf("ext(a, 31, 0) = "); bvconst_print(stdout, b, 31); printf("\n"); bvconst_set_extend(b, 31, a, 20, 1); printf("ext(a, 31, 1) = "); bvconst_print(stdout, b, 31); printf("\n"); bvconst_set_extend(b, 31, a, 20, -1); printf("sgnext(a, 31) = "); bvconst_print(stdout, b, 31); printf("\n\n"); for (i=20; i<=99; i++) { random_vector(vector, 20); bvconst_set_array(a, vector, 20); printf("a = "); bvconst_print(stdout, a, 20); printf("\n"); bvconst_set_extend(b, i, a, 20, 0); printf("ext(a, %2"PRId32", 0) = ", i); bvconst_print(stdout, b, i); printf("\n"); bvconst_set_extend(b, i, a, 20, 1); printf("ext(a, %2"PRId32", 1) = ", i); bvconst_print(stdout, b, i); printf("\n"); bvconst_set_extend(b, i, a, 20, -1); printf("sgnext(a, %2"PRId32") = ", i); bvconst_print(stdout, b, i); printf("\n\n"); } for (i=32; i<=99; i++) { random_vector(vector, 32); bvconst_set_array(a, vector, 32); printf("a = "); bvconst_print(stdout, a, 32); printf("\n"); bvconst_set_extend(b, i, a, 32, 0); printf("ext(a, %2"PRId32", 0) = ", i); bvconst_print(stdout, b, i); printf("\n"); bvconst_set_extend(b, i, a, 32, 1); printf("ext(a, %2"PRId32", 1) = ", i); bvconst_print(stdout, b, i); printf("\n"); bvconst_set_extend(b, i, a, 32, -1); printf("sgnext(a, %2"PRId32") = ", i); bvconst_print(stdout, b, i); printf("\n\n"); } random_vector(vector, 120); bvconst_set_array(a, vector, 120); printf("a = "); bvconst_print(stdout, a, 120); printf("\n"); for (i=0; i<=120; i++) { printf("rshift %3"PRId32": ", i); bvconst_shift_right(a, 120, i, 0); bvconst_print(stdout, a, 120); printf("\n"); bvconst_set_array(a, vector, 120); } printf("\n"); random_vector(vector, 120); bvconst_set_array(a, vector, 120); printf("a = "); bvconst_print(stdout, a, 120); printf("\n"); for (i=0; i<=120; i++) { printf("rshift %3"PRId32": ", i); bvconst_shift_right(a, 120, i, 1); bvconst_print(stdout, a, 120); printf("\n"); bvconst_set_array(a, vector, 120); } printf("\n"); random_vector(vector, 120); bvconst_set_array(a, vector, 120); printf("a = "); bvconst_print(stdout, a, 120); printf("\n"); for (i=0; i<=120; i++) { printf("lshift %3"PRId32": ", i); bvconst_shift_left(a, 120, i, 0); bvconst_print(stdout, a, 120); printf("\n"); bvconst_set_array(a, vector, 120); } printf("\n"); random_vector(vector, 120); bvconst_set_array(a, vector, 120); printf("a = "); bvconst_print(stdout, a, 120); printf("\n"); for (i=0; i<=120; i++) { printf("lshift %3"PRId32": ", i); bvconst_shift_left(a, 120, i, 1); bvconst_print(stdout, a, 120); printf("\n"); bvconst_set_array(a, vector, 120); } printf("\n"); // exit(0); printf("c = "); bvconst_print(stdout, c, 128); printf("\n"); printf("d = "); bvconst_print(stdout, d, 128); printf("\n"); printf("e := c * d\n"); bvconst_mul2(e, 4, c, d); printf("e = "); bvconst_print(stdout, e, 128); printf("\n"); printf("e := d * c\n"); bvconst_mul2(e, 4, d, c); printf("e = "); bvconst_print(stdout, e, 128); printf("\n\n"); printf("b = "); bvconst_print(stdout, b, 128); printf("\n"); printf("d = "); bvconst_print(stdout, d, 128); printf("\n"); printf("e := b * d\n"); bvconst_mul2(e, 4, b, d); printf("e = "); bvconst_print(stdout, e, 128); printf("\n\n"); bvconst_set64(a, 4, 1372919719782793ULL); bvconst_set32(b, 4, 12670371); printf("a = "); bvconst_print(stdout, a, 128); printf("\n"); printf("b = "); bvconst_print(stdout, b, 128); printf("\n"); printf("e := a * b\n"); bvconst_set(c, 4, a); printf("c = "); bvconst_print(stdout, c, 128); printf("\n"); bvconst_mul(c, 4, b); printf("c = "); bvconst_print(stdout, c, 128); printf("\n"); bvconst_mul2(e, 4, a, b); printf("e = "); bvconst_print(stdout, e, 128); printf("\n\n"); mpz_init(z0); mpz_init(z1); mpz_init(z2); bvconst_get_mpz(a, 4, z0); printf("--> conversion a to mpz: "); mpz_out_str(stdout, 10, z0); printf("\n"); bvconst_get_mpz(b, 4, z0); printf("--> conversion b to mpz: "); mpz_out_str(stdout, 10, z0); printf("\n"); bvconst_get_mpz(e, 4, z0); printf("--> conversion e to mpz: "); mpz_out_str(stdout, 10, z0); printf("\n\n"); printf("e -= a * b\n"); bvconst_submul(e, 4, a, b); printf("e = "); bvconst_print(stdout, e, 128); printf("\n"); bvconst_get_mpz(e, 4, z0); printf("--> conversion e to mpz: "); mpz_out_str(stdout, 10, z0); printf("\n\n"); for (i=0; i<10; i++) { printf("test %"PRId32": e *= a\n", i); random_vector(vector, 128); bvconst_set_array(a, vector, 128); random_vector(vector, 128); bvconst_set_array(e, vector, 128); bvconst_get_mpz(e, 4, z1); printf("a = "); bvconst_print(stdout, a, 128); printf("\n"); printf("e = "); bvconst_print(stdout, e, 128); printf("\n"); bvconst_mul(e, 4, a); printf("e' = "); bvconst_print(stdout, e, 128); printf("\n"); bvconst_get_mpz(a, 4, z0); printf("--> conversion a to mpz: "); mpz_out_str(stdout, 10, z0); printf("\n"); printf("--> conversion e to mpz: "); mpz_out_str(stdout, 10, z1); printf("\n"); bvconst_get_mpz(e, 4, z2); printf("--> conversion e' to mpz: "); mpz_out_str(stdout, 10, z2); printf("\n"); mpz_mul(z0, z0, z1); mpz_fdiv_r_2exp(z0, z0, 128); printf("--> check: "); mpz_out_str(stdout, 10, z0); printf("\n\n"); assert(mpz_cmp(z0, z2) == 0); } for (i=0; i<10; i++) { printf("test %"PRId32", a := - a\n", i); random_vector(vector, 128); bvconst_set_array(a, vector, 128); bvconst_get_mpz(a, 4, z0); printf("a = "); bvconst_print(stdout, a, 128); printf("\n"); bvconst_negate(a, 4); printf("a = "); bvconst_print(stdout, a, 128); printf("\n"); printf("--> conversion a to mpz: "); mpz_out_str(stdout, 10, z0); printf("\n"); bvconst_get_mpz(a, 4, z1); printf("--> conversion -a to mpz: "); mpz_out_str(stdout, 10, z1); printf("\n"); mpz_neg(z0, z0); mpz_fdiv_r_2exp(z0, z0, 128); printf("--> check: "); mpz_out_str(stdout, 10, z0); printf("\n\n"); assert(mpz_cmp(z0, z1) == 0); } for (i=0; i<10; i++) { printf("test %"PRId32": e := - a\n", i); random_vector(vector, 128); bvconst_set_array(a, vector, 128); printf("a = "); bvconst_print(stdout, a, 128); printf("\n"); bvconst_negate2(e, 4, a); printf("e = "); bvconst_print(stdout, e, 128); printf("\n"); printf("--> conversion a to mpz: "); bvconst_get_mpz(a, 4, z0); mpz_out_str(stdout, 10, z0); printf("\n"); bvconst_get_mpz(e, 4, z1); printf("--> conversion e to mpz: "); mpz_out_str(stdout, 10, z1); printf("\n"); mpz_neg(z0, z0); mpz_fdiv_r_2exp(z0, z0, 128); printf("--> check: "); mpz_out_str(stdout, 10, z0); printf("\n\n"); assert(mpz_cmp(z0, z1) == 0); } for (i=0; i<10; i++) { printf("test %"PRId32", e = a * b\n", i); random_vector(vector, 128); bvconst_set_array(a, vector, 128); random_vector(vector, 128); bvconst_set_array(b, vector, 128); printf("a = "); bvconst_print(stdout, a, 128); printf("\n"); printf("b = "); bvconst_print(stdout, b, 128); printf("\n"); bvconst_mul2(e, 4, a, b); printf("e = "); bvconst_print(stdout, e, 128); printf("\n"); bvconst_get_mpz(a, 4, z0); printf("--> conversion a to mpz: "); mpz_out_str(stdout, 10, z0); printf("\n"); bvconst_get_mpz(b, 4, z1); printf("--> conversion b to mpz: "); mpz_out_str(stdout, 10, z1); printf("\n"); bvconst_get_mpz(e, 4, z2); printf("--> conversion e to mpz: "); mpz_out_str(stdout, 10, z2); printf("\n"); mpz_mul(z0, z0, z1); mpz_fdiv_r_2exp(z0, z0, 128); printf("--> check: "); mpz_out_str(stdout, 10, z0); printf("\n\n"); assert(mpz_cmp(z0, z2) == 0); } for (i=0; i<10; i++) { printf("test %"PRId32": e = - (a * b)\n", i); random_vector(vector, 128); bvconst_set_array(a, vector, 128); random_vector(vector, 128); bvconst_set_array(b, vector, 128); printf("a = "); bvconst_print(stdout, a, 128); printf("\n"); printf("b = "); bvconst_print(stdout, b, 128); printf("\n"); bvconst_clear(e, 4); bvconst_submul(e, 4, a, b); printf("e = "); bvconst_print(stdout, e, 128); printf("\n"); bvconst_get_mpz(a, 4, z0); printf("--> conversion a to mpz: "); mpz_out_str(stdout, 10, z0); printf("\n"); bvconst_get_mpz(b, 4, z1); printf("--> conversion b to mpz: "); mpz_out_str(stdout, 10, z1); printf("\n"); bvconst_get_mpz(d, 4, z2); printf("--> conversion d to mpz: "); mpz_out_str(stdout, 10, z2); printf("\n"); bvconst_get_mpz(e, 4, z2); printf("--> conversion e to mpz: "); mpz_out_str(stdout, 10, z2); printf("\n"); mpz_mul(z0, z0, z1); mpz_neg(z0, z0); mpz_fdiv_r_2exp(z0, z0, 128); printf("--> check: "); mpz_out_str(stdout, 10, z0); printf("\n\n"); assert(mpz_cmp(z0, z2) == 0); } for (i=0; i<10; i++) { printf("test %"PRId32": e = a + b\n", i); random_vector(vector, 128); bvconst_set_array(a, vector, 128); random_vector(vector, 128); bvconst_set_array(b, vector, 128); printf("a = "); bvconst_print(stdout, a, 128); printf("\n"); printf("b = "); bvconst_print(stdout, b, 128); printf("\n"); bvconst_add2(e, 4, a, b); printf("e = "); bvconst_print(stdout, e, 128); printf("\n"); bvconst_get_mpz(a, 4, z0); printf("--> conversion a to mpz: "); mpz_out_str(stdout, 10, z0); printf("\n"); bvconst_get_mpz(b, 4, z1); printf("--> conversion b to mpz: "); mpz_out_str(stdout, 10, z1); printf("\n"); bvconst_get_mpz(e, 4, z2); printf("--> conversion e to mpz: "); mpz_out_str(stdout, 10, z2); printf("\n"); mpz_add(z0, z0, z1); mpz_fdiv_r_2exp(z0, z0, 128); printf("--> check: "); mpz_out_str(stdout, 10, z0); printf("\n\n"); assert(mpz_cmp(z0, z2) == 0); } for (i=0; i<10; i++) { printf("test %"PRId32": e = a - b\n", i); random_vector(vector, 128); bvconst_set_array(a, vector, 128); random_vector(vector, 128); bvconst_set_array(b, vector, 128); printf("a = "); bvconst_print(stdout, a, 128); printf("\n"); printf("b = "); bvconst_print(stdout, b, 128); printf("\n"); bvconst_sub2(e, 4, a, b); printf("e = "); bvconst_print(stdout, e, 128); printf("\n"); bvconst_get_mpz(a, 4, z0); printf("--> conversion a to mpz: "); mpz_out_str(stdout, 10, z0); printf("\n"); bvconst_get_mpz(b, 4, z1); printf("--> conversion b to mpz: "); mpz_out_str(stdout, 10, z1); printf("\n"); bvconst_get_mpz(e, 4, z2); printf("--> conversion e to mpz: "); mpz_out_str(stdout, 10, z2); printf("\n"); mpz_sub(z0, z0, z1); mpz_fdiv_r_2exp(z0, z0, 128); printf("--> check: "); mpz_out_str(stdout, 10, z0); printf("\n\n"); assert(mpz_cmp(z0, z2) == 0); } for (i=0; i<10; i++) { printf("\ntest %"PRId32": comparisons\n", i); random_vector(vector, 25); bvconst_set_array(a, vector, 25); random_vector(vector, 25); bvconst_set_array(b, vector, 25); printf("a = "); bvconst_print(stdout, a, 25); printf("\n"); printf("b = "); bvconst_print(stdout, b, 25); printf("\n"); bvconst_normalize(a, 25); bvconst_normalize(b, 25); printf("Unsigned tests\n"); printf(" a le b: %d\n", bvconst_le(a, b, 25)); printf(" a ge b: %d\n", bvconst_ge(a, b, 25)); printf(" a lt b: %d\n", bvconst_lt(a, b, 25)); printf(" a gt b: %d\n", bvconst_gt(a, b, 25)); printf("Signed tests\n"); printf(" a sle b: %d\n", bvconst_sle(a, b, 25)); printf(" a sge b: %d\n", bvconst_sge(a, b, 25)); printf(" a slt b: %d\n", bvconst_slt(a, b, 25)); printf(" a sgt b: %d\n", bvconst_sgt(a, b, 25)); } for (i=0; i<10; i++) { printf("\ntest %"PRId32": comparisons\n", i); random_vector(vector, 32); bvconst_set_array(a, vector, 32); random_vector(vector, 32); bvconst_set_array(b, vector, 32); printf("a = "); bvconst_print(stdout, a, 32); printf("\n"); printf("b = "); bvconst_print(stdout, b, 32); printf("\n"); bvconst_normalize(a, 32); bvconst_normalize(b, 32); printf("Unsigned tests\n"); printf(" a le b: %d\n", bvconst_le(a, b, 32)); printf(" a ge b: %d\n", bvconst_ge(a, b, 32)); printf(" a lt b: %d\n", bvconst_lt(a, b, 32)); printf(" a gt b: %d\n", bvconst_gt(a, b, 32)); printf("Signed tests\n"); printf(" a sle b: %d\n", bvconst_sle(a, b, 32)); printf(" a sge b: %d\n", bvconst_sge(a, b, 32)); printf(" a slt b: %d\n", bvconst_slt(a, b, 32)); printf(" a sgt b: %d\n", bvconst_sgt(a, b, 32)); } for (i=0; i<10; i++) { printf("\ntest %"PRId32": comparisons\n", i); random_vector(vector, 33); bvconst_set_array(a, vector, 33); random_vector(vector, 33); bvconst_set_array(b, vector, 33); printf("a = "); bvconst_print(stdout, a, 33); printf("\n"); printf("b = "); bvconst_print(stdout, b, 33); printf("\n"); bvconst_normalize(a, 33); bvconst_normalize(b, 33); printf("Unsigned tests\n"); printf(" a le b: %d\n", bvconst_le(a, b, 33)); printf(" a ge b: %d\n", bvconst_ge(a, b, 33)); printf(" a lt b: %d\n", bvconst_lt(a, b, 33)); printf(" a gt b: %d\n", bvconst_gt(a, b, 33)); printf("Signed tests\n"); printf(" a sle b: %d\n", bvconst_sle(a, b, 33)); printf(" a sge b: %d\n", bvconst_sge(a, b, 33)); printf(" a slt b: %d\n", bvconst_slt(a, b, 33)); printf(" a sgt b: %d\n", bvconst_sgt(a, b, 33)); } for (i=0; i<10; i++) { printf("\ntest %"PRId32": comparisons\n", i); random_vector(vector, 63); bvconst_set_array(a, vector, 63); random_vector(vector, 63); bvconst_set_array(b, vector, 63); printf("a = "); bvconst_print(stdout, a, 63); printf("\n"); printf("b = "); bvconst_print(stdout, b, 63); printf("\n"); bvconst_normalize(a, 63); bvconst_normalize(b, 63); printf("Unsigned tests\n"); printf(" a le b: %d\n", bvconst_le(a, b, 63)); printf(" a ge b: %d\n", bvconst_ge(a, b, 63)); printf(" a lt b: %d\n", bvconst_lt(a, b, 63)); printf(" a gt b: %d\n", bvconst_gt(a, b, 63)); printf("Signed tests\n"); printf(" a sle b: %d\n", bvconst_sle(a, b, 63)); printf(" a sge b: %d\n", bvconst_sge(a, b, 63)); printf(" a slt b: %d\n", bvconst_slt(a, b, 63)); printf(" a sgt b: %d\n", bvconst_sgt(a, b, 63)); } for (i=0; i<10; i++) { printf("\ntest %"PRId32": comparisons\n", i); random_vector(vector, 64); bvconst_set_array(a, vector, 64); random_vector(vector, 64); bvconst_set_array(b, vector, 64); printf("a = "); bvconst_print(stdout, a, 64); printf("\n"); printf("b = "); bvconst_print(stdout, b, 64); printf("\n"); bvconst_normalize(a, 64); bvconst_normalize(b, 64); printf("Unsigned tests\n"); printf(" a le b: %d\n", bvconst_le(a, b, 64)); printf(" a ge b: %d\n", bvconst_ge(a, b, 64)); printf(" a lt b: %d\n", bvconst_lt(a, b, 64)); printf(" a gt b: %d\n", bvconst_gt(a, b, 64)); printf("Signed tests\n"); printf(" a sle b: %d\n", bvconst_sle(a, b, 64)); printf(" a sge b: %d\n", bvconst_sge(a, b, 64)); printf(" a slt b: %d\n", bvconst_slt(a, b, 64)); printf(" a sgt b: %d\n", bvconst_sgt(a, b, 64)); } printf("\nMore comparisons\n"); random_vector(vector, 64); bvconst_set_array(a, vector, 64); bvconst_set_array(b, vector, 64); printf("a = "); bvconst_print(stdout, a, 64); printf("\n"); printf("b = "); bvconst_print(stdout, b, 64); printf("\n"); bvconst_normalize(a, 64); bvconst_normalize(b, 64); printf("Unsigned tests\n"); printf(" a le b: %d\n", bvconst_le(a, b, 64)); printf(" a ge b: %d\n", bvconst_ge(a, b, 64)); printf(" a lt b: %d\n", bvconst_lt(a, b, 64)); printf(" a gt b: %d\n", bvconst_gt(a, b, 64)); printf("Signed tests\n"); printf(" a sle b: %d\n", bvconst_sle(a, b, 64)); printf(" a sge b: %d\n", bvconst_sge(a, b, 64)); printf(" a slt b: %d\n", bvconst_slt(a, b, 64)); printf(" a sgt b: %d\n", bvconst_sgt(a, b, 64)); random_vector(vector, 65); bvconst_set_array(a, vector, 65); bvconst_set_array(b, vector, 65); printf("a = "); bvconst_print(stdout, a, 65); printf("\n"); printf("b = "); bvconst_print(stdout, b, 65); printf("\n"); bvconst_normalize(a, 65); bvconst_normalize(b, 65); printf("Unsigned tests\n"); printf(" a le b: %d\n", bvconst_le(a, b, 65)); printf(" a ge b: %d\n", bvconst_ge(a, b, 65)); printf(" a lt b: %d\n", bvconst_lt(a, b, 65)); printf(" a gt b: %d\n", bvconst_gt(a, b, 65)); printf("Signed tests\n"); printf(" a sle b: %d\n", bvconst_sle(a, b, 65)); printf(" a sge b: %d\n", bvconst_sge(a, b, 65)); printf(" a slt b: %d\n", bvconst_slt(a, b, 65)); printf(" a sgt b: %d\n", bvconst_sgt(a, b, 65)); random_vector(vector, 63); bvconst_set_array(a, vector, 63); bvconst_set_array(b, vector, 63); printf("a = "); bvconst_print(stdout, a, 63); printf("\n"); printf("b = "); bvconst_print(stdout, b, 63); printf("\n"); bvconst_normalize(a, 63); bvconst_normalize(b, 63); printf("Unsigned tests\n"); printf(" a le b: %d\n", bvconst_le(a, b, 63)); printf(" a ge b: %d\n", bvconst_ge(a, b, 63)); printf(" a lt b: %d\n", bvconst_lt(a, b, 63)); printf(" a gt b: %d\n", bvconst_gt(a, b, 63)); printf("Signed tests\n"); printf(" a sle b: %d\n", bvconst_sle(a, b, 63)); printf(" a sge b: %d\n", bvconst_sge(a, b, 63)); printf(" a slt b: %d\n", bvconst_slt(a, b, 63)); printf(" a sgt b: %d\n", bvconst_sgt(a, b, 63)); printf("\nTest powers of two\n"); mpz_set_ui(z0, 1); for (i=0; i<128; i++) { printf("z0 = "); mpz_out_str(stdout, 10, z0); printf("\n"); bvconst_set_mpz(a, 4, z0); printf("a = "); bvconst_print(stdout, a, 128); printf("\n"); n = bvconst_is_power_of_two(a, 4); if (n < 0) { printf("--> not a power of 2\n\n"); } else { printf("--> a = 2^%"PRId32"\n\n", n); } mpz_add(z0, z0, z0); } a[0] = 0; a[1] = 1024; a[2] = 0; a[3] = 36136287; printf("a = "); bvconst_print(stdout, a, 128); printf("\n"); n = bvconst_is_power_of_two(a, 4); if (n < 0) { printf("--> not a power of 2\n\n"); } else { printf("--> a = 2^%"PRId32"\n\n", n); } a[0] = 0; a[1] = 1024; a[2] = 31209; a[3] = 0; printf("a = "); bvconst_print(stdout, a, 128); printf("\n"); n = bvconst_is_power_of_two(a, 4); if (n < 0) { printf("--> not a power of 2\n\n"); } else { printf("--> a = 2^%"PRId32"\n\n", n); } a[0] = 0; a[1] = 1024; a[2] = 0; a[3] = 0; printf("a = "); bvconst_print(stdout, a, 128); printf("\n"); n = bvconst_is_power_of_two(a, 4); if (n < 0) { printf("--> not a power of 2\n\n"); } else { printf("--> a = 2^%"PRId32"\n\n", n); } a[0] = 128; a[1] = 1024; a[2] = 0; a[3] = 0; printf("a = "); bvconst_print(stdout, a, 128); printf("\n"); n = bvconst_is_power_of_two(a, 4); if (n < 0) { printf("--> not a power of 2\n\n"); } else { printf("--> a = 2^%"PRId32"\n\n", n); } bvconst_clear(a, 4); for (i=0; i<256; i++) { printf("a = "); bvconst_print(stdout, a, 128); printf("\n"); n = bvconst_is_power_of_two(a, 4); if (n < 0) { printf("--> not a power of 2\n\n"); } else { printf("--> a = 2^%"PRId32"\n\n", n); } bvconst_add_one(a, 4); } for (i=0; i<10; i++) { printf("test %"PRId32": power of two\n", i); random_vector(vector, 128); bvconst_set_array(a, vector, 128); for (j=0; j<64; j++) { printf("a = "); bvconst_print(stdout, a, 128); printf("\n"); n = bvconst_is_power_of_two(a, 4); if (n < 0) { printf("--> not a power of 2\n\n"); } else { printf("--> a = 2^%"PRId32"\n\n", n); } bvconst_clr_bit(a, j); bvconst_clr_bit(a, 127 - j); } } // test mulpower for (i=0; i<130; i++) { bvconst_set_one(a, 4); // a = 1 bvconst_set32(b, 4, 2); // b = 2 // compute a * b^i = 2^i bvconst_mulpower(a, 4, b, i); printf("---> mulpower: a = b^%"PRIu32" = 2^%"PRIu32"\n", i, i); printf(" b = "); bvconst_print(stdout, b, 128); printf("\n"); printf(" a = "); bvconst_print(stdout, a, 128); printf("\n"); } // test mulpower for (i=0; i<40; i++) { bvconst_set32(a, 4, 4); // a = 0b0..00100 bvconst_set_minus_one(b, 4); // b = 0b11..1111 // compute a * b^i = -4 or +4 bvconst_mulpower(a, 4, b, i); printf("---> mulpower: a = 4 * b^%"PRIu32" = 4 * (-1)^%"PRIu32"\n", i, i); printf(" b = "); bvconst_print(stdout, b, 128); printf("\n"); printf(" a = "); bvconst_print(stdout, a, 128); printf("\n"); } // test mulpower for (i=0; i<40; i++) { bvconst_set32(a, 4, 4); // a = 0b0..00100 bvconst_clear(b, 4); // b = 0 // compute a * b^i = 0 bvconst_mulpower(a, 4, b, i); printf("---> mulpower: a = 4 * b^%"PRIu32"\n", i); printf(" b = "); bvconst_print(stdout, b, 128); printf("\n"); printf(" a = "); bvconst_print(stdout, a, 128); printf("\n"); } // test is_one and is_minus_one printf("\n\n"); for (i=1; i<=128; i++) { bvconst_set_one(a, 4); // a = 1 bvconst_set_minus_one(b, 4); // b = -1 bvconst_clear(c, 4); // c = 0 random_vector(vector, i); bvconst_set_array(d, vector, i); // d = random // make all i-bit length constant bvconst_normalize(a, i); bvconst_normalize(b, i); bvconst_normalize(c, i); bvconst_normalize(d, i); n = (i+31) >> 5; // number of words printf("---> %"PRIu32" bits\n", i); printf("a = "); bvconst_print(stdout, a, i); printf(": is_one = %s, is_minus_one = %s\n", b2str(bvconst_is_one(a, n)), b2str(bvconst_is_minus_one(a, i))); printf("b = "); bvconst_print(stdout, b, i); printf(": is_one = %s, is_minus_one = %s\n", b2str(bvconst_is_one(b, n)), b2str(bvconst_is_minus_one(b, i))); printf("c = "); bvconst_print(stdout, c, i); printf(": is_one = %s, is_minus_one = %s\n", b2str(bvconst_is_one(c, n)), b2str(bvconst_is_minus_one(c, i))); printf("d = "); bvconst_print(stdout, d, i); printf(": is_one = %s, is_minus_one = %s\n", b2str(bvconst_is_one(d, n)), b2str(bvconst_is_minus_one(d, i))); printf("\n"); fflush(stdout); } // test is_min_signed and is_max_signed printf("\n\n"); for (i=1; i<=128; i++) { bvconst_clear(a, 4); // a = 0 bvconst_set_minus_one(b, 4); // b = -1 bvconst_clear(c, 4); bvconst_set_bit(c, i-1); // c = 0b10000000 (smallest negative integer) bvconst_set_minus_one(d, 4); bvconst_clr_bit(d, i-1); // d = 0b01111111 (largest positive integer) random_vector(vector, i); bvconst_set_array(e, vector, i); // e = random // make all i-bit length constant bvconst_normalize(a, i); bvconst_normalize(b, i); bvconst_normalize(c, i); bvconst_normalize(d, i); bvconst_normalize(e, i); printf("---> %"PRIu32" bits\n", i); printf("a = "); bvconst_print(stdout, a, i); printf(": is_min_signed = %s, is_max_signed = %s\n", b2str(bvconst_is_min_signed(a, i)), b2str(bvconst_is_max_signed(a, i))); printf("b = "); bvconst_print(stdout, b, i); printf(": is_min_signed = %s, is_max_signed = %s\n", b2str(bvconst_is_min_signed(b, i)), b2str(bvconst_is_max_signed(b, i))); printf("c = "); bvconst_print(stdout, c, i); printf(": is_min_signed = %s, is_max_signed = %s\n", b2str(bvconst_is_min_signed(c, i)), b2str(bvconst_is_max_signed(c, i))); printf("d = "); bvconst_print(stdout, d, i); printf(": is_min_signed = %s, is_max_signed = %s\n", b2str(bvconst_is_min_signed(d, i)), b2str(bvconst_is_max_signed(d, i))); printf("e = "); bvconst_print(stdout, e, i); printf(": is_min_signed = %s, is_max_signed = %s\n", b2str(bvconst_is_min_signed(e, i)), b2str(bvconst_is_max_signed(e, i))); printf("\n"); fflush(stdout); } for (i=100; i<256; i += 10) { for (j=1; j<=i; j += 9) { test_set_extend(i, j); } } mpz_clear(z0); mpz_clear(z1); mpz_clear(z2); free_constants(); return 0; }
/* * Print the definition of x in vtbl */ static void print_bv_vardef(FILE *f, bv_vartable_t *vtbl, thvar_t x) { uint32_t nbits; assert(valid_bvvar(vtbl, x)); nbits = bvvar_bitsize(vtbl, x); print_bvvar(f, x); fprintf(f, ":bv[%"PRIu32"] = ", nbits); switch (bvvar_tag(vtbl, x)) { case BVTAG_VAR: fputs("var", f); break; case BVTAG_CONST64: bvconst64_print(f, bvvar_val64(vtbl, x), nbits); break; case BVTAG_CONST: bvconst_print(f, bvvar_val(vtbl, x), nbits); break; case BVTAG_POLY64: print_bv_poly64(f, bvvar_poly64_def(vtbl, x)); break; case BVTAG_POLY: print_bv_poly(f, bvvar_poly_def(vtbl, x)); break; case BVTAG_PPROD: print_bv_product(f, bvvar_pprod_def(vtbl, x)); break; case BVTAG_BIT_ARRAY: print_litarray(f, nbits, bvvar_bvarray_def(vtbl, x)); break; case BVTAG_ITE: print_bv_ite(f, bvvar_ite_def(vtbl, x)); break; case BVTAG_UDIV: print_bv_binop(f, "div", bvvar_binop(vtbl, x)); break; case BVTAG_UREM: print_bv_binop(f, "rem", bvvar_binop(vtbl, x)); break; case BVTAG_SDIV: print_bv_binop(f, "sdiv", bvvar_binop(vtbl, x)); break; case BVTAG_SREM: print_bv_binop(f, "srem", bvvar_binop(vtbl, x)); break; case BVTAG_SMOD: print_bv_binop(f, "smod", bvvar_binop(vtbl, x)); break; case BVTAG_SHL: print_bv_binop(f, "shl", bvvar_binop(vtbl, x)); break; case BVTAG_LSHR: print_bv_binop(f, "lshr", bvvar_binop(vtbl, x)); break; case BVTAG_ASHR: print_bv_binop(f, "ashr", bvvar_binop(vtbl, x)); break; case BVTAG_ADD: print_bv_binop(f, "add", bvvar_binop(vtbl, x)); break; case BVTAG_SUB: print_bv_binop(f, "sub", bvvar_binop(vtbl, x)); break; case BVTAG_MUL: print_bv_binop(f, "mul", bvvar_binop(vtbl, x)); break; case BVTAG_NEG: print_bvneg(f, bvvar_binop(vtbl, x)); break; } }