Move bv arith conversions to arith (#8945)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Mon, 11 Jul 2022 20:02:59 +0000 (15:02 -0500)
committerGitHub <noreply@github.com>
Mon, 11 Jul 2022 20:02:59 +0000 (15:02 -0500)
This is in preparation for lazier handling of bv2nat and int2bv. Our infrastructure in arithmetic is better equipped for doing this.

There are no behavior changes in this PR.

17 files changed:
src/theory/arith/arith_rewriter.cpp
src/theory/arith/arith_rewriter.h
src/theory/arith/arith_utilities.cpp
src/theory/arith/arith_utilities.h
src/theory/arith/kinds
src/theory/arith/linear/normal_form.cpp
src/theory/arith/linear/normal_form.h
src/theory/arith/operator_elim.cpp
src/theory/arith/theory_arith_type_rules.cpp
src/theory/arith/theory_arith_type_rules.h
src/theory/bv/kinds
src/theory/bv/theory_bv_rewrite_rules_operator_elimination.h
src/theory/bv/theory_bv_rewriter.cpp
src/theory/bv/theory_bv_type_rules.cpp
src/theory/bv/theory_bv_type_rules.h
src/theory/bv/theory_bv_utils.cpp
src/theory/bv/theory_bv_utils.h

index c6ac2895051ddf05a82b10051e7a216e00171d1f..a5bec7d9e18d03df80fc31d5db235ecbfc6f84c7 100644 (file)
@@ -247,6 +247,8 @@ RewriteResponse ArithRewriter::preRewriteTerm(TNode t){
       case kind::INTS_DIVISION_TOTAL:
       case kind::INTS_MODULUS_TOTAL: return rewriteIntsDivModTotal(t, true);
       case kind::ABS: return rewriteAbs(t);
+      case kind::BITVECTOR_TO_NAT:
+      case kind::INT_TO_BITVECTOR:
       case kind::IS_INTEGER:
       case kind::TO_INTEGER:
       case kind::TO_REAL:
@@ -344,10 +346,10 @@ RewriteResponse ArithRewriter::postRewriteTerm(TNode t){
         ss << "  " << t;
         throw LogicException(ss.str());
       }
-    case kind::PI:
-      return RewriteResponse(REWRITE_DONE, t);
-    default:
-      Unreachable();
+      case kind::BITVECTOR_TO_NAT: return rewriteBVToNat(t);
+      case kind::INT_TO_BITVECTOR: return rewriteIntToBV(t);
+      case kind::PI: return RewriteResponse(REWRITE_DONE, t);
+      default: Unreachable();
     }
   }
 }
@@ -1109,6 +1111,26 @@ RewriteResponse ArithRewriter::postRewriteTranscendental(TNode t)
   return RewriteResponse(REWRITE_DONE, t);
 }
 
