source: icGREP/icgrep-devel/icgrep/pablo/pablo_kernel.cpp @ 5298

Last change on this file since 5298 was 5298, checked in by nmedfort, 2 years ago

Removed StreamType? in favour of 0-length VectorType?.

File size: 3.9 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#include "pablo_kernel.h"
7#include <pablo/codegenstate.h>
8#include <pablo/pablo_compiler.h>
9#include <pablo/pe_var.h>
10#include <pablo/pe_zeroes.h>
11#include <pablo/pe_ones.h>
12//#include <llvm/IR/Module.h>
13//#include <llvm/IR/Verifier.h>
14//#include <IR_Gen/idisa_builder.h>
15
16using namespace pablo;
17using namespace kernel;
18using namespace parabix;
19using namespace IDISA;
20using namespace llvm;
21
22inline bool isStreamType(const Type * ty) {
23    if (ty->isArrayTy()) {
24        ty = ty->getArrayElementType();
25    }
26    if (ty->isVectorTy()) {
27        return (ty->getVectorNumElements() == 0);
28    }
29    return false;
30}
31
32Var * PabloKernel::addInput(const std::string & name, Type * const type) {
33    Var * param = new (mAllocator) Var(mSymbolTable->makeString(name, iBuilder), type, mAllocator, Var::ReadOnly);
34    param->addUser(this);
35    mInputs.push_back(param);
36    mVariables.push_back(param);
37    if (isStreamType(type)) {
38        mStreamSetInputs.emplace_back(type, name);
39    } else {
40        mScalarInputs.emplace_back(type, name);
41    }
42    assert (mStreamSetInputs.size() + mScalarInputs.size() == mInputs.size());
43    return param;
44}
45
46Var * PabloKernel::addOutput(const std::string & name, Type * const type) {
47    Var * result = new (mAllocator) Var(mSymbolTable->makeString(name, iBuilder), type, mAllocator, Var::ReadNone);
48    result->addUser(this);
49    mOutputs.push_back(result);
50    mVariables.push_back(result);
51    if (isStreamType(type)) {
52        mStreamSetOutputs.emplace_back(type, name);
53    } else {
54        mScalarOutputs.emplace_back(type, name);
55    }
56    assert (mStreamSetOutputs.size() + mScalarOutputs.size() == mOutputs.size());
57    return result;
58}
59
60Var * PabloKernel::makeVariable(String * name, Type * const type) {
61    Var * const var = new (mAllocator) Var(name, type, mAllocator);
62    mVariables.push_back(var);
63    return var;
64}
65
66Zeroes * PabloKernel::getNullValue(Type * type) {
67    if (type == nullptr) {
68        type = getStreamTy();
69    }
70    for (PabloAST * constant : mConstants) {
71        if (isa<Zeroes>(constant) && constant->getType() == type) {
72            return cast<Zeroes>(constant);
73        }
74    }
75    Zeroes * value = new (mAllocator) Zeroes(type, mAllocator);
76    mConstants.push_back(value);
77    return value;
78}
79
80Ones * PabloKernel::getAllOnesValue(Type * type) {
81    if (type == nullptr) {
82        type = getStreamTy();
83    }
84    for (PabloAST * constant : mConstants) {
85        if (isa<Ones>(constant) && constant->getType() == type) {
86            return cast<Ones>(constant);
87        }
88    }
89    Ones * value = new (mAllocator) Ones(type, mAllocator);
90    mConstants.push_back(value);
91    return value;
92}
93
94void PabloKernel::prepareKernel() {
95    mPabloCompiler->initializeKernelData();
96    BlockOrientedKernel::prepareKernel();
97}
98
99void PabloKernel::generateDoBlockMethod() {
100    mPabloCompiler->compile();
101}
102
103void PabloKernel::generateFinalBlockMethod(Value * remainingBytes) {
104    // Standard Pablo convention for final block processing: set a bit marking
105    // the position just past EOF, as well as a mask marking all positions past EOF.
106    setScalarField("EOFbit", iBuilder->bitblock_set_bit(remainingBytes));
107    setScalarField("EOFmask", iBuilder->bitblock_mask_from(remainingBytes));
108    CreateDoBlockMethodCall();
109}
110
111PabloKernel::PabloKernel(IDISA::IDISA_Builder * builder, std::string kernelName)
112: BlockOrientedKernel(builder, std::move(kernelName), {}, {}, {}, {}, {Binding{builder->getBitBlockType(), "EOFbit"}, Binding{builder->getBitBlockType(), "EOFmask"}})
113, PabloAST(PabloAST::ClassTypeId::Kernel, nullptr, mAllocator)
114, mPabloCompiler(new PabloCompiler(this))
115, mSymbolTable(new SymbolGenerator(mAllocator))
116, mEntryBlock(PabloBlock::Create(this)) {
117    setDoBlockUpdatesProducedItemCountsAttribute(false);
118}
119
120PabloKernel::~PabloKernel() {
121    delete mPabloCompiler;
122    delete mSymbolTable; 
123}
124
Note: See TracBrowser for help on using the repository browser.