initial support for system tasks

This commit is contained in:
Ethan Sifferman 2024-01-23 21:03:07 -08:00 committed by Zachary Snow
parent 12d977f070
commit bcb6d9b249
5 changed files with 66 additions and 0 deletions

View File

@ -51,6 +51,7 @@ import qualified Convert.StringParam
import qualified Convert.StringType import qualified Convert.StringType
import qualified Convert.Struct import qualified Convert.Struct
import qualified Convert.StructConst import qualified Convert.StructConst
import qualified Convert.SystemTasks
import qualified Convert.TFBlock import qualified Convert.TFBlock
import qualified Convert.Typedef import qualified Convert.Typedef
import qualified Convert.TypeOf import qualified Convert.TypeOf
@ -121,6 +122,7 @@ initialPhases tops selectExclude =
, Convert.Interface.disambiguate , Convert.Interface.disambiguate
, Convert.Package.convert , Convert.Package.convert
, Convert.StructConst.convert , Convert.StructConst.convert
, Convert.SystemTasks.convert
, Convert.PortDecl.convert , Convert.PortDecl.convert
, Convert.ParamNoDefault.convert tops , Convert.ParamNoDefault.convert tops
, Convert.ResolveBindings.convert , Convert.ResolveBindings.convert

View File

@ -0,0 +1,49 @@
{- sv2v
- Author: Ethan Sifferman <ethan@sifferman.dev>
-
- Conversion of SystemVerilog System Tasks to Verilog.
-}
module Convert.SystemTasks (convert) where
import Convert.Traverse
import Language.SystemVerilog.AST
convert :: [AST] -> [AST]
convert =
map $ traverseDescriptions $ traverseModuleItems $
traverseStmts $ traverseNestedStmts convertStmt
convertStmt :: Stmt -> Stmt
convertStmt (Subroutine (Ident "$info") args) =
Block Seq "" [] [
(Subroutine (Ident "$write") (Args [(String "[%0t] Info: "), (Call (Ident "$time") (Args [] []))] [])),
(Subroutine (Ident "$display") args)
]
convertStmt (Subroutine (Ident "$warning") args) =
Block Seq "" [] [
(Subroutine (Ident "$write") (Args [(String "[%0t] Warning: "), (Call (Ident "$time") (Args [] []))] [])),
(Subroutine (Ident "$display") args)
]
convertStmt (Subroutine (Ident "$error") args) =
Block Seq "" [] [
(Subroutine (Ident "$write") (Args [(String "[%0t] Error: "), (Call (Ident "$time") (Args [] []))] [])),
(Subroutine (Ident "$display") args)
]
convertStmt (Subroutine (Ident "$fatal") (Args [] [])) =
Block Seq "" [] [
(Subroutine (Ident "$write") (Args [(String "[%0t] Fatal: "), (Call (Ident "$time") (Args [] []))] [])),
(Subroutine (Ident "$display") (Args [] [])),
(Subroutine (Ident "$finish") (Args [] []))
]
convertStmt (Subroutine (Ident "$fatal") (Args (finishArgs:displayArgs) [])) =
Block Seq "" [] [
(Subroutine (Ident "$write") (Args [(String "Fatal:")] [])),
(Subroutine (Ident "$display") (Args displayArgs [])),
(Subroutine (Ident "$finish") (Args [finishArgs] []))
]
convertStmt other = other

View File

@ -138,6 +138,8 @@ instance Show Expr where
showString " : " . showString " : " .
shows f . shows f .
showChar ')' showChar ')'
showsPrec _ (Call e (Args [] [])) =
shows e
showsPrec _ (Call e l ) = showsPrec _ (Call e l ) =
shows e . shows e .
shows l shows l

View File

@ -104,6 +104,7 @@ executable sv2v
Convert.StringType Convert.StringType
Convert.Struct Convert.Struct
Convert.StructConst Convert.StructConst
Convert.SystemTasks
Convert.TFBlock Convert.TFBlock
Convert.Traverse Convert.Traverse
Convert.Typedef Convert.Typedef

View File

@ -0,0 +1,12 @@
module top;
initial begin
$info;
$info("%b", 1);
$warning;
$warning("%b", 2);
$error;
$error("%b", 3);
$fatal;
$fatal(0, "%b", 4);
end
endmodule