source: icGREP/icgrep-devel/icgrep/pablo/function.h @ 4667

Last change on this file since 4667 was 4659, checked in by nmedfort, 4 years ago

Minor changes to function compilation preceeding any modification of the pablo Call class.

File size: 2.4 KB
Line 
1#ifndef FUNCTION_H
2#define FUNCTION_H
3
4#include <pablo/pabloAST.h>
5#include <pablo/pe_var.h>
6#include <pablo/ps_assign.h>
7#include <pablo/symbol_generator.h>
8
9namespace pablo {
10
11class Var;
12class Assign;
13class PabloBlock;
14class String;
15
16class PabloFunction : public PabloAST {
17    friend class PabloBlock;
18    using ParamAllocator = VectorAllocator::rebind<Var *>::other;
19    using Parameters = std::vector<Var *, ParamAllocator>;
20    using ResultAllocator = VectorAllocator::rebind<Assign *>::other;
21    using Results = std::vector<Assign *, ResultAllocator>;
22public:
23
24    static inline bool classof(const PabloAST * e) {
25        return e->getClassTypeId() == ClassTypeId::Function;
26    }
27
28    static inline bool classof(const void *) {
29        return false;
30    }
31
32    static PabloFunction Create(std::string && name);
33
34    virtual bool operator==(const PabloAST & other) const {
35        return &other == this;
36    }
37
38    PabloBlock & getEntryBlock() {
39        return mEntryBlock;
40    }
41
42    const String * getName() const {
43        return mName;
44    }
45
46    const PabloBlock & getEntryBlock() const {
47        return mEntryBlock;
48    }
49
50    const Parameters & getParameters() const {
51        return mParameters;
52    }
53
54    const Results & getResults() const {
55        return mResults;
56    }
57
58    Var * getParameter(const unsigned index) {
59        return mParameters[index];
60    }
61
62    const Var * getParameter(const unsigned index) const {
63        return mParameters[index];
64    }
65
66    void addParameter(Var * value) {
67        mParameters.push_back(value); value->addUser(this);
68    }
69
70    Assign * getResult(const unsigned index) {
71        return mResults[index];
72    }
73
74    const Assign * getResult(const unsigned index) const {
75        return mResults[index];
76    }
77
78    void addResult(Assign * value) {
79        mResults.push_back(value); value->addUser(this);
80    }
81
82    void setResult(const unsigned index, PabloAST * value) {
83        getResult(index)->setExpression(value);
84    }
85
86    SymbolGenerator & getSymbolTable() {
87        return mSymbolTable;
88    }
89
90    virtual ~PabloFunction() { }
91
92protected:
93    PabloFunction(std::string && name);
94private:
95    PabloBlock &        mEntryBlock;
96    Parameters          mParameters;
97    Results             mResults;
98    SymbolGenerator     mSymbolTable;
99    String *            mName;
100};
101
102inline PabloFunction PabloFunction::Create(std::string && name) {
103    return PabloFunction(std::move(name));
104}
105
106}
107
108#endif // FUNCTION_H
Note: See TracBrowser for help on using the repository browser.