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

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

UnicodeSet? bug fix and compile warning clean-up.

File size: 5.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 * getInternalState(const std::string & name) {
20        return mDefinition->getInternalStateInternal(mKernelState, name);
21    }
22
23    void setInternalState(const std::string & name, llvm::Value * value) {
24        mDefinition->setInternalStateInternal(mKernelState, name, value);
25    }
26
27    llvm::Value * getInternalState(const unsigned index) {
28        return mDefinition->getInternalStateInternal(mKernelState, iBuilder->getInt32(index));
29    }
30
31    llvm::Value * getInternalState(llvm::Value * const index) {
32        return mDefinition->getInternalStateInternal(mKernelState, index);
33    }
34
35    void setInternalState(const unsigned index, llvm::Value * value) {
36        mDefinition->setInternalStateInternal(mKernelState, iBuilder->getInt32(index), value);
37    }
38
39    void setInternalState(llvm::Value * const index, llvm::Value * value) {
40        mDefinition->setInternalStateInternal(mKernelState, index, value);
41    }
42
43    inline llvm::Value * getInputStreamSet(const unsigned streamOffset = 0) {
44        return getStreamSet(mDefinition->getInputStreamType(), mInputStreamSet, streamOffset, mInputBufferSize);
45    }
46
47    llvm::Value * getInputStream(const unsigned index, const unsigned streamOffset = 0) {
48        return mDefinition->getInputStreamInternal(getInputStreamSet(streamOffset), iBuilder->getInt32(index));
49    }
50
51    llvm::Value * getInputStream(disable_implicit_conversion<llvm::Value *> index, const unsigned streamOffset = 0) {
52        return mDefinition->getInputStreamInternal(getInputStreamSet(streamOffset), index);
53    }
54
55    llvm::Type * getInputStreamType() const {
56        return mDefinition->getInputStreamType();
57    }
58
59    llvm::Value * getInputScalar(const unsigned index) {
60        return mDefinition->getInputScalarInternal(mInputScalarSet, iBuilder->getInt32(index));
61    }
62
63    llvm::Value * getInputScalar(disable_implicit_conversion<llvm::Value *> index) {
64        return mDefinition->getInputScalarInternal(mInputScalarSet, index);
65    }
66
67    llvm::Type * getInputScalarType() const {
68        return mDefinition->getInputScalarType();
69    }
70
71
72    inline llvm::Value * getOutputStreamSet(const unsigned streamOffset = 0) {
73        // do not pass the result of this into an instantiate method; instead call getOutputStreamBuffer.
74        return getStreamSet(mDefinition->getOutputStreamType(), mOutputStreamSet, streamOffset, mOutputBufferSize);
75    }
76
77    llvm::Value * getOutputStream(const unsigned index, const unsigned streamOffset = 0) {
78        return mDefinition->getOutputStreamInternal(getOutputStreamSet(streamOffset), iBuilder->getInt32(index));
79    }
80
81    llvm::Value * getOutputStream(disable_implicit_conversion<llvm::Value *> index, const unsigned streamOffset = 0) {
82        return mDefinition->getOutputStreamInternal(getOutputStreamSet(streamOffset), index);
83    }
84
85    void clearOutputStreamSet();
86
87    llvm::Value * getOutputScalar(const unsigned index) {
88        return mDefinition->getOutputScalarInternal(mOutputScalarSet, iBuilder->getInt32(index));
89    }
90
91    llvm::Value * getOutputScalar(disable_implicit_conversion<llvm::Value *> index) {
92        return mDefinition->getOutputScalarInternal(mOutputScalarSet, index);
93    }
94
95    llvm::Value * getBlockNo() {
96        return mDefinition->getBlockNoInternal(mKernelState);
97    }
98
99    inline std::pair<llvm::Value *, unsigned> getOutputStreamBuffer() const {
100        return std::make_pair(mOutputStreamSet, mOutputBufferSize);
101    }
102
103    void* operator new (std::size_t size) noexcept {
104        return mAllocator.allocate(size);
105    }
106
107    void operator delete (void * ptr) {
108        mAllocator.deallocate(static_cast<Allocator::value_type *>(ptr));
109    }
110
111protected:
112
113    Instance(KernelBuilder * const definition, llvm::Value * const kernelState,
114             llvm::Value * const inputScalarSet, llvm::Value * const inputStreamSet, const unsigned inputBufferSize,
115             llvm::Value * const outputScalarSet, llvm::Value * const outputStreamSet, const unsigned outputBufferSize)
116    : mDefinition(definition)
117    , iBuilder(definition->iBuilder)
118    , mKernelState(kernelState)
119    , mInputScalarSet(inputScalarSet)
120    , mInputStreamSet(inputStreamSet)
121    , mInputBufferSize(inputBufferSize)
122    , mOutputScalarSet(outputScalarSet)
123    , mOutputStreamSet(outputStreamSet)
124    , mOutputBufferSize(outputBufferSize) {
125
126    }
127
128    llvm::Value * getStreamSet(Type * const type, llvm::Value * const base, const unsigned index, const unsigned bufferSize);
129
130private:
131    KernelBuilder * const                           mDefinition;
132    IDISA::IDISA_Builder * const                    iBuilder;
133    llvm::Value * const                             mKernelState;
134    llvm::Value * const                             mInputScalarSet;
135    llvm::Value * const                             mInputStreamSet;
136    const unsigned                                  mInputBufferSize;
137    llvm::Value * const                             mOutputScalarSet;
138    llvm::Value * const                             mOutputStreamSet;
139    const unsigned                                  mOutputBufferSize;
140    static Allocator                                mAllocator;
141};
142
143}
144
145#endif // INSTANCE_H
Note: See TracBrowser for help on using the repository browser.