aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorazidar2016-01-08 15:51:41 -0800
committerazidar2016-01-16 14:28:18 -0800
commit168843e45656b3569461f496b85def20b70779d2 (patch)
treee727b1fa3be5adacd07b865d55e0ffdffe9ee2e8 /src
parent4569194392122ae4715549b2f0b9fffff051b278 (diff)
Finished first cut at new firrtl - time for testing! Chirrtl requires masks to be specified with write and rdwr mports
Diffstat (limited to 'src')
-rw-r--r--src/main/stanza/chirrtl.stanza34
-rw-r--r--src/main/stanza/ir-parser.stanza8
-rw-r--r--src/main/stanza/ir-utils.stanza5
3 files changed, 32 insertions, 15 deletions
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<Stmt>()
- 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<MPort>,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<MPort>,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<MPort>,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<Stmt>()
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)