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

Last change on this file since 4568 was 4511, checked in by nmedfort, 5 years ago

Added vector support for If defined vars back.

File size: 2.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    inline static PabloBuilder Create(PabloBuilder & predecessor) {
13        return *(new PabloBlock(predecessor->mPb));
14    }
15
16    inline Zeroes * createZeroes() const {
17        return mPb->createZeroes();
18    }
19
20    inline Ones * createOnes() const {
21        return mPb->createOnes();
22    }
23
24    Var * createVar(const std::string name) {
25        return createVar(mPb->getName(name));
26    }
27
28    Var * createVar(String * name);
29
30    PabloAST * createVar(const PabloAST * const) {
31        throw std::runtime_error("Var objects should only refer to external Vars (i.e., input basis bit streams). Use Assign objects directly.");
32    }
33
34    inline Call * createCall(const std::string name) {
35        return createCall(mPb->getName(name));
36    }
37
38    Call * createCall(String * name);
39
40    Assign * createAssign(const std::string prefix, PabloAST * expr, const int outputIndex = -1);
41
42    inline PabloAST * createAdvance(PabloAST * expr, const Integer::integer_t shiftAmount) {
43        if (shiftAmount == 0) {
44            return expr;
45        }
46        return createAdvance(expr, mPb->getInteger(shiftAmount));
47    }
48
49    PabloAST * createAdvance(PabloAST * expr, PabloAST * shiftAmount);
50
51    Next * createNext(Assign * assign, PabloAST * expr);
52
53    PabloAST * createAnd(PabloAST * expr1, PabloAST * expr2);
54
55    PabloAST * createNot(PabloAST * expr);
56
57    PabloAST * createOr(PabloAST * expr1, PabloAST * expr2);
58
59    PabloAST * createXor(PabloAST * expr1, PabloAST * expr2);
60
61    PabloAST * createMatchStar(PabloAST * marker, PabloAST * charclass);
62
63    PabloAST * createScanThru(PabloAST * from, PabloAST * thru);
64
65    PabloAST * createSel(PabloAST * condition, PabloAST * trueExpr, PabloAST * falseExpr);
66
67    inline If * createIf(PabloAST * condition, std::initializer_list<Assign *> definedVars, PabloBlock & body) {
68        mPb->createIf(condition, std::move(definedVars), body);
69    }
70
71    inline While * createWhile(PabloAST * condition, PabloBlock & body) {
72        mPb->createWhile(condition, body);
73    }
74
75private:
76
77    PabloBlock *        mPb;
78    ExpressionTable     mExprTable;
79};
80
81
82}
83
84
85#endif // BUILDER_HPP
Note: See TracBrowser for help on using the repository browser.