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

Last change on this file since 6184 was 5834, checked in by nmedfort, 21 months ago

Removed Variadic functionality; allowed for deferred creation of statement names

File size: 2.8 KB
Line 
1#ifndef BOOLEAN_H
2#define BOOLEAN_H
3
4#include <pablo/pabloAST.h>
5
6namespace pablo {
7
8class And final : public Statement {
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    : Statement(ClassTypeId::And, type, {expr1, expr2}, name, allocator)
21    {
22
23    }
24};
25
26class Or final : public Statement {
27    friend class PabloBlock;
28public:
29    static inline bool classof(const PabloAST * e) {
30        return e->getClassTypeId() == ClassTypeId::Or;
31    }
32    static inline bool classof(const void *) {
33        return false;
34    }
35    virtual ~Or() { }
36protected:
37    Or(llvm::Type * const type, PabloAST * expr1, PabloAST * expr2, const String * name, Allocator & allocator)
38    : Statement(ClassTypeId::Or, type, {expr1, expr2}, name, allocator)
39    {
40
41    }
42};
43
44class Xor final : public Statement {
45    friend class PabloBlock;
46public:
47    static inline bool classof(const PabloAST * e) {
48        return e->getClassTypeId() == ClassTypeId::Xor;
49    }
50    static inline bool classof(const void *) {
51        return false;
52    }
53protected:
54    Xor(llvm::Type * const type, PabloAST * expr1, PabloAST * expr2, const String * name, Allocator & allocator)
55    : Statement(ClassTypeId::Xor, type, {expr1, expr2}, name, allocator)
56    {
57
58    }
59};
60
61class Not final : public Statement {
62    friend class PabloBlock;
63public:
64    static inline bool classof(const PabloAST * e) {
65        return e->getClassTypeId() == ClassTypeId::Not;
66    }
67    static inline bool classof(const void *) {
68        return false;
69    }
70    virtual ~Not() {
71    }
72    PabloAST * getExpr() const {
73        return getOperand(0);
74    }
75protected:
76    Not(PabloAST * expr, const String * name, Allocator & allocator)
77    : Statement(ClassTypeId::Not, expr->getType(), {expr}, name, allocator)
78    {
79
80    }
81};
82
83class Sel final : public Statement {
84    friend class PabloBlock;
85public:
86    static inline bool classof(const PabloAST * e) {
87        return e->getClassTypeId() == ClassTypeId::Sel;
88    }
89    static inline bool classof(const void *) {
90        return false;
91    }
92    virtual ~Sel() {
93    }
94    inline PabloAST * getCondition() const {
95        return getOperand(0);
96    }
97    inline PabloAST * getTrueExpr() const {
98        return getOperand(1);
99    }
100    inline PabloAST * getFalseExpr() const {
101        return getOperand(2);
102    }
103protected:
104    Sel(PabloAST * condExpr, PabloAST * trueExpr, PabloAST * falseExpr, const String * name, Allocator & allocator)
105    : Statement(ClassTypeId::Sel, trueExpr->getType(), {condExpr, trueExpr, falseExpr}, name, allocator) {
106
107    }
108};
109
110}
111
112#endif // BOOLEAN_H
Note: See TracBrowser for help on using the repository browser.