Ignore:
Timestamp:
Mar 15, 2016, 10:20:07 PM (3 years ago)
Author:
nmedfort
Message:

Added the kernel instance class; removed original mmap file access in favour of the boost mmap system. corrected PrintRegister? routine.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/kernels/kernel.h

    r4970 r4974  
    3232}
    3333
     34namespace kernel {
     35
     36class Instance;
     37
    3438class KernelBuilder {
     39    friend class Instance;
     40    friend llvm::Function * generateScanWordRoutine(llvm::Module *, IDISA::IDISA_Builder *, unsigned, KernelBuilder *, bool);
    3541    using NameMap = boost::container::flat_map<std::string, unsigned>;
    3642public:
     
    3945
    4046    unsigned addInternalState(llvm::Type * const type);
    41     unsigned addInternalState(llvm::Type * const type, std::string name);
     47    unsigned addInternalState(llvm::Type * const type, std::string && name);
    4248
    4349    void addInputStream(const unsigned fields);
    44     void addInputStream(const unsigned fields, std::string name);
     50    void addInputStream(const unsigned fields, std::string && name);
    4551
    4652    void addInputScalar(llvm::Type * const type);
    47     void addInputScalar(llvm::Type * const type, std::string name);
    48 
    49 
    50     void addOutputStream(const unsigned fields);
    51     void addOutputScalar(llvm::Type * const type);
     53    void addInputScalar(llvm::Type * const type, std::string && name);
     54
     55    unsigned addOutputStream(const unsigned fields);
     56    unsigned addOutputScalar(llvm::Type * const type);
    5257
    5358    llvm::Function * prepareFunction();
     
    5560    void increment();
    5661
    57     llvm::Value * getInputStream(const unsigned index, const unsigned streamOffset = 0);
    58 
    59     llvm::Value * getInputScalar(const unsigned index);
    60 
    61     llvm::Value * getInternalState(const std::string & name, llvm::Value * const inputStruct = nullptr);
    62 
    63     llvm::Value * getInternalState(const unsigned index, llvm::Value * const inputStruct = nullptr);
    64 
    65     llvm::Value * getOutputStream(const unsigned index, const unsigned streamOffset = 0);
    66 
    67     llvm::Value * getOutputScalar(const unsigned index);
     62    inline llvm::Value * getInputStream(const unsigned index, const unsigned streamOffset = 0) {
     63        return getInputStream(mInputParam, index, streamOffset);
     64    }
     65
     66    inline llvm::Value * getInputScalar(const unsigned index) {
     67        return getInputScalar(mInputParam, index);
     68    }
     69
     70    llvm::Value * getInternalState(const std::string & name) {
     71        return getInternalState(mKernelParam, name);
     72    }
     73
     74    void setInternalState(const std::string & name, llvm::Value * value) {
     75        setInternalState(mKernelParam, name, value);
     76    }
     77
     78    llvm::Value * getInternalState(const unsigned index) {
     79        return getInternalState(mKernelParam, index);
     80    }
     81
     82    void setInternalState(const unsigned index, llvm::Value * value) {
     83        setInternalState(mKernelParam, index, value);
     84    }
     85
     86    llvm::Value * getOutputStream(const unsigned index, const unsigned streamOffset = 0) {
     87        return getOutputStream(mKernelParam, index, streamOffset);
     88    }
     89    llvm::Value * getOutputStreamSet(const unsigned streamOffset = 0) {
     90        return getOutputStreamSet(mKernelParam, streamOffset);
     91    }
     92
     93    llvm::Value * getOutputScalar(const unsigned index) {
     94        return getOutputScalar(mKernelParam, index);
     95    }
     96
     97    llvm::Value * getBlockNo() {
     98        return getBlockNo(mKernelParam);
     99    }
     100
     101    llvm::Type * getInputStreamType() const;
    68102
    69103    void finalize();
    70104
    71     llvm::Value * generateKernelInstance();
    72         void generateInitCall();
    73     void generateDoBlockCall(llvm::Value * inputStreams);
     105    kernel::Instance * instantiate();
    74106
    75107    unsigned getSegmentBlocks() const;
     108
     109    llvm::Type * getKernelStateType() const;
     110
     111    llvm::Value * getKernelState() const;
     112
    76113    llvm::Function * getDoBlockFunction() const;
    77     llvm::Type * getKernelStructType() const;
    78     llvm::Value * getKernelStructParam() const;
    79114
    80115    void setLongestLookaheadAmount(const unsigned bits);
     116
    81117    void setBlocksPerSegment(const unsigned blocks);
    82118
    83     void setInternalState(const unsigned index, llvm::Value * const value);
    84 
    85     llvm::Value * getBlockIndexScalar();
    86 
    87119protected:
    88120
    89     llvm::Value * getOffset(const unsigned value);
     121    llvm::Value * getInputStream(llvm::Value * const instance, const unsigned index, const unsigned streamOffset);
     122
     123    llvm::Value * getInputScalar(llvm::Value * const instance, const unsigned index);
     124
     125    llvm::Value * getInternalState(llvm::Value * const instance, const std::string & name);
     126
     127    void setInternalState(llvm::Value * const instance, const std::string & name, llvm::Value * const value);
     128
     129    llvm::Value * getInternalState(llvm::Value * const instance, const unsigned index);
     130
     131    void setInternalState(llvm::Value * const instance, const unsigned index, llvm::Value * const value);
     132
     133    llvm::Value * getOutputStream(llvm::Value * const instance, const unsigned index, const unsigned streamOffset);
     134
     135    llvm::Value * getOutputStreamSet(llvm::Value * const instance, const unsigned streamOffset);
     136
     137    llvm::Value * getOutputScalar(llvm::Value * const instance, const unsigned index);
     138
     139    llvm::Value * getOffset(llvm::Value * const instance, const unsigned value);
     140
     141    llvm::Value * getBlockNo(llvm::Value * const instance);
     142
     143    void call(llvm::Value * const instance, llvm::Value * inputStreams);
    90144
    91145private:
     
    94148    std::string                                                 mKernelName;
    95149    llvm::Type *                        mBitBlockType;
    96     std::vector<llvm::Type *>                   mStates;
    97     std::vector<llvm::Type *>           mInputStreams;
    98     std::vector<llvm::Type *>           mOutputStreams;
    99     std::vector<llvm::Type *>           mInputScalars;
    100     std::vector<llvm::Type *>           mOutputScalar;
    101     std::vector<std::string>            mInputStreamNames;
    102     std::vector<std::string>            mInputScalarNames;
    103150    llvm::Function*                                     mConstructor;
    104     llvm::Function*                                             mInitFunction;
    105151    llvm::Function*                                             mFunction;
    106152    unsigned                            mBlockSize;
     
    111157    llvm::Type *                        mInputScalarType;
    112158    llvm::Value *                       mInputParam;
    113     llvm::Value *                       mKernelStruct;
    114159    llvm::Value *                       mKernelParam;
    115160    unsigned                            mSegmentIndex;
    116161    unsigned                            mBlockIndex;
    117 
    118 
    119     NameMap                             mStateNameMap;
    120 
     162    std::vector<llvm::Type *>           mInputStream;
     163    std::vector<std::string>            mInputStreamName;
     164    std::vector<llvm::Type *>           mInputScalar;
     165    std::vector<std::string>            mInputScalarName;
     166    std::vector<llvm::Type *>           mOutputStream;
     167    std::vector<llvm::Type *>           mOutputScalar;
     168    std::vector<llvm::Type *>                   mInternalState;
     169    NameMap                             mInternalStateNameMap;
    121170};
    122171
     
    129178}
    130179
    131 inline llvm::Type * KernelBuilder::getKernelStructType() const{
     180inline llvm::Type * KernelBuilder::getKernelStateType() const{
    132181    return mKernelStructType;
    133182}
    134183
    135 inline llvm::Value * KernelBuilder::getKernelStructParam() const {
     184inline llvm::Value * KernelBuilder::getKernelState() const {
    136185    return mKernelParam;
    137186}
     
    141190}
    142191
     192inline llvm::Type * KernelBuilder::getInputStreamType() const {
     193    return mInputStreamType;
     194}
     195
    143196inline void KernelBuilder::increment() {
    144197    ++mSegmentIndex;
    145198}
    146199
    147 inline llvm::Value * KernelBuilder::getBlockIndexScalar() {
    148     return getInternalState(mBlockIndex);
    149 }
     200inline llvm::Value * KernelBuilder::getBlockNo(llvm::Value * const instance) {
     201    return getInternalState(instance, mBlockIndex);
     202}
     203
     204} // end of namespace kernel
    150205
    151206#endif // KERNEL_H
Note: See TracChangeset for help on using the changeset viewer.