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

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

Initial work on adding types to PabloAST and mutable Var objects.

File size: 4.1 KB
Line 
1#ifndef FUNCTION_H
2#define FUNCTION_H
3
4#include <pablo/pabloAST.h>
5#include <pablo/symbol_generator.h>
6#include <pablo/pe_var.h>
7#include <pablo/ps_assign.h>
8#include <pablo/pe_count.h>
9#include <pablo/pe_zeroes.h>
10#include <pablo/pe_ones.h>
11
12namespace pablo {
13
14class Prototype : public PabloAST {
15    friend class PabloBlock;
16public:
17
18    static inline bool classof(const PabloAST * e) {
19        return e->getClassTypeId() == ClassTypeId::Prototype;
20    }
21
22    static inline bool classof(void *) {
23        return false;
24    }
25
26    static Prototype * Create(std::string name, const unsigned numOfParameters, const unsigned numOfResults, void * functionPtr = nullptr);
27
28    const String * getName() const {
29        return mName;
30    }
31
32    unsigned getNumOfParameters() const {
33        return mNumOfParameters;
34    }
35
36    unsigned getNumOfResults() const {
37        return mNumOfResults;
38    }
39
40protected:
41    Prototype(const PabloAST::ClassTypeId type, std::string && name, const unsigned numOfParameters, const unsigned numOfResults);
42protected:
43    const String * const    mName;
44    unsigned                mNumOfParameters;
45    unsigned                mNumOfResults;
46};
47
48inline Prototype * Prototype::Create(std::string name, const unsigned numOfParameters, const unsigned numOfResults, void *) {
49    return new Prototype(PabloAST::ClassTypeId::Prototype, std::move(name), numOfParameters, numOfResults);
50}
51
52class PabloFunction : public Prototype {
53    friend class PabloBlock;
54    friend class Branch;
55    using Allocator = SlabAllocator<PabloAST *>;
56public:
57
58    static inline bool classof(const PabloAST * e) {
59        switch (e->getClassTypeId()) {
60            case ClassTypeId::Function:
61            case ClassTypeId::Prototype:
62                return true;
63            default:
64                return false;
65        }       
66    }
67
68    static inline bool classof(void *) {
69        return false;
70    }
71
72    static PabloFunction * Create(std::string name);
73   
74    virtual bool operator==(const PabloAST & other) const {
75        return &other == this;
76    }
77
78    PabloBlock * getEntryBlock() {
79        return mEntryBlock;
80    }
81
82    const PabloBlock * getEntryBlock() const {
83        return mEntryBlock;
84    }
85
86    PabloBlock * setEntryBlock(PabloBlock * entryBlock) {
87        assert (entryBlock);
88        std::swap(mEntryBlock, entryBlock);
89        return entryBlock;
90    }
91
92    Var * getParameter(const unsigned index) {
93        return static_cast<Var *>(mParameters[index]);
94    }
95
96    const Var * getParameter(const unsigned index) const {
97        return static_cast<Var *>(mParameters[index]);
98    }
99
100    Var * addParameter(const std::string name, Type * const type);
101
102    Var * getResult(const unsigned index) {
103        return static_cast<Var *>(mResults[index]);
104    }
105
106    const Var * getResult(const unsigned index) const {
107        return static_cast<Var *>(mResults[index]);
108    }
109
110    Var * addResult(const std::string name, Type * const type);
111
112    Var * makeVariable(PabloAST * name, Type * const type);
113
114    Var * getVariable(const unsigned index) {
115        return static_cast<Var *>(mVariables[index]);
116    }
117
118    unsigned getNumOfVariables() {
119        return mVariables.size();
120    }
121
122    Zeroes * getNullValue(Type * const type);
123
124    Ones * getAllOnesValue(Type * const type);
125
126    void operator delete (void*);
127
128    virtual ~PabloFunction() { }
129
130    inline SymbolGenerator * getSymbolTable() const {
131        return mSymbolTable;
132    }
133
134protected:
135
136    __attribute__((noreturn)) void throwInvalidParameterIndex(const unsigned index) const;
137
138    __attribute__((noreturn)) void throwInvalidResultIndex(const unsigned index) const;
139
140    PabloFunction(std::string && name);
141private:
142    SymbolGenerator *                           mSymbolTable;
143    PabloBlock *                                mEntryBlock;
144    std::vector<PabloAST *, Allocator>          mParameters;
145    std::vector<PabloAST *, Allocator>          mResults;
146    std::vector<PabloAST *, Allocator>          mConstants;
147    std::vector<PabloAST *, Allocator>          mVariables;
148};
149
150inline PabloFunction * PabloFunction::Create(std::string name) {
151    return new PabloFunction(std::move(name));
152}
153   
154}
155
156#endif // FUNCTION_H
Note: See TracBrowser for help on using the repository browser.