/* * Test shift a by b: both stored as 64bit integers * - n = number of bits in a and b */ static void test_shift64(uint64_t a, uint64_t b, uint32_t n) { uint64_t lshl, lshr, ashr; a = norm64(a, n); b = norm64(b, n); lshl = bvconst64_lshl(a, b, n); assert(lshl == norm64(lshl, n)); lshr = bvconst64_lshr(a, b, n); assert(lshr == norm64(lshr, n)); ashr = bvconst64_ashr(a, b, n); assert(ashr == norm64(ashr, n)); printf(" a = "); bvconst64_print(stdout, a, n); printf("\n"); printf(" b = "); bvconst64_print(stdout, b, n); printf("\n"); printf(" lshl(a, b) = "); bvconst64_print(stdout, lshl, n); printf("\n"); printf(" lshr(a, b) = "); bvconst64_print(stdout, lshr, n); printf("\n"); printf(" ashr(a, b) = "); bvconst64_print(stdout, ashr, n); printf("\n\n"); }
/* * Monomial coeff * r: */ static void print_bvmlist64_mono(FILE *f, uint64_t coeff, pprod_t *r, uint32_t n, bool first) { if (pp_is_empty(r)) { if (!first) fprintf(f, " + "); bvconst64_print(f, coeff, n); } else if (coeff == 1) { if (!first) fprintf(f, " + "); print_bv_pprod(f, r); } else if (bvconst64_is_minus_one(coeff, n)) { if (!first) fprintf(f, " "); fprintf(f, "- "); print_bv_pprod(f, r); } else { if (!first) fprintf(f, " + "); bvconst64_print(f, coeff, n); fprintf(f, " "); print_bv_pprod(f, r); } }
// c = coeff, x = variable, n = number of bits static void print_bv_mono64(FILE *f, uint64_t c, thvar_t x, uint32_t n, bool first) { if (c == 1) { if (first) { if (x == const_idx) { fputs("1", f); } else { print_bvvar(f, x); } } else { fputs(" + ", f); print_bvvar(f, x); } } else if (bvconst64_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); } bvconst64_print(f, c, n); if (x != const_idx) { fputs(" * ", f); print_bvvar(f, x); } } }
/* * 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; } }