source: icGREP/icgrep-devel/icgrep/pablo/function.cpp @ 5160

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

Initial work for incorporating Types into Pablo AST.

File size: 2.4 KB
Line 
1#include "function.h"
2#include <pablo/codegenstate.h>
3#include <cstring>
4
5namespace pablo {
6
7Prototype::Prototype(const PabloAST::ClassTypeId type, std::string && name, const unsigned numOfParameters, const unsigned numOfResults, void * functionPtr)
8: PabloAST(type, nullptr)
9, mName(GlobalSymbolGenerator.get(name, false))
10, mNumOfParameters(numOfParameters)
11, mNumOfResults(numOfResults)
12, mFunctionPtr(functionPtr) {
13
14}
15
16PabloFunction::PabloFunction(std::string && name, const unsigned numOfParameters, const unsigned numOfResults)
17: Prototype(ClassTypeId::Function, std::move(name), numOfParameters, numOfResults, nullptr)
18, mSymbolTable(new SymbolGenerator())
19, mBitStreamType(getPabloType(PabloType::Stream, 1))
20, mEntryBlock(PabloBlock::Create(*this))
21, mParameters(numOfParameters, nullptr)
22, mResults(numOfResults, nullptr)
23, mConstants(0, nullptr) {
24
25}
26
27Zeroes * PabloFunction::getNullValue(const PabloType * type) {
28    if (type == nullptr) {
29        type = mBitStreamType;
30    }
31    for (PabloAST * constant : mConstants) {
32        if (isa<Zeroes>(constant) && constant->getType() == type) {
33            return cast<Zeroes>(constant);
34        }
35    }
36    Zeroes * value = new Zeroes(type);
37    mConstants.push_back(value);
38    return value;
39}
40
41Ones * PabloFunction::getAllOnesValue(const PabloType * type) {
42    if (type == nullptr) {
43        type = mBitStreamType;
44    }
45    for (PabloAST * constant : mConstants) {
46        if (isa<Ones>(constant) && constant->getType() == type) {
47            return cast<Ones>(constant);
48        }
49    }
50    Ones * value = new Ones(type);
51    mConstants.push_back(value);
52    return value;
53}
54
55void PabloFunction::throwInvalidParameterIndex(const unsigned index) const {
56    throw std::runtime_error(
57                "Invalid parameter index " +
58                std::to_string(index) + " of " + std::to_string(getNumOfParameters()) +
59                " in function " + getName()->to_string());
60}
61
62void PabloFunction::throwInvalidResultIndex(const unsigned index) const {
63    throw std::runtime_error(
64                "Invalid result index " +
65                std::to_string(index) + " of " + std::to_string(getNumOfResults()) +
66                " in function " + getName()->to_string());
67}
68
69void PabloFunction::operator delete(void * ptr) {
70    PabloFunction * f = static_cast<PabloFunction *>(ptr);
71    delete f->mSymbolTable;
72    f->mSymbolTable = nullptr;
73}
74
75}
Note: See TracBrowser for help on using the repository browser.