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

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

Continued work on symbol table.

File size: 8.6 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() { return _value; }
52        T operator -> () { return _value; }
53    private:
54        T const  _value;
55    };
56
57    unsigned addInternalState(llvm::Type * const type);
58    unsigned addInternalState(llvm::Type * const type, std::string && name);
59
60    void addInputStream(const unsigned fields);
61    void addInputStream(const unsigned fields, std::string && name);
62
63    void addInputScalar(llvm::Type * const type);
64    void addInputScalar(llvm::Type * const type, std::string && name);
65
66    unsigned addOutputStream(const unsigned fields);
67    unsigned addOutputScalar(llvm::Type * const type);
68
69    llvm::Function * prepareFunction();
70
71    inline llvm::Value * getInputStream(const unsigned index, const unsigned streamOffset = 0) {
72        return getInputStream(mKernelState, index, streamOffset);
73    }
74
75    inline llvm::Value * getInputStream(disable_implicit_conversion<llvm::Value *> index, const unsigned streamOffset = 0) {
76        return getInputStream(mKernelState, index, streamOffset);
77    }
78
79    inline llvm::Value * getInputScalar(const unsigned index) {
80        return getInputScalar(mKernelState, index);
81    }
82
83    inline llvm::Value * getInputScalar(disable_implicit_conversion<llvm::Value *> const index) {
84        return getInputScalar(mKernelState, index);
85    }
86
87    llvm::Value * getInternalState(const std::string & name) {
88        return getInternalState(mKernelState, name);
89    }
90
91    void setInternalState(const std::string & name, llvm::Value * value) {
92        setInternalState(mKernelState, name, value);
93    }
94
95    llvm::Value * getInternalState(const unsigned index) {
96        return getInternalState(mKernelState, index);
97    }
98
99    llvm::Value * getInternalState(disable_implicit_conversion<llvm::Value *> const index) {
100        return getInternalState(mKernelState, index);
101    }
102
103    void setInternalState(const unsigned index, llvm::Value * value) {
104        setInternalState(mKernelState, index, value);
105    }
106
107    void setInternalState(disable_implicit_conversion<llvm::Value *> const index, llvm::Value * value) {
108        setInternalState(mKernelState, index, value);
109    }
110
111    llvm::Value * getOutputStream(const unsigned index, const unsigned streamOffset = 0) {
112        return getOutputStream(mKernelState, index, streamOffset);
113    }
114
115    llvm::Value * getOutputStream(disable_implicit_conversion<llvm::Value *> const index, const unsigned streamOffset = 0) {
116        return getOutputStream(mKernelState, index, streamOffset);
117    }
118
119    inline unsigned getNumOfOutputStreams() const {
120        return mOutputStream.size();
121    }
122
123    llvm::Value * getOutputScalar(const unsigned index) {
124        return getOutputScalar(mKernelState, index);
125    }
126
127    llvm::Value * getOutputScalar(disable_implicit_conversion<llvm::Value *> const index) {
128        return getOutputScalar(mKernelState, index);
129    }
130
131    inline unsigned getNumOfOutputScalars() const {
132        return mOutputScalar.size();
133    }
134
135    llvm::Value * getBlockNo() {
136        return getBlockNo(mKernelState);
137    }
138
139    llvm::Type * getInputStreamType() const;
140
141    void setInputBufferSize(const unsigned bufferSize);
142
143    unsigned getInputBufferSize() const;
144
145    unsigned getBufferSize() const;
146
147    void finalize();
148
149    kernel::Instance * instantiate(llvm::Value * const inputStream);
150
151    kernel::Instance * instantiate(std::initializer_list<llvm::Value *> inputStreams);
152
153    kernel::Instance * instantiate(std::pair<llvm::Value *, unsigned> && inputStream);
154
155    llvm::Type * getKernelStateType() const;
156
157    llvm::Value * getKernelState() const;
158
159    llvm::Function * getDoBlockFunction() const;
160
161    void clearOutputStreamSet(llvm::Value * const instance, const unsigned streamOffset = 0);
162
163protected:
164
165    llvm::Value * getInputStream(llvm::Value * const instance, const unsigned index, const unsigned streamOffset);
166
167    llvm::Value * getInputStream(llvm::Value * const instance, disable_implicit_conversion<llvm::Value *> index, const unsigned streamOffset);
168
169    llvm::Value * getInputScalar(llvm::Value * const instance, const unsigned index);
170
171    llvm::Value * getInputScalar(llvm::Value * const instance, disable_implicit_conversion<llvm::Value *> index);
172
173    llvm::Value * getInternalState(llvm::Value * const instance, const std::string & name);
174
175    void setInternalState(llvm::Value * const instance, const std::string & name, llvm::Value * const value);
176
177    llvm::Value * getInternalState(llvm::Value * const instance, const unsigned index);
178
179    llvm::Value * getInternalState(llvm::Value * const instance, disable_implicit_conversion<llvm::Value *> index);
180
181    void setInternalState(llvm::Value * const instance, const unsigned index, llvm::Value * const value);
182
183    void setInternalState(llvm::Value * const instance, disable_implicit_conversion<llvm::Value *> index, llvm::Value * const value);
184
185    llvm::Value * getOutputStream(llvm::Value * const instance, const unsigned index, const unsigned streamOffset);
186
187    llvm::Value * getOutputStream(llvm::Value * const instance, disable_implicit_conversion<llvm::Value *> index, const unsigned streamOffset);
188
189    llvm::Value * getOutputScalar(llvm::Value * const instance, const unsigned index);
190
191    llvm::Value * getOutputScalar(llvm::Value * const instance, disable_implicit_conversion<llvm::Value *> index);
192
193    llvm::Value * getStreamOffset(llvm::Value * const instance, const unsigned index);
194
195    llvm::Value * getBlockNo(llvm::Value * const instance);
196
197    llvm::Function * getOutputStreamSetFunction() const;
198
199    void CreateDoBlockCall(llvm::Value * const instance);
200
201    llvm::Function * CreateModFunction(const unsigned size);
202
203    void eliminateRedundantMemoryOperations(llvm::Function * const function);
204
205private:
206    llvm::Module *                      mMod;
207    IDISA::IDISA_Builder *              iBuilder;
208    std::string                                                 mKernelName;
209    llvm::Type *                        mBitBlockType;
210    llvm::Function *                                    mConstructor;
211    llvm::Function *                                    mDoBlock;
212
213    unsigned                            mBufferSize;
214
215    llvm::Type *                        mKernelStateType;
216    llvm::Type *                        mInputStreamType;
217    llvm::Type *                        mInputScalarType;
218    llvm::Type *                        mOutputStreamType;
219
220    llvm::Value *                       mKernelState;
221    unsigned                            mBlockNoIndex;
222
223    std::vector<llvm::Type *>           mInputStream;
224    std::vector<std::string>            mInputStreamName;
225    std::vector<llvm::Type *>           mInputScalar;
226    std::vector<std::string>            mInputScalarName;   
227    std::vector<llvm::Type *>           mOutputStream;
228    std::vector<llvm::Type *>           mOutputScalar;
229    std::vector<llvm::Type *>                   mInternalState;
230    NameMap                             mInternalStateNameMap;
231};
232
233inline llvm::Function * KernelBuilder::getDoBlockFunction() const {
234    return mDoBlock;
235}
236
237inline llvm::Type * KernelBuilder::getKernelStateType() const{
238    return mKernelStateType;
239}
240
241inline llvm::Value * KernelBuilder::getKernelState() const {
242    return mKernelState;
243}
244
245inline llvm::Type * KernelBuilder::getInputStreamType() const {
246    return mInputStreamType;
247}
248
249inline llvm::Value * KernelBuilder::getBlockNo(llvm::Value * const instance) {
250    return getInternalState(instance, mBlockNoIndex);
251}
252
253inline unsigned KernelBuilder::getBufferSize() const {
254    return mBufferSize;
255}
256
257} // end of namespace kernel
258
259#endif // KERNEL_H
Note: See TracBrowser for help on using the repository browser.