/*****************************************************************************/ /*! * \file theory_bitvector.h * * Author: Vijay Ganesh * * Created: Wed May 05 18:34:55 PDT 2004 * *
* * License to use, copy, modify, sell and/or distribute this software * and its documentation for any purpose is hereby granted without * royalty, subject to the terms and conditions defined in the \ref * LICENSE file provided with this distribution. * *
* */ /*****************************************************************************/ #ifndef _cvc3__include__theory_bitvector_h_ #define _cvc3__include__theory_bitvector_h_ #include "theory_core.h" #include "statistics.h" namespace CVC3 { class VCL; class BitvectorProofRules; typedef enum { //some new BV kinds BITVECTOR = 8000, BVCONST, CONCAT, EXTRACT, BOOLEXTRACT, LEFTSHIFT, CONST_WIDTH_LEFTSHIFT, RIGHTSHIFT, BVSHL, BVLSHR, BVASHR, SX, BVREPEAT, BVZEROEXTEND, BVROTL, BVROTR, BVAND, BVOR, BVXOR, BVXNOR, BVNEG, BVNAND, BVNOR, BVCOMP, BVUMINUS, BVPLUS, BVSUB, BVMULT, BVUDIV, BVSDIV, BVUREM, BVSREM, BVSMOD, BVLT, BVLE, BVGT, BVGE, BVSLT, BVSLE, BVSGT, BVSGE, INTTOBV, // Not implemented yet BVTOINT, // Not implemented yet // A wrapper for delaying the construction of type predicates BVTYPEPRED } BVKinds; /*****************************************************************************/ /*! *\class TheoryBitvector *\ingroup Theories *\brief Theory of bitvectors of known length \ * (operations include: @,[i:j],[i],+,.,BVAND,BVNEG) * * Author: Vijay Ganesh * * Created:Wed May 5 15:35:07 PDT 2004 */ /*****************************************************************************/ class TheoryBitvector :public Theory { BitvectorProofRules* d_rules; //! MemoryManager index for BVConstExpr subclass size_t d_bvConstExprIndex; size_t d_bvPlusExprIndex; size_t d_bvParameterExprIndex; size_t d_bvTypePredExprIndex; //! counts delayed asserted equalities StatCounter d_bvDelayEq; //! counts asserted equalities StatCounter d_bvAssertEq; //! counts delayed asserted disequalities StatCounter d_bvDelayDiseq; //! counts asserted disequalities StatCounter d_bvAssertDiseq; //! counts type predicates StatCounter d_bvTypePreds; //! counts delayed type predicates StatCounter d_bvDelayTypePreds; //! counts bitblasted equalities StatCounter d_bvBitBlastEq; //! counts bitblasted disequalities StatCounter d_bvBitBlastDiseq; //! boolean on the fly rewrite flag const bool* d_booleanRWFlag; //! bool extract cache flag const bool* d_boolExtractCacheFlag; //! flag which indicates that all arithmetic is 32 bit with no overflow const bool* d_bv32Flag; //! Command line flag: rewrite bitvector expressions const bool* d_rewriteFlag; //! Command line flag: concatenation normal form rewrite bitvector expressions const bool* d_concatRewriteFlag; //! Command line flag: bvplus normal form rewrite bitvector expressions const bool* d_bvplusRewriteFlag; //! Commant line flag: rewrite while bit-blasting const bool* d_rwBitBlastFlag; //! Commant line flag: bit-blast equalities in CNF converter const bool* d_cnfBitBlastFlag; //! Command line flag: enable lhs-minus-rhs-rule for lhs=rhs const bool* d_lhsMinusRhsFlag; //! Command line flag: enable pushnegation const bool* d_pushNegationFlag; //! Cache for storing the results of the bitBlastTerm function CDMap d_bitvecCache; //! Cache for pushNegation(). it is ok that this is cache is //ExprMap. it is cleared for each call of pushNegation. Does not add //value across calls of pushNegation ExprMap d_pushNegCache; //! Backtracking queue for equalities (to delay them till checkSat() call) CDList d_eq; //! Pointer to the next unasserted equality in d_eq CDO d_eqIdx; //! Pointer to the next equality in d_eq which is not bit-blasted yet CDO d_eqBlastIdx; //! Backtracking queue for disequalities (to delay them till checkSat() call) CDList d_diseq; //! Pointer to the next unasserted disequality in d_diseq CDO d_diseqIdx; //! Database of stale bit-expansions for update() CDMap d_staleDB; //! Backtracking queue for TCCs on individual bits CDList d_tccs; //! Pointer to the next unasserted TCC in d_tccs CDO d_tccsIdx; //! Backtracking database of subterms of shared terms CDMap d_sharedSubterms; //! Backtracking database of subterms of shared terms CDList d_sharedSubtermsList; //! Cache for typePredicates of non shared terms CDMap d_typePredsCache; //! cache for rewriteBoolean //CDMap d_rewriteBooleanCache; //! Constant 1-bit bit-vector 0bin0 Expr d_bvZero; //! Constant 1-bit bit-vector 0bin0 Expr d_bvOne; //! Return cached constant 0bin0 const Expr& bvZero() const { return d_bvZero; } //! Return cached constant 0bin1 const Expr& bvOne() const { return d_bvOne; } //! Max size of any bitvector we've seen int d_maxLength; //! Used in checkSat CDO d_index1; //! functions which implement the DP strategy for bitblasting Theorem bitBlastEqn(const Expr& e); //! functions which implement the DP strategy for bitblasting Theorem bitBlastDisEqn(const Theorem& e); public: //! functions which implement the DP strategy for bitblasting Theorem bitBlastTerm(const Expr& t, int bitPosition); private: //! function which implements the DP strtagey to bitblast Inequations Theorem bitBlastIneqn(const Expr& e); //! strategy fucntions for BVPLUS NORMAL FORM Theorem padBVPlus(const Expr& e); //! strategy fucntions for BVPLUS NORMAL FORM Theorem flattenBVPlus(const Expr& e); //! Implementation of the concatenation normal form Theorem normalizeConcat(const Expr& e, bool useFind); //! Implementation of the n-bit arithmetic normal form Theorem normalizeBVArith(const Expr& e, bool useFind); //! Helper method for composing normalizations Theorem normalizeConcat(const Theorem& t, bool useFind) { return transitivityRule(t, normalizeConcat(t.getRHS(), useFind)); } //! Helper method for composing normalizations Theorem normalizeBVArith(const Theorem& t, bool useFind) { return transitivityRule(t, normalizeBVArith(t.getRHS(), useFind)); } Theorem signExtendBVLT(const Expr& e, int len, bool useFind); Theorem pushNegationRec(const Theorem& thm, bool neg); Theorem pushNegation(const Expr& e); //! Top down simplifier virtual Theorem simplifyOp(const Expr& e); //! Internal rewrite method for constants Theorem rewriteConst(const Expr& e); //! Internal rewrite method Theorem rewriteBV(const Expr& e, bool useFind); //! Rewrite children 'n' levels down (n==1 means "only the top level") Theorem rewriteBV(const Expr& e, int n, bool useFind); //! Rewrite children 'n' levels down (n==1 means "only the top level") Theorem rewriteBV(const Theorem& t, int n, bool useFind) { return transitivityRule(t, rewriteBV(t.getRHS(), n, useFind)); } //! Internal rewrite method (implements the actual rewrites) Theorem rewriteBV(const Expr& e, ExprMap& cache, bool useFind); //! Rewrite children 'n' levels down (n==1 means "only the top level") Theorem rewriteBV(const Expr& e, ExprMap& cache, int n, bool useFind); //! Rewrite children 'n' levels down (n==1 means "only the top level") Theorem rewriteBV(const Theorem& t, ExprMap& cache, int n, bool useFind) { return transitivityRule(t, rewriteBV(t.getRHS(), cache, n, useFind)); } //! rewrite input boolean expression e to a simpler form Theorem rewriteBoolean(const Expr& e); //! Setup the NotifyList mechanism for the Expr e void setupExpr(const Expr& e); public: TheoryBitvector(TheoryCore* core); ~TheoryBitvector(); ExprMap d_bvPlusCarryCacheLeftBV; ExprMap d_bvPlusCarryCacheRightBV; // Trusted method that creates the proof rules class (used in constructor). // Implemented in bitvector_theorem_producer.cpp BitvectorProofRules* createProofRules(); Theorem pushNegationRec(const Expr& e, bool neg); // Theory interface void addSharedTerm(const Expr& e); void assertFact(const Theorem& e); void assertTypePred(const Expr& e, const Theorem& pred); void checkSat(bool fullEffort); Theorem rewrite(const Expr& e); Theorem rewriteAtomic(const Expr& e); void setup(const Expr& e); void update(const Theorem& e, const Expr& d); Theorem solve(const Theorem& e); void checkType(const Expr& e); void computeType(const Expr& e); void computeModelTerm(const Expr& e, std::vector& v); void computeModel(const Expr& e, std::vector& vars); Expr computeTypePred(const Type& t, const Expr& e); Expr computeTCC(const Expr& e); ExprStream& print(ExprStream& os, const Expr& e); Expr parseExprOp(const Expr& e); //helper functions Expr rat(const Rational& r) { return getEM()->newRatExpr(r); } //!pads e to be of length len Expr pad(int len, const Expr& e); bool comparebv(const Expr& e1, const Expr& e2); //! Return the number of bits in the bitvector expression int BVSize(const Expr& e); //helper functions: functions to construct exprs Type newBitvectorType(int i) { return newBitvectorTypeExpr(i); } Expr newBitvectorTypePred(const Type& t, const Expr& e); Expr newBitvectorTypeExpr(int i); Expr newBVAndExpr(const Expr& t1, const Expr& t2); Expr newBVAndExpr(const std::vector& kids); Expr newBVOrExpr(const Expr& t1, const Expr& t2); Expr newBVOrExpr(const std::vector& kids); Expr newBVXorExpr(const Expr& t1, const Expr& t2); Expr newBVXorExpr(const std::vector& kids); Expr newBVXnorExpr(const Expr& t1, const Expr& t2); Expr newBVXnorExpr(const std::vector& kids); Expr newBVNandExpr(const Expr& t1, const Expr& t2); Expr newBVNorExpr(const Expr& t1, const Expr& t2); Expr newBVCompExpr(const Expr& t1, const Expr& t2); Expr newBVLTExpr(const Expr& t1, const Expr& t2); Expr newBVLEExpr(const Expr& t1, const Expr& t2); Expr newSXExpr(const Expr& t1, int len); Expr newBVIndexExpr(int kind, const Expr& t1, int len); Expr newBVSLTExpr(const Expr& t1, const Expr& t2); Expr newBVSLEExpr(const Expr& t1, const Expr& t2); Expr newBVNegExpr(const Expr& t1); Expr newBVUminusExpr(const Expr& t1); Expr newBoolExtractExpr(const Expr& t1, int r); Expr newFixedLeftShiftExpr(const Expr& t1, int r); Expr newFixedConstWidthLeftShiftExpr(const Expr& t1, int r); Expr newFixedRightShiftExpr(const Expr& t1, int r); Expr newConcatExpr(const Expr& t1, const Expr& t2); Expr newConcatExpr(const Expr& t1, const Expr& t2, const Expr& t3); Expr newConcatExpr(const std::vector& kids); Expr newBVConstExpr(const std::string& s, int base = 2); Expr newBVConstExpr(const std::vector& bits); // Construct BVCONST of length 'len', or the min. needed length when len=0. Expr newBVConstExpr(const Rational& r, int len = 0); Expr newBVZeroString(int r); Expr newBVOneString(int r); //! hi and low are bit indices Expr newBVExtractExpr(const Expr& e, int hi, int low); Expr newBVSubExpr(const Expr& t1, const Expr& t2); //! 'numbits' is the number of bits in the result Expr newBVPlusExpr(int numbits, const std::vector& k); //! accepts an integer, r, and bitvector, t1, and returns r.t1 Expr newBVMultExpr(int bvLength, const Expr& t1, const Expr& t2); // Accessors for expression parameters int getBitvectorTypeParam(const Expr& e); int getBitvectorTypeParam(const Type& t) { return getBitvectorTypeParam(t.getExpr()); } Type getTypePredType(const Expr& tp); const Expr& getTypePredExpr(const Expr& tp); int getSXIndex(const Expr& e); int getBVIndex(const Expr& e); int getBoolExtractIndex(const Expr& e); int getFixedLeftShiftParam(const Expr& e); int getFixedRightShiftParam(const Expr& e); int getExtractHi(const Expr& e); int getExtractLow(const Expr& e); int getBVPlusParam(const Expr& e); int getBVMultParam(const Expr& e); unsigned getBVConstSize(const Expr& e); bool getBVConstValue(const Expr& e, int i); //!computes the integer value of a bitvector constant Rational computeBVConst(const Expr& e); //!computes the integer value of ~c+1 or BVUMINUS(c) Rational computeNegBVConst(const Expr& e); int getMaxSize() { return d_maxLength; } }; //end of class TheoryBitvector //!computes the integer value of a bitvector constant Rational computeBVConst(const Expr& e); }//end of namespace CVC3 #endif