source: icGREP/icgrep-devel/icgrep/pablo/pabloAST.cpp @ 4247

Last change on this file since 4247 was 4247, checked in by cameron, 5 years ago

All -> Zeroes, Ones

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#include "pabloAST.h"
8#include "pe_advance.h"
9#include "pe_and.h"
10#include "pe_call.h"
11#include "pe_charclass.h"
12#include "pe_matchstar.h"
13#include "pe_not.h"
14#include "pe_or.h"
15#include "pabloAST.h"
16#include "pe_scanthru.h"
17#include "pe_sel.h"
18#include "pe_var.h"
19#include "pe_xor.h"
20#include "pe_zeroes.h"
21#include "pe_ones.h"
22
23namespace pablo {
24
25/*
26
27    Return true if expr1 and expr2 can be proven equivalent according to some rules,
28    false otherwise.  Note that false may be returned i some cases when the exprs are
29    equivalent.
30
31*/
32
33bool equals(const PabloAST * expr1, const PabloAST * expr2) {
34    if (expr1->getClassTypeId() == expr2->getClassTypeId()) {
35        if ((isa<const Zeroes>(expr1)) || (isa<const Ones>(expr1))) {
36            return true;
37        }
38        else if (const Var * var1 = dyn_cast<const Var>(expr1)) {
39            if (const Var * var2 = cast<const Var>(expr2)) {
40                return (var1->getName() == var2->getName());
41            }
42        }
43        else if (const Not* not1 = dyn_cast<const Not>(expr1)) {
44            if (const Not* not2 = cast<const Not>(expr2)) {
45                return equals(not1->getExpr(), not2->getExpr());
46            }
47        }
48        else if (const And* and1 = dyn_cast<const And>(expr1)) {
49            if (const And* and2 = cast<const And>(expr2)) {
50                if (equals(and1->getExpr1(), and2->getExpr1())) {
51                    return equals(and1->getExpr2(), and2->getExpr2());
52                }
53                else if (equals(and1->getExpr1(), and2->getExpr2())) {
54                    return equals(and1->getExpr2(), and2->getExpr1());
55                }
56            }
57        }
58        else if (const Or * or1 = dyn_cast<const Or>(expr1)) {
59            if (const Or* or2 = cast<const Or>(expr2)) {
60                if (equals(or1->getExpr1(), or2->getExpr1())) {
61                    return equals(or1->getExpr2(), or2->getExpr2());
62                }
63                else if (equals(or1->getExpr1(), or2->getExpr2())) {
64                    return equals(or1->getExpr2(), or2->getExpr1());
65                }
66            }
67        }
68        else if (const Xor * xor1 = dyn_cast<const Xor>(expr1)) {
69            if (const Xor * xor2 = cast<const Xor>(expr2)) {
70                if (equals(xor1->getExpr1(), xor2->getExpr1())) {
71                    return equals(xor1->getExpr2(), xor2->getExpr2());
72                }
73                else if (equals(xor1->getExpr1(), xor2->getExpr2())) {
74                    return equals(xor1->getExpr2(), xor2->getExpr1());
75                }
76            }
77        }
78        else if (const Sel* sel1 = dyn_cast<const Sel>(expr1)) {
79            if (const Sel* sel2 = cast<const Sel>(expr2)) {
80                if (equals(sel1->getCondition(), sel2->getCondition())) {
81                    if (equals(sel1->getTrueExpr(), sel2->getTrueExpr())) {
82                        return equals(sel1->getFalseExpr(), sel2->getFalseExpr());
83                    }
84                }
85            }
86        }
87    }
88    return false;
89}
90
91
92
93PabloAST::~PabloAST(){ }
94
95
96
97}
Note: See TracBrowser for help on using the repository browser.