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

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

Upload of an untested (inactive) UCD compiler.

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