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

Last change on this file since 5829 was 5828, checked in by nmedfort, 17 months ago

Pablo support for byte comparisions; LineFeed? kernel processes byte streams directly. Some clean up of PabloBuilder? functionality.

File size: 3.2 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 PabloAST {
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 Var * getArray() const {
107        return mArray;
108    }
109    inline PabloAST * getIndex() const {
110        return mIndex;
111    }
112protected:
113    Extract(Var * array, PabloAST * const index, llvm::Type * type, Allocator & allocator)
114    : PabloAST(ClassTypeId::Extract, type, allocator)
115    , mArray(array)
116    , mIndex(index) {
117
118    }
119private:
120    Var * const mArray;
121    PabloAST * const mIndex;
122};
123
124}
125
126#endif // PE_VAR_H
127
128
Note: See TracBrowser for help on using the repository browser.