mirror of
https://github.com/Z3Prover/z3
synced 2025-04-22 08:35:31 +00:00
tune multiplication slightly
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
2522c8b53d
commit
4fad0385de
3 changed files with 31 additions and 9 deletions
|
@ -977,6 +977,20 @@ namespace dd {
|
|||
return result;
|
||||
}
|
||||
|
||||
bddv bdd_manager::mk_add(bddv const& a, std::function<bdd(unsigned)>& b) {
|
||||
bdd carry = mk_false();
|
||||
bddv result(this);
|
||||
if (a.size() > 0)
|
||||
result.push_back(a[0] ^ b(0));
|
||||
for (unsigned i = 1; i < a.size(); ++i) {
|
||||
auto bi1 = b(i-1);
|
||||
carry = (carry && a[i-1]) || (carry && bi1) || (a[i-1] && bi1);
|
||||
result.push_back(carry ^ a[i] ^ b(i));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
bddv bdd_manager::mk_sub(bddv const& a, bddv const& b) {
|
||||
SASSERT(a.size() == b.size());
|
||||
bdd carry = mk_false();
|
||||
|
@ -1018,14 +1032,14 @@ namespace dd {
|
|||
|
||||
bddv bdd_manager::mk_mul(bddv const& a, bddv const& b) {
|
||||
SASSERT(a.size() == b.size());
|
||||
bddv a_shifted = a;
|
||||
bddv result = mk_zero(a.size());
|
||||
for (unsigned i = 0; i < b.size(); ++i) {
|
||||
bddv s = a_shifted;
|
||||
for (unsigned j = i; j < b.size(); ++j)
|
||||
s[j] &= b[i];
|
||||
result = mk_add(result, s);
|
||||
a_shifted.shl();
|
||||
std::function<bdd(unsigned)> get_a = [&](unsigned k) {
|
||||
if (k < i)
|
||||
return mk_false();
|
||||
return a[i - k] && b[i];
|
||||
};
|
||||
result = mk_add(result, get_a);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
@ -1040,7 +1054,6 @@ namespace dd {
|
|||
|
||||
bddv bdd_manager::mk_mul(bddv const& a, bool_vector const& b) {
|
||||
SASSERT(a.size() == b.size());
|
||||
bddv a_shifted = a;
|
||||
bddv result = mk_zero(a.size());
|
||||
|
||||
|
||||
|
@ -1051,9 +1064,14 @@ namespace dd {
|
|||
return mk_usub(mk_mul(a, mk_usub(b)));
|
||||
|
||||
for (unsigned i = 0; i < a.size(); ++i) {
|
||||
std::function<bdd(unsigned)> get_a = [&](unsigned k) {
|
||||
if (k < i)
|
||||
return mk_false();
|
||||
else
|
||||
return a[k - i];
|
||||
};
|
||||
if (b[i])
|
||||
result = mk_add(result, a_shifted);
|
||||
a_shifted.shl();
|
||||
result = mk_add(result, get_a);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -206,6 +206,7 @@ namespace dd {
|
|||
|
||||
bool_vector mk_usub(bool_vector const& b);
|
||||
|
||||
|
||||
public:
|
||||
struct mem_out {};
|
||||
|
||||
|
@ -247,6 +248,7 @@ namespace dd {
|
|||
bddv mk_var(unsigned num_bits, unsigned const* vars);
|
||||
bddv mk_var(unsigned_vector const& vars);
|
||||
bddv mk_add(bddv const& a, bddv const& b);
|
||||
bddv mk_add(bddv const& a, std::function<bdd(unsigned)>& get_bit);
|
||||
bddv mk_sub(bddv const& a, bddv const& b);
|
||||
bddv mk_usub(bddv const& a);
|
||||
bddv mk_mul(bddv const& a, bddv const& b);
|
||||
|
@ -366,6 +368,7 @@ namespace dd {
|
|||
inline bddv operator+(rational const& r, bddv const& a) { return a + r; }
|
||||
inline bddv operator-(rational const& r, bddv const& a) { return a.rev_sub(r); }
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -516,6 +516,7 @@ namespace polysat {
|
|||
*
|
||||
*/
|
||||
void solver::resolve_conflict() {
|
||||
IF_VERBOSE(1, verbose_stream() << "resolve conflict\n");
|
||||
LOG_H2("Resolve conflict");
|
||||
LOG_H2(*this);
|
||||
++m_stats.m_num_conflicts;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue