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