+RewriteResponse ArithRewriter::rewriteBVToNat(TNode node)
+{
+  if (node[0].isConst())
+  {
+    Node resultNode = eliminateBv2Nat(node);
+    return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
+  }
+  return RewriteResponse(REWRITE_DONE, node);
+}
+
+RewriteResponse ArithRewriter::rewriteIntToBV(TNode node)
+{
+  if (node[0].isConst())
+  {
+    Node resultNode = eliminateInt2Bv(node);
+    return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
+  }
+  return RewriteResponse(REWRITE_DONE, node);
+}
+
 TrustNode ArithRewriter::expandDefinition(Node node)
 {
   // call eliminate operators, to eliminate partial operators only
index 12f288d74ee7fc4ddb87ebfd84d6d075d4e17a5c..01b1fa95a47ce5486c7101fe8183dc7f2272f09b 100644 (file)
@@ -92,6 +92,11 @@ class ArithRewriter : public TheoryRewriter
   /** postRewrite transcendental functions */
   static RewriteResponse postRewriteTranscendental(TNode t);
 
+  /** rewrite bv2nat */
+  static RewriteResponse rewriteBVToNat(TNode node);
+  /** rewrite int2bv */
+  static RewriteResponse rewriteIntToBV(TNode node);
+
   /** return rewrite */
   static RewriteResponse returnRewrite(TNode t, Node ret, Rewrite r);
   /** The operator elimination utility */
index 02fda5156d7e013a12f4a0e5a56d8b8056e2dacd..dfdd5b754e318537cd909e0e116695824df8d449 100644 (file)
@@ -17,6 +17,9 @@
 
 #include <cmath>
 
+#include "theory/bv/theory_bv_utils.h"
+#include "util/bitvector.h"
+
 using namespace cvc5::internal::kind;
 
 namespace cvc5::internal {
@@ -307,6 +310,58 @@ std::pair<Node,Node> mkSameType(const Node& a, const Node& b)
   return {a, nm->mkNode(kind::TO_REAL, b)};
 }
 
+/* ------------------------------------------------------------------------- */
+
+Node eliminateBv2Nat(TNode node)
+{
+  const unsigned size = bv::utils::getSize(node[0]);
+  NodeManager* const nm = NodeManager::currentNM();
+  const Node z = nm->mkConstInt(Rational(0));
+  const Node bvone = bv::utils::mkOne(1);
+
+  Integer i = 1;
+  std::vector<Node> children;
+  for (unsigned bit = 0; bit < size; ++bit, i *= 2)
+  {
+    Node cond =
+        nm->mkNode(kind::EQUAL,
+                   nm->mkNode(nm->mkConst(BitVectorExtract(bit, bit)), node[0]),
+                   bvone);
+    children.push_back(
+        nm->mkNode(kind::ITE, cond, nm->mkConstInt(Rational(i)), z));
+  }
+  // avoid plus with one child
+  return children.size() == 1 ? children[0] : nm->mkNode(kind::ADD, children);
+}
+
+Node eliminateInt2Bv(TNode node)
+{
+  const uint32_t size = node.getOperator().getConst<IntToBitVector>().d_size;
+  NodeManager* const nm = NodeManager::currentNM();
+  const Node bvzero = bv::utils::mkZero(1);
+  const Node bvone = bv::utils::mkOne(1);
+
+  std::vector<Node> v;
+  Integer i = 2;
+  while (v.size() < size)
+  {
+    Node cond = nm->mkNode(
+        kind::GEQ,
+        nm->mkNode(
+            kind::INTS_MODULUS_TOTAL, node[0], nm->mkConstInt(Rational(i))),
+        nm->mkConstInt(Rational(i, 2)));
+    v.push_back(nm->mkNode(kind::ITE, cond, bvone, bvzero));
+    i *= 2;
+  }
+  if (v.size() == 1)
+  {
+    return v[0];
+  }
+  NodeBuilder result(kind::BITVECTOR_CONCAT);
+  result.append(v.rbegin(), v.rend());
+  return Node(result);
+}
+
 }  // namespace arith
 }  // namespace theory
 }  // namespace cvc5::internal
index c08dbff0bdfc20d586c6b7b6ba37d0bf3ed84d0f..6628c26212601c20135f13e2fbcd4d68c0b131f5 100644 (file)
@@ -341,6 +341,24 @@ Node mkEquality(const Node& a, const Node& b);
  */
 std::pair<Node,Node> mkSameType(const Node& a, const Node& b);
 
+/**
+ * Returns the rewritten form of node, which is a term of the form bv2nat(x).
+ * The return value of this method is the integer sum:
+ *   (+ ite( (= ((_ extract (n-1) (n-1)) x) 1) (^ 2 (n-1)) 0)
+ *      ...
+ *      ite( (= ((_ extract 0 0) x) 1) (^ 2 0) 0))
+ * where n is the bitwidth of x.
+ */
+Node eliminateBv2Nat(TNode node);
+/**
+ * Returns the rewritten form of node, which is a term of the form int2bv(x).
+ * The return value of this method is the concatenation term:
+ *   (bvconcat ite( (>= (mod x (^ 2 n)) (^ 2 (n-1))) (_ bv1 1) (_ bv1 0))
+ *             ...
+ *             ite( (>= (mod x (^ 2 1)) (^ 2 0)) (_ bv1 1) (_ bv1 0)))
+ * where n is the bit-width of x.
+ */
+Node eliminateInt2Bv(TNode node);
 
 }  // namespace arith
 }  // namespace theory
