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

Last change on this file since 4272 was 4272, checked in by nmedfort, 4 years ago

Implemented slab allocator based on the original Parabix StringPool?; intergrated it with RE and Pablo AST nodes.

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