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

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

First attempt at dynamic segment size intergration.

File size: 6.4 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    unsigned addInternalState(llvm::Type * const type);
47    unsigned addInternalState(llvm::Type * const type, std::string && name);
48
49    void addInputStream(const unsigned fields);
50    void addInputStream(const unsigned fields, std::string && name);
51
52    void addInputScalar(llvm::Type * const type);
53    void addInputScalar(llvm::Type * const type, std::string && name);
54
55    unsigned addOutputStream(const unsigned fields);
56    unsigned addOutputScalar(llvm::Type * const type);
57
58    llvm::Function * prepareFunction();
59
60    inline llvm::Value * getInputStream(const unsigned index, const unsigned streamOffset = 0) {
61        return getInputStream(mKernelParam, index, streamOffset);
62    }
63
64    inline llvm::Value * getInputScalar(const unsigned index) {
65        return getInputScalar(mKernelParam, index);
66    }
67
68    llvm::Value * getInternalState(const std::string & name) {
69        return getInternalState(mKernelParam, name);
70    }
71
72    void setInternalState(const std::string & name, llvm::Value * value) {
73        setInternalState(mKernelParam, name, value);
74    }
75
76    llvm::Value * getInternalState(const unsigned index) {
77        return getInternalState(mKernelParam, index);
78    }
79
80    void setInternalState(const unsigned index, llvm::Value * value) {
81        setInternalState(mKernelParam, index, value);
82    }
83
84    llvm::Value * getOutputStream(const unsigned index, const unsigned streamOffset = 0) {
85        return getOutputStream(mKernelParam, index, streamOffset);
86    }
87
88    inline unsigned getNumOfOutputStreams() const {
89        return mOutputStream.size();
90    }
91
92    llvm::Value * getOutputScalar(const unsigned index) {
93        return getOutputScalar(mKernelParam, index);
94    }
95
96    inline unsigned getNumOfOutputScalars() const {
97        return mOutputScalar.size();
98    }
99
100    llvm::Value * getBlockNo() {
101        return getBlockNo(mKernelParam);
102    }
103
104    llvm::Type * getInputStreamType() const;
105
106    void setInputBufferSize(const unsigned bufferSize);
107
108    unsigned getInputBufferSize() const;
109
110    unsigned getBufferSize() const;
111
112    void finalize();
113
114    kernel::Instance * instantiate(llvm::Value * const inputStream);
115
116    kernel::Instance * instantiate(std::pair<llvm::Value *, unsigned> &&inputStream);
117
118    llvm::Type * getKernelStateType() const;
119
120    llvm::Value * getKernelState() const;
121
122    llvm::Function * getDoBlockFunction() const;
123
124    void clearOutputStream(llvm::Value * const instance, const unsigned streamOffset = 0);
125
126    void setLongestLookaheadAmount(const unsigned bits);
127
128protected:
129
130    llvm::Value * getInputStream(llvm::Value * const instance, const unsigned index, const unsigned streamOffset);
131
132    llvm::Value * getInputScalar(llvm::Value * const instance, const unsigned index);
133
134    llvm::Value * getInternalState(llvm::Value * const instance, const std::string & name);
135
136    void setInternalState(llvm::Value * const instance, const std::string & name, llvm::Value * const value);
137
138    llvm::Value * getInternalState(llvm::Value * const instance, const unsigned index);
139
140    void setInternalState(llvm::Value * const instance, const unsigned index, llvm::Value * const value);
141
142    llvm::Value * getOutputStream(llvm::Value * const instance, const unsigned index, const unsigned streamOffset);
143
144    llvm::Value * getOutputScalar(llvm::Value * const instance, const unsigned index);
145
146    llvm::Value * getOffset(llvm::Value * const instance, const unsigned value);
147
148    llvm::Value * getBlockNo(llvm::Value * const instance);
149
150    llvm::Function * getOutputStreamSetFunction() const;
151
152    void CreateDoBlockCall(llvm::Value * const instance);
153
154    llvm::Function * CreateModFunction(const unsigned size);
155
156private:
157    llvm::Module *                      mMod;
158    IDISA::IDISA_Builder *              iBuilder;
159    std::string                                                 mKernelName;
160    llvm::Type *                        mBitBlockType;
161    llvm::Function *                                    mConstructor;
162    llvm::Function *                                    mDoBlock;
163
164    unsigned                            mBufferSize;
165
166    llvm::Type *                        mKernelStateType;
167    llvm::Type *                        mInputStreamType;
168    llvm::Type *                        mInputScalarType;
169    llvm::Type *                        mOutputStreamType;
170
171    llvm::Value *                       mInputParam;
172    llvm::Value *                       mKernelParam;
173    unsigned                            mBlockNoIndex;
174
175    std::vector<llvm::Type *>           mInputStream;
176    std::vector<std::string>            mInputStreamName;
177    std::vector<llvm::Type *>           mInputScalar;
178    std::vector<std::string>            mInputScalarName;   
179    std::vector<llvm::Type *>           mOutputStream;
180    std::vector<llvm::Type *>           mOutputScalar;
181    std::vector<llvm::Type *>                   mInternalState;
182    NameMap                             mInternalStateNameMap;
183};
184
185inline llvm::Function * KernelBuilder::getDoBlockFunction() const {
186    return mDoBlock;
187}
188
189inline llvm::Type * KernelBuilder::getKernelStateType() const{
190    return mKernelStateType;
191}
192
193inline llvm::Value * KernelBuilder::getKernelState() const {
194    return mKernelParam;
195}
196
197inline llvm::Type * KernelBuilder::getInputStreamType() const {
198    return mInputStreamType;
199}
200
201inline llvm::Value * KernelBuilder::getBlockNo(llvm::Value * const instance) {
202    return getInternalState(instance, mBlockNoIndex);
203}
204
205inline unsigned KernelBuilder::getBufferSize() const {
206    return mBufferSize;
207}
208
209} // end of namespace kernel
210
211#endif // KERNEL_H
Note: See TracBrowser for help on using the repository browser.