index 5b302369aeb90640d691426500601f3cf11a0519..e10d5fd1422c8c139107143a2c21af9e12f6967d 100644 (file)
@@ -183,4 +183,20 @@ parameterized IAND IAND_OP 2 "integer version of AND operator; first parameter i
 typerule IAND_OP ::cvc5::internal::theory::arith::IAndOpTypeRule
 typerule IAND ::cvc5::internal::theory::arith::IAndTypeRule
 
+## conversion kinds
+operator BITVECTOR_TO_NAT 1 "bit-vector conversion to (nonnegative) integer; parameter is a bit-vector"
+
+constant INT_TO_BITVECTOR_OP \
+  struct \
+  IntToBitVector \
+  "::cvc5::internal::UnsignedHashFunction< ::cvc5::internal::IntToBitVector >" \
+  "util/bitvector.h" \
+  "operator for the integer conversion to bit-vector; payload is an instance of the cvc5::internal::IntToBitVector class"
+parameterized INT_TO_BITVECTOR INT_TO_BITVECTOR_OP 1 "integer conversion to bit-vector; first parameter is an INT_TO_BITVECTOR_OP, second is an integer term"
+
+## conversion kinds
+typerule BITVECTOR_TO_NAT ::cvc5::internal::theory::arith::BitVectorConversionTypeRule
+typerule INT_TO_BITVECTOR_OP ::cvc5::internal::theory::arith::IntToBitVectorOpTypeRule
+typerule INT_TO_BITVECTOR ::cvc5::internal::theory::arith::BitVectorConversionTypeRule
+
 endtheory
