source: icGREP/icgrep-devel/icgrep/kernels/kernel.h @ 4995

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

More work on symbol table; unexpected bug with 4KiB-one page tests observed.

File size: 8.7 KB
Line 
1#ifndef KERNEL_H
2#define KERNEL_H
3/*
4 *  Copyright (c) 2016 International Characters.
5 *  This software is licensed to the public under the Open Software License 3.0.
6 */
7
8#include <string>
9#include <vector>
10#include <boost/container/flat_map.hpp>
11
12namespace llvm {
13    class Value;
14    class Module;
15    class ExecutionEngine;
16    class VectorType;
17    class PointerType;
18    class Constant;
19    class FunctionType;
20    class Function;
21    class BasicBlock;
22    class Type;
23}
24
25namespace pablo {
26    class PabloAST;
27    class PabloFunction;
28}
29
30namespace IDISA {
31    class IDISA_Builder;
32}
33
34namespace kernel {
35
36class Instance;
37
38class KernelBuilder {
39    friend class Instance;
40    friend llvm::Function * generateScanWordRoutine(llvm::Module *, IDISA::IDISA_Builder *, unsigned, KernelBuilder *, bool);
41    using NameMap = boost::container::flat_map<std::string, unsigned>;
42public:
43    // sets name & sets internal state to the kernel superclass state
44    KernelBuilder(std::string name, llvm::Module * m, IDISA::IDISA_Builder * b, const unsigned bufferSize = 1);
45
46    template<typename T>
47    struct disable_implicit_conversion {
48        inline disable_implicit_conversion(T const value) : _value(value) {}
49        inline disable_implicit_conversion(std::nullptr_t) = delete;
50        inline disable_implicit_conversion(unsigned) = delete;
51        operator T() const { return _value; }
52        T operator-> () const { return _value; }
53        T get() const { return _value; }
54    private:
55        T const  _value;
56    };
57
58    unsigned addInternalState(llvm::Type * const type);
59    unsigned addInternalState(llvm::Type * const type, std::string && name);
60
61    void addInputStream(const unsigned fields);
62    void addInputStream(const unsigned fields, std::string && name);
63
64    void addInputScalar(llvm::Type * const type);
65    void addInputScalar(llvm::Type * const type, std::string && name);
66
67    unsigned addOutputStream(const unsigned fields);
68    unsigned addOutputScalar(llvm::Type * const type);
69
70    llvm::Function * prepareFunction();
71
72    inline llvm::Value * getInputStream(const unsigned index, const unsigned streamOffset = 0) {
73        return getInputStream(mKernelState, index, streamOffset);
74    }
75
76    inline llvm::Value * getInputStream(disable_implicit_conversion<llvm::Value *> index, const unsigned streamOffset = 0) {
77        return getInputStream(mKernelState, index, streamOffset);
78    }
79
80    inline llvm::Value * getInputScalar(const unsigned index) {
81        return getInputScalar(mKernelState, index);
82    }
83
84    inline llvm::Value * getInputScalar(disable_implicit_conversion<llvm::Value *> const index) {
85        return getInputScalar(mKernelState, index);
86    }
87
88    llvm::Value * getInternalState(const std::string & name) {
89        return getInternalState(mKernelState, name);
90    }
91
92    void setInternalState(const std::string & name, llvm::Value * value) {
93        setInternalState(mKernelState, name, value);
94    }
95
96    llvm::Value * getInternalState(const unsigned index) {
97        return getInternalState(mKernelState, index);
98    }
99
100    llvm::Value * getInternalState(disable_implicit_conversion<llvm::Value *> const index) {
101        return getInternalState(mKernelState, index);
102    }
103
104    void setInternalState(const unsigned index, llvm::Value * value) {
105        setInternalState(mKernelState, index, value);
106    }
107
108    void setInternalState(disable_implicit_conversion<llvm::Value *> const index, llvm::Value * value) {
109        setInternalState(mKernelState, index, value);
110    }
111
112    llvm::Value * getOutputStream(const unsigned index, const unsigned streamOffset = 0) {
113        return getOutputStream(mKernelState, index, streamOffset);
114    }
115
116    llvm::Value * getOutputStream(disable_implicit_conversion<llvm::Value *> const index, const unsigned streamOffset = 0) {
117        return getOutputStream(mKernelState, index, streamOffset);
118    }
119
120    inline unsigned getNumOfOutputStreams() const {
121        return mOutputStream.size();
122    }
123
124    llvm::Value * getOutputScalar(const unsigned index) {
125        return getOutputScalar(mKernelState, index);
126    }
127
128    llvm::Value * getOutputScalar(disable_implicit_conversion<llvm::Value *> const index) {
129        return getOutputScalar(mKernelState, index);
130    }
131
132    inline unsigned getNumOfOutputScalars() const {
133        return mOutputScalar.size();
134    }
135
136    llvm::Value * getBlockNo() {
137        return getBlockNo(mKernelState);
138    }
139
140    llvm::Type * getInputStreamType() const;
141
142    void setInputBufferSize(const unsigned bufferSize);
143
144    unsigned getInputBufferSize() const;
145
146    unsigned getBufferSize() const;
147
148    void finalize();
149
150    kernel::Instance * instantiate(llvm::Value * const inputStream);
151
152    kernel::Instance * instantiate(std::initializer_list<llvm::Value *> inputStreams);
153
154    kernel::Instance * instantiate(std::pair<llvm::Value *, unsigned> && inputStream);
155
156    llvm::Type * getKernelStateType() const;
157
158    llvm::Value * getKernelState() const;
159
160    llvm::Function * getDoBlockFunction() const;
161
162    void clearOutputStreamSet(llvm::Value * const instance, const unsigned streamOffset = 0);
163
164protected:
165
166    llvm::Type * packDataTypes(const std::vector<llvm::Type *> & types);
167
168    llvm::Value * getInputStream(llvm::Value * const instance, const unsigned index, const unsigned streamOffset);
169
170    llvm::Value * getInputStream(llvm::Value * const instance, disable_implicit_conversion<llvm::Value *> index, const unsigned streamOffset);
171
172    llvm::Value * getInputScalar(llvm::Value * const instance, const unsigned index);
173
174    llvm::Value * getInputScalar(llvm::Value * const instance, disable_implicit_conversion<llvm::Value *> index);
175
176    llvm::Value * getInternalState(llvm::Value * const instance, const std::string & name);
177
178    void setInternalState(llvm::Value * const instance, const std::string & name, llvm::Value * const value);
179
180    llvm::Value * getInternalState(llvm::Value * const instance, const unsigned index);
181
182    llvm::Value * getInternalState(llvm::Value * const instance, disable_implicit_conversion<llvm::Value *> index);
183
184    void setInternalState(llvm::Value * const instance, const unsigned index, llvm::Value * const value);
185
186    void setInternalState(llvm::Value * const instance, disable_implicit_conversion<llvm::Value *> index, llvm::Value * const value);
187
188    llvm::Value * getOutputStream(llvm::Value * const instance, const unsigned index, const unsigned streamOffset);
189
190    llvm::Value * getOutputStream(llvm::Value * const instance, disable_implicit_conversion<llvm::Value *> index, const unsigned streamOffset);
191
192    llvm::Value * getOutputScalar(llvm::Value * const instance, const unsigned index);
193
194    llvm::Value * getOutputScalar(llvm::Value * const instance, disable_implicit_conversion<llvm::Value *> index);
195
196    llvm::Value * getStreamOffset(llvm::Value * const instance, const unsigned index);
197
198    llvm::Value * getBlockNo(llvm::Value * const instance);
199
200    llvm::Function * getOutputStreamSetFunction() const;
201
202    void CreateDoBlockCall(llvm::Value * const instance);
203
204    llvm::Function * CreateModFunction(const unsigned size);
205
206    void eliminateRedundantMemoryOperations(llvm::Function * const function);
207
208private:
209    llvm::Module *                      mMod;
210    IDISA::IDISA_Builder *              iBuilder;
211    std::string                                                 mKernelName;
212    llvm::Type *                        mBitBlockType;
213    llvm::Function *                                    mConstructor;
214    llvm::Function *                                    mDoBlock;
215
216    unsigned                            mBufferSize;
217
218    llvm::Type *                        mKernelStateType;
219    llvm::Type *                        mInputStreamType;
220    llvm::Type *                        mInputScalarType;
221    llvm::Type *                        mOutputStreamType;
222
223    llvm::Value *                       mKernelState;
224    unsigned                            mBlockNoIndex;
225
226    std::vector<llvm::Type *>           mInputStream;
227    std::vector<std::string>            mInputStreamName;
228    std::vector<llvm::Type *>           mInputScalar;
229    std::vector<std::string>            mInputScalarName;   
230    std::vector<llvm::Type *>           mOutputStream;
231    std::vector<llvm::Type *>           mOutputScalar;
232    std::vector<llvm::Type *>                   mInternalState;
233    NameMap                             mInternalStateNameMap;
234};
235
236inline llvm::Function * KernelBuilder::getDoBlockFunction() const {
237    return mDoBlock;
238}
239
240inline llvm::Type * KernelBuilder::getKernelStateType() const{
241    return mKernelStateType;
242}
243
244inline llvm::Value * KernelBuilder::getKernelState() const {
245    return mKernelState;
246}
247
248inline llvm::Type * KernelBuilder::getInputStreamType() const {
249    return mInputStreamType;
250}
251
252inline llvm::Value * KernelBuilder::getBlockNo(llvm::Value * const instance) {
253    return getInternalState(instance, mBlockNoIndex);
254}
255
256inline unsigned KernelBuilder::getBufferSize() const {
257    return mBufferSize;
258}
259
260} // end of namespace kernel
261
262#endif // KERNEL_H
Note: See TracBrowser for help on using the repository browser.