Program Listing for File AnnotExpr.h

Program Listing for File AnnotExpr.h#

Return to documentation for file (src/midend/astUtil/annotation/AnnotExpr.h)

#ifndef ANNOT_EXPR_H
#define ANNOT_EXPR_H

#include "AnnotDescriptors.h"
#include "SymbolicVal.h"
#include "FunctionObject.h"
#include <vector>
#include <list>
class SymbolicValDescriptor
{
  SymbolicVal val;
  void set_val( const SymbolicVal &v);
 public:
  SymbolicValDescriptor( int i) : val(i) {}
  SymbolicValDescriptor( const SymbolicVal& that) { set_val(that); }
  SymbolicValDescriptor() { set_val( SymbolicVal()); }
  void operator = (const SymbolicVal& that)  { set_val(that); }

  bool read( std::istream& in);

  operator SymbolicVal() const { return val; }
  SymbolicVal get_val() const { return val; }
  SymbolicVal& get_val() { return val; }
  void write(std::ostream& out) const;
  void Dump() const;
  std::string toString() const { std::stringstream out; write(out); return out.str(); }

  bool is_top() const;
  bool is_bottom() const;
  static SymbolicConst get_bottom();
  static SymbolicConst get_top();

  bool merge( const SymbolicValDescriptor& that);
  void replace_var( const std::string& varname, const SymbolicVal& val);
  void replace_val( MapObject<SymbolicVal, SymbolicVal>& repl);
  bool find( const SymbolicVal& v);
};

class SymbolicDotExp : public SymbolicFunction
{
  public:
   SymbolicDotExp(const Arguments& v)
    : SymbolicFunction(AstInterface::BOP_DOT_ACCESS, ".", v)  { assert( v.size() == 2); }
   SymbolicDotExp( const SymbolicVal& obj, const SymbolicVal& field)
    : SymbolicFunction(AstInterface::BOP_DOT_ACCESS,".", obj, field) {}
   SymbolicDotExp( const SymbolicVal& obj, const std::string& fieldname)
    : SymbolicFunction(AstInterface::BOP_DOT_ACCESS,".", obj, SymbolicConst(fieldname, "field")) {}
   SymbolicDotExp( const SymbolicDotExp& that)
    : SymbolicFunction(that) {}

  virtual AstNodePtr CodeGen( AstInterface& fa) const;
  virtual SymbolicValImpl* Clone() const
         { return new SymbolicDotExp(*this); }
  virtual SymbolicFunction* cloneFunction(const Arguments& args) const
         { return new SymbolicDotExp(args); }
};

class SymbolicFunctionPtrCall : public SymbolicFunction
{
  public:
   SymbolicFunctionPtrCall(const Arguments& v)
    : SymbolicFunction(AstInterface::OP_NONE, "FunctionPtrCall", v) {}
   SymbolicFunctionPtrCall( const SymbolicFunctionPtrCall& that)
    : SymbolicFunction(that) {}

  virtual AstNodePtr CodeGen( AstInterface& fa) const;
  virtual SymbolicValImpl* Clone() const
         { return new SymbolicFunctionPtrCall(*this); }
  virtual SymbolicFunction* cloneFunction(const Arguments& args) const
         { return new SymbolicFunctionPtrCall(args); }
};

class SymbolicExtendVar : public SymbolicFunction
{
  SymbolicValImpl* Clone() const
   { return new SymbolicExtendVar(*this); }
  virtual SymbolicFunction* cloneFunction(const Arguments& v) const
         { return new SymbolicExtendVar( v); }

  public:
   SymbolicExtendVar(const Arguments& v)
    : SymbolicFunction(AstInterface::OP_NONE, "$", v)
       { assert( v.size() == 2); }
   SymbolicExtendVar( const std::string& varname, int  index)
    : SymbolicFunction(AstInterface::OP_NONE,"$", SymbolicVar(varname, AST_NULL), index) {}
   SymbolicExtendVar( const SymbolicExtendVar& that)
    : SymbolicFunction(that) {}

   virtual AstNodePtr CodeGen( AstInterface& fa) const;
   static std::string get_varname( std::string var, int index);
};

