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

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

Added ability to name internal state types; removed unnecessary predefined states. Some progress towards supporting segment size > 1

File size: 4.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
34class KernelBuilder {
35    using NameMap = boost::container::flat_map<std::string, unsigned>;
36public:
37    // sets name & sets internal state to the kernel superclass state
38    KernelBuilder(std::string name, llvm::Module * m, IDISA::IDISA_Builder * b);
39
40    unsigned addInternalState(llvm::Type * const type);
41    unsigned addInternalState(llvm::Type * const type, std::string name);
42
43    void addInputStream(const unsigned fields);
44    void addInputStream(const unsigned fields, std::string name);
45
46    void addInputScalar(llvm::Type * const type);
47    void addInputScalar(llvm::Type * const type, std::string name);
48
49
50    void addOutputStream(const unsigned fields);
51    void addOutputScalar(llvm::Type * const type);
52
53    llvm::Function * prepareFunction();
54
55    void increment();
56
57    llvm::Value * getInputStream(const unsigned index, const unsigned streamOffset = 0);
58
59    llvm::Value * getInputScalar(const unsigned index);
60
61    llvm::Value * getInternalState(const std::string & name, llvm::Value * const inputStruct = nullptr);
62
63    llvm::Value * getInternalState(const unsigned index, llvm::Value * const inputStruct = nullptr);
64
65    llvm::Value * getOutputStream(const unsigned index, const unsigned streamOffset = 0);
66
67    llvm::Value * getOutputScalar(const unsigned index);
68
69    void finalize();
70
71    llvm::Value * generateKernelInstance();
72        void generateInitCall();
73    void generateDoBlockCall(llvm::Value * inputStreams);
74
75    unsigned getSegmentBlocks() const;
76    llvm::Function * getDoBlockFunction() const;
77    llvm::Type * getKernelStructType() const;
78    llvm::Value * getKernelStructParam() const;
79
80    void setLongestLookaheadAmount(const unsigned bits);
81    void setBlocksPerSegment(const unsigned blocks);
82
83    void setInternalState(const unsigned index, llvm::Value * const value);
84
85    llvm::Value * getBlockIndexScalar();
86
87protected:
88
89    llvm::Value * getOffset(const unsigned value);
90
91private:
92    llvm::Module *                      mMod;
93    IDISA::IDISA_Builder *              iBuilder;
94    std::string                                                 mKernelName;
95    llvm::Type *                        mBitBlockType;
96    std::vector<llvm::Type *>                   mStates;
97    std::vector<llvm::Type *>           mInputStreams;
98    std::vector<llvm::Type *>           mOutputStreams;
99    std::vector<llvm::Type *>           mInputScalars;
100    std::vector<llvm::Type *>           mOutputScalar;
101    std::vector<std::string>            mInputStreamNames;
102    std::vector<std::string>            mInputScalarNames;
103    llvm::Function*                                     mConstructor;
104    llvm::Function*                                             mInitFunction;
105    llvm::Function*                                             mFunction;
106    unsigned                            mBlockSize;
107    unsigned                            mBlocksPerSegment;
108    unsigned                            mCircularBufferModulo;
109    llvm::Type *                        mKernelStructType;
110    llvm::Type *                        mInputStreamType;
111    llvm::Type *                        mInputScalarType;
112    llvm::Value *                       mInputParam;
113    llvm::Value *                       mKernelStruct;
114    llvm::Value *                       mKernelParam;
115    unsigned                            mSegmentIndex;
116    unsigned                            mBlockIndex;
117
118
119    NameMap                             mStateNameMap;
120
121};
122
123inline unsigned KernelBuilder::getSegmentBlocks() const {
124    return mBlocksPerSegment;
125}
126
127inline llvm::Function * KernelBuilder::getDoBlockFunction() const {
128    return mFunction;
129}
130
131inline llvm::Type * KernelBuilder::getKernelStructType() const{
132    return mKernelStructType;
133}
134
135inline llvm::Value * KernelBuilder::getKernelStructParam() const {
136    return mKernelParam;
137}
138
139inline void KernelBuilder::setBlocksPerSegment(const unsigned blocks) {
140    mBlocksPerSegment = blocks;
141}
142
143inline void KernelBuilder::increment() {
144    ++mSegmentIndex;
145}
146
147inline llvm::Value * KernelBuilder::getBlockIndexScalar() {
148    return getInternalState(mBlockIndex);
149}
150
151#endif // KERNEL_H
Note: See TracBrowser for help on using the repository browser.