source: icGREP/icgrep-devel/icgrep/pablo/pablo_kernel.h @ 5292

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

Removed 'function' and 'self' parameters from generateXXXMethod() functions.

File size: 3.9 KB
RevLine 
[5057]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 PABLO_KERNEL_H
7#define PABLO_KERNEL_H
8
[5062]9#include <kernels/kernel.h>
[5283]10#include <pablo/pabloAST.h>
[5217]11#include <pablo/symbol_generator.h>
[5230]12#include <util/slab_allocator.h>
[5283]13#include <llvm/ADT/StringRef.h>
14
[5267]15namespace IDISA { class IDISA_Builder; }
16namespace llvm { class Type; }
17namespace pablo { class Integer; }
18namespace pablo { class Ones; }
19namespace pablo { class PabloBlock; }
20namespace pablo { class PabloCompiler; }
21namespace pablo { class String; }
22namespace pablo { class Var; }
23namespace pablo { class Zeroes; }
[5057]24
25namespace pablo {
26
[5283]27class PabloKernel : public kernel::BlockOrientedKernel, public PabloAST {
[5062]28
[5217]29    friend class PabloCompiler;
30    friend class PabloBlock;
31    friend class CarryManager;
32
[5057]33public:
[5217]34
[5240]35    using Allocator = SlabAllocator<PabloAST *>;
[5230]36
[5283]37    static inline bool classof(const PabloAST * e) {
38        return e->getClassTypeId()  == PabloAST::ClassTypeId::Kernel;
39    }
40    static inline bool classof(const PabloKernel *) {
41        return true;
42    }
43    static inline bool classof(const void *) {
44        return false;
45    }
46
[5267]47    PabloKernel(IDISA::IDISA_Builder * builder, std::string kernelName);
[5062]48   
[5246]49    virtual ~PabloKernel();
[5202]50
[5217]51    PabloBlock * getEntryBlock() {
52        return mEntryBlock;
53    }
54
55    const PabloBlock * getEntryBlock() const {
56        return mEntryBlock;
57    }
58
59    PabloBlock * setEntryBlock(PabloBlock * entryBlock) {
60        assert (entryBlock);
61        std::swap(mEntryBlock, entryBlock);
62        return entryBlock;
63    }
64
65    Var * getInput(const unsigned index) {
66        return mInputs[index];
67    }
68
69    const Var * getInput(const unsigned index) const {
70        return mInputs[index];
71    }
72
[5267]73    Var * addInput(const std::string & name, llvm::Type * const type);
[5217]74
75    unsigned getNumOfInputs() const {
76        return mInputs.size();
77    }
78
79    Var * getOutput(const unsigned index) {
80        return mOutputs[index];
81    }
82
83    const Var * getOutput(const unsigned index) const {
84        return mOutputs[index];
85    }
86
[5267]87    Var * addOutput(const std::string & name, llvm::Type * const type);
[5217]88
89    unsigned getNumOfOutputs() const {
90        return mOutputs.size();
91    }
92
[5283]93    Var * makeVariable(String * name, llvm::Type * const type);
[5217]94
95    Var * getVariable(const unsigned index) {
96        return mVariables[index];
97    }
98
99    unsigned getNumOfVariables() const {
100        return mVariables.size();
101    }
102
[5267]103    Zeroes * getNullValue(llvm::Type * const type);
[5217]104
[5267]105    Ones * getAllOnesValue(llvm::Type * const type);
[5217]106
107    inline SymbolGenerator * getSymbolTable() const {
108        return mSymbolTable;
109    }
110
[5074]111protected:
[5217]112
[5062]113    // A custom method for preparing kernel declarations is needed,
114    // so that the carry data requirements may be accommodated before
115    // finalizing the KernelStateType.
[5285]116    void prepareKernel()  override final;
[5057]117
[5292]118    void generateDoBlockMethod(llvm::Value * blockNo) override final;
[5285]119
[5057]120    // The default method for Pablo final block processing sets the
121    // EOFmark bit and then calls the standard DoBlock function.
122    // This may be overridden for specialized processing.
[5292]123    virtual void generateFinalBlockMethod(llvm::Value * remainingBytes, llvm::Value * blockNo) override final;
[5059]124
[5283]125    inline String * makeName(const llvm::StringRef & prefix) const {
126        return mSymbolTable->makeString(prefix, iBuilder);
[5217]127    }
128
129    inline Integer * getInteger(const int64_t value) const {
130        return mSymbolTable->getInteger(value, iBuilder);
131    }
132
133private:
134
[5230]135    Allocator                       mAllocator;
[5217]136    PabloCompiler * const           mPabloCompiler;
137    SymbolGenerator *               mSymbolTable;
138    PabloBlock *                    mEntryBlock;
[5230]139
[5217]140    std::vector<Var *>              mInputs;
141    std::vector<Var *>              mOutputs;
142    std::vector<PabloAST *>         mConstants;
143    std::vector<Var *>              mVariables;
144
[5057]145};
[5217]146
[5057]147}
[5217]148
[5057]149#endif // PABLO_KERNEL_H
Note: See TracBrowser for help on using the repository browser.