outmonom = monom;
chosen_symbol = true;
}
+ else if (
+ !chosen_symbol
+ && monom.GetKind() == BVEXTRACT
+ && SYMBOL == monom[0].GetKind()
+ && BVCONST == monom[1].GetKind()
+ && zero == monom[2]
+ && !DoNotSolveThis(monom[0])
+ && count.single(monom[0])
+ )
+ {
+ outmonom = monom;
+ chosen_symbol = true;
+ }
+ else if (
+ !chosen_symbol
+ && monom.GetKind() == BVUMINUS
+ && monom[0].GetKind() == BVEXTRACT
+ && SYMBOL == monom[0][0].GetKind()
+ && BVCONST == monom[0][1].GetKind()
+ && zero == monom[0][2]
+ && !DoNotSolveThis(monom[0][0])
+ && count.single(monom[0][0])
+ )
+ {
+ outmonom = monom;
+ chosen_symbol = true;
+ }
else
+
{
o.push_back(monom);
}
_bm->CreateNode(AND, o) :
o[0]) :
ASTTrue;
- output = _bm->CreateNode(AND, output, evens);
+ if (evens != ASTTrue)
+ output = _bm->CreateNode(AND, output, evens);
output = solveForAndOfXOR(output);
--- /dev/null
+(benchmark r
+ :status sat
+ :category { crafted }
+ :difficulty { 0 }
+ :logic QF_BV
+ :extrafuns ((x BitVec[3]))
+ :extrafuns ((y BitVec[3]))
+ :extrafuns ((z BitVec[3]))
+
+ :assumption (= (bvadd (bvadd (bvmul bv3[3] x) (bvmul bv4[3] y)) (bvmul bv2[3] z)) bv0[3])
+ :assumption (= (bvadd (bvadd (bvmul bv2[3] x) (bvmul bv2[3] y)) (bvmul bv0[3] z)) bv6[3])
+ :assumption (= (bvadd (bvadd (bvmul bv2[3] x) (bvmul bv4[3] y)) (bvmul bv2[3] z)) bv0[3])
+
+ :formula true
+)