source: icGREP/icgrep-devel/icgrep/kernels/streamset.h @ 5175

Last change on this file since 5175 was 5175, checked in by cameron, 2 years ago

Some tidy ups and changes to prepare for LLVM 3.9

File size: 6.0 KB
Line 
1/*
2 *  Copyright (c) 2016 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 */
5
6#ifndef STREAMSET_H
7#define STREAMSET_H
8
9#include <string>
10#include <vector>
11#include <IDISA/idisa_builder.h>
12#include <llvm/IR/Type.h>
13   
14namespace parabix {
15   
16enum FieldType {i1 = 1, i2 = 2, i4 = 4, i8 = 8, i16 = 16, i32 = 32, i64 = 64, i128 = 128, i256 = 256};
17
18class StreamSetType {
19public:
20    StreamSetType(int count, int width) : mStreamCount(count), mFieldWidth(width) {}
21    int StreamCount() { return mStreamCount;}
22    int StreamFieldWidth() { return mFieldWidth;}
23    bool operator== (StreamSetType& other) {return (mStreamCount == other.mStreamCount) && (mFieldWidth == other.mFieldWidth);}
24   
25    llvm::Type * getStreamSetBlockType(IDISA::IDISA_Builder * iBuilder);
26   
27private:
28    int mStreamCount;
29    int mFieldWidth;
30};
31
32class StreamSetBuffer {
33public:
34    enum class BufferKind : unsigned {BlockBuffer, ExternalFileBuffer, CircularBuffer, ExpandingBuffer};
35    inline BufferKind getBufferKind() const {return mBufferKind;}
36    inline StreamSetType& getBufferStreamSetType() {return mStreamSetType;}
37
38    virtual llvm::PointerType * getStreamBufferPointerType();
39
40    virtual size_t getBufferSize() = 0;
41   
42    virtual llvm::Value * allocateBuffer() = 0;
43   
44    llvm::Value * getStreamSetBasePtr() {return mStreamSetBufferPtr;}
45   
46    // Get the buffer pointer for a given block of the stream.
47    virtual llvm::Value * getStreamSetBlockPointer(llvm::Value * bufferBasePtr, llvm::Value * blockNo) = 0;
48   
49    virtual llvm::Value * getProducerPosPtr(Value * ptr);
50
51    virtual void setProducerPos(Value * ptr, Value * pos);
52
53    virtual llvm::Value * getConsumerPosPtr(Value * ptr);
54
55    virtual void setConsumerPos(Value * ptr, Value * pos);
56
57    virtual llvm::Value * hasEndOfInputPtr(Value * ptr);
58
59    virtual void setEndOfInput(Value * ptr);
60
61    virtual llvm::PointerType * getStreamSetStructPointerType();
62
63    virtual llvm::Value * getStreamSetStructPtr();
64   
65protected:
66    StreamSetBuffer(BufferKind k, IDISA::IDISA_Builder * b, StreamSetType ss_type) :
67        mBufferKind(k), iBuilder(b), mStreamSetType(ss_type), mBufferBlocks(1), mAddrSpace(0), mStreamSetBufferPtr(nullptr) {
68    }
69    const BufferKind       mBufferKind;
70    IDISA::IDISA_Builder * iBuilder;
71    StreamSetType mStreamSetType;
72    size_t mBufferBlocks;
73    int mAddrSpace;
74    llvm::Value * mStreamSetBufferPtr;
75    llvm::Value * mStreamSetStructPtr;
76    llvm::Type * mStreamSetStructType;
77
78};   
79   
80
81class SingleBlockBuffer : public StreamSetBuffer {
82public:
83    static inline bool classof(const StreamSetBuffer * b) {return b->getBufferKind() == BufferKind::BlockBuffer;}
84   
85    SingleBlockBuffer(IDISA::IDISA_Builder * b, StreamSetType ss_type) :
86    StreamSetBuffer(BufferKind::BlockBuffer, b, ss_type) {
87        mStreamSetStructType = StructType::get(iBuilder->getContext(), 
88                                               std::vector<Type *>({iBuilder->getSizeTy(), 
89                                                                    iBuilder->getSizeTy(), 
90                                                                    iBuilder->getInt8Ty(), 
91                                                                    getStreamBufferPointerType()}));
92
93    }
94   
95    size_t getBufferSize() override;
96    llvm::Value * allocateBuffer() override;
97    llvm::Value * getStreamSetBlockPointer(llvm::Value * bufferBasePtr, llvm::Value * blockNo) override;
98};
99   
100class ExternalFileBuffer : public StreamSetBuffer {
101public:
102    static inline bool classof(const StreamSetBuffer * b) {return b->getBufferKind() == BufferKind::ExternalFileBuffer;}
103   
104    ExternalFileBuffer(IDISA::IDISA_Builder * b, StreamSetType ss_type, unsigned AddressSpace = 0) :
105        StreamSetBuffer(BufferKind::ExternalFileBuffer, b, ss_type) {
106            mBufferBlocks = 0;
107            mAddrSpace = AddressSpace;
108            mStreamSetStructType = StructType::get(iBuilder->getContext(), 
109                                                   std::vector<Type *>({iBuilder->getSizeTy(), 
110                                                                        iBuilder->getSizeTy(), 
111                                                                        iBuilder->getInt8Ty(), 
112                                                                        getStreamBufferPointerType()}));
113        }
114    llvm::PointerType * getStreamBufferPointerType() override;
115
116    void setStreamSetBuffer(llvm::Value * ptr, llvm::Value * fileSize);
117   
118    size_t getBufferSize() override;
119    // Can't allocate - raise an error. */
120    llvm::Value * allocateBuffer() override;
121    llvm::Value * getStreamSetBlockPointer(llvm::Value * bufferBasePtr, llvm::Value * blockNo) override;
122
123private:
124    unsigned mAddrSpace;
125};
126
127class CircularBuffer : public StreamSetBuffer {
128public:
129    static inline bool classof(const StreamSetBuffer * b) {return b->getBufferKind() == BufferKind::CircularBuffer;}
130 
131    CircularBuffer(IDISA::IDISA_Builder * b, StreamSetType ss_type, size_t bufferBlocks) :
132        StreamSetBuffer(BufferKind::CircularBuffer, b, ss_type) {
133            mBufferBlocks = bufferBlocks;
134            if (((bufferBlocks - 1) & bufferBlocks) != 0) {
135                throw std::runtime_error("CircularStreamSetBuffer: number of blocks must be a power of 2!");
136            }
137            mStreamSetStructType = StructType::get(iBuilder->getContext(), 
138                                                   std::vector<Type *>({iBuilder->getSizeTy(), 
139                                                                        iBuilder->getSizeTy(), 
140                                                                        iBuilder->getInt8Ty(), 
141                                                                        getStreamBufferPointerType()}));
142 
143        }
144
145    size_t getBufferSize() override;
146    llvm::Value * allocateBuffer() override;
147    llvm::Value * getStreamSetBlockPointer(llvm::Value * bufferBasePtr, llvm::Value * blockNo) override;
148};
149
150}
151#endif // STREAMSET_H
Note: See TracBrowser for help on using the repository browser.