Ignore:
Timestamp:
Dec 16, 2016, 4:16:28 PM (3 years ago)
Author:
nmedfort
Message:

Rewrite of the CarryManager? to support non-carry-collapsing loops.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/pablo/arithmetic.h

    r5217 r5227  
    66namespace pablo {
    77
    8 class Add : public Statement {
     8class Operator : public PabloAST {
    99    friend class PabloBlock;
    1010public:
    1111    static inline bool classof(const PabloAST * e) {
    12         return e->getClassTypeId() == ClassTypeId::Add;
     12        switch (e->getClassTypeId()) {
     13            case ClassTypeId::Add:
     14            case ClassTypeId::Subtract:
     15            case ClassTypeId::LessThan:
     16            case ClassTypeId::LessThanEquals:
     17            case ClassTypeId::Equals:
     18            case ClassTypeId::GreaterThanEquals:
     19            case ClassTypeId::GreaterThan:
     20            case ClassTypeId::NotEquals:
     21                return true;
     22            default:
     23                return false;
     24        }
    1325    }
    1426    static inline bool classof(const void *) {
    1527        return false;
    1628    }
    17     virtual ~Add() { }
     29    PabloAST * getLH() const {
     30        return mLH;
     31    }
     32    PabloAST * getRH() const {
     33        return mRH;
     34    }
     35    virtual ~Operator() { }
    1836protected:
    19     Add(Type * const type, PabloAST * expr1, PabloAST * expr2, const String * name)
    20     : Statement(ClassTypeId::And, type, {expr1, expr2}, name)
    21     {
    22 
     37    Operator(const ClassTypeId typeId, Type * const type, PabloAST * const expr1, PabloAST * const expr2)
     38    : PabloAST(typeId, type, nullptr)
     39    , mLH(expr1)
     40    , mRH(expr2) {
     41        expr1->addUser(this);
     42        expr2->addUser(this);
    2343    }
     44private:
     45    PabloAST *          mLH;
     46    PabloAST *          mRH;
    2447};
    2548
    26 class Subtract : public Statement {
    27     friend class PabloBlock;
    28 public:
    29     static inline bool classof(const PabloAST * e) {
    30         return e->getClassTypeId() == ClassTypeId::Subtract;
    31     }
    32     static inline bool classof(const void *) {
    33         return false;
    34     }
    35     virtual ~Subtract() { }
    36 protected:
    37     Subtract(Type * const type, PabloAST * expr1, PabloAST * expr2, const String * name)
    38     : Statement(ClassTypeId::And, type, {expr1, expr2}, name)
    39     {
    40 
    41     }
     49#define CREATE_OPERATOR_TYPE(Name) \
     50class Name : public Operator { \
     51    friend class PabloBlock; \
     52public: \
     53    static inline bool classof(const PabloAST * e) { \
     54        return e->getClassTypeId() == ClassTypeId::Name; \
     55    } \
     56protected: \
     57    Name(Type * const type, PabloAST * const expr1, PabloAST * const expr2) \
     58    : Operator(ClassTypeId::Name, type, expr1, expr2) { \
     59    } \
    4260};
    4361
     62CREATE_OPERATOR_TYPE(Add)
     63CREATE_OPERATOR_TYPE(Subtract)
     64CREATE_OPERATOR_TYPE(LessThan)
     65CREATE_OPERATOR_TYPE(LessThanEquals)
     66CREATE_OPERATOR_TYPE(Equals)
     67CREATE_OPERATOR_TYPE(GreaterThanEquals)
     68CREATE_OPERATOR_TYPE(GreaterThan)
     69CREATE_OPERATOR_TYPE(NotEquals)
     70
     71#undef CREATE_OPERATOR_TYPE
    4472
    4573}
Note: See TracChangeset for help on using the changeset viewer.