From 52eb839eb593c0c5b73e5703ca12a538ccd40443 Mon Sep 17 00:00:00 2001 From: Ethan Sifferman Date: Tue, 30 Jan 2024 01:23:25 -0800 Subject: [PATCH] increased code reusability --- src/Convert/SystemTasks.hs | 124 +++++++++++++++++++++---------------- test/core/elab_task.v | 10 +-- test/core/system_tasks.v | 8 +-- 3 files changed, 78 insertions(+), 64 deletions(-) diff --git a/src/Convert/SystemTasks.hs b/src/Convert/SystemTasks.hs index 33147b0..4ef236d 100644 --- a/src/Convert/SystemTasks.hs +++ b/src/Convert/SystemTasks.hs @@ -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 diff --git a/test/core/elab_task.v b/test/core/elab_task.v index 663b6bb..649d8a9 100644 --- a/test/core/elab_task.v +++ b/test/core/elab_task.v @@ -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 diff --git a/test/core/system_tasks.v b/test/core/system_tasks.v index f459895..b95eee3 100644 --- a/test/core/system_tasks.v +++ b/test/core/system_tasks.v @@ -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