// e.g:  _size:dim:1:dimension
class ExtendibleParamDescriptor
  : private SelectPair < SymbolicValDescriptor, // parameter itself
                         CollectPair<NameDescriptor, // a range's name followed by its lower and upper bound
                                     CollectPair<SymbolicValDescriptor,
                                                 SymbolicValDescriptor, ':'>,
                                     ':'>,
                         ':',0>
{
 typedef SelectPair < SymbolicValDescriptor,
                         CollectPair<NameDescriptor,
                                     CollectPair<SymbolicValDescriptor,
                                                 SymbolicValDescriptor, ':'>,
                                     ':'>,
                         ':', 0>
          BaseClass;
 SymbolicValDescriptor& get_ext_lb() { return second.second.first; }
 const SymbolicValDescriptor& get_ext_lb() const { return second.second.first; }
 SymbolicValDescriptor& get_ext_ub() { return second.second.second; }
 const SymbolicValDescriptor& get_ext_ub() const { return second.second.second; }

 public:
  ExtendibleParamDescriptor() {}
  ExtendibleParamDescriptor( const SymbolicValDescriptor& p)
       { first = p; }
  void write(std::ostream& out) const { BaseClass::write(out); }
  void Dump() const;
  std::string toString() const { std::stringstream out; write(out); return out.str(); }

  bool read(std::istream& in);
  const SymbolicValDescriptor& get_param() const { return first; }
  SymbolicValDescriptor& get_param() { return first; }
  std::string get_param_name() const
        { assert(first.get_val().GetValType() == VAL_VAR); return first.get_val().toString(); }
  std::string get_extend_var() const { return second.first; }
  bool get_extension( int& lb, int& ub) const;

  void replace_var( const std::string& varname, const SymbolicVal& val);
  void replace_val(MapObject<SymbolicVal, SymbolicVal>& repl);
};
// Each parameter has a range of values
class SymbolicParamListDescriptor
  : public ContainerDescriptor< std::vector <ExtendibleParamDescriptor>,
                             ExtendibleParamDescriptor,',','(', ')'>
{
 public:
  void replace_var( const std::string& varname, const SymbolicVal& val);
  void Dump() const;
};
// a parameter list 'SymbolicParamListDescriptor' and a name (??) 'SymbolicValDescriptor',
// separated by ':' in their string format
// Note the reversed order for function name and parameter list
class SymbolicFunctionDeclaration
 : private CollectPair<SymbolicParamListDescriptor,SymbolicValDescriptor,':'>
{
  typedef CollectPair<SymbolicParamListDescriptor,SymbolicValDescriptor,':'> BaseClass;
 public:
  SymbolicFunctionDeclaration( const SymbolicParamListDescriptor& par,
                            const SymbolicValDescriptor& val)
              { first = par; second = val; }
  SymbolicFunctionDeclaration( const ExtendibleParamDescriptor& par,
                            const SymbolicValDescriptor& val)
              { first.push_back(par); second = val; }

  void write( std::ostream& out) const
        {  BaseClass::write(out); }
  void Dump() const;
  std::string toString() const { std::stringstream out; write(out); return out.str(); }

  bool get_val( const std::vector<SymbolicVal>& args, SymbolicVal& r) const;
  void replace_var( const std::string& varname, const SymbolicVal& val);
  void replace_val(MapObject<SymbolicVal, SymbolicVal>& repl);
};
class SymbolicFunctionDeclarationGroup
  : public ContainerDescriptor< std::list<SymbolicFunctionDeclaration>,
                                SymbolicFunctionDeclaration, ',', '(', ')'>
{
  typedef ContainerDescriptor< std::list<SymbolicFunctionDeclaration>,
                                SymbolicFunctionDeclaration, ',', '(', ')'>
      BaseClass;
public:
 bool get_val( const std::vector<SymbolicVal>& argList, SymbolicVal& r) const;
 bool get_val( AstInterface& fa, const AstInterface::AstNodeList& argList,
                  AstNodePtr& r) const;
 void replace_var( const std::string& varname, const SymbolicVal& val);
 void replace_val( MapObject<SymbolicVal, SymbolicVal>& repl);
 void Dump() const;
};

class DefineVariableDescriptor
  : public CollectPair< CollectPair<TypeDescriptor, ExtendibleParamDescriptor,0>,
                        SymbolicValDescriptor, '='>
{
  typedef CollectPair< CollectPair<TypeDescriptor, ExtendibleParamDescriptor,0>,
                        SymbolicValDescriptor, '='> BaseClass;
 public:
  std::string get_var_type() const { return first.first; }
  const ExtendibleParamDescriptor& get_var() const { return first.second; }
  ExtendibleParamDescriptor& get_var() { return first.second; }
  SymbolicVal get_var_init() const { return second; }
  void replace_var( const std::string& varname, const SymbolicVal& val);
  void replace_val( MapObject<SymbolicVal, SymbolicVal>& repl);
  void Dump() const;
};
// string_name(parameterList)=symbolicVal
// e.g: elem(i:dim:1:dimension) = this(i$dim)
class ReadSymbolicFunctionDeclaration
 : public CollectPair< SelectPair <StringDescriptor,
                                 SymbolicParamListDescriptor,0,'('>,
                     SymbolicValDescriptor, '='>
{
  public:
   std::string get_name() const { return first.first; }
   SymbolicFunctionDeclaration get_function() const
     { return SymbolicFunctionDeclaration( first.second, second); }
};

#endif