mirror of
https://github.com/Z3Prover/z3
synced 2025-06-22 13:53:39 +00:00
FPA theory bug fixes
Signed-off-by: Christoph M. Wintersteiger <cwinter@microsoft.com>
This commit is contained in:
parent
c9c11f3b3a
commit
b7c5a29570
1 changed files with 62 additions and 66 deletions
|
@ -69,6 +69,7 @@ namespace smt {
|
||||||
simplifier & simp = ctx.get_simplifier();
|
simplifier & simp = ctx.get_simplifier();
|
||||||
bv_util & bu = m_converter.bu();
|
bv_util & bu = m_converter.bu();
|
||||||
expr_ref bv_atom(m);
|
expr_ref bv_atom(m);
|
||||||
|
proof_ref pr(m);
|
||||||
|
|
||||||
if (ctx.b_internalized(atom))
|
if (ctx.b_internalized(atom))
|
||||||
return true;
|
return true;
|
||||||
|
@ -78,6 +79,7 @@ namespace smt {
|
||||||
ctx.internalize(atom->get_arg(i), false);
|
ctx.internalize(atom->get_arg(i), false);
|
||||||
|
|
||||||
m_rw(atom, bv_atom);
|
m_rw(atom, bv_atom);
|
||||||
|
simp(bv_atom, bv_atom, pr);
|
||||||
|
|
||||||
ctx.internalize(bv_atom, gate_ctx);
|
ctx.internalize(bv_atom, gate_ctx);
|
||||||
literal def = ctx.get_literal(bv_atom);
|
literal def = ctx.get_literal(bv_atom);
|
||||||
|
@ -106,12 +108,14 @@ namespace smt {
|
||||||
bv_util & bu = m_converter.bu();
|
bv_util & bu = m_converter.bu();
|
||||||
sort * term_sort = m.get_sort(term);
|
sort * term_sort = m.get_sort(term);
|
||||||
expr_ref t(m), bv_term(m);
|
expr_ref t(m), bv_term(m);
|
||||||
|
proof_ref pr(m);
|
||||||
|
|
||||||
unsigned num_args = term->get_num_args();
|
unsigned num_args = term->get_num_args();
|
||||||
for (unsigned i = 0; i < num_args; i++)
|
for (unsigned i = 0; i < num_args; i++)
|
||||||
ctx.internalize(term->get_arg(i), false);
|
ctx.internalize(term->get_arg(i), false);
|
||||||
|
|
||||||
m_rw(term, t);
|
m_rw(term, t);
|
||||||
|
simp(t, t, pr);
|
||||||
|
|
||||||
if (m_converter.is_rm(term_sort)) {
|
if (m_converter.is_rm(term_sort)) {
|
||||||
SASSERT(is_app(t));
|
SASSERT(is_app(t));
|
||||||
|
@ -163,11 +167,13 @@ namespace smt {
|
||||||
simplifier & simp = ctx.get_simplifier();
|
simplifier & simp = ctx.get_simplifier();
|
||||||
app * owner = n->get_owner();
|
app * owner = n->get_owner();
|
||||||
expr_ref converted(m);
|
expr_ref converted(m);
|
||||||
|
proof_ref pr(m);
|
||||||
|
|
||||||
theory_var v = mk_var(n);
|
theory_var v = mk_var(n);
|
||||||
ctx.attach_th_var(n, this, v);
|
ctx.attach_th_var(n, this, v);
|
||||||
m_tvars.push_back(v);
|
m_tvars.push_back(v);
|
||||||
m_rw(owner, converted);
|
m_rw(owner, converted);
|
||||||
|
simp(converted, converted, pr);
|
||||||
m_trans_map.insert(owner, converted, 0);
|
m_trans_map.insert(owner, converted, 0);
|
||||||
|
|
||||||
sort * owner_sort = m.get_sort(owner);
|
sort * owner_sort = m.get_sort(owner);
|
||||||
|
@ -281,16 +287,14 @@ namespace smt {
|
||||||
expr_wrapper_proc * res = 0;
|
expr_wrapper_proc * res = 0;
|
||||||
|
|
||||||
if (fu.is_rm(fpa_e_srt)) {
|
if (fu.is_rm(fpa_e_srt)) {
|
||||||
SASSERT(ctx.e_internalized(bv_e));
|
if (!ctx.e_internalized(bv_e))
|
||||||
sort * s = m.get_sort(bv_e);
|
res = alloc(expr_wrapper_proc, fu.mk_round_nearest_ties_to_away());
|
||||||
family_id fid = s->get_family_id();
|
|
||||||
theory_bv * bv_th = (theory_bv*)ctx.get_theory(fid);
|
|
||||||
rational val;
|
|
||||||
if (!bv_th->get_fixed_value(ctx.get_enode(bv_e)->get_owner(), val)) {
|
|
||||||
UNREACHABLE();
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
theory_bv * bv_th = (theory_bv*)ctx.get_theory(m.get_family_id("bv"));
|
||||||
|
rational val;
|
||||||
|
|
||||||
|
bv_th->get_fixed_value(ctx.get_enode(bv_e)->get_owner(), val); // OK to fail
|
||||||
app * fp_val_e;
|
app * fp_val_e;
|
||||||
SASSERT(val.is_uint64());
|
SASSERT(val.is_uint64());
|
||||||
switch (val.get_uint64())
|
switch (val.get_uint64())
|
||||||
|
@ -311,38 +315,31 @@ namespace smt {
|
||||||
expr * bv_sgn, *bv_sig, *bv_exp;
|
expr * bv_sgn, *bv_sig, *bv_exp;
|
||||||
split_triple(bv_e, bv_sgn, bv_sig, bv_exp);
|
split_triple(bv_e, bv_sgn, bv_sig, bv_exp);
|
||||||
|
|
||||||
SASSERT(ctx.e_internalized(bv_sgn));
|
family_id fid = m.get_family_id("bv");
|
||||||
SASSERT(ctx.e_internalized(bv_sig));
|
|
||||||
SASSERT(ctx.e_internalized(bv_exp));
|
|
||||||
|
|
||||||
enode * e_sgn = ctx.get_enode(bv_sgn);
|
|
||||||
enode * e_sig = ctx.get_enode(bv_sig);
|
|
||||||
enode * e_exp = ctx.get_enode(bv_exp);
|
|
||||||
|
|
||||||
TRACE("t_fpa", tout << "bv rep: [" << mk_ismt2_pp(e_sgn->get_owner(), m) << " "
|
|
||||||
<< mk_ismt2_pp(e_sig->get_owner(), m) << " "
|
|
||||||
<< mk_ismt2_pp(e_exp->get_owner(), m) << "]\n";);
|
|
||||||
|
|
||||||
sort * s = m.get_sort(e_sgn->get_owner());
|
|
||||||
family_id fid = s->get_family_id();
|
|
||||||
theory_bv * bv_th = (theory_bv*)ctx.get_theory(fid);
|
theory_bv * bv_th = (theory_bv*)ctx.get_theory(fid);
|
||||||
|
|
||||||
SASSERT(bv_th->is_attached_to_var(e_sgn));
|
app * e_sgn, *e_sig, *e_exp;
|
||||||
SASSERT(bv_th->is_attached_to_var(e_sig));
|
unsigned exp_sz = fpa_e_srt->get_parameter(0).get_int();
|
||||||
SASSERT(bv_th->is_attached_to_var(e_exp));
|
unsigned sig_sz = fpa_e_srt->get_parameter(1).get_int() - 1;
|
||||||
|
|
||||||
unsigned sig_sz, exp_sz;
|
e_sgn = (ctx.e_internalized(bv_sgn)) ? ctx.get_enode(bv_sgn)->get_owner() :
|
||||||
sig_sz = bu.get_bv_size(e_sig->get_owner());
|
m_converter.bu().mk_numeral(0, 1);
|
||||||
exp_sz = bu.get_bv_size(e_exp->get_owner());
|
e_sig = (ctx.e_internalized(bv_sig)) ? ctx.get_enode(bv_sig)->get_owner() :
|
||||||
|
m_converter.bu().mk_numeral(0, sig_sz);
|
||||||
|
e_exp = (ctx.e_internalized(bv_exp)) ? ctx.get_enode(bv_exp)->get_owner() :
|
||||||
|
m_converter.bu().mk_numeral(0, exp_sz);
|
||||||
|
|
||||||
|
TRACE("t_fpa", tout << "bv rep: ["
|
||||||
|
<< mk_ismt2_pp(e_sgn, m) << "\n"
|
||||||
|
<< mk_ismt2_pp(e_sig, m) << "\n"
|
||||||
|
<< mk_ismt2_pp(e_exp, m) << "]\n";);
|
||||||
|
|
||||||
rational sgn_r(0), sig_r(0), exp_r(0);
|
rational sgn_r(0), sig_r(0), exp_r(0);
|
||||||
|
|
||||||
if (!bv_th->get_fixed_value(e_sgn->get_owner(), sgn_r) ||
|
bv_th->get_fixed_value(e_sgn, sgn_r); // OK to fail
|
||||||
!bv_th->get_fixed_value(e_sig->get_owner(), sig_r) ||
|
bv_th->get_fixed_value(e_sig, sig_r); // OK to fail
|
||||||
!bv_th->get_fixed_value(e_exp->get_owner(), exp_r)) {
|
bv_th->get_fixed_value(e_exp, exp_r); // OK to fail
|
||||||
UNREACHABLE();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
TRACE("t_fpa", tout << "bv model: [" << sgn_r.to_string() << " "
|
TRACE("t_fpa", tout << "bv model: [" << sgn_r.to_string() << " "
|
||||||
<< sig_r.to_string() << " "
|
<< sig_r.to_string() << " "
|
||||||
<< exp_r.to_string() << "]\n";);
|
<< exp_r.to_string() << "]\n";);
|
||||||
|
@ -378,7 +375,6 @@ namespace smt {
|
||||||
|
|
||||||
res = alloc(expr_wrapper_proc, fp_val_e);
|
res = alloc(expr_wrapper_proc, fp_val_e);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
else
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue