mirror of https://github.com/zachjs/sv2v.git
increased code reusability
This commit is contained in:
parent
a020761709
commit
52eb839eb5
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue