Commit 04d6fa61 by Zachary Snow

fix additional type parameter instantiation issues

- avoid premature conversion of default struct type parameters
- allow use of $clog2, $signed, and $unsigned in type parameters
- more thorough and efficient top reference ident renaming
- precede type param conversion with hier const pass
parent 623f0a2d
...@@ -75,10 +75,10 @@ mainPhases selectExclude = ...@@ -75,10 +75,10 @@ mainPhases selectExclude =
, Convert.MultiplePacked.convert , Convert.MultiplePacked.convert
, Convert.UnbasedUnsized.convert , Convert.UnbasedUnsized.convert
, Convert.Cast.convert , Convert.Cast.convert
, Convert.ParamType.convert
, Convert.HierConst.convert , Convert.HierConst.convert
, Convert.TypeOf.convert , Convert.TypeOf.convert
, Convert.DimensionQuery.convert , Convert.DimensionQuery.convert
, Convert.ParamType.convert
, Convert.Simplify.convert , Convert.Simplify.convert
, Convert.Stream.convert , Convert.Stream.convert
, Convert.Struct.convert , Convert.Struct.convert
......
...@@ -150,13 +150,15 @@ convert files = ...@@ -150,13 +150,15 @@ convert files =
Part attrs extern kw ml m p items = part Part attrs extern kw ml m p items = part
m' = moduleInstanceName m typeMap m' = moduleInstanceName m typeMap
items' = map rewriteModuleItem items items' = map rewriteModuleItem items
rewriteModuleItem = traverseDecls rewriteDecl . rewriteModuleItem = traverseNestedModuleItems $ traverseNodes
traverseNestedModuleItems rewriteExpr rewriteDecl rewriteType rewriteLHS rewriteStmt
(traverseExprs rewriteExpr . traverseLHSs rewriteLHS)
rewriteDecl :: Decl -> Decl rewriteDecl :: Decl -> Decl
rewriteDecl (ParamType Parameter x _) = rewriteDecl (ParamType Parameter x _) =
ParamType Localparam x (fst $ typeMap Map.! x) ParamType Localparam x t
rewriteDecl other = other where t = rewriteType $ fst $ typeMap Map.! x
rewriteDecl other =
traverseDeclTypes rewriteType $
traverseDeclExprs rewriteExpr other
additionalParamItems = concatMap makeAddedParams $ additionalParamItems = concatMap makeAddedParams $
Map.toList $ Map.map snd typeMap Map.toList $ Map.map snd typeMap
rewriteExpr :: Expr -> Expr rewriteExpr :: Expr -> Expr
...@@ -177,7 +179,13 @@ convert files = ...@@ -177,7 +179,13 @@ convert files =
traverseSinglyNestedLHSs rewriteLHS other traverseSinglyNestedLHSs rewriteLHS other
rewriteType :: Type -> Type rewriteType :: Type -> Type
rewriteType = rewriteType =
traverseNestedTypes $ traverseTypeExprs rewriteExpr traverseTypeExprs rewriteExpr .
traverseSinglyNestedTypes rewriteType
rewriteStmt :: Stmt -> Stmt
rewriteStmt =
traverseStmtLHSs rewriteLHS .
traverseStmtExprs rewriteExpr .
traverseSinglyNestedStmts rewriteStmt
makeAddedParams :: (Identifier, IdentSet) -> [ModuleItem] makeAddedParams :: (Identifier, IdentSet) -> [ModuleItem]
makeAddedParams (paramName, identSet) = makeAddedParams (paramName, identSet) =
...@@ -289,6 +297,9 @@ prepareTypeIdents prefix = ...@@ -289,6 +297,9 @@ prepareTypeIdents prefix =
(traverseTypeExprsM $ traverseNestedExprsM prepareExprIdents) (traverseTypeExprsM $ traverseNestedExprsM prepareExprIdents)
where where
prepareExprIdents :: Expr -> Writer IdentSet Expr prepareExprIdents :: Expr -> Writer IdentSet Expr
prepareExprIdents (e @ (Ident "$unsigned")) = return e
prepareExprIdents (e @ (Ident "$signed" )) = return e
prepareExprIdents (e @ (Ident "$clog2" )) = return e
prepareExprIdents (Ident x) = do prepareExprIdents (Ident x) = do
tell $ Set.singleton x tell $ Set.singleton x
return $ Ident $ prefix ++ '_' : x return $ Ident $ prefix ++ '_' : x
......
...@@ -27,6 +27,7 @@ module Convert.Traverse ...@@ -27,6 +27,7 @@ module Convert.Traverse
, traverseExprs , traverseExprs
, collectExprsM , collectExprsM
, traverseNodesM , traverseNodesM
, traverseNodes
, traverseStmtExprsM , traverseStmtExprsM
, traverseStmtExprs , traverseStmtExprs
, collectStmtExprsM , collectStmtExprsM
...@@ -98,6 +99,8 @@ module Convert.Traverse ...@@ -98,6 +99,8 @@ module Convert.Traverse
, traverseFiles , traverseFiles
, traverseSinglyNestedGenItemsM , traverseSinglyNestedGenItemsM
, traverseSinglyNestedStmtsM , traverseSinglyNestedStmtsM
, traverseSinglyNestedStmts
, collectSinglyNestedStmtsM
) where ) where
import Data.Functor.Identity (Identity, runIdentity) import Data.Functor.Identity (Identity, runIdentity)
...@@ -252,6 +255,11 @@ traverseSinglyNestedStmtsM fullMapper = cs ...@@ -252,6 +255,11 @@ traverseSinglyNestedStmtsM fullMapper = cs
cs (Null) = return Null cs (Null) = return Null
cs (CommentStmt c) = return $ CommentStmt c cs (CommentStmt c) = return $ CommentStmt c
traverseSinglyNestedStmts :: Mapper Stmt -> Mapper Stmt
traverseSinglyNestedStmts = unmonad traverseSinglyNestedStmtsM
collectSinglyNestedStmtsM :: Monad m => CollectorM m Stmt -> CollectorM m Stmt
collectSinglyNestedStmtsM = collectify traverseSinglyNestedStmtsM
traverseAssertionStmtsM :: Monad m => MapperM m Stmt -> MapperM m Assertion traverseAssertionStmtsM :: Monad m => MapperM m Stmt -> MapperM m Assertion
traverseAssertionStmtsM mapper = assertionMapper traverseAssertionStmtsM mapper = assertionMapper
where where
...@@ -623,6 +631,21 @@ traverseNodesM exprMapper declMapper typeMapper lhsMapper stmtMapper = ...@@ -623,6 +631,21 @@ traverseNodesM exprMapper declMapper typeMapper lhsMapper stmtMapper =
e' <- exprMapper e e' <- exprMapper e
return (dir, ident, e') return (dir, ident, e')
traverseNodes
:: Mapper Expr
-> Mapper Decl
-> Mapper Type
-> Mapper LHS
-> Mapper Stmt
-> Mapper ModuleItem
traverseNodes exprMapper declMapper typeMapper lhsMapper stmtMapper =
runIdentity . traverseNodesM
(return . exprMapper)
(return . declMapper)
(return . typeMapper)
(return . lhsMapper )
(return . stmtMapper)
traverseStmtExprsM :: Monad m => MapperM m Expr -> MapperM m Stmt traverseStmtExprsM :: Monad m => MapperM m Expr -> MapperM m Stmt
traverseStmtExprsM exprMapper = flatStmtMapper traverseStmtExprsM exprMapper = flatStmtMapper
where where
...@@ -947,7 +970,12 @@ traverseTypesM' strategy mapper = ...@@ -947,7 +970,12 @@ traverseTypesM' strategy mapper =
traverseExprsM (traverseNestedExprsM exprMapper) traverseExprsM (traverseNestedExprsM exprMapper)
where where
exprMapper = traverseExprTypesM mapper exprMapper = traverseExprTypesM mapper
declMapper = traverseDeclTypesM mapper declMapper =
if strategy == IncludeParamTypes
then traverseDeclTypesM mapper
else \decl -> case decl of
ParamType{} -> return decl
_ -> traverseDeclTypesM mapper decl
miMapper (MIPackageItem (Function l t x d s)) = miMapper (MIPackageItem (Function l t x d s)) =
mapper t >>= \t' -> return $ MIPackageItem $ Function l t' x d s mapper t >>= \t' -> return $ MIPackageItem $ Function l t' x d s
miMapper (MIPackageItem (other @ (Task _ _ _ _))) = miMapper (MIPackageItem (other @ (Task _ _ _ _))) =
......
...@@ -72,8 +72,8 @@ module p #( ...@@ -72,8 +72,8 @@ module p #(
T x = 0; T x = 0;
U y = 1; U y = 1;
initial begin initial begin
$display("p %b %b %d", x, x+1, $bits(T)); $display("p %b %b %0d", x, x+1, $bits(T));
$display("p %b %b %d", y, y+1, $bits(U)); $display("p %b %b %0d", y, y+1, $bits(U));
end end
endmodule endmodule
...@@ -112,3 +112,6 @@ module f_4; o_nodef #(.T(logic [1:0]), .U(logic), .b(0), .a(1)) x(); endmodule ...@@ -112,3 +112,6 @@ module f_4; o_nodef #(.T(logic [1:0]), .U(logic), .b(0), .a(1)) x(); endmodule
module p_1; p #(logic [1:0], logic [2:0]) x(); endmodule module p_1; p #(logic [1:0], logic [2:0]) x(); endmodule
module p_2; p x(); endmodule module p_2; p x(); endmodule
module p_3; localparam W = 2; p #(logic [W:0], logic [W:0]) x(); endmodule module p_3; localparam W = 2; p #(logic [W:0], logic [W:0]) x(); endmodule
module p_4; parameter W = 2; p #(logic [$clog2(W):0], logic [$clog2(W):0]) x(); endmodule
module p_5; parameter W = 2; p #(logic [$unsigned(W):0], logic [$unsigned(W):0]) x(); endmodule
module p_6; parameter W = 2; p #(logic [$signed(W):0], logic [$signed(W):0]) x(); endmodule
...@@ -36,11 +36,17 @@ module top; ...@@ -36,11 +36,17 @@ module top;
$display("n_nodef b= 1 001 00000000000000000000000000000010 3"); $display("n_nodef b= 1 001 00000000000000000000000000000010 3");
$display("n_nodef a= 1 01 00000000000000000000000000000010 2"); $display("n_nodef a= 1 01 00000000000000000000000000000010 2");
$display("n_nodef b= 0 0 00000000000000000000000000000001 1"); $display("n_nodef b= 0 0 00000000000000000000000000000001 1");
$display("p 00 00000000000000000000000000000001 2"); $display("p 00 00000000000000000000000000000001 2");
$display("p 001 00000000000000000000000000000010 3"); $display("p 001 00000000000000000000000000000010 3");
$display("p 0 00000000000000000000000000000001 1"); $display("p 0 00000000000000000000000000000001 1");
$display("p 1 00000000000000000000000000000010 1"); $display("p 1 00000000000000000000000000000010 1");
$display("p 000 00000000000000000000000000000001 3"); $display("p 000 00000000000000000000000000000001 3");
$display("p 001 00000000000000000000000000000010 3"); $display("p 001 00000000000000000000000000000010 3");
$display("p 00 00000000000000000000000000000001 2");
$display("p 01 00000000000000000000000000000010 2");
$display("p 000 00000000000000000000000000000001 3");
$display("p 001 00000000000000000000000000000010 3");
$display("p 000 00000000000000000000000000000001 3");
$display("p 001 00000000000000000000000000000010 3");
end end
endmodule endmodule
module example(inp, data, valid);
parameter W = 16;
typedef struct packed {
logic [W-1:0] data;
logic valid;
} line_t;
parameter type local_line_t = line_t;
input local_line_t inp;
output logic [W-1:0] data;
assign data = inp.data;
output logic valid;
assign valid = inp.valid;
endmodule
module top;
reg [16:0] inp;
wire [15:0] data;
wire valid;
example e(.*);
initial inp = 17'b1_01100011_11001111;
endmodule
module top;
reg [16:0] inp;
wire [15:0] data;
wire valid;
assign data = inp[16:1];
assign valid = inp[0];
initial inp = 17'b1_01100011_11001111;
endmodule
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