source: icGREP/icgrep-devel/icgrep/pablo/pe_var.h @ 5792

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

Adjusted pablo compiler to use getInputStream and getOutputStream when accessing packed stream fields.

File size: 3.1 KB
Line 
1/*
2 *  Copyright (c) 2014 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 *  icgrep is a trademark of International Characters.
5 */
6
7#ifndef PE_VAR_H
8#define PE_VAR_H
9
10#include <pablo/pabloAST.h>
11#include <pablo/pe_string.h>
12
13namespace pablo {
14
15class Var : public PabloAST {
16    friend class PabloBlock;
17    friend class PabloAST;
18    friend class PabloKernel;
19    friend class Statement;
20public:
21
22    enum Attribute {
23        None = 0x00
24        , ReadOnly = 0x01
25        , ReadNone = 0x02
26        , Scalar = 0x04
27        , KernelParameter = 0x80
28        // Composite attributes
29        , KernelInputParameter = ReadOnly | KernelParameter
30        , KernelOutputParameter = ReadNone | KernelParameter
31    };
32
33    static inline bool classof(const PabloAST * e) {
34        return e->getClassTypeId() == ClassTypeId::Var;
35    }
36    static inline bool classof(const void *) {
37        return false;
38    }
39    bool isReadOnly() const {
40        return (mAttribute & Attribute::ReadOnly) != 0;
41    }
42    void setReadOnly(const bool value = true) {
43        if (value) {
44            mAttribute |= Attribute::ReadOnly;
45        } else {
46            mAttribute &= ~(Attribute::ReadOnly);
47        }
48    }
49    bool isReadNone() const {
50        return (mAttribute & Attribute::ReadNone) != 0;
51    }
52    void setReadNone(const bool value = true) {
53        if (value) {
54            mAttribute |= Attribute::ReadNone;
55        } else {
56            mAttribute &= ~(Attribute::ReadNone);
57        }
58    }
59    bool isKernelParameter() const {
60        return (mAttribute & Attribute::KernelParameter) != 0;
61    }
62    void setKernelParameter(const bool value = true) {
63        if (value) {
64            mAttribute |= Attribute::KernelParameter;
65        } else {
66            mAttribute &= ~(Attribute::KernelParameter);
67        }
68    }
69    bool isScalar() const {
70        return (mAttribute & Attribute::Scalar) != 0;
71    }
72    void setScalar(const bool value = true) {
73        if (value) {
74            mAttribute |= Attribute::Scalar;
75        } else {
76            mAttribute &= ~(Attribute::Scalar);
77        }
78    }
79    const String & getName() const noexcept {
80        return *mName;
81    }
82
83protected:
84    Var(const String * name, llvm::Type * const type, Allocator & allocator, const Attribute attr = Attribute::None)
85    : PabloAST(ClassTypeId::Var, type, allocator)
86    , mAttribute(attr)
87    , mName(name) {
88
89    }
90private:
91    unsigned mAttribute;
92    const String * const mName;
93};
94
95class Extract : public Statement {
96    friend class PabloBlock;
97public:
98    static inline bool classof(const PabloAST * e) {
99        return e->getClassTypeId() == ClassTypeId::Extract;
100    }
101    static inline bool classof(const void *) {
102        return false;
103    }
104    virtual ~Extract(){
105    }
106    inline PabloAST * getArray() const {
107        return getOperand(0);
108    }
109    inline PabloAST * getIndex() const {
110        return getOperand(1);
111    }
112protected:
113    Extract(PabloAST * array, PabloAST * const index, const String * const name, llvm::Type * type, Allocator & allocator)
114    : Statement(ClassTypeId::Extract, type, {array, index}, name, allocator) {
115
116    }
117};
118
119}
120
121#endif // PE_VAR_H
122
123
Note: See TracBrowser for help on using the repository browser.