aboutsummaryrefslogtreecommitdiff
path: root/src/main/stanza/verilog.stanza
diff options
context:
space:
mode:
authorazidar2015-06-03 20:39:41 -0700
committerazidar2015-06-03 20:39:41 -0700
commit887d785ecc2ba7c363194cef89b72bc026c81cf9 (patch)
tree350224acd106b5e5a4bbfccef793ac412a86b556 /src/main/stanza/verilog.stanza
parent0a0c2d7c13c5beaa7c5132963112cc9e747ff287 (diff)
Fixed verilog backend bugs. Passes ALU. Fails Datapath
Diffstat (limited to 'src/main/stanza/verilog.stanza')
-rw-r--r--src/main/stanza/verilog.stanza137
1 files changed, 79 insertions, 58 deletions
diff --git a/src/main/stanza/verilog.stanza b/src/main/stanza/verilog.stanza
index 96778469..708430f2 100644
--- a/src/main/stanza/verilog.stanza
+++ b/src/main/stanza/verilog.stanza
@@ -49,6 +49,18 @@ defstruct ComMemKind <: VKind
;============ Verilog Backend =============
+defn emit-as-type (e:Expression,t:Type) -> String :
+ match(t) :
+ (t:UIntType) : emit(e)
+ (t:SIntType) : string-join(["$signed(" emit(e) ")"])
+
+defn emit-signed-if-any (e:Expression,ls:List<Expression>) -> String :
+ var signed? = false
+ for x in ls do :
+ if type(x) typeof SIntType : signed? = true
+ if not signed? : emit(e)
+ else : string-join(["$signed(" emit(e) ")"])
+
defn emit (e:Expression) -> String :
match(e) :
(e:Ref) : to-string $ name(e)
@@ -59,64 +71,73 @@ defn emit (e:Expression) -> String :
(e:Register) : error("Non-supported expression")
(e:ReadPort) : error("Non-supported expression")
(e:WritePort) : error("Non-supported expression")
- (e:DoPrim) : string-join $ switch {_ == op(e)} :
- ADD-OP : [emit(args(e)[0]) " + " emit(args(e)[1])]
- SUB-OP : [emit(args(e)[0]) " - " emit(args(e)[1])]
- MUL-OP : [emit(args(e)[0]) " * " emit(args(e)[1])]
- DIV-OP : [emit(args(e)[0]) " / " emit(args(e)[1])]
- MOD-OP : [emit(args(e)[0]) " % " emit(args(e)[1])]
- QUO-OP : [emit(args(e)[0]) " / " emit(args(e)[1])]
- REM-OP : [emit(args(e)[0]) " % " emit(args(e)[1])]
- ADD-WRAP-OP : [emit(args(e)[0]) " + " emit(args(e)[1])]
- SUB-WRAP-OP : [emit(args(e)[0]) " - " emit(args(e)[1])]
- LESS-OP : [emit(args(e)[0]) " < " emit(args(e)[1])]
- LESS-EQ-OP : [emit(args(e)[0]) " <= " emit(args(e)[1])]
- GREATER-OP : [emit(args(e)[0]) " > " emit(args(e)[1])]
- GREATER-EQ-OP : [emit(args(e)[0]) " >= " emit(args(e)[1])]
- NEQUAL-OP : [emit(args(e)[0]) " != " emit(args(e)[1])]
- EQUAL-OP : [emit(args(e)[0]) " == " emit(args(e)[1])]
- MUX-OP : [emit(args(e)[0]) " ? " emit(args(e)[1]) " : " emit(args(e)[2])]
- PAD-OP :
- val x = args(e)[0]
- val w = width!(type(x))
- val diff = consts(e)[0] - w
- if w == 0 : [ emit(x) ]
- else : ["{{" diff "{" emit(x) "[" w - 1 "]}}, " emit(x) " }"]
- AS-UINT-OP :
- ["$unsigned(" emit(args(e)[0]) ")"]
- AS-SINT-OP :
- ["$signed(" emit(args(e)[0]) ")"]
- DYN-SHIFT-LEFT-OP : [emit(args(e)[0]) " << " emit(args(e)[1])]
- DYN-SHIFT-RIGHT-OP : [emit(args(e)[0]) " >> " emit(args(e)[1])]
- SHIFT-LEFT-OP : [emit(args(e)[0]) " << " consts(e)[0]]
- SHIFT-RIGHT-OP : [emit(args(e)[0]) " >> " consts(e)[0]]
- NEG-OP : ["-{" emit(args(e)[0]) "}"]
- CONVERT-OP :
- match(type(args(e)[0])) :
- (t:UIntType) : ["{1'b0," emit(args(e)[0]) "}"]
- (t:SIntType) : [emit(args(e)[0])]
- BIT-NOT-OP : ["!" emit(args(e)[0])]
- BIT-AND-OP : [emit(args(e)[0]) " & " emit(args(e)[1])]
- BIT-OR-OP : [emit(args(e)[0]) " | " emit(args(e)[1])]
- BIT-XOR-OP : [emit(args(e)[0]) " ^ " emit(args(e)[1])]
- CONCAT-OP : ["{" emit(args(e)[0]) "," emit(args(e)[1]) "}"]
- BIT-SELECT-OP : [emit(args(e)[0]) "[" consts(e)[0] "]"]
- BITS-SELECT-OP : [emit(args(e)[0]) "[" consts(e)[0] ":" consts(e)[1] "]"]
- BIT-AND-REDUCE-OP :
- var v = emit(args(e)[0])
- for x in tail(args(e)) do :
- v = concat(v, [" & " emit(x)])
- v
- BIT-OR-REDUCE-OP :
- var v = emit(args(e)[0])
- for x in tail(args(e)) do :
- v = concat(v, [" | " emit(x)])
- v
- BIT-XOR-REDUCE-OP :
- var v = emit(args(e)[0])
- for x in tail(args(e)) do :
- v = concat(v, [" ^ " emit(x)])
- v
+ (e:DoPrim) :
+ val sargs = map(emit-as-type{_,type(e)},args(e))
+ val xargs = map(emit-signed-if-any{_,args(e)},args(e))
+ string-join $ switch {_ == op(e)} :
+ ADD-OP : [sargs[0] " + " sargs[1]]
+ SUB-OP : [sargs[0] " - " sargs[1]]
+ MUL-OP : [sargs[0] " * " sargs[1] ]
+ DIV-OP : [sargs[0] " / " sargs[1] ]
+ MOD-OP : [sargs[0] " % " sargs[1] ]
+ QUO-OP : [sargs[0] " / " sargs[1] ]
+ REM-OP : [sargs[0] " % " sargs[1] ]
+ ADD-WRAP-OP : [sargs[0], " + " sargs[1]]
+ SUB-WRAP-OP : [sargs[0], " - " sargs[1]]
+ LESS-OP : [xargs[0] " < " xargs[1]]
+ LESS-EQ-OP : [xargs[0] " <= " xargs[1]]
+ GREATER-OP : [xargs[0] " > " xargs[1]]
+ GREATER-EQ-OP : [xargs[0] " >= " xargs[1]]
+ NEQUAL-OP : [xargs[0] " != " xargs[1]]
+ EQUAL-OP : [xargs[0] " == " xargs[1]]
+ MUX-OP : [emit(args(e)[0]) " ? " sargs[1] " : " sargs[2]]
+ PAD-OP :
+ val x = args(e)[0]
+ val w = width!(type(x))
+ val diff = consts(e)[0] - w
+ if w == 0 : [ emit(x) ]
+ else :
+ if type(e) typeof SIntType : ["{{" diff "{" emit(x) "[" w - 1 "]}}, " emit(x) " }"]
+ else : ["{{" diff "'d0 }, " emit(x) " }"]
+ AS-UINT-OP :
+ ["$unsigned(" emit(args(e)[0]) ")"]
+ AS-SINT-OP :
+ ["$signed(" emit(args(e)[0]) ")"]
+ DYN-SHIFT-LEFT-OP : [sargs[0] " << " emit(args(e)[1])]
+ DYN-SHIFT-RIGHT-OP :
+ if type(e) typeof SIntType : [sargs[0] " >>> " emit(args(e)[1])]
+ else : [sargs[0] " >> " emit(args(e)[1])]
+ SHIFT-LEFT-OP : [sargs[0] " << " consts(e)[0]]
+ SHIFT-RIGHT-OP :
+ if type(e) typeof SIntType : [sargs[0] " >>> " consts(e)[0]]
+ else : [sargs[0] " >> " consts(e)[0]]
+ NEG-OP : ["-{" sargs[0] "}"]
+ CONVERT-OP :
+ match(type(args(e)[0])) :
+ (t:UIntType) : ["{1'b0," sargs[0] "}"]
+ (t:SIntType) : [sargs[0]]
+ BIT-NOT-OP : ["!" sargs[0]]
+ BIT-AND-OP : [sargs[0] " & " sargs[1]]
+ BIT-OR-OP : [sargs[0] " | " sargs[1]]
+ BIT-XOR-OP : [sargs[0] " ^ " sargs[1]]
+ CONCAT-OP : ["{" sargs[0] "," sargs[1] "}"]
+ BIT-SELECT-OP : [sargs[0] "[" consts(e)[0] "]"]
+ BITS-SELECT-OP : [sargs[0] "[" consts(e)[0] ":" consts(e)[1] "]"]
+ BIT-AND-REDUCE-OP :
+ var v = sargs[0]
+ for x in tail(args(e)) do :
+ v = concat(v, [" & " emit(x)])
+ v
+ BIT-OR-REDUCE-OP :
+ var v = sargs[0]
+ for x in tail(args(e)) do :
+ v = concat(v, [" | " emit(x)])
+ v
+ BIT-XOR-REDUCE-OP :
+ var v = sargs[0]
+ for x in tail(args(e)) do :
+ v = concat(v, [" ^ " emit(x)])
+ v
defn emit-module (m:InModule) :
val h = HashTable<Symbol,VKind>(symbol-hash)