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

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

Preliminary changes to inclusion of UCD Compiler into the RE Compiler.

File size: 4.8 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    PabloBuilder(PabloBlock & block) : mPb(block), mParent(nullptr) {}
13
14    PabloBuilder(PabloBlock & block, PabloBuilder & parent) : mPb(block), mParent(&parent), mExprTable(&(parent.mExprTable)) {}
15
16    inline static PabloBuilder && Create(PabloBuilder & parent) {
17        return std::move(PabloBuilder(parent.mPb.Create(parent.mPb), parent));
18    }
19
20    inline Zeroes * createZeroes() const {
21        return mPb.createZeroes();
22    }
23
24    inline Ones * createOnes() const {
25        return mPb.createOnes();
26    }
27
28    inline Var * createVar(const std::string name) {
29        return mPb.createVar(name);
30    }
31
32    inline Var * createVar(String * const name) {
33        return mPb.createVar(name);
34    }
35
36    inline Var * createVar(PabloAST * const name) {
37        return mPb.createVar(name);
38    }
39
40    inline Call * createCall(const std::string name) {
41        return createCall(mPb.getName(name));
42    }
43
44    Call * createCall(String * name);
45
46    Assign * createAssign(const std::string && prefix, PabloAST * expr, const int outputIndex = -1) {
47        return mPb.createAssign(std::move(prefix), expr, outputIndex);
48    }
49
50    inline PabloAST * createAdvance(PabloAST * expr, const Integer::integer_t shiftAmount) {
51        if (shiftAmount == 0) {
52            return expr;
53        }
54        return createAdvance(expr, mPb.getInteger(shiftAmount));
55    }
56
57    PabloAST * createAdvance(PabloAST * expr, PabloAST * shiftAmount);
58
59    inline PabloAST * createAdvance(PabloAST * expr, const Integer::integer_t shiftAmount, const std::string prefix) {
60        if (shiftAmount == 0) {
61            return expr;
62        }
63        return createAdvance(expr, mPb.getInteger(shiftAmount), prefix);
64    }
65
66    PabloAST * createAdvance(PabloAST * expr, PabloAST * shiftAmount, const std::string prefix);
67
68    inline Next * createNext(Assign * assign, PabloAST * expr) {
69        return mPb.createNext(assign, expr);
70    }
71
72    PabloAST * createAnd(PabloAST * expr1, PabloAST * expr2);
73
74    PabloAST * createAnd(PabloAST * expr1, PabloAST * expr2, const std::string prefix);
75
76    PabloAST * createNot(PabloAST * expr);
77
78    PabloAST * createNot(PabloAST * expr, const std::string prefix);
79
80    PabloAST * createOr(PabloAST * expr1, PabloAST * expr2);
81
82    PabloAST * createOr(PabloAST * expr1, PabloAST * expr2, const std::string prefix);
83
84    PabloAST * createXor(PabloAST * expr1, PabloAST * expr2);
85
86    PabloAST * createXor(PabloAST * expr1, PabloAST * expr2, const std::string prefix);
87
88    PabloAST * createMatchStar(PabloAST * marker, PabloAST * charclass);
89
90    PabloAST * createMatchStar(PabloAST * marker, PabloAST * charclass, const std::string prefix);
91
92    PabloAST * createScanThru(PabloAST * from, PabloAST * thru);
93
94    PabloAST * createScanThru(PabloAST * from, PabloAST * thru, const std::string prefix);
95
96    PabloAST * createSel(PabloAST * condition, PabloAST * trueExpr, PabloAST * falseExpr);
97
98    PabloAST * createSel(PabloAST * condition, PabloAST * trueExpr, PabloAST * falseExpr, const std::string prefix);
99
100    inline If * createIf(PabloAST * condition, std::initializer_list<Assign *> definedVars, PabloBuilder & body) {
101        return mPb.createIf(condition, std::move(definedVars), body.mPb);
102    }
103
104    inline If * createIf(PabloAST * condition, std::initializer_list<Assign *> definedVars, PabloBlock & body) {
105        return mPb.createIf(condition, std::move(definedVars), body);
106    }
107
108    inline If * createIf(PabloAST * condition, std::vector<Assign *> definedVars, PabloBuilder & body) {
109        return mPb.createIf(condition, std::move(definedVars), body.mPb);
110    }
111
112    inline If * createIf(PabloAST * condition, std::vector<Assign *> definedVars, PabloBlock & body) {
113        return mPb.createIf(condition, std::move(definedVars), body);
114    }
115
116    inline While * createWhile(PabloAST * condition, PabloBuilder & body) {
117        return mPb.createWhile(condition, body.mPb);
118    }
119
120    inline While * createWhile(PabloAST * condition, PabloBlock & body) {
121        return mPb.createWhile(condition, body);
122    }
123
124    inline Statement * front() const {
125        return mPb.front();
126    }
127
128    inline Statement * back() const {
129        return mPb.back();
130    }
131
132    inline void setInsertPoint(Statement * const statement) {
133        mPb.setInsertPoint(statement);
134    }
135
136    inline void setInsertPoint(StatementList * const list) {
137        mPb.setInsertPoint(list);
138    }
139
140    inline Statement * getInsertPoint() const {
141        return mPb.getInsertPoint();
142    }
143
144    inline PabloBlock & getPabloBlock() {
145        return mPb;
146    }
147
148    inline PabloBuilder * getParent() {
149        return mParent;
150    }
151
152private:
153
154    PabloBlock &        mPb;
155    PabloBuilder *      mParent;
156    ExpressionTable     mExprTable;
157};
158
159
160}
161
162
163#endif // BUILDER_HPP
Note: See TracBrowser for help on using the repository browser.