source: icGREP/icgrep-devel/icgrep/pablo/branch.h @ 5792

Last change on this file since 5792 was 5706, checked in by nmedfort, 20 months ago

First stage of MultiBlockKernel? and pipeline restructuring

File size: 2.4 KB
Line 
1#ifndef BRANCH_H
2#define BRANCH_H
3
4#include <pablo/pabloAST.h>
5namespace pablo { class Var; }
6namespace pablo { class PabloBlock; }
7
8namespace pablo {
9
10class Branch : public Statement {
11    friend class PabloBlock;
12    friend class Statement;
13    friend class Simplifier;
14public:
15    using EscapedVars = std::vector<Var *>;
16    static inline bool classof(const PabloAST * e) {
17        switch (e->getClassTypeId()) {
18            case ClassTypeId::If:
19            case ClassTypeId::While:
20                return true;
21            default:
22                return false;
23        }
24    }
25    static inline bool classof(const void *) {
26        return false;
27    }
28    inline PabloAST * getCondition() const {
29        return getOperand(0);
30    }
31    inline void setCondition(PabloAST * const condition) {
32        return setOperand(0, condition);
33    }
34    inline PabloBlock * getBody() {
35        return mBody;
36    }
37    inline  PabloBlock * getBody() const {
38        return mBody;
39    }
40    inline bool isRegular() const {
41        return mRegular;
42    }
43    inline void setRegular(const bool value) {
44        mRegular = value;
45    }
46    PabloBlock * setBody(PabloBlock * const body);
47    EscapedVars getEscaped() const;
48protected:
49    void addEscaped(PabloAST * const node);
50    void removeEscaped(PabloAST * const node);
51    Branch(const ClassTypeId typeId, PabloAST * condition, PabloBlock * body, Allocator & allocator);
52protected:
53    PabloBlock *    mBody;
54    unsigned        mEscapedCount;
55    unsigned        mEscapedCapacity;
56    PabloAST **     mEscaped;
57    bool            mRegular;
58};
59
60class If final : public Branch {
61    friend class PabloBlock;
62    friend class Statement;
63    friend class Simplifier;
64public:
65    static inline bool classof(const PabloAST * e) {
66        return e->getClassTypeId() == ClassTypeId::If;
67    }
68protected:
69    If(PabloAST * condition, PabloBlock * body, Allocator & allocator)
70    : Branch(ClassTypeId::If, condition, body, allocator) {
71
72    }
73};
74
75class While final : public Branch {
76    friend class PabloBlock;
77    friend class Statement;
78    friend class Simplifier;
79public:
80    static inline bool classof(const PabloAST * e) {
81        return e->getClassTypeId() == ClassTypeId::While;
82    }
83protected:
84    While(PabloAST * condition, PabloBlock * body, Allocator & allocator)
85    : Branch(ClassTypeId::While, condition, body, allocator) {
86
87    }
88};
89
90
91}
92
93#endif // BRANCH_H
Note: See TracBrowser for help on using the repository browser.