source: icGREP/icgrep-devel/icgrep/pablo/builder.hpp @ 5842

Last change on this file since 5842 was 5836, checked in by nmedfort, 19 months ago

Added PabloBlock/Builder? createScope() methods + minor code changes.

File size: 9.4 KB
Line 
1#ifndef BUILDER_HPP
2#define BUILDER_HPP
3
4#include <pablo/codegenstate.h>
5#include <pablo/expression_map.hpp>
6#include <pablo/pe_var.h>
7
8namespace pablo {
9
10class PabloBuilder {
11public:
12
13    template<typename T>
14    struct not_null {
15        not_null(T const value) : _value(value) { assert(_value); }
16        not_null(std::nullptr_t) = delete;
17        not_null(unsigned) = delete;
18        operator T() const { return _value; }
19        T operator-> () const { return _value; }
20        T get() const { return _value; }
21    private:
22        T const  _value;
23    };
24
25    using iterator = PabloBlock::iterator;
26
27    using const_iterator = PabloBlock::const_iterator;
28
29    PabloBuilder(not_null<PabloBlock *> block)
30    : mPb(block), mParent(nullptr), mExprTable(nullptr) {
31
32    }
33
34    PabloBuilder createScope() noexcept {
35        return PabloBuilder(&mPb->createScope(), this);
36    }
37
38    Zeroes * createZeroes(llvm::Type * const type = nullptr) {
39        return mPb->createZeroes(type);
40    }
41
42    Ones * createOnes(llvm::Type * const type = nullptr) {
43        return mPb->createOnes(type);
44    }
45
46    Var * createVar(const llvm::StringRef & name, llvm::Type * const type = nullptr) {
47        return createVar(makeName(name), type);
48    }
49
50    Var * createVar(const llvm::StringRef & name, PabloAST * value) {
51        Var * const var = createVar(name, value->getType());
52        createAssign(var, value);
53        return var;
54    }
55
56    Var * createVar(String * const name, llvm::Type * const type = nullptr) {
57        return mPb->createVar(name, type);
58    }
59
60    Extract * createExtract(Var * const array, not_null<Integer *> index);
61
62    Extract * createExtract(Var * const array, const int64_t index) {
63        return createExtract(array, getInteger(index));
64    }
65
66    Var * createExtract(Var * const array, not_null<Integer *> index, const llvm::StringRef & name) {
67        return createVar(name, createExtract(array, index));
68    }
69
70    Var * createExtract(Var * const array, const int64_t index, const llvm::StringRef & name) {
71        return createVar(name, createExtract(array, index));
72    }
73
74    PabloAST * createAdvance(PabloAST * expr, const int64_t shiftAmount) {
75        if (shiftAmount == 0) {
76            return expr;
77        }
78        return createAdvance(expr, mPb->getInteger(shiftAmount));
79    }
80
81    PabloAST * createAdvance(PabloAST * expr, not_null<Integer *> shiftAmount);
82
83    PabloAST * createAdvance(PabloAST * expr, const int64_t shiftAmount, const llvm::StringRef & prefix) {
84        if (shiftAmount == 0) {
85            return expr;
86        }
87        return createAdvance(expr, mPb->getInteger(shiftAmount), prefix);
88    }
89
90    PabloAST * createAdvance(PabloAST * expr, not_null<Integer *> shiftAmount, const llvm::StringRef & prefix);
91
92    PabloAST * createIndexedAdvance(PabloAST * expr, PabloAST * indexStream, const int64_t shiftAmount) {
93        if (shiftAmount == 0) {
94            return expr;
95        }
96        return createIndexedAdvance(expr, indexStream, mPb->getInteger(shiftAmount));
97    }
98   
99    PabloAST * createIndexedAdvance(PabloAST * expr, PabloAST * indexStream, not_null<Integer *> shiftAmount);
100   
101    PabloAST * createIndexedAdvance(PabloAST * expr, PabloAST * indexStream, const int64_t shiftAmount, const llvm::StringRef & prefix) {
102        if (shiftAmount == 0) {
103            return expr;
104        }
105        return createIndexedAdvance(expr, indexStream, mPb->getInteger(shiftAmount), prefix);
106    }
107   
108    PabloAST * createIndexedAdvance(PabloAST * expr, PabloAST * indexStream, not_null<Integer *> shiftAmount, const llvm::StringRef & prefix);
109   
110    PabloAST * createLookahead(PabloAST * expr, const int64_t shiftAmount) {
111        if (shiftAmount == 0) {
112            return expr;
113        }
114        return createLookahead(expr, mPb->getInteger(shiftAmount));
115    }
116
117    PabloAST * createLookahead(PabloAST * expr, not_null<Integer *> shiftAmount);
118
119    PabloAST * createLookahead(PabloAST * expr, const int64_t shiftAmount, const llvm::StringRef & prefix) {
120        if (shiftAmount == 0) {
121            return expr;
122        }
123        return createLookahead(expr, mPb->getInteger(shiftAmount), prefix);
124    }
125
126    PabloAST * createLookahead(PabloAST * expr, not_null<Integer *> shiftAmount, const llvm::StringRef & prefix);
127
128    Assign * createAssign(PabloAST * const variable, PabloAST * const value){
129        return mPb->createAssign(variable, value);
130    }
131
132    PabloAST * createAnd(PabloAST * expr1, PabloAST * expr2);
133
134    PabloAST * createAnd(PabloAST * expr1, PabloAST * expr2, const llvm::StringRef & prefix);
135
136    PabloAST * createNot(PabloAST * expr);
137
138    PabloAST * createNot(PabloAST * expr, const llvm::StringRef & prefix);
139
140    PabloAST * createRepeat(const int64_t fieldWidth, const int64_t value) {
141        return createRepeat(mPb->getInteger(fieldWidth), mPb->getInteger(value));
142    }
143
144    PabloAST * createRepeat(const int64_t fieldWidth, PabloAST * value) {
145        return createRepeat(mPb->getInteger(fieldWidth), value);
146    }
147
148    PabloAST * createRepeat(not_null<Integer *> fieldWidth, PabloAST * value);
149
150    PabloAST * createRepeat(const int64_t fieldWidth, PabloAST * value, const llvm::StringRef & prefix) {
151        return createRepeat(mPb->getInteger(fieldWidth), value, prefix);
152    }
153
154    PabloAST * createRepeat(const int64_t fieldWidth, const int64_t value, const llvm::StringRef & prefix) {
155        return createRepeat(mPb->getInteger(fieldWidth), mPb->getInteger(value), prefix);
156    }
157
158    PabloAST * createRepeat(not_null<Integer *> fieldWidth, PabloAST * value, const llvm::StringRef & prefix);
159
160    PabloAST * createOr(PabloAST * expr1, PabloAST * expr2);
161
162    PabloAST * createOr(PabloAST * expr1, PabloAST * expr2, const llvm::StringRef & prefix);
163
164    PabloAST * createXor(PabloAST * expr1, PabloAST * expr2);
165
166    PabloAST * createXor(PabloAST * expr1, PabloAST * expr2, const llvm::StringRef & prefix);
167
168    PabloAST * createMatchStar(PabloAST * marker, PabloAST * charclass);
169
170    PabloAST * createMatchStar(PabloAST * marker, PabloAST * charclass, const llvm::StringRef & prefix);
171
172    PabloAST * createScanThru(PabloAST * from, PabloAST * thru);
173
174    PabloAST * createScanThru(PabloAST * from, PabloAST * thru, const llvm::StringRef & prefix);
175
176    PabloAST * createScanTo(PabloAST * from, PabloAST * to);
177
178    PabloAST * createScanTo(PabloAST * from, PabloAST * to, const llvm::StringRef & prefix);
179
180    PabloAST * createAdvanceThenScanThru(PabloAST * from, PabloAST * thru);
181
182    PabloAST * createAdvanceThenScanThru(PabloAST * from, PabloAST * thru, const llvm::StringRef & prefix);
183
184    PabloAST * createAdvanceThenScanTo(PabloAST * from, PabloAST * to);
185
186    PabloAST * createAdvanceThenScanTo(PabloAST * from, PabloAST * to, const llvm::StringRef & prefix);
187
188    PabloAST * createSel(PabloAST * condition, PabloAST * trueExpr, PabloAST * falseExpr);
189
190    PabloAST * createSel(PabloAST * condition, PabloAST * trueExpr, PabloAST * falseExpr, const llvm::StringRef & prefix);
191
192    PabloAST * createCount(PabloAST * expr);
193   
194    PabloAST * createCount(PabloAST * expr, const llvm::StringRef & prefix);
195
196    PabloAST * createInFile(PabloAST * expr);
197   
198    PabloAST * createInFile(PabloAST * expr, const llvm::StringRef & prefix);
199   
200    PabloAST * createAtEOF(PabloAST * expr);
201   
202    PabloAST * createAtEOF(PabloAST * expr, const llvm::StringRef & prefix);
203   
204    PabloAST * createAdd(PabloAST * expr1, PabloAST * expr2);
205
206    PabloAST * createSubtract(PabloAST * expr1, PabloAST * expr2);
207
208    PabloAST * createLessThan(PabloAST * expr1, PabloAST * expr2);
209
210    PabloAST * createEquals(PabloAST * expr1, PabloAST * expr2);
211
212    If * createIf(PabloAST * condition, PabloBlock * body) {
213        return mPb->createIf(condition, body);
214    }
215
216    If * createIf(PabloAST * condition, PabloBuilder & builder) {
217        return mPb->createIf(condition, builder.mPb);
218    }
219
220    While * createWhile(PabloAST * condition, PabloBlock * body) {
221        return mPb->createWhile(condition, body);
222    }
223
224    While * createWhile(PabloAST * condition, PabloBuilder & builder) {
225        return mPb->createWhile(condition, builder.mPb);
226    }
227   
228    /// Statement Iterator Wrappers
229
230    iterator begin() {
231        return mPb->begin();
232    }
233
234    iterator end() {
235        return mPb->end();
236    }
237
238    const_iterator begin() const {
239        return mPb->cbegin();
240    }
241
242    const_iterator end() const {
243        return mPb->cend();
244    }
245
246    const_iterator cbegin() const {
247        return mPb->cbegin();
248    }
249
250    const_iterator cend() const {
251        return mPb->cend();
252    }
253
254    Statement * front() const {
255        return mPb->front();
256    }
257
258    Statement * back() const {
259        return mPb->back();
260    }
261
262    Statement * getInsertPoint() const {
263        return mPb->getInsertPoint();
264    }
265
266    PabloBlock * getPabloBlock() const {
267        return mPb;
268    }
269
270    PabloBuilder * getParent() const {
271        return mParent;
272    }
273
274    String * makeName(const llvm::StringRef & prefix) const {
275        return mPb->makeName(prefix);
276    }
277
278    Integer * getInteger(const uint64_t value) const {
279        return mPb->getInteger(value);
280    }
281
282    void print(llvm::raw_ostream & O, const bool expandNested = true) const {
283        mPb->print(O, expandNested);
284    }
285
286protected:
287
288    PabloBuilder(not_null<PabloBlock *> block, not_null<PabloBuilder *> parent)
289    : mPb(block), mParent(parent), mExprTable(&(parent->mExprTable)) {
290
291    }
292
293private:
294
295    PabloBlock * const          mPb;
296    PabloBuilder * const        mParent;
297    ExpressionTable             mExprTable;
298};
299
300
301}
302
303
304#endif // BUILDER_HPP
Note: See TracBrowser for help on using the repository browser.