assert(_bm->UserFlags.optimize_flag);
assert (BOOLEAN_TYPE == b.GetType());
+ if (b.isConstant())
+ {
+ if (!pushNeg)
+ return b;
+ else
+ {
+ if (ASTTrue==b)
+ return ASTFalse;
+ else
+ return ASTTrue;
+ }
+ }
+
ASTNode output;
if (CheckSimplifyMap(b, output, pushNeg, VarConstMap))
return output;
default:
//kind can be EQ,NEQ,BVLT,BVLE,... or a propositional variable
output = SimplifyAtomicFormula(a, pushNeg, VarConstMap);
- //output = pushNeg ? nf->CreateNode(NOT,a) : a;
break;
}
UpdateSimplifyMap(b, output, pushNeg, VarConstMap);
UpdateSimplifyMap(a, output, pushNeg, VarConstMap);
+
+ ASTNode input_with_not = pushNeg? nf->CreateNode(NOT,a):a;
+ if (input_with_not != output)
+ {
+ return SimplifyFormula(output, false, VarConstMap);
+ }
return output;
}
{
bool notSimplified= false;
for (int i =0; i < inputterm.Degree();i++)
- if (inputterm[i].GetType() == BITVECTOR_TYPE)
+ if (inputterm[i].GetType() != ARRAY_TYPE)
if (!hasBeenSimplified(inputterm[i]))
{
notSimplified = true;
assert(inputterm.Degree() == 2);
const ASTNode& a0 =inputterm[0];
- assert(hasBeenSimplified(a0));
-
const ASTNode& a1 =inputterm[1];
- assert(hasBeenSimplified(a1));
if (a0 == a1)
output = _bm->CreateZeroConst(inputValueWidth);
//can catch this fact.
const ASTNode& a0 =inputterm[0];
- assert(hasBeenSimplified(a0));
const Kind k1 = a0.GetKind();
const ASTNode one = _bm->CreateOneConst(inputValueWidth);
assert(k1 != BVCONST);
//BVEXTRACT. it exposes oppurtunities for later simplification
//and solving (variable elimination)
const ASTNode& a0 =inputterm[0];
- assert(hasBeenSimplified(a0));
const Kind k1 = a0.GetKind();
case BVNEG:
{
const ASTNode& a0 =inputterm[0];
- assert(hasBeenSimplified(a0));
assert (a0.GetKind() != BVCONST);
{
//a0 is the expr which is being sign extended
ASTNode a0 =inputterm[0];
- assert(hasBeenSimplified(a0));
//a1 represents the length of the term BVSX(a0)
const ASTNode& a1 = inputterm[1];
- assert(hasBeenSimplified(a1));
+
if (a0.GetValueWidth() == inputValueWidth)
{
case BVCONCAT:
{
const ASTNode& t =inputterm[0];
- assert(hasBeenSimplified(t));
-
const ASTNode& u =inputterm[1];
- assert(hasBeenSimplified(u));
const Kind tkind = t.GetKind();
const Kind ukind = u.GetKind();
{ // If the shift amount is known. Then replace it by an extract.
const ASTNode a =inputterm[0];
- assert(hasBeenSimplified(a));
-
const ASTNode b =inputterm[1];
- assert(hasBeenSimplified(b));
+
const unsigned int width = a.GetValueWidth();
if (BVCONST == b.GetKind()) // known shift amount.
}
case ITE:
{
- // SimplifyFormula isn't idempotent, so we try again.
- ASTNode t0 = SimplifyFormula(inputterm[0], false, VarConstMap);
-
- const ASTNode& t1 = inputterm[1];
- assert(hasBeenSimplified(t1));
-
- const ASTNode& t2 = inputterm[2];
- assert(hasBeenSimplified(t2));
-
- output = CreateSimplifiedTermITE(t0, t1, t2);
+ output = CreateSimplifiedTermITE(inputterm[0], inputterm[1], inputterm[2]);
break;
}
case SBVREM: