source: icGREP/icgrep-devel/icgrep/pablo/builder.cpp @ 5061

Last change on this file since 5061 was 5061, checked in by cameron, 3 years ago

pablo.Count is a pure statement, setting an accumulator state variable

File size: 7.2 KB
Line 
1#include <pablo/builder.hpp>
2
3namespace pablo {
4
5#define MAKE_UNARY(NAME, TYPE, ARGS...) \
6struct __##NAME { \
7    inline PabloAST * operator()(PabloAST * arg) { \
8        return mPb->NAME(arg); \
9    } \
10    inline PabloAST * operator()(PabloAST * arg, const std::string name) { \
11        return mPb->NAME(arg, name); \
12    } \
13    inline __##NAME(PabloBlock * pb) : mPb(pb) {} \
14private: \
15    PabloBlock * mPb; \
16}; \
17__##NAME functor(mPb); \
18PabloAST * result = mExprTable.findUnaryOrCall(std::move(functor), TYPE, ARGS)
19
20#define MAKE_BINARY(NAME, TYPE, ARGS...) \
21struct __##NAME { \
22    inline PabloAST * operator()(PabloAST * arg1, PabloAST * arg2) { \
23        return mPb->NAME(arg1, arg2); \
24    } \
25    inline PabloAST * operator()(PabloAST * arg1, PabloAST * arg2, const std::string name) { \
26        return mPb->NAME(arg1, arg2, name); \
27    } \
28    inline __##NAME(PabloBlock * pb) : mPb(pb) {} \
29private: \
30    PabloBlock * mPb; \
31}; \
32__##NAME functor(mPb); \
33PabloAST * result = mExprTable.findBinaryOrCall(std::move(functor), TYPE, ARGS)
34
35
36#define MAKE_TERNARY(NAME, TYPE, ARGS...) \
37struct __##NAME { \
38    inline PabloAST * operator()(PabloAST * arg1, PabloAST * arg2, PabloAST * arg3) { \
39        return mPb->NAME(arg1, arg2, arg3); \
40    } \
41    inline PabloAST * operator()(PabloAST * arg1, PabloAST * arg2, PabloAST * arg3, const std::string name) { \
42        return mPb->NAME(arg1, arg2, arg3, name); \
43    } \
44    inline __##NAME(PabloBlock * pb) : mPb(pb) {} \
45private: \
46    PabloBlock * mPb; \
47}; \
48__##NAME functor(mPb); \
49PabloAST * result = mExprTable.findTernaryOrCall(std::move(functor), TYPE, ARGS)
50
51#define MAKE_VARIABLE(NAME, TYPE, ARGS...) \
52struct __##NAME { \
53    inline PabloAST * operator()(const std::vector<PabloAST *> & args, PabloAST * prototype) { \
54        return mPb->NAME(prototype, args); \
55    } \
56    inline __##NAME(PabloBlock * pb) : mPb(pb) {} \
57private: \
58    PabloBlock * mPb; \
59}; \
60__##NAME functor(mPb); \
61PabloAST * result = mExprTable.findVariableOrCall(std::move(functor), TYPE, ARGS)
62
63Call * PabloBuilder::createCall(Prototype * prototype, const std::vector<PabloAST *> & args) {
64    if (prototype == nullptr) {
65        throw std::runtime_error("Call object cannot be created with a Null prototype!");
66    }
67    if (args.size() != cast<Prototype>(prototype)->getNumOfParameters()) {
68        throw std::runtime_error("Invalid number of arguments passed into Call object!");
69    }
70    MAKE_VARIABLE(createCall, PabloAST::ClassTypeId::Call, prototype->getName(), args, prototype);
71    return cast<Call>(result);
72}
73
74PabloAST * PabloBuilder::createAdvance(PabloAST * expr, PabloAST * shiftAmount) {
75    MAKE_BINARY(createAdvance, PabloAST::ClassTypeId::Advance, expr, shiftAmount);
76    return result;
77}
78
79PabloAST * PabloBuilder::createAdvance(PabloAST * expr, PabloAST * shiftAmount, const std::string prefix) {
80    MAKE_BINARY(createAdvance, PabloAST::ClassTypeId::Advance, expr, shiftAmount, prefix);
81    return result;
82}
83
84PabloAST * PabloBuilder::createLookahead(PabloAST * expr, PabloAST * shiftAmount) {
85    MAKE_BINARY(createLookahead, PabloAST::ClassTypeId::Lookahead, expr, shiftAmount);
86    return result;
87}
88
89PabloAST * PabloBuilder::createLookahead(PabloAST * expr, PabloAST * shiftAmount, const std::string prefix) {
90    MAKE_BINARY(createLookahead, PabloAST::ClassTypeId::Lookahead, expr, shiftAmount, prefix);
91    return result;
92}
93
94PabloAST * PabloBuilder::createNot(PabloAST * expr) {
95    MAKE_UNARY(createNot, PabloAST::ClassTypeId::Not, expr);
96    return result;
97}
98
99PabloAST * PabloBuilder::createNot(PabloAST * expr, const std::string prefix) {
100    MAKE_UNARY(createNot, PabloAST::ClassTypeId::Not, expr, prefix);
101    return result;
102}
103
104PabloAST * PabloBuilder::createAnd(PabloAST * expr1, PabloAST * expr2) {
105    assert (expr1);
106    assert (expr2);
107    if (isa<Not>(expr1) || expr1 > expr2) {
108        std::swap(expr1, expr2);
109    }
110    MAKE_BINARY(createAnd, PabloAST::ClassTypeId::And, expr1, expr2);
111    return result;
112}
113
114PabloAST * PabloBuilder::createAnd(PabloAST * expr1, PabloAST * expr2, const std::string prefix) {
115    assert (expr1);
116    assert (expr2);
117    if (isa<Not>(expr1) || expr1 > expr2) {
118        std::swap(expr1, expr2);
119    }
120    MAKE_BINARY(createAnd, PabloAST::ClassTypeId::And, expr1, expr2, prefix);
121    return result;
122}
123
124PabloAST * PabloBuilder::createOr(PabloAST * expr1, PabloAST * expr2) {
125    assert (expr1);
126    assert (expr2);
127    if (expr1 > expr2) {
128        std::swap(expr1, expr2);
129    }
130    MAKE_BINARY(createOr, PabloAST::ClassTypeId::Or, expr1, expr2);
131    return result;
132}
133
134PabloAST * PabloBuilder::createOr(PabloAST * expr1, PabloAST * expr2, const std::string prefix) {
135    assert (expr1);
136    assert (expr2);
137    if (expr1 > expr2) {
138        std::swap(expr1, expr2);
139    }
140    MAKE_BINARY(createOr, PabloAST::ClassTypeId::Or, expr1, expr2, prefix);
141    return result;
142}
143
144PabloAST * PabloBuilder::createXor(PabloAST * expr1, PabloAST * expr2) {
145    assert (expr1);
146    assert (expr2);
147    if (expr1 > expr2) {
148        std::swap(expr1, expr2);
149    }
150    MAKE_BINARY(createXor, PabloAST::ClassTypeId::Xor, expr1, expr2);
151    return result;
152}
153
154PabloAST * PabloBuilder::createXor(PabloAST * expr1, PabloAST * expr2, const std::string prefix) {
155    assert (expr1);
156    assert (expr2);
157    if (expr1 > expr2) {
158        std::swap(expr1, expr2);
159    }
160    MAKE_BINARY(createXor, PabloAST::ClassTypeId::Xor, expr1, expr2, prefix);
161    return result;
162}
163
164PabloAST * PabloBuilder::createInFile(PabloAST * expr) {
165    MAKE_UNARY(createInFile, PabloAST::ClassTypeId::InFile, expr);
166    return result;
167}
168
169PabloAST * PabloBuilder::createInFile(PabloAST * expr, const std::string prefix) {
170    MAKE_UNARY(createInFile, PabloAST::ClassTypeId::InFile, expr, prefix);
171    return result;
172}
173
174PabloAST * PabloBuilder::createAtEOF(PabloAST * expr) {
175    MAKE_UNARY(createAtEOF, PabloAST::ClassTypeId::AtEOF, expr);
176    return result;
177}
178
179PabloAST * PabloBuilder::createAtEOF(PabloAST * expr, const std::string prefix) {
180    MAKE_UNARY(createAtEOF, PabloAST::ClassTypeId::AtEOF, expr, prefix);
181    return result;
182}
183
184PabloAST * PabloBuilder::createMatchStar(PabloAST * marker, PabloAST * charclass) {
185MAKE_BINARY(createMatchStar, PabloAST::ClassTypeId::MatchStar, marker, charclass);
186return result;
187}
188
189PabloAST * PabloBuilder::createMatchStar(PabloAST * marker, PabloAST * charclass, const std::string prefix) {
190    MAKE_BINARY(createMatchStar, PabloAST::ClassTypeId::MatchStar, marker, charclass, prefix);
191    return result;
192}
193
194PabloAST * PabloBuilder::createScanThru(PabloAST * from, PabloAST * thru) {
195    MAKE_BINARY(createScanThru, PabloAST::ClassTypeId::ScanThru, from, thru);
196    return result;
197}
198
199PabloAST * PabloBuilder::createScanThru(PabloAST * from, PabloAST * thru, const std::string prefix) {
200    MAKE_BINARY(createScanThru, PabloAST::ClassTypeId::ScanThru, from, thru, prefix);
201    return result;
202}
203
204
205PabloAST * PabloBuilder::createSel(PabloAST * condition, PabloAST * trueExpr, PabloAST * falseExpr) {
206    MAKE_TERNARY(createSel, PabloAST::ClassTypeId::Sel, condition, trueExpr, falseExpr);
207    return result;
208}
209
210PabloAST * PabloBuilder::createSel(PabloAST * condition, PabloAST * trueExpr, PabloAST * falseExpr, const std::string prefix) {
211    MAKE_TERNARY(createSel, PabloAST::ClassTypeId::Sel, condition, trueExpr, falseExpr, prefix);
212    return result;
213}
214
215}
Note: See TracBrowser for help on using the repository browser.