use system functions for signedness casts

This commit is contained in:
Zachary Snow 2019-10-20 16:18:18 -04:00
parent 06411d70f1
commit c936b39bd2
5 changed files with 48 additions and 0 deletions

View File

@ -31,6 +31,7 @@ import qualified Convert.NestPI
import qualified Convert.Package
import qualified Convert.ParamType
import qualified Convert.RemoveComments
import qualified Convert.SignCast
import qualified Convert.Simplify
import qualified Convert.SizeCast
import qualified Convert.StarPort
@ -72,6 +73,7 @@ phases excludes =
, Convert.Unique.convert
, Convert.UnpackedArray.convert
, Convert.Unsigned.convert
, Convert.SignCast.convert
, Convert.Package.convert
, Convert.Enum.convert
, Convert.NestPI.convert

29
src/Convert/SignCast.hs Normal file
View File

@ -0,0 +1,29 @@
{- sv2v
- Author: Zachary Snow <zach@zachjs.com>
-
- Conversion for `signed` and `unsigned` type casts.
-
- SystemVerilog has `signed'(foo)` and `unsigned'(foo)` as syntactic sugar for
- the `$signed` and `$unsigned` system functions present in Verilog-2005. This
- conversion elaborates these casts.
-}
module Convert.SignCast (convert) where
import Convert.Traverse
import Language.SystemVerilog.AST
convert :: [AST] -> [AST]
convert =
map $
traverseDescriptions $
traverseModuleItems $
traverseExprs $
traverseNestedExprs convertExpr
convertExpr :: Expr -> Expr
convertExpr (Cast (Left (Implicit Signed [])) e) =
Call (Ident "$signed") (Args [Just e] [])
convertExpr (Cast (Left (Implicit Unsigned [])) e) =
Call (Ident "$unsigned") (Args [Just e] [])
convertExpr other = other

View File

@ -77,6 +77,7 @@ executable sv2v
Convert.Package
Convert.ParamType
Convert.RemoveComments
Convert.SignCast
Convert.Simplify
Convert.SizeCast
Convert.StarPort

8
test/basic/sign_cast.sv Normal file
View File

@ -0,0 +1,8 @@
module top;
initial begin
$display(signed'(4294967295));
$display(unsigned'(4294967295));
$display(signed'(-1));
$display(unsigned'(-1));
end
endmodule

8
test/basic/sign_cast.v Normal file
View File

@ -0,0 +1,8 @@
module top;
initial begin
$display($signed(4294967295));
$display($unsigned(4294967295));
$display($signed(-1));
$display($unsigned(-1));
end
endmodule