index 90a96a8745db5f356f74727c7349bf79efed3671..956a64bf655ef91e3d9f397d2567e128296b8f2e 100644 (file)
@@ -42,17 +42,6 @@ bool Variable::isLeafMember(Node n){
 
 VarList::VarList(Node n) : NodeWrapper(n) { Assert(isSorted(begin(), end())); }
 
-bool Variable::isIAndMember(Node n)
-{
-  return n.getKind() == kind::IAND && Polynomial::isMember(n[0])
-         && Polynomial::isMember(n[1]);
-}
-
-bool Variable::isPow2Member(Node n)
-{
-  return n.getKind() == kind::POW2 && Polynomial::isMember(n[0]);
-}
-
 bool Variable::isDivMember(Node n){
   switch(n.getKind()){
   case kind::DIVISION:
@@ -67,30 +56,18 @@ bool Variable::isDivMember(Node n){
   }
 }
 
-bool Variable::isTranscendentalMember(Node n) {
-  switch(n.getKind()){
-  case kind::EXPONENTIAL:
-  case kind::SINE:
-  case kind::COSINE:
-  case kind::TANGENT:
-  case kind::COSECANT:
-  case kind::SECANT:
-  case kind::COTANGENT:
-  case kind::ARCSINE:
-  case kind::ARCCOSINE:
-  case kind::ARCTANGENT:
-  case kind::ARCCOSECANT:
-  case kind::ARCSECANT:
-  case kind::ARCCOTANGENT:
-  case kind::SQRT: return Polynomial::isMember(n[0]);
-  case kind::PI:
-    return true;
-  default:
-    return false;
+bool Variable::areChildrenPolynomialMembers(Node n)
+{
+  for (const Node& nc : n)
+  {
+    if (!Polynomial::isMember(nc))
+    {
+      return false;
+    }
   }
+  return true;
 }
 
-
 bool VarList::isSorted(iterator start, iterator end) {
   return std::is_sorted(start, end);
 }
index 1829a20f6e395afb0a109b9c8886881e3cf928d3..6a2cc14719bc58fdba790c16277b1c3032f511a4 100644 (file)
@@ -239,8 +239,8 @@ public:
      case kind::INTS_DIVISION_TOTAL:
      case kind::INTS_MODULUS_TOTAL:
      case kind::DIVISION_TOTAL: return isDivMember(n);
-     case kind::IAND: return isIAndMember(n);
-     case kind::POW2: return isPow2Member(n);
+     case kind::IAND:
+     case kind::POW2:
      case kind::EXPONENTIAL:
      case kind::SINE:
      case kind::COSINE:
@@ -255,7 +255,9 @@ public:
      case kind::ARCSECANT:
      case kind::ARCCOTANGENT:
      case kind::SQRT:
-     case kind::PI: return isTranscendentalMember(n);
+     case kind::PI:
+     case kind::INT_TO_BITVECTOR:
+     case kind::BITVECTOR_TO_NAT: return areChildrenPolynomialMembers(n);
      case kind::ABS:
      case kind::TO_INTEGER:
        // Treat to_int as a variable; it is replaced in early preprocessing
@@ -266,13 +268,15 @@ public:
  }
 
   static bool isLeafMember(Node n);
-  static bool isIAndMember(Node n);
-  static bool isPow2Member(Node n);
   static bool isDivMember(Node n);
   bool isDivLike() const{
     return isDivMember(getNode());
   }
-  static bool isTranscendentalMember(Node n);
+  /**
+   * Return true if all direct children of n are polynomial members (returns
+   * true for Polynomial::isMember).
+   */
+  static bool areChildrenPolynomialMembers(Node n);
 
   bool isNormalForm() { return isMember(getNode()); }
 
index 65caeb3d3f4b527031f6ea6a279d89e186269d6d..ffa19e6d50adc511f9079544a346d7d768f663a1 100644 (file)
@@ -390,6 +390,8 @@ Node OperatorElim::eliminateOperators(Node node,
       return var;
     }
 
+    case BITVECTOR_TO_NAT: return eliminateBv2Nat(node); break;
+    case INT_TO_BITVECTOR: return eliminateInt2Bv(node); break;
     default: break;
   }
   return node;
index 8b66d092fa707dc1e3afda1962ae7882f272c128..883c3fa78510d67eeeaa5eb1495db190d0fdc2d7 100644 (file)
@@ -15,6 +15,7 @@
 
 #include "theory/arith/theory_arith_type_rules.h"
 
+#include "util/bitvector.h"
 #include "util/rational.h"
 
 namespace cvc5::internal {
@@ -210,6 +211,42 @@ TypeNode IndexedRootPredicateTypeRule::computeType(NodeManager* nodeManager,
   return nodeManager->booleanType();
 }
 
+TypeNode IntToBitVectorOpTypeRule::computeType(NodeManager* nodeManager,
+                                               TNode n,
+                                               bool check)
+{
+  Assert(n.getKind() == kind::INT_TO_BITVECTOR_OP);
+  size_t bvSize = n.getConst<IntToBitVector>();
+  if (bvSize == 0)
+  {
+    throw TypeCheckingExceptionPrivate(n, "expecting bit-width > 0");
+  }
+  return nodeManager->mkFunctionType(nodeManager->integerType(),
+                                     nodeManager->mkBitVectorType(bvSize));
+}
+
+TypeNode BitVectorConversionTypeRule::computeType(NodeManager* nodeManager,
+                                                  TNode n,
+                                                  bool check)
+{
+  if (n.getKind() == kind::BITVECTOR_TO_NAT)
+  {
+    if (check && !n[0].getType(check).isBitVector())
+    {
+      throw TypeCheckingExceptionPrivate(n, "expecting bit-vector term");
+    }
+    return nodeManager->integerType();
+  }
+
+  Assert(n.getKind() == kind::INT_TO_BITVECTOR);
+  size_t bvSize = n.getOperator().getConst<IntToBitVector>();
+  if (check && !n[0].getType(check).isInteger())
+  {
+    throw TypeCheckingExceptionPrivate(n, "expecting integer term");
+  }
+  return nodeManager->mkBitVectorType(bvSize);
+}
+
 }  // namespace arith
 }  // namespace theory
 }  // namespace cvc5::internal
