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

Last change on this file since 5307 was 5307, checked in by nmedfort, 3 years ago

Continued work on eliminating BlockNo?

File size: 8.2 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
[5283]68    inline Var * createVar(const llvm::StringRef & name, llvm::Type * const type = nullptr) {
[5202]69        return createVar(makeName(name), type);
[4443]70    }
71
[5283]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
[5217]106    inline PabloAST * createLookahead(PabloAST * expr, const int64_t shiftAmount) {
[4959]107        if (shiftAmount == 0) {
108            return expr;
109        }
110        return createLookahead(expr, mPb->getInteger(shiftAmount));
111    }
112
113    PabloAST * createLookahead(PabloAST * expr, PabloAST * shiftAmount);
114
[5283]115    inline PabloAST * createLookahead(PabloAST * expr, const int64_t shiftAmount, const llvm::StringRef & prefix) {
[4959]116        if (shiftAmount == 0) {
117            return expr;
118        }
119        return createLookahead(expr, mPb->getInteger(shiftAmount), prefix);
120    }
121
[5283]122    PabloAST * createLookahead(PabloAST * expr, PabloAST * shiftAmount, const llvm::StringRef & prefix);
[4959]123
[5202]124    PabloAST * createAssign(PabloAST * const variable, PabloAST * const value);
[4432]125
126    PabloAST * createAnd(PabloAST * expr1, PabloAST * expr2);
127
[5283]128    PabloAST * createAnd(PabloAST * expr1, PabloAST * expr2, const llvm::StringRef & prefix);
[4622]129
[4432]130    PabloAST * createNot(PabloAST * expr);
131
[5283]132    PabloAST * createNot(PabloAST * expr, const llvm::StringRef & prefix);
[4622]133
[4432]134    PabloAST * createOr(PabloAST * expr1, PabloAST * expr2);
135
[5283]136    PabloAST * createOr(PabloAST * expr1, PabloAST * expr2, const llvm::StringRef & prefix);
[4622]137
[4432]138    PabloAST * createXor(PabloAST * expr1, PabloAST * expr2);
139
[5283]140    PabloAST * createXor(PabloAST * expr1, PabloAST * expr2, const llvm::StringRef & prefix);
[4622]141
[4432]142    PabloAST * createMatchStar(PabloAST * marker, PabloAST * charclass);
143
[5283]144    PabloAST * createMatchStar(PabloAST * marker, PabloAST * charclass, const llvm::StringRef & prefix);
[4622]145
[4432]146    PabloAST * createScanThru(PabloAST * from, PabloAST * thru);
147
[5283]148    PabloAST * createScanThru(PabloAST * from, PabloAST * thru, const llvm::StringRef & prefix);
[4622]149
[5245]150    PabloAST * createScanTo(PabloAST * from, PabloAST * to) {
151        return createScanThru(from, createNot(to));
152    }
153
[5283]154    PabloAST * createScanTo(PabloAST * from, PabloAST * to, const llvm::StringRef & prefix) {
[5245]155        return createScanThru(from, createNot(to), prefix);
156    }
157
[4432]158    PabloAST * createSel(PabloAST * condition, PabloAST * trueExpr, PabloAST * falseExpr);
159
[5283]160    PabloAST * createSel(PabloAST * condition, PabloAST * trueExpr, PabloAST * falseExpr, const llvm::StringRef & prefix);
[5202]161
162    PabloAST * createCount(PabloAST * expr);
[4717]163   
[5283]164    PabloAST * createCount(PabloAST * expr, const llvm::StringRef & prefix);
[5202]165
[5023]166    PabloAST * createInFile(PabloAST * expr);
167   
[5283]168    PabloAST * createInFile(PabloAST * expr, const llvm::StringRef & prefix);
[5023]169   
[5042]170    PabloAST * createAtEOF(PabloAST * expr);
171   
[5283]172    PabloAST * createAtEOF(PabloAST * expr, const llvm::StringRef & prefix);
[5042]173   
[5217]174    PabloAST * createAdd(PabloAST * expr1, PabloAST * expr2);
175
176    PabloAST * createSubtract(PabloAST * expr1, PabloAST * expr2);
177
[5227]178    PabloAST * createLessThan(PabloAST * expr1, PabloAST * expr2);
[5217]179
[5202]180    inline If * createIf(PabloAST * condition, PabloBlock * body) {
181        return mPb->createIf(condition, body);
[4443]182    }
[4432]183
[5202]184    inline If * createIf(PabloAST * condition, PabloBuilder & builder) {
185        return mPb->createIf(condition, builder.mPb);
[4622]186    }
187
[5202]188    inline While * createWhile(PabloAST * condition, PabloBlock * body) {
189        return mPb->createWhile(condition, body);
[4602]190    }
191
[5202]192    inline While * createWhile(PabloAST * condition, PabloBuilder & builder) {
193        return mPb->createWhile(condition, builder.mPb);
[4622]194    }
195
[5307]196//    llvm::Type * getStreamTy(const unsigned FieldWidth = 1) {
197//        return mPb->getStreamTy(FieldWidth);
198//    }
[5229]199   
[5267]200    llvm::Type * getStreamSetTy(const unsigned NumElements = 1, const unsigned FieldWidth = 1) {
[5227]201        return mPb->getStreamSetTy(NumElements, FieldWidth);
202    }
[5229]203   
[4711]204    /// Statement Iterator Wrappers
205
206    iterator begin() {
207        return mPb->begin();
208    }
209
210    iterator end() {
211        return mPb->end();
212    }
213
214    const_iterator begin() const {
215        return mPb->cbegin();
216    }
217
218    const_iterator end() const {
219        return mPb->cend();
220    }
221
222    const_iterator cbegin() const {
223        return mPb->cbegin();
224    }
225
226    const_iterator cend() const {
227        return mPb->cend();
228    }
229
[4641]230    inline Statement * front() const {
231        return mPb->front();
232    }
233
234    inline Statement * back() const {
235        return mPb->back();
236    }
237
[5202]238    inline Statement * getInsertPoint() const {
239        return mPb->getInsertPoint();
[4680]240    }
241
[5202]242    inline PabloBlock * getPabloBlock() const {
243        return mPb;
[4680]244    }
245
[5202]246    inline PabloBuilder * getParent() const {
247        return mParent;
[4680]248    }
249
[5283]250    inline String * makeName(const llvm::StringRef & prefix) const {
[5202]251        return mPb->makeName(prefix);
[4603]252    }
253
[5217]254    inline Integer * getInteger(const uint64_t value) const {
[5202]255        return mPb->getInteger(value);
[4617]256    }
257
[5267]258    inline void print(llvm::raw_ostream & O, const bool expandNested = true) const {
[5245]259        mPb->print(O, expandNested);
260    }
261
[5202]262protected:
263
264    explicit PabloBuilder(PabloBlock * block, PabloBuilder & parent)
265    : mPb(block), mParent(&parent), mExprTable(&(parent.mExprTable)) {
266
[4711]267    }
268
[4432]269private:
270
[4641]271    PabloBlock *        mPb;
[4622]272    PabloBuilder *      mParent;
[4443]273    ExpressionTable     mExprTable;
[4432]274};
275
276
277}
278
279
280#endif // BUILDER_HPP
Note: See TracBrowser for help on using the repository browser.