struct conversion includes exprs in decls

This commit is contained in:
Zachary Snow 2020-06-13 22:14:53 -04:00
parent 3baa9cbac7
commit 682620b23f
3 changed files with 23 additions and 2 deletions

View File

@ -31,7 +31,7 @@ convertDescription (description @ Part{}) =
Part attrs extern kw lifetime name ports (items ++ funcs) Part attrs extern kw lifetime name ports (items ++ funcs)
where where
description' @ (Part attrs extern kw lifetime name ports items) = description' @ (Part attrs extern kw lifetime name ports items) =
scopedConversion (traverseDeclM structs) traverseModuleItemM scopedConversion traverseDeclM' traverseModuleItemM
traverseStmtM tfArgTypes description traverseStmtM tfArgTypes description
-- collect information about this description -- collect information about this description
structs = execWriter $ collectModuleItemsM structs = execWriter $ collectModuleItemsM
@ -45,6 +45,12 @@ convertDescription (description @ Part{}) =
funcs = map packerFn $ filter isNeeded $ Map.keys structs funcs = map packerFn $ filter isNeeded $ Map.keys structs
isNeeded tf = Set.member (packerFnName tf) calledPackedFuncs isNeeded tf = Set.member (packerFnName tf) calledPackedFuncs
-- helpers for the scoped traversal -- helpers for the scoped traversal
traverseDeclM' :: Decl -> State Types Decl
traverseDeclM' decl = do
decl' <- traverseDeclM structs decl
res <- traverseModuleItemM $ MIPackageItem $ Decl decl'
let MIPackageItem (Decl decl'') = res
return decl''
traverseModuleItemM :: ModuleItem -> State Types ModuleItem traverseModuleItemM :: ModuleItem -> State Types ModuleItem
traverseModuleItemM item = traverseModuleItemM item =
traverseLHSsM traverseLHSM item >>= traverseLHSsM traverseLHSM item >>=

View File

@ -3,12 +3,22 @@ package top_pkg;
endpackage endpackage
package foo_pkg; package foo_pkg;
typedef struct packed {
logic valid;
logic value;
} mask_t;
typedef struct packed { typedef struct packed {
logic valid; logic valid;
logic [top_pkg::AW-1:0] user; logic [top_pkg::AW-1:0] user;
mask_t mask;
} boo_t; } boo_t;
endpackage endpackage
module top; module top;
foo_pkg::boo_t foo; foo_pkg::boo_t foo;
assign foo = 19'b110_01001000_01110100;
wire [7:0] bar;
parameter FLAG = 1;
assign bar = FLAG ? foo.user[0+:8] : '1;
endmodule endmodule

View File

@ -1,4 +1,9 @@
module top; module top;
localparam AW = 16; localparam AW = 16;
wire [16:0] foo; wire [AW+2:0] foo;
assign foo = 19'b110_01001000_01110100;
wire [7:0] bar;
parameter FLAG = 1;
assign bar = FLAG ? foo[2+:8] : 8'hFF;
endmodule endmodule