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

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

Initial modifications to Pablo Compiler and Kernel Builder to support circular buffers for Lookahead.

File size: 4.0 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
11namespace llvm {
12    class Value;
13    class Module;
14    class ExecutionEngine;
15    class VectorType;
16    class PointerType;
17    class Constant;
18    class FunctionType;
19    class Function;
20    class BasicBlock;
21    class Type;
22}
23
24namespace pablo {
25    class PabloAST;
26    class PabloFunction;
27}
28
29namespace IDISA {
30    class IDISA_Builder;
31}
32
33class KernelBuilder {
34
35public:
36    // sets name & sets internal state to the kernel superclass state
37    KernelBuilder(std::string name, llvm::Module * m, IDISA::IDISA_Builder * b);
38
39    unsigned addInternalStateType(llvm::Type * type);
40    void addOutputStream(const unsigned fields);
41    void addOutputAccum(llvm::Type * t);
42    void addInputStream(const unsigned fields, std::string name);
43    void addInputScalar(llvm::Type * t, std::string name);
44
45    llvm::Function * prepareFunction();
46
47    void increment();
48    void incrementCircularBuffer();
49
50    llvm::Value * getInputStream(const unsigned index, const unsigned streamOffset = 0);
51    llvm::Value * getKernelState(const unsigned index, const unsigned streamOffset = 0);
52    llvm::Value * getOutputStream(const unsigned index, const unsigned streamOffset = 0);
53    llvm::Value * getOutputScalar(const unsigned index, const unsigned streamOffset = 0);
54
55    void finalize();
56
57    llvm::Value * generateKernelInstance();
58        void generateInitCall();
59    void generateDoBlockCall(llvm::Value * inputStreams);
60
61    unsigned getSegmentBlocks() const;
62    llvm::Function * getDoBlockFunction() const;
63    llvm::Type * getKernelStructType() const;
64    llvm::Value * getKernelStructParam() const;
65
66    void setCircularBufferSize(const unsigned blocks);
67    void setBlocksPerSegment(const unsigned blocks);
68
69    void setInternalState(const unsigned index, llvm::Value * const value);
70    llvm::Value * getInternalState(const unsigned index);
71
72protected:
73
74    llvm::Value * getOffset(const unsigned offset);
75
76private:
77    llvm::Module *                      mMod;
78    IDISA::IDISA_Builder *              iBuilder;
79    std::string                                                 mKernelName;
80    llvm::Type *                        mBitBlockType;
81    std::vector<llvm::Type *>                   mStates;
82    std::vector<llvm::Type *>           mInputStreams;
83    std::vector<llvm::Type *>           mOutputStreams;
84    std::vector<llvm::Type *>           mInputScalars;
85    std::vector<llvm::Type *>           mOutputAccums;
86    std::vector<std::string>            mInputStreamNames;
87    std::vector<std::string>            mInputScalarNames;
88    llvm::Function*                                     mConstructor;
89    llvm::Function*                                             mInitFunction;
90    llvm::Function*                                             mFunction;
91    unsigned                            mBlockSize;
92    unsigned                            mBlocksPerSegment;
93    unsigned                            mCircularBufferModulo;
94    llvm::Type *                        mKernelStructType;
95    llvm::Type *                        mInputStreamType;
96    llvm::Type *                        mInputScalarType;
97    llvm::Value *                       mInputParam;
98    llvm::Value *                       mKernelStruct;
99    llvm::Value *                       mKernelParam;
100    unsigned                            mSegmentIndex;
101    unsigned                            mStartIndex;
102};
103
104inline unsigned KernelBuilder::getSegmentBlocks() const {
105    return mBlocksPerSegment;
106}
107
108inline llvm::Function * KernelBuilder::getDoBlockFunction() const {
109    return mFunction;
110}
111
112inline llvm::Type * KernelBuilder::getKernelStructType() const{
113    return mKernelStructType;
114}
115
116inline llvm::Value * KernelBuilder::getKernelStructParam() const {
117    return mKernelParam;
118}
119
120inline void KernelBuilder::setCircularBufferSize(const unsigned blocks) {
121    mCircularBufferModulo = blocks;
122}
123
124inline void KernelBuilder::setBlocksPerSegment(const unsigned blocks) {
125    mBlocksPerSegment = blocks;
126}
127
128inline void KernelBuilder::increment() {
129    ++mSegmentIndex;
130}
131
132#endif // KERNEL_H
Note: See TracBrowser for help on using the repository browser.