3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-07-29 15:37:58 +00:00
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2023-12-25 09:23:57 -08:00
parent cf6d7d2c4b
commit 071836d5ed
2 changed files with 39 additions and 27 deletions

View file

@ -93,54 +93,58 @@ namespace polysat {
} }
} }
// fixed bits void viable::init_fixed_bits(pvar v) {
// suffixes
// find one or two values
//
lbool viable::find_viable(pvar v, rational& lo, rational& hi) {
return l_undef;
fixed_bits_info fbi;
#if 0 #if 0
if (!collect_bit_information(v, true, fbi)) if (!collect_bit_information(v, true, fbi))
return l_false; // conflict already added return; // conflict already added
#endif #endif
}
offset_slices overlaps; void viable::init_overlays(pvar v) {
c.get_bitvector_suffixes(v, overlaps); m_widths.reset();
std::sort(overlaps.begin(), overlaps.end(), [&](auto const& x, auto const& y) { return c.size(x.v) > c.size(y.v); }); m_overlaps.reset();
c.get_bitvector_suffixes(v, m_overlaps);
std::sort(m_overlaps.begin(), m_overlaps.end(), [&](auto const& x, auto const& y) { return c.size(x.v) > c.size(y.v); });
uint_set widths_set; uint_set widths_set;
// max size should always be present, regardless of whether we have intervals there (to make sure all fixed bits are considered) // max size should always be present, regardless of whether we have intervals there (to make sure all fixed bits are considered)
widths_set.insert(c.size(v)); widths_set.insert(c.size(v));
for (auto const& [v, offset] : overlaps) for (auto const& [v, offset] : m_overlaps)
for (layer const& l : m_units[v].get_layers()) for (layer const& l : m_units[v].get_layers())
widths_set.insert(l.bit_width); widths_set.insert(l.bit_width);
unsigned_vector widths; for (unsigned w : widths_set)
for (unsigned w : widths_set) m_widths.push_back(w);
widths.push_back(w); LOG("Overlaps with v" << v << ":" << m_overlaps);
LOG("Overlaps with v" << v << ":" << overlaps); LOG("widths: " << m_widths);
LOG("widths: " << widths); }
lbool viable::find_viable(pvar v, rational& lo, rational& hi) {
m_explain.reset();
init_fixed_bits(v);
init_overlays(v);
return l_undef;
rational const& max_value = c.var2pdd(v).max_value(); rational const& max_value = c.var2pdd(v).max_value();
m_explain.reset();
lbool result_lo = find_on_layers(v, widths, overlaps, fbi, rational::zero(), max_value, lo); lbool r = find_on_layers(v, m_widths, m_overlaps, m_fbi, rational::zero(), max_value, lo);
if (result_lo != l_true) if (r != l_true)
return result_lo; return r;
if (lo == max_value) { if (lo == max_value) {
hi = lo; hi = lo;
return l_true; return l_true;
} }
lbool result_hi = find_on_layers(v, widths, overlaps, fbi, lo + 1, max_value, hi); r = find_on_layers(v, m_widths, m_overlaps, m_fbi, lo + 1, max_value, hi);
if (result_hi != l_false) if (r != l_false)
return result_hi; return r;
hi = lo; hi = lo;
return l_true; return l_true;
} }

View file

@ -240,6 +240,14 @@ namespace polysat {
bool collect_bit_information(pvar v, bool add_conflict, fixed_bits_info& out_fbi); bool collect_bit_information(pvar v, bool add_conflict, fixed_bits_info& out_fbi);
fixed_bits_info m_fbi;
void init_fixed_bits(pvar v);
unsigned_vector m_widths;
offset_slices m_overlaps;
void init_overlays(pvar v);
public: public:
viable(core& c); viable(core& c);