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

Last change on this file since 4685 was 4684, checked in by nmedfort, 4 years ago

First attempt to intergrate 'generate_predefined_ucd_functions' into build process.

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