index 90834a776c7af7a26f04fb72f2cc90024f2025a6..9fc9e11455b7c0198c9da9682b7d6d03a5cd6f09 100644 (file)
@@ -123,6 +123,18 @@ class IndexedRootPredicateTypeRule
   static TypeNode computeType(NodeManager* nodeManager, TNode n, bool check);
 };
 
+class IntToBitVectorOpTypeRule
+{
+ public:
+  static TypeNode computeType(NodeManager* nodeManager, TNode n, bool check);
+};
+
+class BitVectorConversionTypeRule
+{
+ public:
+  static TypeNode computeType(NodeManager* nodeManager, TNode n, bool check);
+};
+
 }  // namespace arith
 }  // namespace theory
 }  // namespace cvc5::internal
index 90eeeefc9d3d811a9e09a4387b6901503949d149..d665175bbff988941eeb064fbe66a5a2b440914d 100644 (file)
@@ -92,9 +92,6 @@ operator BITVECTOR_REDOR 1 "bit-vector redor"
 ## if-then-else kind
 operator BITVECTOR_ITE 3 "same semantics as regular ITE, but condition is bv of size 1 instead of Boolean"
 
-## conversion kinds
-operator BITVECTOR_TO_NAT 1 "bit-vector conversion to (nonnegative) integer; parameter is a bit-vector"
-
 ## internal kinds
 operator BITVECTOR_ACKERMANNIZE_UDIV 1 "term to be treated as a variable; used for eager bit-blasting Ackermann expansion of bvudiv (internal-only symbol)"
 operator BITVECTOR_ACKERMANNIZE_UREM 1 "term to be treated as a variable; used for eager bit-blasting Ackermann expansion of bvurem (internal-only symbol)"
@@ -158,14 +155,6 @@ constant BITVECTOR_ZERO_EXTEND_OP \
   "operator for the bit-vector zero-extend; payload is an instance of the cvc5::internal::BitVectorZeroExtend class"
 parameterized BITVECTOR_ZERO_EXTEND BITVECTOR_ZERO_EXTEND_OP 1 "bit-vector zero-extend; first parameter is a BITVECTOR_ZERO_EXTEND_OP, second is a bit-vector term"
 
-constant INT_TO_BITVECTOR_OP \
-  struct \
-  IntToBitVector \
-  "::cvc5::internal::UnsignedHashFunction< ::cvc5::internal::IntToBitVector >" \
-  "util/bitvector.h" \
-  "operator for the integer conversion to bit-vector; payload is an instance of the cvc5::internal::IntToBitVector class"
-parameterized INT_TO_BITVECTOR INT_TO_BITVECTOR_OP 1 "integer conversion to bit-vector; first parameter is an INT_TO_BITVECTOR_OP, second is an integer term"
-
 ### type rules for non-parameterized operator kinds ---------------------------
 
 typerule CONST_BITVECTOR ::cvc5::internal::theory::bv::BitVectorConstantTypeRule
@@ -222,9 +211,6 @@ typerule BITVECTOR_ITE ::cvc5::internal::theory::bv::BitVectorITETypeRule
 typerule BITVECTOR_REDAND ::cvc5::internal::theory::bv::BitVectorUnaryPredicateTypeRule
 typerule BITVECTOR_REDOR ::cvc5::internal::theory::bv::BitVectorUnaryPredicateTypeRule
 
