mirror of
https://github.com/Z3Prover/z3
synced 2026-07-23 23:42:33 +00:00
Implement proposed smtlib2 bitvector overflow predicates (#6715)
* Logical names for function declarations in c++ Currently, for example, the function declaration symbol member for checking whether multiplication *does not* overflow is called `m_bv_smul_ovfl`. Since we are introducing the upcoming smtlib2 symbols that check that multpliciation *does* overflow, the not overflow check symbols are renamed to `m_bv_smul_no_ovfl` etc. * Implement smtlib overflow preds for multiplication Smtlib2 is being extended to include overflow predicates for bit vectors (see https://groups.google.com/u/1/g/smt-lib/c/J4D99wT0aKI). This commit introduces the predicates `bvumulo` and `bvsmulo` that return `true` if the unsigned multiplication overflows or the signed multiplication underflows or overflows, respectively. * Move mul overflow predicates to BV logic * Add a todo on illogical argument order * Implement mk_unary_pred for bv * Implement bvnego * Implement bvuaddo * Implement bvsaddo * Implement bvusubo * Implement bvssubo * Implement bvsdivo
This commit is contained in:
parent
62e1ec0698
commit
12e45c9d17
4 changed files with 222 additions and 7 deletions
|
|
@ -139,6 +139,22 @@ class bv_rewriter : public poly_rewriter<bv_rewriter_core> {
|
|||
br_status mk_mkbv(unsigned num, expr * const * args, expr_ref & result);
|
||||
br_status mk_bvsmul_no_overflow(unsigned num, expr * const * args, bool is_overflow, expr_ref & result);
|
||||
br_status mk_bvumul_no_overflow(unsigned num, expr * const * args, expr_ref & result);
|
||||
|
||||
br_status mk_bvsmul_overflow(unsigned num, expr * const * args, expr_ref & result);
|
||||
br_status mk_bvumul_overflow(unsigned num, expr * const * args, expr_ref & result);
|
||||
|
||||
br_status mk_bvsdiv_overflow(unsigned num, expr * const * args, expr_ref & result);
|
||||
|
||||
br_status mk_bvneg_overflow(expr * const arg, expr_ref & result);
|
||||
|
||||
br_status mk_bvuadd_overflow(unsigned num, expr * const * args, expr_ref & result);
|
||||
br_status mk_bvsadd_overflow(unsigned num, expr * const * args, expr_ref & result);
|
||||
br_status mk_bvsadd_underflow(unsigned num, expr * const * args, expr_ref & result);
|
||||
br_status mk_bvsadd_over_underflow(unsigned num, expr * const * args, expr_ref & result);
|
||||
|
||||
br_status mk_bvusub_underflow(unsigned num, expr * const * args, expr_ref & result);
|
||||
br_status mk_bvssub_overflow(unsigned num, expr * const * args, expr_ref & result);
|
||||
|
||||
bool is_minus_one_times_t(expr * arg);
|
||||
void mk_t1_add_t2_eq_c(expr * t1, expr * t2, expr * c, expr_ref & result);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue