aboutsummaryrefslogtreecommitdiff
path: root/src/main/stanza/ir-utils.stanza
diff options
context:
space:
mode:
authorazidar2015-10-07 14:48:04 -0700
committerazidar2015-10-07 14:49:54 -0700
commit4183c648b719eac9da26e2d9d34fa852ebdbfd20 (patch)
tree87d216e61563d0498c29953b824848ab92a7ade9 /src/main/stanza/ir-utils.stanza
parent9f2e1fd28f8526f7b68dc4b0ea030ceded720697 (diff)
Added Printf and Stop to firrtl. #23 #24.
Diffstat (limited to 'src/main/stanza/ir-utils.stanza')
-rw-r--r--src/main/stanza/ir-utils.stanza24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/main/stanza/ir-utils.stanza b/src/main/stanza/ir-utils.stanza
index ffc9b39e..59c7c36a 100644
--- a/src/main/stanza/ir-utils.stanza
+++ b/src/main/stanza/ir-utils.stanza
@@ -110,6 +110,11 @@ public defmethod print (o:OutputStream, p:Pass) :
;============== Various Useful Functions ==============
+public defn add-all (v1:Vector,v2:Vector) -> False :
+ for x in v2 do :
+ add(v1,x)
+
+
public defn ceil-log2 (i:Long) -> Long :
defn* loop (n:Long, l:Long) :
if n < i :
@@ -138,6 +143,17 @@ public defn req-num-bits (i: Int) -> Int :
else : i
ceil-log2(i* + 1) + 1
+defn escape (s:String) -> String :
+ val s* = Vector<String>()
+ add(s*,"\"");"
+ for c in s do :
+ if c == '\n' :
+ add(s*,"\\n")
+ else : add(s*,to-string(c))
+ add(s*,"\"");"
+ string-join(s*)
+ ;"
+
;============== PRINTERS ===================================
defmethod print (o:OutputStream, d:Flip) :
@@ -261,6 +277,13 @@ defmethod print (o:OutputStream, c:Stmt) :
print-all(o, ["onreset " loc(c) " := " exp(c)])
(c:EmptyStmt) :
print(o, "skip")
+ (c:StopStmt) :
+ print-all(o, ["stop(" ret(c) ")"])
+ (c:PrintfStmt) :
+ print-all(o, ["printf("]) ;"
+ print-all(o, join(List(escape(string(c)),args(c)), ", "))
+ print(o, ")")
+
if not c typeof Conditionally|Begin|EmptyStmt : print-debug(o,c)
defmethod print (o:OutputStream, t:Type) :
@@ -352,6 +375,7 @@ defmethod map (f: Expression -> Expression, c:Stmt) -> Stmt :
(c:Connect) : Connect(info(c),f(loc(c)), f(exp(c)))
(c:BulkConnect) : BulkConnect(info(c),f(loc(c)), f(exp(c)))
(c:OnReset) : OnReset(info(c),f(loc(c)),f(exp(c)))
+ (c:PrintfStmt) : PrintfStmt(info(c),string(c),map(f,args(c)))
(c) : c
public defmulti map<?T> (f: Stmt -> Stmt, c:?T&Stmt) -> T