more bv rewrites
authorlianah <lianahady@gmail.com>
Sat, 14 Jun 2014 20:13:46 +0000 (16:13 -0400)
committerlianah <lianahady@gmail.com>
Sat, 14 Jun 2014 20:13:46 +0000 (16:13 -0400)
src/theory/bv/theory_bv.cpp
src/theory/bv/theory_bv_rewrite_rules.h
src/theory/bv/theory_bv_rewrite_rules_normalization.h
src/theory/bv/theory_bv_rewrite_rules_simplification.h

index 441577c9e9167d5ce0ab29da3a2c2ec98f0e8f41..04b8e9d6e3e1a611dbb265b15d4d71c4106c2aea 100644 (file)
@@ -562,6 +562,26 @@ Node TheoryBV::ppRewrite(TNode t)
     res = Rewriter::rewrite(result);
   }
 
+  if( res.getKind() == kind::EQUAL &&
+      ((res[0].getKind() == kind::BITVECTOR_PLUS &&
+        RewriteRule<ConcatToMult>::applies(res[1])) ||
+       res[1].getKind() == kind::BITVECTOR_PLUS &&
+       RewriteRule<ConcatToMult>::applies(res[0]))) {
+    Node mult = RewriteRule<ConcatToMult>::applies(res[0])?
+      RewriteRule<ConcatToMult>::run<false>(res[0]) :
+      RewriteRule<ConcatToMult>::run<true>(res[1]);
+    Node factor = mult[0];
+    Node sum =  RewriteRule<ConcatToMult>::applies(res[0])? res[1] : res[0];
+    Node new_eq =utils::mkNode(kind::EQUAL, sum, mult);
+    Node rewr_eq = RewriteRule<SolveEq>::run<true>(new_eq);
+    if (rewr_eq[0].isVar() || rewr_eq[1].isVar()){
+      res = Rewriter::rewrite(rewr_eq);
+    } else {
+      res = t;
+    }
+  }
+  
+
   // if(t.getKind() == kind::EQUAL &&
   //    ((t[0].getKind() == kind::BITVECTOR_MULT && t[1].getKind() == kind::BITVECTOR_PLUS) ||
   //     (t[1].getKind() == kind::BITVECTOR_MULT && t[0].getKind() == kind::BITVECTOR_PLUS))) {
index 496e05c86e7a3a3deb4ef2e6b16cfbed6f144217..eadb63671c80c4a994711b35e1a0b8cb85d68087 100644 (file)
@@ -164,7 +164,8 @@ enum RewriteRuleId {
   BitwiseSlicing,
   // rules to simplify bitblasting
   BBPlusNeg,
-  UltPlusOne
+  UltPlusOne,
+  ConcatToMult
 };
 
 
@@ -291,6 +292,7 @@ inline std::ostream& operator << (std::ostream& out, RewriteRuleId ruleId) {
   case ExtractSignExtend : out << "ExtractSignExtend"; return out;
   case MultDistrib: out << "MultDistrib"; return out;
   case UltPlusOne: out << "UltPlusOne"; return out;
+  case ConcatToMult: out << "ConcatToMult"; return out;
   default:
     Unreachable();
   }
@@ -513,6 +515,7 @@ struct AllRewriteRules {
   RewriteRule<IntToBVEliminate>  rule117;
   RewriteRule<MultDistrib> rule118;
   RewriteRule<UltPlusOne> rule119;
+  RewriteRule<ConcatToMult> rule120;
 };
 
 template<> inline
index 0807b3d66023d767d54aaefe39d91f1ea0c587ea..5cff670059f533a2598239350c32cde2958957b1 100644 (file)
@@ -506,6 +506,38 @@ Node RewriteRule<MultDistrib>::apply(TNode node) {
   return utils::mkNode(sum.getKind(), children); 
 }
 
+template<> inline
+bool RewriteRule<ConcatToMult>::applies(TNode node) {
+  if (node.getKind() != kind::BITVECTOR_CONCAT) return false;
+  if (node.getNumChildren() != 2) return false;
+  if (node[0].getKind()!= kind::BITVECTOR_EXTRACT) return false;
+  if (!node[1].isConst()) return false;
+  TNode extract = node[0];
+  TNode c = node[1];
+  unsigned ammount = utils::getSize(c);
+  
+  if (utils::getSize(node) != utils::getSize(extract[0])) return false; 
+  if (c != utils::mkConst(ammount, 0)) return false;
+
+  unsigned low = utils::getExtractLow(extract);
+  if (low != 0) return false; 
+  unsigned high = utils::getExtractHigh(extract);
+  if (high + ammount + 1 != utils::getSize(node)) return false;
+  return true;
+}
+
+template<> inline
+Node RewriteRule<ConcatToMult>::apply(TNode node) {
+  Debug("bv-rewrite") << "RewriteRule<ConcatToMult>(" << node << ")" << std::endl;
+  unsigned size = utils::getSize(node); 
+  Node factor = node[0][0];
+  Assert(utils::getSize(factor) == utils::getSize(node)); 
+  BitVector ammount = BitVector(size, utils::getSize(node[1]));
+  Node coef = utils::mkConst(BitVector(size, 1u).leftShift(ammount));
+  return utils::mkNode(kind::BITVECTOR_MULT, factor, coef); 
+}
+
+
 
 template<> inline
 bool RewriteRule<SolveEq>::applies(TNode node) {
index a8a7d112785530fcd75b46d09354d0f3a9b7aebe..71df1edcad0425bdf3afbc375a1174da16e12ef4 100644 (file)
@@ -1169,6 +1169,10 @@ bool RewriteRule<UltPlusOne>::applies(TNode node) {
       y1[1].getKind() != kind::CONST_BITVECTOR)
     return false;
   
+  if (y1[0].getKind() == kind::CONST_BITVECTOR &&
+      y1[1].getKind() == kind::CONST_BITVECTOR)
+    return false;
+  
   if (y1.getNumChildren() != 2)
     return false;