Skip to content

Commit f0d33dd

Browse files
some simplifications based on #4178
1 parent 2695221 commit f0d33dd

8 files changed

+32
-9
lines changed

src/ast/rewriter/bit_blaster/bit_blaster.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ static void sort_args(expr * & l1, expr * & l2, expr * & l3) {
3636
l1 = args[0]; l2 = args[1]; l3 = args[2];
3737
}
3838

39+
3940
void bit_blaster_cfg::mk_xor3(expr * l1, expr * l2, expr * l3, expr_ref & r) {
4041
TRACE("xor3", tout << "#" << l1->get_id() << " #" << l2->get_id() << " #" << l3->get_id(););
4142
sort_args(l1, l2, l3);

src/ast/rewriter/bit_blaster/bit_blaster.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class bit_blaster_cfg {
4444
void mk_and(expr * a, expr * b, expr_ref & r) { m_rw.mk_and(a, b, r); }
4545
void mk_and(expr * a, expr * b, expr * c, expr_ref & r) { m_rw.mk_and(a, b, c, r); }
4646
void mk_and(unsigned sz, expr * const * args, expr_ref & r) { m_rw.mk_and(sz, args, r); }
47+
void mk_ge2(expr* a, expr* b, expr* c, expr_ref& r) { m_rw.mk_ge2(a, b, c, r); }
4748
void mk_or(expr * a, expr * b, expr_ref & r) { m_rw.mk_or(a, b, r); }
4849
void mk_or(expr * a, expr * b, expr * c, expr_ref & r) { m_rw.mk_or(a, b, c, r); }
4950
void mk_or(unsigned sz, expr * const * args, expr_ref & r) { m_rw.mk_or(sz, args, r); }

src/ast/rewriter/bit_blaster/bit_blaster_rewriter.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ struct blaster_cfg {
6464
void mk_ite(expr * c, expr * t, expr * e, expr_ref & r) { m_rewriter.mk_ite(c, t, e, r); }
6565
void mk_nand(expr * a, expr * b, expr_ref & r) { m_rewriter.mk_nand(a, b, r); }
6666
void mk_nor(expr * a, expr * b, expr_ref & r) { m_rewriter.mk_nor(a, b, r); }
67+
void mk_ge2(expr * a, expr * b, expr * c, expr_ref& r) { m_rewriter.mk_ge2(a, b, c, r); }
6768
};
6869

6970
class blaster : public bit_blaster_tpl<blaster_cfg> {

src/ast/rewriter/bit_blaster/bit_blaster_tpl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class bit_blaster_tpl : public Cfg {
7070
void mk_ite(expr * c, expr * t, expr * e, expr_ref & r) { Cfg::mk_ite(c, t, e, r); }
7171
void mk_nand(expr * a, expr * b, expr_ref & r) { Cfg::mk_nand(a, b, r); }
7272
void mk_nor(expr * a, expr * b, expr_ref & r) { Cfg::mk_nor(a, b, r); }
73+
void mk_ge2(expr* a, expr* b, expr* c, expr_ref& r) { Cfg::mk_ge2(a, b, c, r); }
7374
//
7475

7576

src/ast/rewriter/bit_blaster/bit_blaster_tpl_def.h

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,23 +1101,17 @@ template<typename Cfg>
11011101
template<bool Signed>
11021102
void bit_blaster_tpl<Cfg>::mk_le(unsigned sz, expr * const * a_bits, expr * const * b_bits, expr_ref & out) {
11031103
SASSERT(sz > 0);
1104-
expr_ref i1(m()), i2(m()), i3(m()), not_a(m());
1104+
expr_ref not_a(m());
11051105
mk_not(a_bits[0], not_a);
11061106
mk_or(not_a, b_bits[0], out);
11071107
for (unsigned idx = 1; idx < (Signed ? sz - 1 : sz); idx++) {
11081108
mk_not(a_bits[idx], not_a);
1109-
mk_and(not_a, b_bits[idx], i1);
1110-
mk_and(not_a, out, i2);
1111-
mk_and(b_bits[idx], out, i3);
1112-
mk_or(i1, i2, i3, out);
1109+
mk_ge2(not_a, b_bits[idx], out, out);
11131110
}
11141111
if (Signed) {
11151112
expr_ref not_b(m());
11161113
mk_not(b_bits[sz-1], not_b);
1117-
mk_and(not_b, a_bits[sz-1], i1);
1118-
mk_and(not_b, out, i2);
1119-
mk_and(a_bits[sz-1], out, i3);
1120-
mk_or(i1, i2, i3, out);
1114+
mk_ge2(not_b, a_bits[sz-1], out, out);
11211115
}
11221116
}
11231117

src/ast/rewriter/bool_rewriter.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,4 +1031,22 @@ void bool_rewriter::mk_nor(expr * arg1, expr * arg2, expr_ref & result) {
10311031
mk_not(tmp, result);
10321032
}
10331033

1034+
1035+
void bool_rewriter::mk_ge2(expr* a, expr* b, expr* c, expr_ref& r) {
1036+
if (m().is_false(a)) mk_and(b, c, r);
1037+
else if (m().is_false(b)) mk_and(a, c, r);
1038+
else if (m().is_false(c)) mk_and(a, b, r);
1039+
else if (m().is_true(a)) mk_or(b, c, r);
1040+
else if (m().is_true(b)) mk_or(a, c, r);
1041+
else if (m().is_true(c)) mk_or(a, b, r);
1042+
else {
1043+
expr_ref i1(m()), i2(m()), i3(m());
1044+
mk_and(a, b, i1);
1045+
mk_and(a, c, i2);
1046+
mk_and(b, c, i3);
1047+
mk_or(i1, i2, i3, r);
1048+
}
1049+
}
1050+
1051+
10341052
template class rewriter_tpl<bool_rewriter_cfg>;

src/ast/rewriter/bool_rewriter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ class bool_rewriter {
215215
void mk_nor(unsigned num_args, expr * const * args, expr_ref & result);
216216
void mk_nand(expr * arg1, expr * arg2, expr_ref & result);
217217
void mk_nor(expr * arg1, expr * arg2, expr_ref & result);
218+
void mk_ge2(expr* a, expr* b, expr* c, expr_ref& result);
218219
};
219220

220221
struct bool_rewriter_cfg : public default_rewriter_cfg {

src/ast/rewriter/bv_rewriter.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,12 @@ br_status bv_rewriter::mk_leq_core(bool is_signed, expr * a, expr * b, expr_ref
510510
return BR_REWRITE2;
511511
}
512512

513+
// (bvule c (+ c a)) -> (bvule a (2^n - c)) (could be generalized)
514+
if (!is_signed && is_num1 && m_util.is_bv_add(b, a1, a2) && is_numeral(a1, r2, sz) && r1 == r2) {
515+
result = m_util.mk_ule(a2, m_util.mk_numeral(-r1, sz));
516+
return BR_REWRITE1;
517+
}
518+
513519
if (m_le_extra) {
514520
const br_status cst = rw_leq_concats(is_signed, a, b, result);
515521
if (cst != BR_FAILED) {

0 commit comments

Comments
 (0)