source: icGREP/icgrep-devel/icgrep/pablo/function.h @ 4713

Last change on this file since 4713 was 4692, checked in by nmedfort, 4 years ago

Temporary check in.

File size: 5.1 KB
RevLine 
[4656]1#ifndef FUNCTION_H
2#define FUNCTION_H
3
4#include <pablo/pabloAST.h>
[4657]5#include <pablo/pe_var.h>
6#include <pablo/ps_assign.h>
7#include <pablo/symbol_generator.h>
[4656]8
9namespace pablo {
10
11class Var;
12class Assign;
[4657]13class PabloBlock;
[4659]14class String;
[4656]15
[4680]16class Prototype : public PabloAST {
[4656]17    friend class PabloBlock;
[4680]18public:
19
20    static inline bool classof(const PabloAST * e) {
21        return e->getClassTypeId() == ClassTypeId::Prototype;
22    }
23
[4684]24    static inline bool classof(void *) {
[4680]25        return false;
26    }
27
[4692]28    static Prototype * Create(std::string name, const unsigned numOfParameters, const unsigned numOfResults, const unsigned requiredStateSpace, void * functionPtr = nullptr);
[4680]29
30    const String * getName() const {
31        return mName;
32    }
33
34    unsigned getNumOfParameters() const {
35        return mNumOfParameters;
36    }
37
38    unsigned getNumOfResults() const {
39        return mNumOfResults;
40    }
41
42    unsigned getRequiredStateSpace() const {
43        return mRequiredStateSpace;
44    }
45
[4684]46    void * getFunctionPtr() const {
47        return mFunctionPtr;
[4680]48    }
49
50protected:
[4684]51    Prototype(const PabloAST::ClassTypeId type, std::string && name, const unsigned numOfParameters, const unsigned numOfResults, const unsigned requiredStateSpace, void * functionPtr);
52protected:
[4680]53    const String * const    mName;
54    const unsigned          mNumOfParameters;
55    const unsigned          mNumOfResults;
56    unsigned                mRequiredStateSpace;
[4684]57    void *                  mFunctionPtr;
[4680]58};
59
[4684]60inline Prototype * Prototype::Create(std::string name, const unsigned numOfParameters, const unsigned numOfResults, const unsigned requiredStateSpace, void * functionPtr) {
61    return new Prototype(PabloAST::ClassTypeId::Prototype, std::move(name), numOfParameters, numOfResults, requiredStateSpace, functionPtr);
[4680]62}
63
64class PabloFunction : public Prototype {
65    friend class PabloBlock;
[4657]66    using ParamAllocator = VectorAllocator::rebind<Var *>::other;
67    using ResultAllocator = VectorAllocator::rebind<Assign *>::other;
[4656]68public:
[4657]69
[4656]70    static inline bool classof(const PabloAST * e) {
[4680]71        switch (e->getClassTypeId()) {
72            case ClassTypeId::Function:
73            case ClassTypeId::Prototype:
74                return true;
75            default:
76                return false;
77        }       
[4656]78    }
[4657]79
[4684]80    static inline bool classof(void *) {
[4656]81        return false;
82    }
[4657]83
[4680]84    static PabloFunction Create(std::string name, const unsigned numOfParameters, const unsigned numOfResults);
[4657]85
[4656]86    virtual bool operator==(const PabloAST & other) const {
87        return &other == this;
88    }
[4657]89
90    PabloBlock & getEntryBlock() {
91        return mEntryBlock;
92    }
93
94    const PabloBlock & getEntryBlock() const {
95        return mEntryBlock;
96    }
97
[4680]98    SymbolGenerator & getSymbolTable() {
99        return mSymbolTable;
[4657]100    }
101
102    Var * getParameter(const unsigned index) {
[4680]103        if (LLVM_LIKELY(index < getNumOfParameters()))
104            return mParameters[index];
105        else throwInvalidParameterIndex(index);
[4657]106    }
107
108    const Var * getParameter(const unsigned index) const {
[4680]109        if (LLVM_LIKELY(index < getNumOfParameters()))
110            return mParameters[index];
111        else throwInvalidParameterIndex(index);
[4657]112    }
113
[4680]114    void setParameter(const unsigned index, Var * value) {
115        if (LLVM_LIKELY(index < getNumOfParameters()))
116            mParameters[index] = value;
117        else throwInvalidParameterIndex(index);
[4657]118    }
119
120    Assign * getResult(const unsigned index) {
[4680]121        if (LLVM_LIKELY(index < getNumOfResults()))
122            return mResults[index];
123        else throwInvalidResultIndex(index);
[4657]124    }
125
126    const Assign * getResult(const unsigned index) const {
[4680]127        if (LLVM_LIKELY(index < getNumOfResults()))
128            return mResults[index];
129        else throwInvalidResultIndex(index);
[4657]130    }
131
[4680]132    void setResult(const unsigned index, Assign * value) {       
133        if (LLVM_LIKELY(index < getNumOfResults())) {
134            if (LLVM_LIKELY(mResults[index] != value)) {
135                if (LLVM_UNLIKELY(mResults[index] != nullptr)) {
136                    mResults[index]->removeUser(this);
137                }
138                mResults[index] = value;
139                value->addUser(this);
140            }
141        }
142        else throwInvalidResultIndex(index);
[4657]143    }
144
[4684]145    void setRequiredStateSpace(const unsigned value) {
146        mRequiredStateSpace = value;
147    }
148
149    void setFunctionPtr(void * functionPtr) {
150        mFunctionPtr = functionPtr;
151    }
152
[4680]153    virtual ~PabloFunction() { }
[4657]154
[4680]155protected:
[4657]156
[4680]157    __attribute__((noreturn)) void throwInvalidParameterIndex(const unsigned index) const;
[4657]158
[4680]159    __attribute__((noreturn)) void throwInvalidResultIndex(const unsigned index) const;
160
161    PabloFunction(std::string && name, const unsigned numOfParameters, const unsigned numOfResults);
[4656]162private:
[4657]163    PabloBlock &        mEntryBlock;
164    SymbolGenerator     mSymbolTable;
[4680]165    Var ** const        mParameters;
166    Assign ** const     mResults;
[4656]167};
168
[4680]169inline PabloFunction PabloFunction::Create(std::string name, const unsigned numOfParameters, const unsigned numOfResults) {
170    return PabloFunction(std::move(name), numOfParameters, numOfResults);
[4656]171}
172
[4657]173}
174
[4656]175#endif // FUNCTION_H
Note: See TracBrowser for help on using the repository browser.