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

Last change on this file since 5709 was 5709, checked in by cameron, 18 months ago

createIndexedAdvance

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