diff options
| author | azidar | 2015-11-06 09:51:59 -0800 |
|---|---|---|
| committer | azidar | 2016-01-16 14:28:16 -0800 |
| commit | ffa090c10d6210395e3f304e56008e2183a85698 (patch) | |
| tree | 25fce98795c897f655a4e6dd2f2ebf866e9c3049 /src/main/stanza/symbolic-value.stanza | |
| parent | 407200e46de9a97f8a88c210e3b0e7d6d38f307b (diff) | |
WIP
Diffstat (limited to 'src/main/stanza/symbolic-value.stanza')
| -rw-r--r-- | src/main/stanza/symbolic-value.stanza | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/main/stanza/symbolic-value.stanza b/src/main/stanza/symbolic-value.stanza new file mode 100644 index 00000000..d8ca2024 --- /dev/null +++ b/src/main/stanza/symbolic-value.stanza @@ -0,0 +1,71 @@ +defpackage firrtl/symbolic-value : + import core + import verse + import firrtl/ir2 + import firrtl/ir-utils + +; ======= Symbolic Value Library ========== +public definterface SymbolicValue +public defstruct SVExp <: SymbolicValue : + exp : Expression +public defstruct SVMux <: SymbolicValue : + pred : Expression + conseq : SymbolicValue + alt : SymbolicValue +public defstruct SVNul <: SymbolicValue + +defmethod print (o:OutputStream, sv:SymbolicValue) : + match(sv) : + (sv: SVExp) : print(o, exp(sv)) + (sv: SVMux) : print-all(o, ["(" pred(sv) " ? " conseq(sv) " : " alt(sv) ")"]) + (sv: SVNul) : print(o, "SVNUL") + +defn map (f: Expression -> Expression, sv:SymbolicValue) -> SymbolicValue : + match(sv) : + (sv:SVMux) : SVMux(f(pred(sv)),conseq(sv),alt(sv)) + (sv:SVExp) : SVExp(f(exp(sv))) + (sv:SVNul) : sv + +defmulti map<?T> (f: SymbolicValue -> SymbolicValue, sv:?T&SymbolicValue) -> T +defmethod map (f: SymbolicValue -> SymbolicValue, sv:SymbolicValue) -> SymbolicValue : + match(sv) : + (sv: SVMux) : SVMux(pred(sv),f(conseq(sv)),f(alt(sv))) + (sv) : sv + +defn do (f:SymbolicValue -> ?, s:SymbolicValue) -> False : + defn f* (sv:SymbolicValue) -> SymbolicValue : + f(sv) + sv + map(f*,s) + false + +defn dor (f:SymbolicValue -> ?, e:SymbolicValue) -> False : + do(f,e) + defn f* (x:SymbolicValue) -> SymbolicValue : + dor(f,x) + x + map(f*,e) + false + +defmethod equal? (a:SymbolicValue,b:SymbolicValue) -> True|False : + match(a,b) : + (a:SVNul,b:SVNul) : true + (a:SVExp,b:SVExp) : exp(a) == exp(b) + (a:SVMux,b:SVMux) : pred(a) == pred(b) and conseq(a) == conseq(b) and alt(a) == alt(b) + (a,b) : false + +;TODO add invert to primop +defn optimize (sv:SymbolicValue) -> SymbolicValue : + match(map(optimize,sv)) : + (sv:SVMux) : + if conseq(sv) == alt(sv) : conseq(sv) + else : + match(conseq(sv),alt(sv)) : + (c:SVExp,a:SVExp) : + if exp(c) == one and exp(a) == zero : SVExp(pred(sv)) + else if exp(c) == zero and exp(a) == one : SVExp(NOT(pred(sv))) + else if exp(c) == exp(a) : c + else : sv + (c,a) : sv + (sv) : sv + |
