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

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

Multi-threading support for PabloAST / PabloCompiler?. Requires unique LLVM Context / Module for each thread.

File size: 3.5 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 = PabloAST::Allocator;
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    ~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() override;
113   
114    // The default method for Pablo final block processing sets the
115    // EOFmark bit and then calls the standard DoBlock function.
116    // This may be overridden for specialized processing.
117    virtual void generateFinalBlockMethod() override;
118
119    inline String * getName(const std::string & name) const {
120        return mSymbolTable->get(name, iBuilder);
121    }
122
123    inline String * makeName(const std::string & prefix) const {
124        return mSymbolTable->make(prefix, iBuilder);
125    }
126
127    inline Integer * getInteger(const int64_t value) const {
128        return mSymbolTable->getInteger(value, iBuilder);
129    }
130
131private:
132
133    Allocator                       mAllocator;
134    PabloCompiler * const           mPabloCompiler;
135    SymbolGenerator *               mSymbolTable;
136    PabloBlock *                    mEntryBlock;
137
138    std::vector<Var *>              mInputs;
139    std::vector<Var *>              mOutputs;
140    std::vector<PabloAST *>         mConstants;
141    std::vector<Var *>              mVariables;
142
143};
144
145}
146
147#endif // PABLO_KERNEL_H
Note: See TracBrowser for help on using the repository browser.