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

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

Redesigned buffer system to allow the pipeline to control selection of the current input and output streams; DoBlock? functions containing lookahead now take multiple input stream arguments. Selection and passing occurs automatically. Some work on Symbol Table.

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