Commit c5fdf386 by Zachary Snow

added conversion which adds names to unnamed blocks with decls

parent f76f9bb8
...@@ -18,6 +18,7 @@ import qualified Convert.FuncRet ...@@ -18,6 +18,7 @@ import qualified Convert.FuncRet
import qualified Convert.Interface import qualified Convert.Interface
import qualified Convert.KWArgs import qualified Convert.KWArgs
import qualified Convert.Logic import qualified Convert.Logic
import qualified Convert.NamedBlock
import qualified Convert.PackedArray import qualified Convert.PackedArray
import qualified Convert.Return import qualified Convert.Return
import qualified Convert.StarPort import qualified Convert.StarPort
...@@ -33,6 +34,7 @@ type Phase = AST -> AST ...@@ -33,6 +34,7 @@ type Phase = AST -> AST
phases :: [Job.Exclude] -> [Phase] phases :: [Job.Exclude] -> [Phase]
phases excludes = phases excludes =
[ Convert.AsgnOp.convert [ Convert.AsgnOp.convert
, Convert.NamedBlock.convert
, Convert.Assertion.convert , Convert.Assertion.convert
, Convert.Bits.convert , Convert.Bits.convert
, selectExclude (Job.Logic , Convert.Logic.convert) , selectExclude (Job.Logic , Convert.Logic.convert)
......
{- sv2v
- Author: Zachary Snow <zach@zachjs.com>
-
- Conversion for unnamed blocks with contain data declarations
-}
module Convert.NamedBlock (convert) where
import Control.Monad.State
import qualified Data.Set as Set
import Convert.Traverse
import Language.SystemVerilog.AST
type Idents = Set.Set Identifier
convert :: AST -> AST
convert ast =
-- we collect all the existing blocks in the first pass to make sure we
-- don't generate conflicting names on repeated passes of this conversion
evalState (runner collectStmtM ast >>= runner traverseStmtM) Set.empty
where runner = traverseDescriptionsM . traverseModuleItemsM . traverseStmtsM
collectStmtM :: Stmt -> State Idents Stmt
collectStmtM (Block (Just x) decls stmts) = do
modify $ Set.insert x
return $ Block (Just x) decls stmts
collectStmtM other = return other
traverseStmtM :: Stmt -> State Idents Stmt
traverseStmtM (Block Nothing [] stmts) =
return $ Block Nothing [] stmts
traverseStmtM (Block Nothing decls stmts) = do
names <- get
let x = uniqueBlockName names
modify $ Set.insert x
return $ Block (Just x) decls stmts
traverseStmtM other = return other
uniqueBlockName :: Idents -> Identifier
uniqueBlockName names =
step ("sv2v_autoblock_" ++ (show $ Set.size names)) 0
where
step :: Identifier -> Int -> Identifier
step base n =
if Set.member name names
then step base (n + 1)
else name
where
name = if n == 0
then base
else base ++ "_" ++ show n
...@@ -62,6 +62,7 @@ executable sv2v ...@@ -62,6 +62,7 @@ executable sv2v
Convert.Interface Convert.Interface
Convert.KWArgs Convert.KWArgs
Convert.Logic Convert.Logic
Convert.NamedBlock
Convert.PackedArray Convert.PackedArray
Convert.Return Convert.Return
Convert.StarPort Convert.StarPort
......
module top;
// The below blocks must be named when converted to Verilog-2005 because it
// contains a data declaration.
initial begin
integer i;
i = 1;
$display("%08d", i);
end
initial begin
integer i;
i = 1;
$display("%08d", i);
end
endmodule
module top;
initial begin : block_name1
integer i;
i = 1;
$display("%08d", i);
end
initial begin : block_name2
integer i;
i = 1;
$display("%08d", i);
end
endmodule
// intentionally empty
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment