diff --git a/src/Convert/Struct.hs b/src/Convert/Struct.hs index 2e131a8..7b86fae 100644 --- a/src/Convert/Struct.hs +++ b/src/Convert/Struct.hs @@ -271,6 +271,19 @@ convertAsgn structs types (lhs, expr) = convertExpr (IntegerVector t sg (r:rs)) (Pattern [(":default", e)]) = Repeat (rangeSize r) [e'] where e' = convertExpr (IntegerVector t sg rs) e + -- TODO: This is a conversion for concat array literals with elements + -- that are unsized numbers. This probably belongs somewhere else. + convertExpr (t @ IntegerVector{}) (Concat exprs) = + if all isUnsizedNumber exprs + then Concat exprs' + else Concat exprs + where + size = DimsFn FnBits (Left $ dropInnerTypeRange t) + caster = Cast (Right size) + exprs' = map caster exprs + isUnsizedNumber :: Expr -> Bool + isUnsizedNumber (Number n) = not $ elem '\'' n + isUnsizedNumber _ = False convertExpr (Struct packing fields (_:rs)) (Concat exprs) = Concat $ map (convertExpr (Struct packing fields rs)) exprs convertExpr (Struct packing fields (_:rs)) (Bit e _) = diff --git a/test/basic/integer_array.sv b/test/basic/integer_array.sv new file mode 100644 index 0000000..a4ff724 --- /dev/null +++ b/test/basic/integer_array.sv @@ -0,0 +1,12 @@ +module top; + localparam integer B [4] = { 1, 2, 3, 4 }; + localparam byte C [4] = { 1, 2, 3, 4 }; + localparam bit D [4] = { 1, 2, 3, 4 }; + initial begin +`define PRINT(X) \ + $display("%b %2d %2d", {X[0], X[1], X[2], X[3]}, $bits(X), $bits(X[0])); + `PRINT(B); + `PRINT(C); + `PRINT(D); + end +endmodule diff --git a/test/basic/integer_array.v b/test/basic/integer_array.v new file mode 100644 index 0000000..d68ab85 --- /dev/null +++ b/test/basic/integer_array.v @@ -0,0 +1,10 @@ +module top; + localparam [0:127] B = { 32'h1, 32'h2, 32'h3, 32'h4 }; + localparam [0:31] C = { 8'h1, 8'h2, 8'h3, 8'h4 }; + localparam [0:3] D = { 1'h1, 1'h0, 1'h1, 1'h0 }; + initial begin + $display("%b %2d %2d", B, $bits(B), 32); + $display("%b %2d %2d", C, $bits(C), 8); + $display("%b %2d %2d", D, $bits(D), 1); + end +endmodule