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

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

Initial work on adding types to PabloAST and mutable Var objects.

File size: 2.7 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)
8: PabloAST(type, nullptr, nullptr)
9, mName(GlobalSymbolGenerator.get(name))
10, mNumOfParameters(numOfParameters)
11, mNumOfResults(numOfResults) {
12
13}
14
15PabloFunction::PabloFunction(std::string && name)
16: Prototype(ClassTypeId::Function, std::move(name), 0, 0)
17, mSymbolTable(new SymbolGenerator())
18, mEntryBlock(PabloBlock::Create(*this))
19, mConstants(0, nullptr) {
20
21}
22
23Var * PabloFunction::addParameter(const std::string name, Type * const type) {
24    Var * param = new Var(mSymbolTable->make(name), type);
25    mParameters.push_back(param);
26    mNumOfParameters = mParameters.size();
27    return param;
28}
29
30Var * PabloFunction::addResult(const std::string name, Type * const type) {
31    Var * result = new Var(mSymbolTable->make(name), type);
32    mResults.push_back(result);
33    mNumOfResults = mResults.size();
34    return result;
35}
36
37Var * PabloFunction::makeVariable(PabloAST * name, Type * const type) {
38    Var * const var = new Var(name, type);
39    mVariables.push_back(var);
40    return var;
41}
42
43Zeroes * PabloFunction::getNullValue(Type * type) {
44    if (type == nullptr) {
45        type = getStreamTy();
46    }
47    for (PabloAST * constant : mConstants) {
48        if (isa<Zeroes>(constant) && constant->getType() == type) {
49            return cast<Zeroes>(constant);
50        }
51    }
52    Zeroes * value = new Zeroes(type);
53    mConstants.push_back(value);
54    return value;
55}
56
57Ones * PabloFunction::getAllOnesValue(Type * type) {
58    if (type == nullptr) {
59        type = getStreamTy();
60    }
61    for (PabloAST * constant : mConstants) {
62        if (isa<Ones>(constant) && constant->getType() == type) {
63            return cast<Ones>(constant);
64        }
65    }
66    Ones * value = new Ones(type);
67    mConstants.push_back(value);
68    return value;
69}
70
71void PabloFunction::throwInvalidParameterIndex(const unsigned index) const {
72    throw std::runtime_error(
73                "Invalid parameter index " +
74                std::to_string(index) + " of " + std::to_string(getNumOfParameters()) +
75                " in function " + getName()->to_string());
76}
77
78void PabloFunction::throwInvalidResultIndex(const unsigned index) const {
79    throw std::runtime_error(
80                "Invalid result index " +
81                std::to_string(index) + " of " + std::to_string(getNumOfResults()) +
82                " in function " + getName()->to_string());
83}
84
85void PabloFunction::operator delete(void * ptr) {
86    PabloFunction * f = static_cast<PabloFunction *>(ptr);
87    delete f->mSymbolTable;
88    f->mSymbolTable = nullptr;
89}
90
91}
Note: See TracBrowser for help on using the repository browser.