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

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

Continued work on symbol table.

File size: 3.4 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
8namespace kernel {
9
10class Instance {
11    friend class KernelBuilder;
12    using Allocator = SlabAllocator<Instance>;
13public:
14
15    void CreateDoBlockCall() {
16        mDefinition->CreateDoBlockCall(mMemory);
17    }
18
19    llvm::Value * getInternalState(const std::string & name) {
20        return mDefinition->getInternalState(mMemory, name);
21    }
22
23    void setInternalState(const std::string & name, llvm::Value * value) {
24        mDefinition->setInternalState(mMemory, name, value);
25    }
26
27    llvm::Value * getInternalState(const unsigned index) {
28        return mDefinition->getInternalState(mMemory, index);
29    }
30
31    llvm::Value * getInternalState(llvm::Value * const index) {
32        return mDefinition->getInternalState(mMemory, index);
33    }
34
35    void setInternalState(const unsigned index, llvm::Value * value) {
36        mDefinition->setInternalState(mMemory, index, value);
37    }
38
39    void setInternalState(llvm::Value * const index, llvm::Value * value) {
40        mDefinition->setInternalState(mMemory, index, value);
41    }
42
43    llvm::Value * getInputStream(const unsigned index, const unsigned streamOffset = 0) {
44        return mDefinition->getInputStream(mMemory, index, streamOffset);
45    }
46
47    llvm::Value * getInputStream(llvm::Value * const index, const unsigned streamOffset = 0) {
48        return mDefinition->getInputStream(mMemory, index, streamOffset);
49    }
50
51    llvm::Type * getInputStreamType() const {
52        return mDefinition->getInputStreamType();
53    }
54
55    llvm::Value * getInputScalar(const unsigned index) {
56        return mDefinition->getInputScalar(mMemory, index);
57    }
58
59    llvm::Value * getInputScalar(llvm::Value * const index) {
60        return mDefinition->getInputScalar(mMemory, index);
61    }
62
63    llvm::Value * getOutputStream(const unsigned index, const unsigned streamOffset = 0) {
64        return mDefinition->getOutputStream(mMemory, index, streamOffset);
65    }
66
67    llvm::Value * getOutputStream(llvm::Value * const index, const unsigned streamOffset = 0) {
68        return mDefinition->getOutputStream(mMemory, index, streamOffset);
69    }
70
71    void clearOutputStreamSet(const unsigned streamOffset = 0) {
72        mDefinition->clearOutputStreamSet(mMemory, streamOffset);
73    }
74
75    inline std::pair<llvm::Value *, unsigned> getOutputStreamSet() const {
76        return std::make_pair(mMemory, mDefinition->getBufferSize());
77    }
78
79    llvm::Value * getOutputScalar(const unsigned index) {
80        return mDefinition->getOutputScalar(mMemory, index);
81    }
82
83    llvm::Value * getOutputScalar(llvm::Value * const index) {
84        return mDefinition->getOutputScalar(mMemory, index);
85    }
86
87    llvm::Value * getBlockNo() {
88        return mDefinition->getBlockNo(mMemory);
89    }
90
91    unsigned getBufferSize() const {
92        return mDefinition->getBufferSize();
93    }
94
95    void* operator new (std::size_t size) noexcept {
96        return mAllocator.allocate(size);
97    }
98
99    void operator delete (void * ptr) {
100        mAllocator.deallocate(static_cast<Allocator::value_type *>(ptr));
101    }
102
103protected:
104
105    Instance(KernelBuilder * definition, llvm::AllocaInst * space)
106    : mDefinition(definition)
107    , mMemory(space) {
108
109    }
110
111private:
112    KernelBuilder * const mDefinition;
113    llvm::AllocaInst * const mMemory;
114    static Allocator mAllocator;
115};
116
117}
118
119#endif // INSTANCE_H
Note: See TracBrowser for help on using the repository browser.