-## conversion kinds
-typerule BITVECTOR_TO_NAT ::cvc5::internal::theory::bv::BitVectorConversionTypeRule
-
 ## internal kinds
 typerule BITVECTOR_ACKERMANNIZE_UDIV ::cvc5::internal::theory::bv::BitVectorAckermanizationUdivTypeRule
 typerule BITVECTOR_ACKERMANNIZE_UREM ::cvc5::internal::theory::bv::BitVectorAckermanizationUremTypeRule
@@ -246,7 +232,5 @@ typerule BITVECTOR_SIGN_EXTEND_OP "SimpleTypeRule<RBuiltinOperator>"
 typerule BITVECTOR_SIGN_EXTEND ::cvc5::internal::theory::bv::BitVectorExtendTypeRule
 typerule BITVECTOR_ZERO_EXTEND_OP "SimpleTypeRule<RBuiltinOperator>"
 typerule BITVECTOR_ZERO_EXTEND ::cvc5::internal::theory::bv::BitVectorExtendTypeRule
-typerule INT_TO_BITVECTOR_OP ::cvc5::internal::theory::bv::IntToBitVectorOpTypeRule
-typerule INT_TO_BITVECTOR ::cvc5::internal::theory::bv::BitVectorConversionTypeRule
 
 endtheory
index f9b0bcdfed081a39cefe2913ba3726fce66eab73..1eac7581d379c4e9418391c154be2af89250bd4b 100644 (file)
@@ -264,40 +264,6 @@ inline Node RewriteRule<RotateRightEliminate>::apply(TNode node)
   return result;
 }
 
-template <>
-inline bool RewriteRule<BVToNatEliminate>::applies(TNode node)
-{
-  return (node.getKind() == kind::BITVECTOR_TO_NAT);
-}
-
-template <>
-inline Node RewriteRule<BVToNatEliminate>::apply(TNode node)
-{
-  Trace("bv-rewrite") << "RewriteRule<BVToNatEliminate>(" << node << ")" << std::endl;
-
-  //if( node[0].isConst() ){
-    //TODO? direct computation instead of term construction+rewriting
-  //}
-  return utils::eliminateBv2Nat(node);
-}
-
-template <>
-inline bool RewriteRule<IntToBVEliminate>::applies(TNode node)
-{
-  return (node.getKind() == kind::INT_TO_BITVECTOR);
-}
-
-template <>
-inline Node RewriteRule<IntToBVEliminate>::apply(TNode node)
-{
-  Trace("bv-rewrite") << "RewriteRule<IntToBVEliminate>(" << node << ")" << std::endl;
-
-  //if( node[0].isConst() ){
-    //TODO? direct computation instead of term construction+rewriting
-  //}
-  return utils::eliminateInt2Bv(node);
-}
-
 template <>
 inline bool RewriteRule<NandEliminate>::applies(TNode node)
 {
index 3069b12c0bbcc347533ef0169d4944f93fa67ba2..37450768daa6557e1cf32f237efab1879556a4a9 100644 (file)
@@ -61,16 +61,6 @@ TrustNode TheoryBVRewriter::expandDefinition(Node node)
     case kind::BITVECTOR_SDIV:
     case kind::BITVECTOR_SREM:
     case kind::BITVECTOR_SMOD: ret = eliminateBVSDiv(node); break;
-    case kind::BITVECTOR_TO_NAT:
-
-        ret = utils::eliminateBv2Nat(node);
-      
-      break;
-    case kind::INT_TO_BITVECTOR:
-
-        ret = utils::eliminateInt2Bv(node);
-      
-      break;
     default: break;
   }
   if (!ret.isNull() && node != ret)
@@ -644,31 +634,6 @@ RewriteResponse TheoryBVRewriter::RewriteRedand(TNode node, bool prerewrite){
   return RewriteResponse(REWRITE_AGAIN_FULL, resultNode); 
 }
 
