Ignore:
Timestamp:
Jul 10, 2015, 4:51:39 PM (4 years ago)
Author:
nmedfort
Message:

Initial introduction of a PabloFunction? type.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/pablo/function.h

    r4656 r4657  
    33
    44#include <pablo/pabloAST.h>
     5#include <pablo/pe_var.h>
     6#include <pablo/ps_assign.h>
     7#include <pablo/symbol_generator.h>
    58
    69namespace pablo {
     
    811class Var;
    912class Assign;
     13class PabloBlock;
    1014
    11 enum class ArgumentType {
    12     In = 0
    13     , Out = 1
    14     , InOut = 2
    15 };
     15class PabloFunction : public PabloAST {
     16    friend class PabloBlock;
     17    using ParamAllocator = VectorAllocator::rebind<Var *>::other;
     18    using Parameters = std::vector<Var *, ParamAllocator>;
     19    using ResultAllocator = VectorAllocator::rebind<Assign *>::other;
     20    using Results = std::vector<Assign *, ResultAllocator>;
     21public:
    1622
    17 using Argument = std::pair<ArgumentType, PabloAST *>;
    18 
    19 class Function : public PabloAST {
    20     using ArgumentListAllocator = VectorAllocator::rebind<Argument>::other;
    21     using ArgumentListType = std::vector<Argument, ArgumentListAllocator>;
    22     friend class PabloBlock;
    23 public:
    2423    static inline bool classof(const PabloAST * e) {
    2524        return e->getClassTypeId() == ClassTypeId::Function;
    2625    }
     26
    2727    static inline bool classof(const void *) {
    2828        return false;
    2929    }
    30     virtual ~Function() { }
     30
     31    static PabloFunction Create();
     32
    3133    virtual bool operator==(const PabloAST & other) const {
    3234        return &other == this;
    3335    }
     36
     37    PabloBlock & getEntryBlock() {
     38        return mEntryBlock;
     39    }
     40
     41    const PabloBlock & getEntryBlock() const {
     42        return mEntryBlock;
     43    }
     44
     45    const Parameters & getParameters() const {
     46        return mParameters;
     47    }
     48
     49    const Results & getResults() const {
     50        return mResults;
     51    }
     52
     53    Var * getParameter(const unsigned index) {
     54        return mParameters[index];
     55    }
     56
     57    const Var * getParameter(const unsigned index) const {
     58        return mParameters[index];
     59    }
     60
     61    void addParameter(Var * value) {
     62        mParameters.push_back(value); value->addUser(this);
     63    }
     64
     65    Assign * getResult(const unsigned index) {
     66        return mResults[index];
     67    }
     68
     69    const Assign * getResult(const unsigned index) const {
     70        return mResults[index];
     71    }
     72
     73    void addResult(Assign * value) {
     74        mResults.push_back(value); value->addUser(this);
     75    }
     76
     77    void setResult(const unsigned index, PabloAST * value) {
     78        getResult(index)->setExpression(value);
     79    }
     80
     81    SymbolGenerator & getSymbolTable() {
     82        return mSymbolTable;
     83    }
     84
     85    virtual ~PabloFunction() { }
     86
    3487protected:
    35     Function();
    36     Function(std::initializer_list<Argument *> args);
    37     Function(const std::vector<Argument *> & args);
     88    PabloFunction();
    3889private:
    39     ArgumentListType        mArgumentList;
     90    PabloBlock &        mEntryBlock;
     91    Parameters          mParameters;
     92    Results             mResults;
     93    SymbolGenerator     mSymbolTable;
    4094};
     95
     96inline PabloFunction PabloFunction::Create() {
     97    return PabloFunction();
     98}
    4199
    42100}
Note: See TracChangeset for help on using the changeset viewer.