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

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

Added the kernel instance class; removed original mmap file access in favour of the boost mmap system. corrected PrintRegister? routine.

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);
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    void increment();
61
62    inline llvm::Value * getInputStream(const unsigned index, const unsigned streamOffset = 0) {
63        return getInputStream(mInputParam, index, streamOffset);
64    }
65
66    inline llvm::Value * getInputScalar(const unsigned index) {
67        return getInputScalar(mInputParam, index);
68    }
69
70    llvm::Value * getInternalState(const std::string & name) {
71        return getInternalState(mKernelParam, name);
72    }
73
74    void setInternalState(const std::string & name, llvm::Value * value) {
75        setInternalState(mKernelParam, name, value);
76    }
77
78    llvm::Value * getInternalState(const unsigned index) {
79        return getInternalState(mKernelParam, index);
80    }
81
82    void setInternalState(const unsigned index, llvm::Value * value) {
83        setInternalState(mKernelParam, index, value);
84    }
85
86    llvm::Value * getOutputStream(const unsigned index, const unsigned streamOffset = 0) {
87        return getOutputStream(mKernelParam, index, streamOffset);
88    }
89    llvm::Value * getOutputStreamSet(const unsigned streamOffset = 0) {
90        return getOutputStreamSet(mKernelParam, streamOffset);
91    }
92
93    llvm::Value * getOutputScalar(const unsigned index) {
94        return getOutputScalar(mKernelParam, index);
95    }
96
97    llvm::Value * getBlockNo() {
98        return getBlockNo(mKernelParam);
99    }
100
101    llvm::Type * getInputStreamType() const;
102
103    void finalize();
104
105    kernel::Instance * instantiate();
106
107    unsigned getSegmentBlocks() const;
108
109    llvm::Type * getKernelStateType() const;
110
111    llvm::Value * getKernelState() const;
112
113    llvm::Function * getDoBlockFunction() const;
114
115    void setLongestLookaheadAmount(const unsigned bits);
116
117    void setBlocksPerSegment(const unsigned blocks);
118
119protected:
120
121    llvm::Value * getInputStream(llvm::Value * const instance, const unsigned index, const unsigned streamOffset);
122
123    llvm::Value * getInputScalar(llvm::Value * const instance, const unsigned index);
124
125    llvm::Value * getInternalState(llvm::Value * const instance, const std::string & name);
126
127    void setInternalState(llvm::Value * const instance, const std::string & name, llvm::Value * const value);
128
129    llvm::Value * getInternalState(llvm::Value * const instance, const unsigned index);
130
131    void setInternalState(llvm::Value * const instance, const unsigned index, llvm::Value * const value);
132
133    llvm::Value * getOutputStream(llvm::Value * const instance, const unsigned index, const unsigned streamOffset);
134
135    llvm::Value * getOutputStreamSet(llvm::Value * const instance, const unsigned streamOffset);
136
137    llvm::Value * getOutputScalar(llvm::Value * const instance, const unsigned index);
138
139    llvm::Value * getOffset(llvm::Value * const instance, const unsigned value);
140
141    llvm::Value * getBlockNo(llvm::Value * const instance);
142
143    void call(llvm::Value * const instance, llvm::Value * inputStreams);
144
145private:
146    llvm::Module *                      mMod;
147    IDISA::IDISA_Builder *              iBuilder;
148    std::string                                                 mKernelName;
149    llvm::Type *                        mBitBlockType;
150    llvm::Function*                                     mConstructor;
151    llvm::Function*                                             mFunction;
152    unsigned                            mBlockSize;
153    unsigned                            mBlocksPerSegment;
154    unsigned                            mCircularBufferModulo;
155    llvm::Type *                        mKernelStructType;
156    llvm::Type *                        mInputStreamType;
157    llvm::Type *                        mInputScalarType;
158    llvm::Value *                       mInputParam;
159    llvm::Value *                       mKernelParam;
160    unsigned                            mSegmentIndex;
161    unsigned                            mBlockIndex;
162    std::vector<llvm::Type *>           mInputStream;
163    std::vector<std::string>            mInputStreamName;
164    std::vector<llvm::Type *>           mInputScalar;
165    std::vector<std::string>            mInputScalarName;
166    std::vector<llvm::Type *>           mOutputStream;
167    std::vector<llvm::Type *>           mOutputScalar;
168    std::vector<llvm::Type *>                   mInternalState;
169    NameMap                             mInternalStateNameMap;
170};
171
172inline unsigned KernelBuilder::getSegmentBlocks() const {
173    return mBlocksPerSegment;
174}
175
176inline llvm::Function * KernelBuilder::getDoBlockFunction() const {
177    return mFunction;
178}
179
180inline llvm::Type * KernelBuilder::getKernelStateType() const{
181    return mKernelStructType;
182}
183
184inline llvm::Value * KernelBuilder::getKernelState() const {
185    return mKernelParam;
186}
187
188inline void KernelBuilder::setBlocksPerSegment(const unsigned blocks) {
189    mBlocksPerSegment = blocks;
190}
191
192inline llvm::Type * KernelBuilder::getInputStreamType() const {
193    return mInputStreamType;
194}
195
196inline void KernelBuilder::increment() {
197    ++mSegmentIndex;
198}
199
200inline llvm::Value * KernelBuilder::getBlockNo(llvm::Value * const instance) {
201    return getInternalState(instance, mBlockIndex);
202}
203
204} // end of namespace kernel
205
206#endif // KERNEL_H
Note: See TracBrowser for help on using the repository browser.