-RewriteResponse TheoryBVRewriter::RewriteBVToNat(TNode node, bool prerewrite) {
-  if (node[0].isConst())
-  {
-    Node resultNode = LinearRewriteStrategy
-      < RewriteRule<BVToNatEliminate>
-      >::apply(node);
-    return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
-  }else{
-    return RewriteResponse(REWRITE_DONE, node); 
-  }
-}
-
-RewriteResponse TheoryBVRewriter::RewriteIntToBV(TNode node, bool prerewrite) {
-  if (node[0].isConst())
-  {
-    Node resultNode = LinearRewriteStrategy
-      < RewriteRule<IntToBVEliminate>
-      >::apply(node);
-
-    return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
-  }else{
-    return RewriteResponse(REWRITE_DONE, node); 
-  }
-}
-
 RewriteResponse TheoryBVRewriter::RewriteEqual(TNode node, bool prerewrite) {
   if (prerewrite) {
     Node resultNode = LinearRewriteStrategy
@@ -756,9 +721,6 @@ void TheoryBVRewriter::initializeRewrites() {
   d_rewriteTable [ kind::BITVECTOR_SLTBV ] = RewriteSltBv;
   d_rewriteTable [ kind::BITVECTOR_ITE ] = RewriteITEBv;
   d_rewriteTable[kind::BITVECTOR_EAGER_ATOM] = RewriteEagerAtom;
-
-  d_rewriteTable [ kind::BITVECTOR_TO_NAT ] = RewriteBVToNat;
-  d_rewriteTable [ kind::INT_TO_BITVECTOR ] = RewriteIntToBV;
 }
 
 Node TheoryBVRewriter::eliminateBVSDiv(TNode node) {
index 7e8b8b0d3691fa2cbdc2ce68b049c06213de4ca7..a1ee0eefff0ac366f8cb5b2dc5319778f575e56f 100644 (file)
@@ -266,42 +266,6 @@ TypeNode BitVectorExtendTypeRule::computeType(NodeManager* nodeManager,
   return nodeManager->mkBitVectorType(extendAmount + t.getBitVectorSize());
 }
 
-TypeNode IntToBitVectorOpTypeRule::computeType(NodeManager* nodeManager,
-                                               TNode n,
-                                               bool check)
-{
-  Assert(n.getKind() == kind::INT_TO_BITVECTOR_OP);
-  size_t bvSize = n.getConst<IntToBitVector>();
-  if (bvSize == 0)
-  {
-    throw TypeCheckingExceptionPrivate(n, "expecting bit-width > 0");
-  }
-  return nodeManager->mkFunctionType(nodeManager->integerType(),
-                                     nodeManager->mkBitVectorType(bvSize));
-}
-
-TypeNode BitVectorConversionTypeRule::computeType(NodeManager* nodeManager,
-                                                  TNode n,
-                                                  bool check)
-{
-  if (n.getKind() == kind::BITVECTOR_TO_NAT)
-  {
-    if (check && !n[0].getType(check).isBitVector())
-    {
-      throw TypeCheckingExceptionPrivate(n, "expecting bit-vector term");
-    }
-    return nodeManager->integerType();
-  }
-
-  Assert(n.getKind() == kind::INT_TO_BITVECTOR);
-  size_t bvSize = n.getOperator().getConst<IntToBitVector>();
-  if (check && !n[0].getType(check).isInteger())
-  {
-    throw TypeCheckingExceptionPrivate(n, "expecting integer term");
-  }
-  return nodeManager->mkBitVectorType(bvSize);
-}
-
 TypeNode BitVectorEagerAtomTypeRule::computeType(NodeManager* nodeManager,
                                                  TNode n,
                                                  bool check)
index 9c31c6590f28f7162b89089273e95a502b44dbd5..d962875512a0c6552e99c97bed71483214dc4e0f 100644 (file)
@@ -134,18 +134,6 @@ class BitVectorExtendTypeRule
   static TypeNode computeType(NodeManager* nodeManager, TNode n, bool check);
 };
 
-class IntToBitVectorOpTypeRule
-{
- public:
-  static TypeNode computeType(NodeManager* nodeManager, TNode n, bool check);
-};
-
-class BitVectorConversionTypeRule
-{
- public:
-  static TypeNode computeType(NodeManager* nodeManager, TNode n, bool check);
-};
-
 /* -------------------------------------------------------------------------- */
 /* internal                                                                   */
 /* -------------------------------------------------------------------------- */
index 76823351635b0c478a97a20788e8d4c4937ce51a..d3d76d208f69f96764acbda6855f3beb237f7393 100644 (file)
@@ -461,58 +461,6 @@ Node flattenAnd(std::vector<TNode>& queue)
   return mkAnd(children);
 }
 
-/* ------------------------------------------------------------------------- */
-
-Node eliminateBv2Nat(TNode node)
-{
-  const unsigned size = utils::getSize(node[0]);
-  NodeManager* const nm = NodeManager::currentNM();
-  const Node z = nm->mkConstInt(Rational(0));
-  const Node bvone = utils::mkOne(1);
-
-  Integer i = 1;
-  std::vector<Node> children;
-  for (unsigned bit = 0; bit < size; ++bit, i *= 2)
-  {
-    Node cond =
-        nm->mkNode(kind::EQUAL,
-                   nm->mkNode(nm->mkConst(BitVectorExtract(bit, bit)), node[0]),
-                   bvone);
-    children.push_back(
-        nm->mkNode(kind::ITE, cond, nm->mkConstInt(Rational(i)), z));
-  }
-  // avoid plus with one child
-  return children.size() == 1 ? children[0] : nm->mkNode(kind::ADD, children);
-}
-
-Node eliminateInt2Bv(TNode node)
-{
-  const uint32_t size = node.getOperator().getConst<IntToBitVector>().d_size;
-  NodeManager* const nm = NodeManager::currentNM();
-  const Node bvzero = utils::mkZero(1);
-  const Node bvone = utils::mkOne(1);
-
-  std::vector<Node> v;
-  Integer i = 2;
-  while (v.size() < size)
-  {
-    Node cond = nm->mkNode(
-        kind::GEQ,
-        nm->mkNode(
-            kind::INTS_MODULUS_TOTAL, node[0], nm->mkConstInt(Rational(i))),
-        nm->mkConstInt(Rational(i, 2)));
-    v.push_back(nm->mkNode(kind::ITE, cond, bvone, bvzero));
-    i *= 2;
-  }
-  if (v.size() == 1)
-  {
-    return v[0];
-  }
-  NodeBuilder result(kind::BITVECTOR_CONCAT);
-  result.append(v.rbegin(), v.rend());
-  return Node(result);
-}
-
 }  // namespace utils
 }  // namespace bv
 }  // namespace theory
