From a0c3112b6c56a2eccde18e8cc696150b1bdc6488 Mon Sep 17 00:00:00 2001 From: Zachary Snow Date: Tue, 5 May 2020 19:32:37 -0400 Subject: [PATCH] flatten tf blocks with decls --- src/Convert.hs | 4 +-- src/Convert/StmtBlock.hs | 30 ---------------------- src/Convert/TFBlock.hs | 55 ++++++++++++++++++++++++++++++++++++++++ sv2v.cabal | 2 +- 4 files changed, 58 insertions(+), 33 deletions(-) delete mode 100644 src/Convert/StmtBlock.hs create mode 100644 src/Convert/TFBlock.hs diff --git a/src/Convert.hs b/src/Convert.hs index 065491f..d835ae8 100644 --- a/src/Convert.hs +++ b/src/Convert.hs @@ -38,9 +38,9 @@ import qualified Convert.SignCast import qualified Convert.Simplify import qualified Convert.SizeCast import qualified Convert.StarPort -import qualified Convert.StmtBlock import qualified Convert.Stream import qualified Convert.Struct +import qualified Convert.TFBlock import qualified Convert.Typedef import qualified Convert.TypeOf import qualified Convert.UnbasedUnsized @@ -73,9 +73,9 @@ phases excludes = , Convert.SizeCast.convert , Convert.Simplify.convert , Convert.StarPort.convert - , Convert.StmtBlock.convert , Convert.Stream.convert , Convert.Struct.convert + , Convert.TFBlock.convert , Convert.Typedef.convert , Convert.UnbasedUnsized.convert , Convert.Unique.convert diff --git a/src/Convert/StmtBlock.hs b/src/Convert/StmtBlock.hs deleted file mode 100644 index bd5b0d1..0000000 --- a/src/Convert/StmtBlock.hs +++ /dev/null @@ -1,30 +0,0 @@ -{- sv2v - - Author: Zachary Snow - - - - Conversion for tasks and functions to use only one statement, as required in - - Verilog-2005. - -} - -module Convert.StmtBlock (convert) where - -import Convert.Traverse -import Language.SystemVerilog.AST - -convert :: [AST] -> [AST] -convert = map $ traverseDescriptions $ traverseModuleItems convertModuleItem - -convertModuleItem :: ModuleItem -> ModuleItem -convertModuleItem (MIPackageItem packageItem) = - MIPackageItem $ convertPackageItem packageItem -convertModuleItem other = other - -convertPackageItem :: PackageItem -> PackageItem -convertPackageItem (Function ml t f decls stmts) = - Function ml t f decls [stmtsToStmt stmts] -convertPackageItem (Task ml f decls stmts) = - Task ml f decls [stmtsToStmt stmts] -convertPackageItem other = other - -stmtsToStmt :: [Stmt] -> Stmt -stmtsToStmt [stmt] = stmt -stmtsToStmt stmts = Block Seq "" [] stmts diff --git a/src/Convert/TFBlock.hs b/src/Convert/TFBlock.hs new file mode 100644 index 0000000..25f6e2a --- /dev/null +++ b/src/Convert/TFBlock.hs @@ -0,0 +1,55 @@ +{- sv2v + - Author: Zachary Snow + - + - Conversion for tasks and functions to contain only one top-level statement, + - as required in Verilog-2005. This conversion also hoists data declarations to + - the task or function level for greater portability. + -} + +module Convert.TFBlock (convert) where + +import Data.List (isPrefixOf) + +import Convert.Traverse +import Language.SystemVerilog.AST + +convert :: [AST] -> [AST] +convert = map $ traverseDescriptions $ traverseModuleItems convertModuleItem + +convertModuleItem :: ModuleItem -> ModuleItem +convertModuleItem (MIPackageItem packageItem) = + MIPackageItem $ convertPackageItem packageItem +convertModuleItem other = other + +convertPackageItem :: PackageItem -> PackageItem +convertPackageItem (Function ml t f decls stmts) = + Function ml t f decls' stmts' + where (decls', stmts') = convertTFBlock decls stmts +convertPackageItem (Task ml f decls stmts) = + Task ml f decls' stmts' + where (decls', stmts') = convertTFBlock decls stmts +convertPackageItem other = other + +convertTFBlock :: [Decl] -> [Stmt] -> ([Decl], [Stmt]) +convertTFBlock decls stmts = + (decls', [stmtsToStmt stmts']) + where (decls', stmts') = flattenOuterBlocks $ Block Seq "" decls stmts + +stmtsToStmt :: [Stmt] -> Stmt +stmtsToStmt [stmt] = stmt +stmtsToStmt stmts = Block Seq "" [] stmts + +flattenOuterBlocks :: Stmt -> ([Decl], [Stmt]) +flattenOuterBlocks (Block Seq "" declsA [stmt]) = + (declsA ++ declsB, stmtsB) + where (declsB, stmtsB) = flattenOuterBlocks stmt +flattenOuterBlocks (Block Seq "" declsA (Block Seq name declsB stmtsA : stmtsB)) = + flattenOuterBlocks $ Block Seq name (declsA ++ declsB) (stmtsA ++ stmtsB) +flattenOuterBlocks (Block Seq name decls stmts) + | notscope name = (decls, stmts) + | otherwise = ([], [Block Seq name decls stmts]) +flattenOuterBlocks stmt = ([], [stmt]) + +notscope :: Identifier -> Bool +notscope "" = True +notscope name = "sv2v_autoblock_" `isPrefixOf` name diff --git a/sv2v.cabal b/sv2v.cabal index 9421295..75e7f90 100644 --- a/sv2v.cabal +++ b/sv2v.cabal @@ -86,9 +86,9 @@ executable sv2v Convert.Simplify Convert.SizeCast Convert.StarPort - Convert.StmtBlock Convert.Stream Convert.Struct + Convert.TFBlock Convert.Traverse Convert.Typedef Convert.TypeOf