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

Last change on this file since 4726 was 4726, checked in by cameron, 4 years ago

Embed carry data in compiled LLVM module; eliminate passing of carry data pointers/size

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