index 110493517ce3adcb409f4dfc7fb3db428a5eba2f..39bb61b402415c42ff5b273f529735bdddedd1e7 100644 (file)
@@ -204,25 +204,6 @@ Node flattenAnd(std::vector<TNode>& queue);
 void intersect(const std::vector<uint32_t>& v1,
                const std::vector<uint32_t>& v2,
                std::vector<uint32_t>& intersection);
-
-/**
- * Returns the rewritten form of node, which is a term of the form bv2nat(x).
- * The return value of this method is the integer sum:
- *   (+ ite( (= ((_ extract (n-1) (n-1)) x) 1) (^ 2 (n-1)) 0)
- *      ...
- *      ite( (= ((_ extract 0 0) x) 1) (^ 2 0) 0))
- * where n is the bitwidth of x.
- */
-Node eliminateBv2Nat(TNode node);
-/**
- * Returns the rewritten form of node, which is a term of the form int2bv(x).
- * The return value of this method is the concatenation term:
- *   (bvconcat ite( (>= (mod x (^ 2 n)) (^ 2 (n-1))) (_ bv1 1) (_ bv1 0))
- *             ...
- *             ite( (>= (mod x (^ 2 1)) (^ 2 0)) (_ bv1 1) (_ bv1 0)))
- * where n is the bit-width of x.
- */
-Node eliminateInt2Bv(TNode node);
 }
 }
 }