From 168843e45656b3569461f496b85def20b70779d2 Mon Sep 17 00:00:00 2001 From: azidar Date: Fri, 8 Jan 2016 15:51:41 -0800 Subject: Finished first cut at new firrtl - time for testing! Chirrtl requires masks to be specified with write and rdwr mports --- src/main/stanza/chirrtl.stanza | 34 ++++++++++++++++++++++++---------- src/main/stanza/ir-parser.stanza | 8 ++++---- src/main/stanza/ir-utils.stanza | 5 ++++- 3 files changed, 32 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/main/stanza/chirrtl.stanza b/src/main/stanza/chirrtl.stanza index 06f1a61d..83a9e853 100644 --- a/src/main/stanza/chirrtl.stanza +++ b/src/main/stanza/chirrtl.stanza @@ -58,19 +58,20 @@ defn to-ir (c:Circuit) : match(s) : (s:CDefMemory) : val stmts = Vector() - val n = firrtl-gensym(`GEN,sh) - val t = UIntType(IntWidth(ceil-log2(size(s)))) - add(stmts,DefPoison(info(s),n,t)) + val naddr = firrtl-gensym(`GEN,sh) + val taddr = UIntType(IntWidth(ceil-log2(size(s)))) + add(stmts,DefPoison(info(s),naddr,taddr)) + val ndata = firrtl-gensym(`GEN,sh) + val tdata = type(s) + add(stmts,DefPoison(info(s),ndata,tdata)) defn set-poison (vec:List,addr:Symbol) -> False : for r in vec do : - add(stmts,Connect(info(s),SubField(SubField(Ref(name(s),ut),name(r),ut),addr,t),Ref(n,t))) - add(stmts,Connect(info(s),SubField(SubField(Ref(name(s),ut),name(r),ut),`clk,t),clk(r))) - add(stmts,Connect(info(s),SubField(SubField(Ref(name(s),ut),name(r),ut),`en,t),zero)) - + add(stmts,Connect(info(s),SubField(SubField(Ref(name(s),ut),name(r),ut),addr,taddr),Ref(naddr,taddr))) + add(stmts,Connect(info(s),SubField(SubField(Ref(name(s),ut),name(r),ut),`clk,taddr),clk(r))) + defn set-enable (vec:List,en:Symbol) -> False: + for r in vec do : + add(stmts,Connect(info(s),SubField(SubField(Ref(name(s),ut),name(r),ut),en,taddr),zero)) defn set-write (vec:List,data:Symbol,mask:Symbol) -> False : - val ndata = firrtl-gensym(`GEN,sh) - val tdata = type(s) - add(stmts,DefPoison(info(s),ndata,tdata)) val tmask = type(create-mask(`blah,type(s))) for r in vec do : add(stmts,Connect(info(s),SubField(SubField(Ref(name(s),ut),name(r),ut),data,tdata),Ref(ndata,tdata))) @@ -79,12 +80,16 @@ defn to-ir (c:Circuit) : val rds = to-list $ readers $ get?(hash,name(s),EMPs()) set-poison(rds,`addr) + set-enable(rds,`en) val wrs = to-list $ writers $ get?(hash,name(s),EMPs()) set-poison(wrs,`addr) + set-enable(wrs,`en) set-write(wrs,`data,`mask) val rws = to-list $ readwriters $ get?(hash,name(s),EMPs()) set-poison(rws,`waddr) set-poison(rws,`raddr) + set-enable(rws,`wen) + set-enable(rws,`ren) set-write(rws,`wdata,`wmask) val read-l = if seq?(s) : 1 @@ -101,15 +106,24 @@ defn to-ir (c:Circuit) : add(addrs,`addr) add(ens,`wen) add(ens,`ren) + add(masks,`wmask) + MWrite : + repl[name(s)] = DataRef(SubField(Ref(mem(s),ut),name(s),ut),`data,`data) + add(addrs,`addr) + add(ens,`en) + add(masks,`mask) else : ; TODO add MWrite for mask repl[name(s)] = DataRef(SubField(Ref(mem(s),ut),name(s),ut),`data,`data) add(addrs,`addr) add(ens,`en) + val stmts = Vector() for x in addrs do : add(stmts,Connect(info(s),SubField(SubField(Ref(mem(s),ut),name(s),ut),x,ut),exps(s)[0])) for x in ens do : add(stmts,Connect(info(s),SubField(SubField(Ref(mem(s),ut),name(s),ut),x,ut),one)) + for x in masks do : + add(stmts,Connect(info(s),SubField(SubField(Ref(mem(s),ut),name(s),ut),x,ut),exps(s)[2])) Begin $ to-list $ stmts (s) : map(collect-refs,s) defn to-ir-e (e:Expression,g:Gender) -> Expression : diff --git a/src/main/stanza/ir-parser.stanza b/src/main/stanza/ir-parser.stanza index d891227f..fa103fe3 100644 --- a/src/main/stanza/ir-parser.stanza +++ b/src/main/stanza/ir-parser.stanza @@ -265,10 +265,10 @@ defsyntax firrtl : stmt = (read mport ?name:#id! #=! ?mem:#id! (@get ?index:#exp!) ?clk:#exp!) : CDefMPort(first-info(form),name,mem,list(index,clk),MRead) - stmt = (write mport ?name:#id! #=! ?mem:#id! (@get ?index:#exp!) ?clk:#exp!) : - CDefMPort(first-info(form),name,mem,list(index,clk),MWrite) - stmt = (rdwr mport ?name:#id! #=! ?mem:#id! (@get ?index:#exp!) ?clk:#exp!) : - CDefMPort(first-info(form),name,mem,list(index,clk),MReadWrite) + stmt = (write mport ?name:#id! #=! ?mem:#id! (@get ?index:#exp!) ?clk:#exp! ?mask:#exp!) : + CDefMPort(first-info(form),name,mem,list(index,clk,mask),MWrite) + stmt = (rdwr mport ?name:#id! #=! ?mem:#id! (@get ?index:#exp!) ?clk:#exp! ?mask:#exp!) : + CDefMPort(first-info(form),name,mem,list(index,clk,mask),MReadWrite) stmt = (mem ?name:#id! #:! (?ms:#mstat ...)) : defn grab (f:MStat -> True|False) : diff --git a/src/main/stanza/ir-utils.stanza b/src/main/stanza/ir-utils.stanza index a2af082b..00b573a6 100644 --- a/src/main/stanza/ir-utils.stanza +++ b/src/main/stanza/ir-utils.stanza @@ -345,7 +345,10 @@ defmethod print (o:OutputStream, c:Stmt) : else : print-all(o, ["cmem " name(c) " : " type(c) "[" size(c) "]"]) (c:CDefMPort) : - print-all(o, [direction(c) " mport " name(c) " = " mem(c) "[" exps(c)[0] "], " exps(c)[1]]) + if direction(c) == MRead : + print-all(o, [direction(c) " mport " name(c) " = " mem(c) "[" exps(c)[0] "], " exps(c)[1]]) + else : + print-all(o, [direction(c) " mport " name(c) " = " mem(c) "[" exps(c)[0] "], " exps(c)[1] ", " exps(c)[2]]) if not c typeof Conditionally|Begin|Empty: print-debug(o,c) -- cgit v1.2.3