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

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

First attempt at dynamic segment size intergration.

File size: 2.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
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    void setInternalState(const unsigned index, llvm::Value * value) {
32        mDefinition->setInternalState(mMemory, index, value);
33    }
34
35    llvm::Value * getInputStream(const unsigned index, const unsigned streamOffset = 0) {
36        return mDefinition->getInputStream(mMemory, index, streamOffset);
37    }
38
39    llvm::Type * getInputStreamType() const {
40        return mDefinition->getInputStreamType();
41    }
42
43    llvm::Value * getInputScalar(const unsigned index) {
44        return mDefinition->getInputScalar(mMemory, index);
45    }
46
47    llvm::Value * getOutputStream(const unsigned index, const unsigned streamOffset = 0) {
48        return mDefinition->getOutputStream(mMemory, index, streamOffset);
49    }
50
51    void clearOutputStream(const unsigned streamOffset = 0) {
52        mDefinition->clearOutputStream(mMemory, streamOffset);
53    }
54
55    inline std::pair<llvm::Value *, unsigned> getOutputStreamSet() const {
56        return std::make_pair(mMemory, mDefinition->getBufferSize());
57    }
58
59    llvm::Value * getOutputScalar(const unsigned index) {
60        return mDefinition->getOutputScalar(mMemory, index);
61    }
62
63    llvm::Value * getBlockNo() {
64        return mDefinition->getBlockNo(mMemory);
65    }
66
67    unsigned getBufferSize() const {
68        return mDefinition->getBufferSize();
69    }
70
71    void* operator new (std::size_t size) noexcept {
72        return mAllocator.allocate(size);
73    }
74
75    void operator delete (void * ptr) {
76        mAllocator.deallocate(static_cast<Allocator::value_type *>(ptr));
77    }
78
79protected:
80
81    Instance(KernelBuilder * definition, llvm::AllocaInst * space)
82    : mDefinition(definition)
83    , mMemory(space) {
84
85    }
86
87private:
88    KernelBuilder * const mDefinition;
89    llvm::AllocaInst * const mMemory;
90    static Allocator mAllocator;
91};
92
93}
94
95#endif // INSTANCE_H
Note: See TracBrowser for help on using the repository browser.