-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrewrite.cpp
More file actions
75 lines (61 loc) · 2.13 KB
/
rewrite.cpp
File metadata and controls
75 lines (61 loc) · 2.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <gtest/gtest.h>
#include <arithmetic/algorithm.h>
#include <arithmetic/expression.h>
#include <arithmetic/rewrite.h>
#include <common/mapping.h>
#include <common/text.h>
using namespace arithmetic;
using namespace std;
void verifyRule(const RuleSet &rules, int idx) {
Rule rule = rules.rules[idx];
cout << "evaluating rule " << to_string(rules.sub, rule.left, false) << "->" << to_string(rules.sub, rule.right, false) << endl;
State s;
for (ConstDownIterator i(rules.sub, {rule.left, rule.right}); not i.done(); ++i) {
auto j = i.get();
for (auto k = j.operands.begin(); k != j.operands.end(); k++) {
if (k->isVar() and (k->index >= s.values.size() or s.values[k->index].isUndef())) {
s.set(k->index, Value::intOf(rand()%100+1), true);
}
}
}
cout << "on state " << s << endl;
try {
Value left = evaluate(rules.sub, rule.left, s).val;
Value right = evaluate(rules.sub, rule.right, s).val;
EXPECT_TRUE(areSame(left, right)) << "rule " << idx << ": " << left.typeName() << ":" << left << " != " << right.typeName() << ":" << right << endl << subExpr(rules.sub, rule.left) << "vs" << endl << subExpr(rules.sub, rule.right);
} catch (const std::exception& e) {
FAIL() << e.what() << " rule " << idx << ": " << subExpr(rules.sub, rule.left) << "vs" << endl << subExpr(rules.sub, rule.right);
}
cout << endl;
}
void verifyRewrite(const RuleSet &rules) {
for (int i = 0; i < (int)rules.rules.size(); i++) {
verifyRule(rules, i);
}
}
TEST(Rewrite, Basic) {
verifyRewrite(rewriteSimple());
}
TEST(Rewrite, Human) {
verifyRewrite(rewriteHuman());
}
TEST(Rewrite, Undirected) {
verifyRewrite(rewriteUndirected());
}
TEST(Rewrite, Commutative) {
Expression a = Expression::varOf(0);
Expression b = Expression::varOf(1);
Expression c = Expression::varOf(2);
Expression d = Expression::varOf(3);
auto rules = RuleSet({
(a & wireOr(b)) > (wireOr(a&b)),
});
Expression dut = (a | b) & (c | d);
//Expression exp = ((a & c) | (a & d) | (b & c) | (b & d));
//exp.minimize();
cout << dut << endl;
dut.minimize(rules);
cout << dut << endl;
//dut.minimize();
//EXPECT_TRUE(areSame(dut, exp)) << dut << " != " << exp << endl;
}