increased code reusability

This commit is contained in:
Ethan Sifferman 2024-01-30 01:23:25 -08:00 committed by Zachary Snow
parent a020761709
commit 52eb839eb5
3 changed files with 78 additions and 64 deletions

View File

@ -12,16 +12,16 @@ import Language.SystemVerilog.AST
convert :: [AST] -> [AST]
convert = map $ traverseDescriptions traverseDescription
-- Identifiers for fatal elaboration checker
elaborationFatalIdent :: Identifier
elaborationFatalIdent = "_sv2v_elaboration_fatal"
elaborationFatalCancelCode :: Expr
elaborationFatalCancelCode = RawNum (-1)
-- Checker for fatal elaboration
elaborationFatalDecl :: ModuleItem
elaborationFatalDecl = MIPackageItem $ Decl $ Variable Local t elaborationFatalIdent [] elaborationFatalCancelCode
where t = IntegerAtom TInteger Unspecified
elaborationFatalCheck :: ModuleItem
elaborationFatalCheck = Initial (Block Seq "" [] [
zeroDelay,
@ -31,6 +31,7 @@ elaborationFatalCheck = Initial (Block Seq "" [] [
checkCancelCode = BinOpA Ne [] (Ident elaborationFatalIdent) elaborationFatalCancelCode
finishCall = Subroutine (Ident "$finish") (Args [(Ident elaborationFatalIdent)] [])
-- If SV code uses elab fatal, add checker for fatal elaboration
traverseDescription :: Description -> Description
traverseDescription (Part att ext kw lif name pts items) =
traverseModuleItems convertModuleItem $
@ -44,66 +45,79 @@ traverseDescription (Part att ext kw lif name pts items) =
isElabTaskFatal _ = False
traverseDescription description = traverseModuleItems convertModuleItem description
-- Convert Elaboration Severity Tasks
severityElabTaskToString :: ModuleItem -> String
severityElabTaskToString (ElabTask SeverityInfo _) = "Info"
severityElabTaskToString (ElabTask SeverityWarning _) = "Warning"
severityElabTaskToString (ElabTask SeverityError _) = "Error"
severityElabTaskToString (ElabTask SeverityFatal _) = "Fatal"
severityElabTaskToString _ = ""
severityElabTaskToDisplay :: ModuleItem -> [Stmt]
severityElabTaskToDisplay task@(ElabTask severity (Args taskArgs [])) =
[Subroutine (Ident "$display") (Args (
[(String ("Elaboration "++(severityElabTaskToString task)++":"++(trailingSpace)))] ++ args
) [])]
where
args = parseTaskArgs severity taskArgs
parseTaskArgs _ [] = []
parseTaskArgs SeverityFatal (_:xs) = xs
parseTaskArgs _ x = x
trailingSpace = if (length args) > 0 then " " else ""
severityElabTaskToDisplay _ = []
severityElabTaskToFinish :: ModuleItem -> [Stmt]
severityElabTaskToFinish (ElabTask SeverityFatal (Args [] [])) =
[Asgn AsgnOpEq Nothing (LHSIdent elaborationFatalIdent) (RawNum 0)]
severityElabTaskToFinish (ElabTask SeverityFatal (Args (finishArgs:_) [])) =
[Asgn AsgnOpEq Nothing (LHSIdent elaborationFatalIdent) finishArgs]
severityElabTaskToFinish _ = []
convertModuleItem :: ModuleItem -> ModuleItem
convertModuleItem (ElabTask SeverityInfo (Args args [])) =
Initial (Block Seq "" [] [
(Subroutine (Ident "$display") (Args ([(String "Elaboration Info: ")] ++ args) []))
])
convertModuleItem (ElabTask SeverityWarning (Args args [])) =
Initial (Block Seq "" [] [
(Subroutine (Ident "$display") (Args ([(String "Elaboration Warning: ")] ++ args) []))
])
convertModuleItem (ElabTask SeverityError (Args args [])) =
Initial (Block Seq "" [] [
(Subroutine (Ident "$display") (Args ([(String "Elaboration Error: ")] ++ args) []))
])
convertModuleItem (ElabTask SeverityFatal (Args [] [])) =
Initial (Block Seq "" [] [
(Subroutine (Ident "$display") (Args [(String "Elaboration Fatal: ")] [])),
(Asgn AsgnOpEq Nothing (LHSIdent elaborationFatalIdent) (RawNum 0))
])
convertModuleItem (ElabTask SeverityFatal (Args (finishArgs:displayArgs) _)) =
Initial (Block Seq "" [] [
(Subroutine (Ident "$display") (Args ([(String "Elaboration Fatal: ")] ++ displayArgs) [])),
(Asgn AsgnOpEq Nothing (LHSIdent elaborationFatalIdent) finishArgs)
])
convertModuleItem task@(ElabTask _ _) =
Initial (Block Seq "" [] ((severityElabTaskToDisplay task) ++ (severityElabTaskToFinish task)))
convertModuleItem other =
traverseStmts (traverseNestedStmts convertStmt) other
-- Convert Standard Severity Tasks
severityTaskToString :: Stmt -> String
severityTaskToString (Subroutine (Ident "$info") _) = severityElabTaskToString (ElabTask SeverityInfo (Args [] []))
severityTaskToString (Subroutine (Ident "$warning") _) = severityElabTaskToString (ElabTask SeverityWarning (Args [] []))
severityTaskToString (Subroutine (Ident "$error") _) = severityElabTaskToString (ElabTask SeverityError (Args [] []))
severityTaskToString (Subroutine (Ident "$fatal") _) = severityElabTaskToString (ElabTask SeverityFatal (Args [] []))
severityTaskToString _ = ""
timeCall :: Expr
timeCall = Call (Ident "$time") (Args [] [])
severityTaskToDisplay :: Stmt -> [Stmt]
severityTaskToDisplay task@(Subroutine severity (Args taskArgs [])) =
[Subroutine (Ident "$display") (Args (
[(String ("[%0t] "++(severityTaskToString task)++":"++(trailingSpace))), timeCall] ++ args
) [])]
where
args = parseTaskArgs severity taskArgs
parseTaskArgs _ [] = []
parseTaskArgs (Ident "$fatal") (_:xs) = xs
parseTaskArgs _ x = x
trailingSpace = if (length args) > 0 then " " else ""
severityTaskToDisplay _ = []
severityTaskToFinish :: Stmt -> [Stmt]
severityTaskToFinish (Subroutine (Ident "$fatal") (Args [] [])) =
[Subroutine (Ident "$finish") (Args [] [])]
severityTaskToFinish (Subroutine (Ident "$fatal") (Args (finishArgs:_) [])) =
[Subroutine (Ident "$finish") (Args [finishArgs] [])]
severityTaskToFinish _ = []
convertStmt :: Stmt -> Stmt
convertStmt (Subroutine (Ident "$info") (Args args [])) =
Block Seq "" [] [
(Subroutine (Ident "$display") (Args ([(String "[%0t] Info: "), timeCall] ++ args) []))
]
convertStmt (Subroutine (Ident "$warning") (Args args [])) =
Block Seq "" [] [
(Subroutine (Ident "$display") (Args ([(String "[%0t] Warning: "), timeCall] ++ args) []))
]
convertStmt (Subroutine (Ident "$error") (Args args [])) =
Block Seq "" [] [
(Subroutine (Ident "$display") (Args ([(String "[%0t] Error: "), timeCall] ++ args) []))
]
convertStmt (Subroutine (Ident "$fatal") (Args [] [])) =
Block Seq "" [] [
(Subroutine (Ident "$display") (Args [(String "[%0t] Fatal: "), timeCall] [])),
(Subroutine (Ident "$finish") (Args [] []))
]
convertStmt (Subroutine (Ident "$fatal") (Args (finishArgs:displayArgs) _)) =
Block Seq "" [] [
(Subroutine (Ident "$display") (Args ([(String "[%0t] Fatal: "), timeCall] ++ displayArgs) [])),
(Subroutine (Ident "$finish") (Args [finishArgs] []))
]
convertStmt task@(Subroutine (Ident "$info") _) =
Block Seq "" [] ((severityTaskToDisplay task) ++ (severityTaskToFinish task))
convertStmt task@(Subroutine (Ident "$warning") _) =
Block Seq "" [] ((severityTaskToDisplay task) ++ (severityTaskToFinish task))
convertStmt task@(Subroutine (Ident "$error") _) =
Block Seq "" [] ((severityTaskToDisplay task) ++ (severityTaskToFinish task))
convertStmt task@(Subroutine (Ident "$fatal") _) =
Block Seq "" [] ((severityTaskToDisplay task) ++ (severityTaskToFinish task))
convertStmt other = other

View File

@ -1,17 +1,17 @@
module top;
integer _sv2v_elaboration_fatal = -1;
initial $display("Elaboration Info: ");
initial $display("Elaboration Info:");
initial $display("Elaboration Info: ", "%b", 1);
initial $display("Elaboration Warning: ");
initial $display("Elaboration Warning:");
initial $display("Elaboration Warning: ", "%b", 2);
initial $display("Elaboration Error: ");
initial $display("Elaboration Error:");
initial $display("Elaboration Error: ", "%b", 3);
initial begin
$display("Elaboration Fatal: ");
$display("Elaboration Fatal:");
_sv2v_elaboration_fatal = 0;
end
initial begin
$display("Elaboration Fatal: ");
$display("Elaboration Fatal:");
_sv2v_elaboration_fatal = 0;
end
initial begin

View File

@ -1,12 +1,12 @@
module top;
initial begin
$display("[%0t] Info: ", $time);
$display("[%0t] Info:", $time);
$display("[%0t] Info: ", $time, "%b", 1);
$display("[%0t] Warning: ", $time);
$display("[%0t] Warning:", $time);
$display("[%0t] Warning: ", $time, "%b", 2);
$display("[%0t] Error: ", $time);
$display("[%0t] Error:", $time);
$display("[%0t] Error: ", $time, "%b", 3);
$display("[%0t] Fatal: ", $time);
$display("[%0t] Fatal:", $time);
$finish;
end
endmodule