source: icGREP/icgrep-devel/icgrep/pablo/boolean.h @ 5652

Last change on this file since 5652 was 5454, checked in by nmedfort, 2 years ago

Bug fix check in for DumpTrace?, compilation of DoBlock? / DoFinalBlock? functions. Pablo CodeMotionPass? optimized and enabled by default.

File size: 4.0 KB
Line 
1#ifndef BOOLEAN_H
2#define BOOLEAN_H
3
4#include <pablo/pabloAST.h>
5
6namespace pablo {
7
8class And final : public Variadic {
9    friend class PabloBlock;
10public:
11    static inline bool classof(const PabloAST * e) {
12        return e->getClassTypeId() == ClassTypeId::And;
13    }
14    static inline bool classof(const void *) {
15        return false;
16    }
17    virtual ~And() { }
18protected:
19    And(llvm::Type * const type, PabloAST * expr1, PabloAST * expr2, const String * name, Allocator & allocator)
20    : Variadic(ClassTypeId::And, type, {expr1, expr2}, name, allocator)
21    {
22
23    }
24    And(llvm::Type * const type, const unsigned reserved, const String * name, Allocator & allocator)
25    : Variadic(ClassTypeId::And, type, reserved, name, allocator)
26    {
27
28    }
29    template<typename iterator>
30    And(llvm::Type * const type, iterator begin, iterator end, const String * name, Allocator & allocator)
31    : Variadic(ClassTypeId::And, type, begin, end, name, allocator) {
32
33    }
34};
35
36class Or final : public Variadic {
37    friend class PabloBlock;
38public:
39    static inline bool classof(const PabloAST * e) {
40        return e->getClassTypeId() == ClassTypeId::Or;
41    }
42    static inline bool classof(const void *) {
43        return false;
44    }
45    virtual ~Or() { }
46protected:
47    Or(llvm::Type * const type, PabloAST * expr1, PabloAST * expr2, const String * name, Allocator & allocator)
48    : Variadic(ClassTypeId::Or, type, {expr1, expr2}, name, allocator)
49    {
50
51    }
52    Or(llvm::Type * const type, const unsigned reserved, const String * name, Allocator & allocator)
53    : Variadic(ClassTypeId::Or, type, reserved, name, allocator)
54    {
55
56    }
57    template<typename iterator>
58    Or(llvm::Type * const type, iterator begin, iterator end, const String * name, Allocator & allocator)
59    : Variadic(ClassTypeId::Or, type, begin, end, name, allocator) {
60
61    }
62};
63
64class Xor final : public Variadic {
65    friend class PabloBlock;
66public:
67    static inline bool classof(const PabloAST * e) {
68        return e->getClassTypeId() == ClassTypeId::Xor;
69    }
70    static inline bool classof(const void *) {
71        return false;
72    }
73protected:
74    Xor(llvm::Type * const type, PabloAST * expr1, PabloAST * expr2, const String * name, Allocator & allocator)
75    : Variadic(ClassTypeId::Xor, type, {expr1, expr2}, name, allocator)
76    {
77
78    }
79    Xor(llvm::Type * const type, const unsigned reserved, const String * name, Allocator & allocator)
80    : Variadic(ClassTypeId::Xor, type, reserved, name, allocator)
81    {
82
83    }
84    template<typename iterator>
85    Xor(llvm::Type * const type, iterator begin, iterator end, const String * name, Allocator & allocator)
86    : Variadic(ClassTypeId::Xor, type, begin, end, name, allocator) {
87
88    }
89};
90
91class Not final : public Statement {
92    friend class PabloBlock;
93public:
94    static inline bool classof(const PabloAST * e) {
95        return e->getClassTypeId() == ClassTypeId::Not;
96    }
97    static inline bool classof(const void *) {
98        return false;
99    }
100    virtual ~Not() {
101    }
102    PabloAST * getExpr() const {
103        return getOperand(0);
104    }
105protected:
106    Not(PabloAST * expr, const String * name, Allocator & allocator)
107    : Statement(ClassTypeId::Not, expr->getType(), {expr}, name, allocator)
108    {
109
110    }
111};
112
113class Sel final : public Statement {
114    friend class PabloBlock;
115public:
116    static inline bool classof(const PabloAST * e) {
117        return e->getClassTypeId() == ClassTypeId::Sel;
118    }
119    static inline bool classof(const void *) {
120        return false;
121    }
122    virtual ~Sel() {
123    }
124    inline PabloAST * getCondition() const {
125        return getOperand(0);
126    }
127    inline PabloAST * getTrueExpr() const {
128        return getOperand(1);
129    }
130    inline PabloAST * getFalseExpr() const {
131        return getOperand(2);
132    }
133protected:
134    Sel(PabloAST * condExpr, PabloAST * trueExpr, PabloAST * falseExpr, const String * name, Allocator & allocator)
135    : Statement(ClassTypeId::Sel, trueExpr->getType(), {condExpr, trueExpr, falseExpr}, name, allocator) {
136
137    }
138};
139
140}
141
142#endif // BOOLEAN_H
Note: See TracBrowser for help on using the repository browser.