diff --git a/src/Convert/Struct.hs b/src/Convert/Struct.hs index 3469964..3671e3b 100644 --- a/src/Convert/Struct.hs +++ b/src/Convert/Struct.hs @@ -292,6 +292,9 @@ convertExpr (struct @ (Struct _ fields [])) (Pattern itemsOrig) = Just value = numberToInteger n Right (Number n) = item +convertExpr _ (Cast (Left t) expr@Pattern{}) = + Cast (Left t) $ convertExpr t expr + convertExpr (Implicit _ []) expr = expr convertExpr (Implicit sg rs) expr = convertExpr (IntegerVector TBit sg rs) expr diff --git a/src/Language/SystemVerilog/Parser/Parse.y b/src/Language/SystemVerilog/Parser/Parse.y index ab36641..ea2e80c 100644 --- a/src/Language/SystemVerilog/Parser/Parse.y +++ b/src/Language/SystemVerilog/Parser/Parse.y @@ -1266,6 +1266,7 @@ Expr :: { Expr } | Expr "?" Expr ":" Expr { Mux $1 $3 $5 } | Expr "." Identifier { Dot $1 $3 } | "'" "{" PatternItems "}" { Pattern $3 } + | Expr "'" "{" PatternItems "}"{ Cast (Right $1) (Pattern $4) } | CastingType "'" "(" Expr ")" { Cast (Left $1) $4 } | Expr "'" "(" Expr ")" { Cast (Right $1) $4 } | "{" StreamOp StreamSize Concat "}" { Stream $2 $3 $4 } diff --git a/test/core/struct_pattern_cast.sv b/test/core/struct_pattern_cast.sv new file mode 100644 index 0000000..50315b2 --- /dev/null +++ b/test/core/struct_pattern_cast.sv @@ -0,0 +1,12 @@ +module top; + typedef struct packed { + integer x; + byte y; + } S; + typedef struct packed { + byte x; + shortint y; + S z; + } T; + initial $display("%b", T'{ x: 1, y: 2, z: '{ x: 3, y: 4 } }); +endmodule diff --git a/test/core/struct_pattern_cast.v b/test/core/struct_pattern_cast.v new file mode 100644 index 0000000..d8b63a0 --- /dev/null +++ b/test/core/struct_pattern_cast.v @@ -0,0 +1,3 @@ +module top; + initial $display("%b", { 8'd1, 16'd2, 32'd3, 8'd4 } ); +endmodule