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