00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _cvc3__include__theory_bitvector_h_
00022 #define _cvc3__include__theory_bitvector_h_
00023
00024 #include "theory_core.h"
00025 #include "statistics.h"
00026
00027 namespace CVC3 {
00028
00029 class VCL;
00030 class BitvectorProofRules;
00031
00032 typedef enum {
00033
00034 BVCONST = 80,
00035
00036 BITVECTOR = 8000,
00037
00038 CONCAT,
00039 EXTRACT,
00040 BOOLEXTRACT,
00041
00042 LEFTSHIFT,
00043 CONST_WIDTH_LEFTSHIFT,
00044 RIGHTSHIFT,
00045 BVSHL,
00046 BVLSHR,
00047 BVASHR,
00048 SX,
00049 BVREPEAT,
00050 BVZEROEXTEND,
00051 BVROTL,
00052 BVROTR,
00053
00054 BVAND,
00055 BVOR,
00056 BVXOR,
00057 BVXNOR,
00058 BVNEG,
00059 BVNAND,
00060 BVNOR,
00061 BVCOMP,
00062
00063 BVUMINUS,
00064 BVPLUS,
00065 BVSUB,
00066 BVMULT,
00067 BVUDIV,
00068 BVSDIV,
00069 BVUREM,
00070 BVSREM,
00071 BVSMOD,
00072
00073 BVLT,
00074 BVLE,
00075 BVGT,
00076 BVGE,
00077 BVSLT,
00078 BVSLE,
00079 BVSGT,
00080 BVSGE,
00081
00082 INTTOBV,
00083 BVTOINT,
00084
00085 BVTYPEPRED
00086 } BVKinds;
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 class TheoryBitvector :public Theory {
00101 BitvectorProofRules* d_rules;
00102
00103 size_t d_bvConstExprIndex;
00104 size_t d_bvPlusExprIndex;
00105 size_t d_bvParameterExprIndex;
00106 size_t d_bvTypePredExprIndex;
00107
00108
00109 StatCounter d_bvDelayEq;
00110
00111 StatCounter d_bvAssertEq;
00112
00113 StatCounter d_bvDelayDiseq;
00114
00115 StatCounter d_bvAssertDiseq;
00116
00117 StatCounter d_bvTypePreds;
00118
00119 StatCounter d_bvDelayTypePreds;
00120
00121 StatCounter d_bvBitBlastEq;
00122
00123 StatCounter d_bvBitBlastDiseq;
00124
00125
00126 const bool* d_booleanRWFlag;
00127
00128 const bool* d_boolExtractCacheFlag;
00129
00130 const bool* d_bv32Flag;
00131
00132
00133 CDMap<Expr,Theorem> d_bitvecCache;
00134
00135
00136
00137
00138 ExprMap<Theorem> d_pushNegCache;
00139
00140
00141 CDList<Theorem> d_eq;
00142
00143 CDList<Theorem> d_eqPending;
00144
00145 CDO<unsigned int> d_eq_index;
00146
00147 CDList<Theorem> d_bitblast;
00148
00149 CDO<unsigned int> d_bb_index;
00150
00151 CDMap<Expr,Expr> d_sharedSubterms;
00152
00153 CDList<Expr> d_sharedSubtermsList;
00154
00155
00156 Expr d_bvZero;
00157
00158 Expr d_bvOne;
00159
00160 const Expr& bvZero() const { return d_bvZero; }
00161
00162 const Expr& bvOne() const { return d_bvOne; }
00163
00164
00165 int d_maxLength;
00166
00167
00168 CDO<unsigned> d_index1;
00169 CDO<unsigned> d_index2;
00170
00171
00172 Theorem bitBlastEqn(const Expr& e);
00173
00174 Theorem bitBlastDisEqn(const Theorem& notE);
00175
00176 Theorem bitBlastIneqn(const Expr& e);
00177
00178 Theorem bitBlastTerm(const Expr& t, int bitPosition);
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200 public:
00201 Theorem pushNegationRec(const Expr& e);
00202 private:
00203 Theorem pushNegation(const Expr& e);
00204
00205
00206 virtual Theorem simplifyOp(const Expr& e);
00207
00208
00209
00210
00211
00212 Theorem rewriteBV(const Expr& e, ExprMap<Theorem>& cache, int n = 1);
00213
00214
00215 Theorem rewriteBV(const Expr& e, int n = 1);
00216
00217
00218 Theorem rewriteBV(const Theorem& t, ExprMap<Theorem>& cache, int n = 1) {
00219 return transitivityRule(t, rewriteBV(t.getRHS(), cache, n));
00220 }
00221 Theorem rewriteBV(const Theorem& t, int n = 1) {
00222 return transitivityRule(t, rewriteBV(t.getRHS(), n));
00223 }
00224
00225
00226 Theorem rewriteBoolean(const Expr& e);
00227
00228
00229
00230 Expr multiply_coeff( Rational mult_inv, const Expr& e);
00231
00232
00233 int min(std::vector<Rational> list);
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243 Rational Odd_coeff( const Expr& e );
00244
00245
00246
00247
00248 int check_linear( const Expr &e );
00249
00250 bool isTermIn(const Expr& e1, const Expr& e2);
00251
00252 Theorem updateSubterms( const Expr& d );
00253
00254
00255 int countTermIn( const Expr& term, const Expr& e);
00256
00257 Theorem simplifyPendingEq(const Theorem& thm, int maxEffort);
00258 Theorem generalBitBlast( const Theorem& thm );
00259
00260
00261 public:
00262 TheoryBitvector(TheoryCore* core);
00263 ~TheoryBitvector();
00264
00265 ExprMap<Expr> d_bvPlusCarryCacheLeftBV;
00266 ExprMap<Expr> d_bvPlusCarryCacheRightBV;
00267
00268
00269
00270 BitvectorProofRules* createProofRules();
00271
00272
00273 void addSharedTerm(const Expr& e);
00274 void assertFact(const Theorem& e);
00275 void assertTypePred(const Expr& e, const Theorem& pred);
00276 void checkSat(bool fullEffort);
00277 Theorem rewrite(const Expr& e);
00278 Theorem rewriteAtomic(const Expr& e);
00279 void setup(const Expr& e);
00280 void update(const Theorem& e, const Expr& d);
00281 Theorem solve(const Theorem& e);
00282 void checkType(const Expr& e);
00283 Cardinality finiteTypeInfo(Expr& e, Unsigned& n,
00284 bool enumerate, bool computeSize);
00285 void computeType(const Expr& e);
00286 void computeModelTerm(const Expr& e, std::vector<Expr>& v);
00287 void computeModel(const Expr& e, std::vector<Expr>& vars);
00288 Expr computeTypePred(const Type& t, const Expr& e);
00289 Expr computeTCC(const Expr& e);
00290 ExprStream& print(ExprStream& os, const Expr& e);
00291 Expr parseExprOp(const Expr& e);
00292
00293
00294
00295
00296 int BVSize(const Expr& e);
00297
00298 Expr rat(const Rational& r) { return getEM()->newRatExpr(r); }
00299
00300 Expr pad(int len, const Expr& e);
00301
00302 bool comparebv(const Expr& e1, const Expr& e2);
00303
00304
00305 Type newBitvectorType(int i)
00306 { return newBitvectorTypeExpr(i); }
00307 Expr newBitvectorTypePred(const Type& t, const Expr& e);
00308 Expr newBitvectorTypeExpr(int i);
00309
00310 Expr newBVAndExpr(const Expr& t1, const Expr& t2);
00311 Expr newBVAndExpr(const std::vector<Expr>& kids);
00312
00313 Expr newBVOrExpr(const Expr& t1, const Expr& t2);
00314 Expr newBVOrExpr(const std::vector<Expr>& kids);
00315
00316 Expr newBVXorExpr(const Expr& t1, const Expr& t2);
00317 Expr newBVXorExpr(const std::vector<Expr>& kids);
00318
00319 Expr newBVXnorExpr(const Expr& t1, const Expr& t2);
00320 Expr newBVXnorExpr(const std::vector<Expr>& kids);
00321
00322 Expr newBVNandExpr(const Expr& t1, const Expr& t2);
00323 Expr newBVNorExpr(const Expr& t1, const Expr& t2);
00324 Expr newBVCompExpr(const Expr& t1, const Expr& t2);
00325
00326 Expr newBVLTExpr(const Expr& t1, const Expr& t2);
00327 Expr newBVLEExpr(const Expr& t1, const Expr& t2);
00328 Expr newSXExpr(const Expr& t1, int len);
00329 Expr newBVIndexExpr(int kind, const Expr& t1, int len);
00330 Expr newBVSLTExpr(const Expr& t1, const Expr& t2);
00331 Expr newBVSLEExpr(const Expr& t1, const Expr& t2);
00332
00333 Expr newBVNegExpr(const Expr& t1);
00334 Expr newBVUminusExpr(const Expr& t1);
00335 Expr newBoolExtractExpr(const Expr& t1, int r);
00336 Expr newFixedLeftShiftExpr(const Expr& t1, int r);
00337 Expr newFixedConstWidthLeftShiftExpr(const Expr& t1, int r);
00338 Expr newFixedRightShiftExpr(const Expr& t1, int r);
00339 Expr newConcatExpr(const Expr& t1, const Expr& t2);
00340 Expr newConcatExpr(const Expr& t1, const Expr& t2, const Expr& t3);
00341 Expr newConcatExpr(const std::vector<Expr>& kids);
00342 Expr newBVConstExpr(const std::string& s, int base = 2);
00343 Expr newBVConstExpr(const std::vector<bool>& bits);
00344
00345
00346
00347 Expr signed_newBVConstExpr( Rational c, int bv_size);
00348
00349
00350
00351 Expr newBVConstExpr(const Rational& r, int len = 0);
00352 Expr newBVZeroString(int r);
00353 Expr newBVOneString(int r);
00354
00355 Expr newBVExtractExpr(const Expr& e,
00356 int hi, int low);
00357 Expr newBVSubExpr(const Expr& t1, const Expr& t2);
00358
00359 Expr newBVPlusExpr(int numbits, const Expr& k1, const Expr& k2);
00360
00361 Expr newBVPlusExpr(int numbits, const std::vector<Expr>& k);
00362
00363 Expr newBVPlusPadExpr(int bvLength, const std::vector<Expr>& k);
00364 Expr newBVMultExpr(int bvLength,
00365 const Expr& t1, const Expr& t2);
00366 Expr newBVMultExpr(int bvLength, const std::vector<Expr>& kids);
00367 Expr newBVMultPadExpr(int bvLength,
00368 const Expr& t1, const Expr& t2);
00369 Expr newBVMultPadExpr(int bvLength, const std::vector<Expr>& kids);
00370 Expr newBVUDivExpr(const Expr& t1, const Expr& t2);
00371 Expr newBVURemExpr(const Expr& t1, const Expr& t2);
00372 Expr newBVSDivExpr(const Expr& t1, const Expr& t2);
00373 Expr newBVSRemExpr(const Expr& t1, const Expr& t2);
00374 Expr newBVSModExpr(const Expr& t1, const Expr& t2);
00375
00376
00377 int getBitvectorTypeParam(const Expr& e);
00378 int getBitvectorTypeParam(const Type& t)
00379 { return getBitvectorTypeParam(t.getExpr()); }
00380 Type getTypePredType(const Expr& tp);
00381 const Expr& getTypePredExpr(const Expr& tp);
00382 int getSXIndex(const Expr& e);
00383 int getBVIndex(const Expr& e);
00384 int getBoolExtractIndex(const Expr& e);
00385 int getFixedLeftShiftParam(const Expr& e);
00386 int getFixedRightShiftParam(const Expr& e);
00387 int getExtractHi(const Expr& e);
00388 int getExtractLow(const Expr& e);
00389 int getBVPlusParam(const Expr& e);
00390 int getBVMultParam(const Expr& e);
00391
00392 unsigned getBVConstSize(const Expr& e);
00393 bool getBVConstValue(const Expr& e, int i);
00394
00395 Rational computeBVConst(const Expr& e);
00396
00397 Rational computeNegBVConst(const Expr& e);
00398
00399 int getMaxSize() { return d_maxLength; }
00400
00401
00402
00403 bool isLinearTerm( const Expr& e );
00404 void extract_vars( const Expr& e, std::vector<Expr>& vars );
00405
00406 bool canSolveFor( const Expr& term, const Expr& e );
00407
00408
00409 Rational multiplicative_inverse(Rational r, int n_bits);
00410
00411
00412
00413
00414 std::vector<Theorem> additionalRewriteConstraints;
00415
00416 };
00417
00418
00419 }
00420 #endif