Assignment.h

Go to the documentation of this file.
00001 //===-- Assignment.h --------------------------------------------*- C++ -*-===//
00002 //
00003 //                     The KLEE Symbolic Virtual Machine
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 
00010 #ifndef KLEE_UTIL_ASSIGNMENT_H
00011 #define KLEE_UTIL_ASSIGNMENT_H
00012 
00013 #include <map>
00014 
00015 #include "klee/util/ExprEvaluator.h"
00016 
00017 // FIXME: Rename?
00018 
00019 namespace klee {
00020   class Array;
00021 
00022   class Assignment {
00023   public:
00024     typedef std::map<const Array*, std::vector<unsigned char> > bindings_ty;
00025 
00026     bool allowFreeValues;
00027     bindings_ty bindings;
00028     
00029   public:
00030     Assignment(bool _allowFreeValues=false) 
00031       : allowFreeValues(_allowFreeValues) {}
00032     Assignment(std::vector<const Array*> &objects, 
00033                std::vector< std::vector<unsigned char> > &values,
00034                bool _allowFreeValues=false) 
00035       : allowFreeValues(_allowFreeValues){
00036       std::vector< std::vector<unsigned char> >::iterator valIt = 
00037         values.begin();
00038       for (std::vector<const Array*>::iterator it = objects.begin(),
00039              ie = objects.end(); it != ie; ++it) {
00040         const Array *os = *it;
00041         std::vector<unsigned char> &arr = *valIt;
00042         bindings.insert(std::make_pair(os, arr));
00043         ++valIt;
00044       }
00045     }
00046     
00047     ref<Expr> evaluate(const Array *mo, unsigned index) const;
00048     ref<Expr> evaluate(ref<Expr> e);
00049 
00050     template<typename InputIterator>
00051     bool satisfies(InputIterator begin, InputIterator end);
00052   };
00053   
00054   class AssignmentEvaluator : public ExprEvaluator {
00055     const Assignment &a;
00056 
00057   protected:
00058     ref<Expr> getInitialValue(const Array &mo, unsigned index) {
00059       return a.evaluate(&mo, index);
00060     }
00061     
00062   public:
00063     AssignmentEvaluator(const Assignment &_a) : a(_a) {}    
00064   };
00065 
00066   /***/
00067 
00068   inline ref<Expr> Assignment::evaluate(const Array *array, 
00069                                         unsigned index) const {
00070     bindings_ty::const_iterator it = bindings.find(array);
00071     if (it!=bindings.end() && index<it->second.size()) {
00072       return ConstantExpr::alloc(it->second[index], Expr::Int8);
00073     } else {
00074       if (allowFreeValues) {
00075         return ReadExpr::create(UpdateList(array, true, 0), 
00076                                 ConstantExpr::alloc(index, Expr::Int32));
00077       } else {
00078         return ConstantExpr::alloc(0, Expr::Int8);
00079       }
00080     }
00081   }
00082 
00083   inline ref<Expr> Assignment::evaluate(ref<Expr> e) { 
00084     AssignmentEvaluator v(*this);
00085     return v.visit(e); 
00086   }
00087 
00088   template<typename InputIterator>
00089   inline bool Assignment::satisfies(InputIterator begin, InputIterator end) {
00090     AssignmentEvaluator v(*this);
00091     for (; begin!=end; ++begin) {
00092       ref<Expr> res = v.visit(*begin);
00093       ConstantExpr *CE = dyn_cast<ConstantExpr>(res);
00094       if (!CE || !CE->getConstantValue())
00095         return false;
00096     }
00097     return true;
00098   }
00099 }
00100 
00101 #endif

Generated on Fri Jun 5 03:31:31 2009 for klee by  doxygen 1.5.8