1 /********************* */
2 /*! \file theory_bv_rewriter.h
4 ** Top contributors (to current version):
5 ** Liana Hadarean, Andres Noetzli, Morgan Deters
6 ** This file is part of the CVC4 project.
7 ** Copyright (c) 2009-2020 by the authors listed in the file AUTHORS
8 ** in the top-level source directory and their institutional affiliations.
9 ** All rights reserved. See the file COPYING in the top-level source
10 ** directory for licensing information.\endverbatim
12 ** \brief [[ Add one-line brief description here ]]
14 ** [[ Add lengthier description here ]]
15 ** \todo document this file
18 #include "cvc4_private.h"
20 #ifndef CVC4__THEORY__BV__THEORY_BV_REWRITER_H
21 #define CVC4__THEORY__BV__THEORY_BV_REWRITER_H
23 #include "theory/theory_rewriter.h"
24 #include "util/statistics_registry.h"
30 struct AllRewriteRules
;
31 typedef RewriteResponse (*RewriteFunction
) (TNode
, bool);
33 class TheoryBVRewriter
: public TheoryRewriter
37 * Temporary hack for devision-by-zero until we refactor theory code from
44 static Node
eliminateBVSDiv(TNode node
);
48 RewriteResponse
postRewrite(TNode node
) override
;
49 RewriteResponse
preRewrite(TNode node
) override
;
52 static RewriteResponse
IdentityRewrite(TNode node
, bool prerewrite
= false);
53 static RewriteResponse
UndefinedRewrite(TNode node
, bool prerewrite
= false);
55 static RewriteResponse
RewriteBitOf(TNode node
, bool prerewrite
= false);
56 static RewriteResponse
RewriteEqual(TNode node
, bool prerewrite
= false);
57 static RewriteResponse
RewriteUlt(TNode node
, bool prerewrite
= false);
58 static RewriteResponse
RewriteUltBv(TNode node
, bool prerewrite
= false);
59 static RewriteResponse
RewriteSlt(TNode node
, bool prerewrite
= false);
60 static RewriteResponse
RewriteSltBv(TNode node
, bool prerewrite
= false);
61 static RewriteResponse
RewriteUle(TNode node
, bool prerewrite
= false);
62 static RewriteResponse
RewriteSle(TNode node
, bool prerewrite
= false);
63 static RewriteResponse
RewriteUgt(TNode node
, bool prerewrite
= false);
64 static RewriteResponse
RewriteSgt(TNode node
, bool prerewrite
= false);
65 static RewriteResponse
RewriteUge(TNode node
, bool prerewrite
= false);
66 static RewriteResponse
RewriteSge(TNode node
, bool prerewrite
= false);
67 static RewriteResponse
RewriteITEBv(TNode node
, bool prerewrite
= false);
68 static RewriteResponse
RewriteNot(TNode node
, bool prerewrite
= false);
69 static RewriteResponse
RewriteConcat(TNode node
, bool prerewrite
= false);
70 static RewriteResponse
RewriteAnd(TNode node
, bool prerewrite
= false);
71 static RewriteResponse
RewriteOr(TNode node
, bool prerewrite
= false);
72 static RewriteResponse
RewriteXnor(TNode node
, bool prerewrite
= false);
73 static RewriteResponse
RewriteXor(TNode node
, bool prerewrite
= false);
74 static RewriteResponse
RewriteNand(TNode node
, bool prerewrite
= false);
75 static RewriteResponse
RewriteNor(TNode node
, bool prerewrite
= false);
76 static RewriteResponse
RewriteComp(TNode node
, bool prerewrite
= false);
77 static RewriteResponse
RewriteMult(TNode node
, bool prerewrite
= false);
78 static RewriteResponse
RewritePlus(TNode node
, bool prerewrite
= false);
79 static RewriteResponse
RewriteSub(TNode node
, bool prerewrite
= false);
80 static RewriteResponse
RewriteNeg(TNode node
, bool prerewrite
= false);
81 static RewriteResponse
RewriteUdiv(TNode node
, bool prerewrite
= false);
82 static RewriteResponse
RewriteUrem(TNode node
, bool prerewrite
= false);
83 static RewriteResponse
RewriteUdivTotal(TNode node
, bool prerewrite
= false);
84 static RewriteResponse
RewriteUremTotal(TNode node
, bool prerewrite
= false);
85 static RewriteResponse
RewriteSmod(TNode node
, bool prerewrite
= false);
86 static RewriteResponse
RewriteSdiv(TNode node
, bool prerewrite
= false);
87 static RewriteResponse
RewriteSrem(TNode node
, bool prerewrite
= false);
88 static RewriteResponse
RewriteShl(TNode node
, bool prerewrite
= false);
89 static RewriteResponse
RewriteLshr(TNode node
, bool prerewrite
= false);
90 static RewriteResponse
RewriteAshr(TNode node
, bool prerewrite
= false);
91 static RewriteResponse
RewriteExtract(TNode node
, bool prerewrite
= false);
92 static RewriteResponse
RewriteRepeat(TNode node
, bool prerewrite
= false);
93 static RewriteResponse
RewriteZeroExtend(TNode node
, bool prerewrite
= false);
94 static RewriteResponse
RewriteSignExtend(TNode node
, bool prerewrite
= false);
95 static RewriteResponse
RewriteRotateRight(TNode node
, bool prerewrite
= false);
96 static RewriteResponse
RewriteRotateLeft(TNode node
, bool prerewrite
= false);
97 static RewriteResponse
RewriteRedor(TNode node
, bool prerewrite
= false);
98 static RewriteResponse
RewriteRedand(TNode node
, bool prerewrite
= false);
100 static RewriteResponse
RewriteBVToNat(TNode node
, bool prerewrite
= false);
101 static RewriteResponse
RewriteIntToBV(TNode node
, bool prerewrite
= false);
103 void initializeRewrites();
105 RewriteFunction d_rewriteTable
[kind::LAST_KIND
];
106 }; /* class TheoryBVRewriter */
108 }/* CVC4::theory::bv namespace */
109 }/* CVC4::theory namespace */
110 }/* CVC4 namespace */
112 #endif /* CVC4__THEORY__BV__THEORY_BV_REWRITER_H */