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

Last change on this file since 5239 was 5230, checked in by nmedfort, 3 years ago

Multi-threading support for PabloAST / PabloCompiler?. Requires unique LLVM Context / Module for each thread.

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