source: icGREP/icgrep-devel/icgrep/kernels/instance.h @ 5055

Last change on this file since 5055 was 5051, checked in by cameron, 3 years ago

s2p kernel with new infrastructure, includes s2p_FinalBlock

File size: 4.5 KB
Line 
1#ifndef INSTANCE_H
2#define INSTANCE_H
3
4#include <llvm/IR/Instructions.h>
5#include <kernels/kernel.h>
6#include <util/slab_allocator.h>
7#include <llvm/Support/raw_ostream.h>
8
9namespace kernel {
10
11class Instance {
12    friend class KernelBuilder;
13    using InputStreamMap = KernelBuilder::InputStreamMap;
14    using Allocator = SlabAllocator<Instance>;
15public:
16
17    llvm::Value * CreateDoBlockCall();
18
19    llvm::Value * getKernelState() {
20        return mKernelState;
21    }
22   
23    llvm::Value * getInternalState(const std::string & name) {
24        return mDefinition->getInternalStateInternal(mKernelState, name);
25    }
26   
27    void setInternalState(const std::string & name, llvm::Value * value) {
28        mDefinition->setInternalStateInternal(mKernelState, name, value);
29    }
30
31    llvm::Value * getInternalState(const unsigned index) {
32        return mDefinition->getInternalStateInternal(mKernelState, iBuilder->getInt32(index));
33    }
34
35    llvm::Value * getInternalState(llvm::Value * const index) {
36        return mDefinition->getInternalStateInternal(mKernelState, index);
37    }
38
39    void setInternalState(const unsigned index, llvm::Value * value) {
40        mDefinition->setInternalStateInternal(mKernelState, iBuilder->getInt32(index), value);
41    }
42
43    void setInternalState(llvm::Value * const index, llvm::Value * value) {
44        mDefinition->setInternalStateInternal(mKernelState, index, value);
45    }
46
47    inline llvm::Value * getInputStreamSet(const unsigned streamOffset = 0) {
48        return getStreamSet(mDefinition->getInputStreamType(), mInputStreamSet, streamOffset, mInputBufferSize);
49    }
50
51    llvm::Value * getInputStream(const unsigned index, const unsigned streamOffset = 0) {
52        return mDefinition->getInputStreamInternal(getInputStreamSet(streamOffset), iBuilder->getInt32(index));
53    }
54
55    llvm::Value * getInputStream(disable_implicit_conversion<llvm::Value *> index, const unsigned streamOffset = 0) {
56        return mDefinition->getInputStreamInternal(getInputStreamSet(streamOffset), index);
57    }
58
59    llvm::Type * getInputStreamType() const {
60        return mDefinition->getInputStreamType();
61    }
62
63
64    inline llvm::Value * getOutputStreamSet(const unsigned streamOffset = 0) {
65        // do not pass the result of this into an instantiate method; instead call getOutputStreamBuffer.
66        return getStreamSet(mDefinition->getOutputStreamType(), mOutputStreamSet, streamOffset, mOutputBufferSize);
67    }
68
69    llvm::Value * getOutputStream(const unsigned index, const unsigned streamOffset = 0) {
70        return mDefinition->getOutputStreamInternal(getOutputStreamSet(streamOffset), iBuilder->getInt32(index));
71    }
72
73    llvm::Value * getOutputStream(disable_implicit_conversion<llvm::Value *> index, const unsigned streamOffset = 0) {
74        return mDefinition->getOutputStreamInternal(getOutputStreamSet(streamOffset), index);
75    }
76
77    void clearOutputStreamSet();
78
79    llvm::Value * getBlockNo() {
80        return mDefinition->getBlockNoInternal(mKernelState);
81    }
82
83    inline std::pair<llvm::Value *, unsigned> getOutputStreamBuffer() const {
84        return std::make_pair(mOutputStreamSet, mOutputBufferSize);
85    }
86
87    void* operator new (std::size_t size) noexcept {
88        return mAllocator.allocate(size);
89    }
90
91    void operator delete (void * ptr) {
92        mAllocator.deallocate(static_cast<Allocator::value_type *>(ptr));
93    }
94
95protected:
96
97    Instance(KernelBuilder * const definition, llvm::Value * const kernelState,
98             llvm::Value * const inputStreamSet, const unsigned inputBufferSize,
99             llvm::Value * const outputStreamSet, const unsigned outputBufferSize)
100    : mDefinition(definition)
101    , iBuilder(definition->iBuilder)
102    , mKernelState(kernelState)
103    , mInputStreamSet(inputStreamSet)
104    , mInputBufferSize(inputBufferSize)
105    , mOutputStreamSet(outputStreamSet)
106    , mOutputBufferSize(outputBufferSize) {
107
108    }
109
110    llvm::Value * getStreamSet(Type * const type, llvm::Value * const base, const unsigned index, const unsigned bufferSize);
111
112private:
113    KernelBuilder * const                           mDefinition;
114    IDISA::IDISA_Builder * const                    iBuilder;
115    llvm::Value * const                             mKernelState;
116    llvm::Value * const                             mInputStreamSet;
117    const unsigned                                  mInputBufferSize;
118    llvm::Value * const                             mOutputStreamSet;
119    const unsigned                                  mOutputBufferSize;
120    static Allocator                                mAllocator;
121};
122
123}
124
125#endif // INSTANCE_H
Note: See TracBrowser for help on using the repository browser.