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

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

Code clean up to enforce proper calling order of KernelBuilder? methods

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