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

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

Next nodes for While statements must be declared similar to how Defined Vars are for Ifs. (Temporarily breaks multiplexing correctness.)

File size: 6.1 KB
Line 
1#ifndef BUILDER_HPP
2#define BUILDER_HPP
3
4#include "codegenstate.h"
5#include "expression_map.hpp"
6
7namespace pablo {
8
9class PabloBuilder {
10public:
11
12    explicit PabloBuilder(PabloBlock & block) : mPb(&block), mParent(nullptr) {}
13
14    explicit PabloBuilder(PabloBlock & block, PabloBuilder & parent) : mPb(&block), mParent(&parent), mExprTable(&(parent.mExprTable)) {}
15
16    PabloBuilder(const PabloBuilder &) = default;
17
18    PabloBuilder & operator=(PabloBuilder &) = delete;
19
20    PabloBuilder & operator=(PabloBuilder &&) = default;
21
22    inline static PabloBuilder && Create(PabloBuilder & parent) noexcept {
23        return std::move(PabloBuilder(PabloBlock::Create(*(parent.mPb)), parent));
24    }
25
26    inline Zeroes * createZeroes() const {
27        return mPb->createZeroes();
28    }
29
30    inline Ones * createOnes() const {
31        return mPb->createOnes();
32    }
33
34    inline Var * createVar(const std::string name) {
35        return mPb->createVar(name);
36    }
37
38    inline Var * createVar(String * const name) {
39        return mPb->createVar(name);
40    }
41
42    inline Var * createVar(PabloAST * const name) {
43        return mPb->createVar(name);
44    }
45
46    inline Call * createCall(const std::string name) {
47        return createCall(mPb->getName(name));
48    }
49
50    Call * createCall(String * name);
51
52    Assign * createAssign(const std::string && prefix, PabloAST * expr, const int outputIndex = -1) {
53        return mPb->createAssign(std::move(prefix), expr, outputIndex);
54    }
55
56    inline PabloAST * createAdvance(PabloAST * expr, const Integer::integer_t shiftAmount) {
57        if (shiftAmount == 0) {
58            return expr;
59        }
60        return createAdvance(expr, mPb->getInteger(shiftAmount));
61    }
62
63    PabloAST * createAdvance(PabloAST * expr, PabloAST * shiftAmount);
64
65    inline PabloAST * createAdvance(PabloAST * expr, const Integer::integer_t shiftAmount, const std::string prefix) {
66        if (shiftAmount == 0) {
67            return expr;
68        }
69        return createAdvance(expr, mPb->getInteger(shiftAmount), prefix);
70    }
71
72    PabloAST * createAdvance(PabloAST * expr, PabloAST * shiftAmount, const std::string prefix);
73
74    inline Next * createNext(Assign * assign, PabloAST * expr) {
75        return mPb->createNext(assign, expr);
76    }
77
78    PabloAST * createAnd(PabloAST * expr1, PabloAST * expr2);
79
80    PabloAST * createAnd(PabloAST * expr1, PabloAST * expr2, const std::string prefix);
81
82    PabloAST * createNot(PabloAST * expr);
83
84    PabloAST * createNot(PabloAST * expr, const std::string prefix);
85
86    PabloAST * createOr(PabloAST * expr1, PabloAST * expr2);
87
88    PabloAST * createOr(PabloAST * expr1, PabloAST * expr2, const std::string prefix);
89
90    PabloAST * createXor(PabloAST * expr1, PabloAST * expr2);
91
92    PabloAST * createXor(PabloAST * expr1, PabloAST * expr2, const std::string prefix);
93
94    PabloAST * createMatchStar(PabloAST * marker, PabloAST * charclass);
95
96    PabloAST * createMatchStar(PabloAST * marker, PabloAST * charclass, const std::string prefix);
97
98    PabloAST * createScanThru(PabloAST * from, PabloAST * thru);
99
100    PabloAST * createScanThru(PabloAST * from, PabloAST * thru, const std::string prefix);
101
102    PabloAST * createSel(PabloAST * condition, PabloAST * trueExpr, PabloAST * falseExpr);
103
104    PabloAST * createSel(PabloAST * condition, PabloAST * trueExpr, PabloAST * falseExpr, const std::string prefix);
105
106    /// CreateIf Wrappers
107
108    inline If * createIf(PabloAST * condition, std::initializer_list<Assign *> definedVars, PabloBlock & body) {
109        return mPb->createIf(condition, std::move(definedVars), body);
110    }
111
112    inline If * createIf(PabloAST * condition, const std::vector<Assign *> & definedVars, PabloBlock & body) {
113        return mPb->createIf(condition, definedVars, body);
114    }
115
116    inline If * createIf(PabloAST * condition, std::vector<Assign *> && definedVars, PabloBlock & body) {
117        return mPb->createIf(condition, std::move(definedVars), body);
118    }
119
120    inline If * createIf(PabloAST * condition, std::initializer_list<Assign *> definedVars, PabloBuilder & builder) {
121        return mPb->createIf(condition, std::move(definedVars), *builder.mPb);
122    }
123
124    inline If * createIf(PabloAST * condition, const std::vector<Assign *> & definedVars, PabloBuilder & builder) {
125        return mPb->createIf(condition, definedVars, *builder.mPb);
126    }
127
128    inline If * createIf(PabloAST * condition, std::vector<Assign *> && definedVars, PabloBuilder & builder) {
129        return mPb->createIf(condition, std::move(definedVars), *builder.mPb);
130    }
131
132    /// CreateWhile Wrappers
133
134    inline While * createWhile(PabloAST * condition, const std::initializer_list<Next *> nextVars, PabloBlock & body) {
135        return mPb->createWhile(condition, nextVars, body);
136    }
137
138    inline While * createWhile(PabloAST * condition, const std::vector<Next *> & nextVars, PabloBlock & body) {
139        return mPb->createWhile(condition, nextVars, body);
140    }
141
142    inline While * createWhile(PabloAST * condition, std::vector<Next *> && nextVars, PabloBlock & body) {
143        return mPb->createWhile(condition, std::move(nextVars), body);
144    }
145
146    inline While * createWhile(PabloAST * condition, const std::initializer_list<Next *> nextVars, PabloBuilder & builder) {
147        return mPb->createWhile(condition, nextVars, *builder.mPb);
148    }
149
150    inline While * createWhile(PabloAST * condition, const std::vector<Next *> & nextVars, PabloBuilder & builder) {
151        return mPb->createWhile(condition, nextVars, *builder.mPb);
152    }
153
154    inline While * createWhile(PabloAST * condition, std::vector<Next *> && nextVars, PabloBuilder & builder) {
155        return mPb->createWhile(condition, std::move(nextVars), *builder.mPb);
156    }
157
158    inline Statement * front() const {
159        return mPb->front();
160    }
161
162    inline Statement * back() const {
163        return mPb->back();
164    }
165
166    inline Statement * getInsertPoint() const {
167        return mPb->getInsertPoint();
168    }
169
170    inline PabloBlock * getPabloBlock() {
171        return mPb;
172    }
173
174    inline PabloBuilder * getParent() {
175        return mParent;
176    }
177
178private:
179
180    PabloBlock *        mPb;
181    PabloBuilder *      mParent;
182    ExpressionTable     mExprTable;
183};
184
185
186}
187
188
189#endif // BUILDER_HPP
Note: See TracBrowser for help on using the repository browser.