mirror of
https://github.com/Z3Prover/z3
synced 2025-04-22 00:26:38 +00:00
no need to introduce names for zero_ext/sign_ext arguments
This commit is contained in:
parent
5c53f588b7
commit
4b4f0558b4
2 changed files with 6 additions and 8 deletions
|
@ -654,8 +654,7 @@ namespace polysat {
|
|||
unsigned const v_sz = p_sz + extra_bits;
|
||||
if (p.is_val())
|
||||
return s.sz2pdd(v_sz).mk_val(p.val());
|
||||
pvar const p_name = s.m_names.mk_name(p);
|
||||
constraint_dedup::bv_ext_args const args = {false, p_name, extra_bits};
|
||||
constraint_dedup::bv_ext_args const args = {{false, p, extra_bits}};
|
||||
auto const it = m_dedup.m_bv_ext_expr.find_iterator(args);
|
||||
if (it != m_dedup.m_bv_ext_expr.end())
|
||||
return s.var(it->m_value);
|
||||
|
@ -663,7 +662,7 @@ namespace polysat {
|
|||
pdd const V = s.var(v);
|
||||
m_dedup.m_bv_ext_expr.insert(args, v);
|
||||
// (1) v[|p|-1:0] = p
|
||||
s.add_eq(extract(V, p_sz - 1, 0), s.var(p_name));
|
||||
s.add_eq(extract(V, p_sz - 1, 0), p);
|
||||
// (2) v < 2^|p|
|
||||
s.add_ule(V, p.manager().max_value());
|
||||
return V;
|
||||
|
@ -675,15 +674,14 @@ namespace polysat {
|
|||
unsigned const v_sz = p_sz + extra_bits;
|
||||
if (p.is_val())
|
||||
return s.sz2pdd(v_sz).mk_val(p.get_signed_val());
|
||||
pdd const q = s.var(s.m_names.mk_name(p));
|
||||
constraint_dedup::bv_ext_args const args = {true, q.var(), extra_bits};
|
||||
constraint_dedup::bv_ext_args const args = {{true, p, extra_bits}};
|
||||
auto const it = m_dedup.m_bv_ext_expr.find_iterator(args);
|
||||
if (it != m_dedup.m_bv_ext_expr.end())
|
||||
return s.var(it->m_value);
|
||||
pdd const v = s.var(s.add_var(v_sz, pvar_kind::internal));
|
||||
m_dedup.m_bv_ext_expr.insert(args, v.var());
|
||||
// (1) v[|p|-1:0] = p
|
||||
s.add_eq(q, extract(v, p_sz - 1, 0));
|
||||
s.add_eq(extract(v, p_sz - 1, 0), p);
|
||||
// (2) Let h := v[|v|-1:|p|]
|
||||
pdd const h = extract(v, v_sz - 1, p_sz);
|
||||
signed_constraint p_negative = s.uge(p, rational::power_of_two(p_sz - 1));
|
||||
|
|
|
@ -43,11 +43,11 @@ namespace polysat {
|
|||
vector<std::tuple<pdd, pdd, pvar, pvar>> m_div_rem_list;
|
||||
|
||||
// zero_ext or sign_ext
|
||||
using bv_ext_args = std::tuple<bool, pvar, unsigned>;
|
||||
using bv_ext_args = std::optional<std::tuple<bool, pdd, unsigned>>; // NOTE: this is only wrapped in optional because table2map requires a default constructor
|
||||
using bv_ext_args_eq = default_eq<bv_ext_args>;
|
||||
struct bv_ext_args_hash {
|
||||
unsigned operator()(bv_ext_args const& args) const {
|
||||
return mk_mix(std::get<0>(args), std::get<1>(args), std::get<2>(args));
|
||||
return args ? mk_mix(std::get<0>(*args), std::get<1>(*args).hash(), std::get<2>(*args)) : 0;
|
||||
}
|
||||
};
|
||||
using bv_ext_expr_map = map<bv_ext_args, pvar, bv_ext_args_hash, bv_ext_args_eq>;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue