diff options
| author | azidar | 2015-05-29 11:34:51 -0700 |
|---|---|---|
| committer | azidar | 2015-05-29 11:34:51 -0700 |
| commit | ca49cb05f9e2fbeac1d0c722eb7d342f74508b7e (patch) | |
| tree | f8fb73ac66b7d5a50c1ab56ec2b2c8b91f71dd0b /src/main/stanza/custom-passes.stanza | |
| parent | b44b49e6a6589add30b5b1d89d85f2e20432a515 (diff) | |
Added custom pass. Does not correctly run, stanza just spins. Requires debugging.
Diffstat (limited to 'src/main/stanza/custom-passes.stanza')
| -rw-r--r-- | src/main/stanza/custom-passes.stanza | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/main/stanza/custom-passes.stanza b/src/main/stanza/custom-passes.stanza new file mode 100644 index 00000000..d47f6661 --- /dev/null +++ b/src/main/stanza/custom-passes.stanza @@ -0,0 +1,81 @@ +defpackage firrtl/custom-passes : + import core + import verse + import firrtl/ir-utils + import firrtl/ir2 + +public defstruct WhenCoverage <: Pass : + port-name : String + reg-name : String +public defmethod pass (b:WhenCoverage) -> (Circuit -> Circuit) : when-coverage{port-name(b),reg-name(b),_} +public defmethod name (b:WhenCoverage) -> String : "When Coverage" +public defmethod short-name (b:WhenCoverage) -> String : "when-coverage" + +;============ Utilz ============= +defn concat-all (ls:List<Expression>) -> Expression : + if length(ls) == 0 : error("Shouldn't be here") + if length(ls) == 1 : head(ls) + else : DoPrim( CONCAT-OP, + list(head(ls),concat-all(tail(ls))), + list(), + UIntType(UnknownWidth())) + +;============ When Coverage Pass ============= +;port width = 1 bit per scope + portwidths of all instances + +defn when-coverage (port-name:Symbol, reg-name:Symbol, m:InModule) -> InModule : + val when-bits = Vector<Ref>() + val inst-bits = Vector<Ref>() + val sym = HashTable<Symbol,Int>(symbol-hash) + val w1 = IntWidth(1) + val t1 = UIntType(w1) + val u1 = UIntValue(1,w1) + defn when-coverage (s:Stmt) -> Stmt : + map{when-coverage,_} $ match(s) : + (s:Conditionally) : + val ref = Ref(firrtl-gensym(reg-name,sym),t1) + add(when-bits,ref) + val conseq* = Begin(list(Connect(FileInfo()ref,u1),conseq(s))) + Conditionally(info(s),pred(s),conseq*,alt(s)) + (s:DefInstance) : + val ref = Ref(firrtl-gensym(port-name,sym),t1) + add(inst-bits,ref) + val sfld = Subfield(Ref(name(s),UnknownType()),port-name,UnknownType()) + Begin(list(s,Connect(FileInfo(),ref,sfld))) + (s) : s + + val body* = when-coverage(body(m)) + val logic = Vector<Stmt>() + + val w-ls = to-list $ when-bits + if length(w-ls) != 0 : + val reg-ref = Ref(reg-name,UIntType(IntWidth(length(w-ls)))) + add{logic,_} $ DefRegister(FileInfo(),name(reg-ref),type(reg-ref)) + add{logic,_} $ OnReset(FileInfo(),reg-ref,UIntValue(0,IntWidth(length(w-ls)))) + for (x in w-ls, i in 0 to false) do : + add{logic,_} $ DefWire(FileInfo(),name(x),type(x)) + add{logic,_} $ Connect(FileInfo(),x,DoPrim(BIT-SELECT-OP,list(reg-ref),list(i),UIntType(w1))) + add{logic,_} $ Connect(FileInfo(),reg-ref,concat-all(w-ls)) + + val i-ls = to-list $ inst-bits + if length(i-ls) != 0 : + val port-ref = Ref(port-name,UIntType(UnknownWidth())) + for (x in i-ls, i in 0 to false) do : + add{logic,_} $ DefWire(FileInfo(),name(x),type(x)) + add{logic,_} $ Connect(FileInfo(),x,UIntValue(0,UnknownWidth())) + add{logic,_} $ Connect(FileInfo(),port-ref,concat-all(append(w-ls,i-ls))) + + if length(logic) != 0 : + val ports* = List(Port(FileInfo(),port-name,OUTPUT,UIntType(UnknownWidth())),ports(m)) + val body** = Begin(list(Begin(to-list $ logic),body*)) + InModule(info(m),name(m),ports*,body**) + else : m + +public defn when-coverage (port-name:String, reg-name:String, c:Circuit) : + val modules* = for m in modules(c) map : + match(m) : + (m:InModule) : + when-coverage(to-symbol $ port-name,to-symbol $ reg-name,m) + (m:ExModule) : m + Circuit(info(c),modules*,main(c)) + |
