diff --git a/src/Convert/Enum.hs b/src/Convert/Enum.hs index bf013de..49bcba2 100644 --- a/src/Convert/Enum.hs +++ b/src/Convert/Enum.hs @@ -64,11 +64,8 @@ convertDescription' description = (description', enumPairs) where -- replace and collect the enum types in this description - (description', enums) = - runWriter $ - traverseModuleItemsM (traverseTypesM traverseType) $ - traverseModuleItems (traverseExprs $ traverseNestedExprs traverseExpr) $ - description + (description', enums) = runWriter $ + traverseModuleItemsM (traverseTypesM traverseType) description -- convert the collected enums into their corresponding localparams enumPairs = concatMap enumVals $ Set.toList enums @@ -126,13 +123,6 @@ traverseType other = return other simplifyRange :: Range -> Range simplifyRange (a, b) = (simplify a, simplify b) --- drop any enum type casts in favor of implicit conversion from the --- converted type -traverseExpr :: Expr -> Expr -traverseExpr (Cast (Left (IntegerVector _ _ _)) e) = e -traverseExpr (Cast (Left (Enum _ _ _)) e) = e -traverseExpr other = other - enumVals :: EnumInfo -> [EnumItem] enumVals (mr, l) = -- check for obviously duplicate values diff --git a/src/Convert/Simplify.hs b/src/Convert/Simplify.hs index 09f044f..f963d93 100644 --- a/src/Convert/Simplify.hs +++ b/src/Convert/Simplify.hs @@ -66,7 +66,7 @@ convertExpr info (Call (Ident "$clog2") (Args [Just e] [])) = clog2' = simplify clog2 convertExpr info (Mux cc aa bb) = if before == after - then Mux cc aa bb + then simplify $ Mux cc aa bb else simplify $ Mux after aa bb where before = substitute info cc diff --git a/src/Convert/SizeCast.hs b/src/Convert/SizeCast.hs index 90580ec..98cd5c1 100644 --- a/src/Convert/SizeCast.hs +++ b/src/Convert/SizeCast.hs @@ -72,19 +72,25 @@ traverseExprM = return orig convertExprM (Cast (Right s) e) = convertCastM s e + convertExprM (Cast (Left (IntegerVector _ Signed rs)) e) = + convertCastWithSigningM (dimensionsSize rs) e Signed + convertExprM (Cast (Left (IntegerVector _ _ rs)) e) = + convertExprM $ Cast (Right $ dimensionsSize rs) e convertExprM other = return other convertCastM :: Expr -> Expr -> ST Expr convertCastM s e = do typeMap <- get case exprSigning typeMap e of - Just sg -> do - lift $ tell $ Set.singleton (s, sg) - let f = castFnName s sg - let args = Args [Just e] [] - return $ Call (Ident f) args + Just sg -> convertCastWithSigningM s e sg _ -> return $ Cast (Right s) e + convertCastWithSigningM :: Expr -> Expr -> Signing -> ST Expr + convertCastWithSigningM s e sg = do + lift $ tell $ Set.singleton (s, sg) + let f = castFnName s sg + let args = Args [Just e] [] + return $ Call (Ident f) args castFn :: Expr -> Signing -> Description castFn e sg = diff --git a/src/Convert/Struct.hs b/src/Convert/Struct.hs index d92e31f..e42e813 100644 --- a/src/Convert/Struct.hs +++ b/src/Convert/Struct.hs @@ -275,16 +275,20 @@ convertAsgn structs types (lhs, expr) = 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{}) (Pattern items) = + if all (null . fst) items + then convertExpr t $ Concat $ map snd items + else Pattern items 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) + caster = Cast (Left $ dropInnerTypeRange t) exprs' = map caster exprs isUnsizedNumber :: Expr -> Bool isUnsizedNumber (Number n) = not $ elem '\'' n + isUnsizedNumber (UniOp UniSub e) = isUnsizedNumber e isUnsizedNumber _ = False convertExpr (Struct packing fields (_:rs)) (Concat exprs) = Concat $ map (convertExpr (Struct packing fields rs)) exprs diff --git a/src/Convert/TypeOf.hs b/src/Convert/TypeOf.hs index 15eeca1..ae265ff 100644 --- a/src/Convert/TypeOf.hs +++ b/src/Convert/TypeOf.hs @@ -93,6 +93,7 @@ typeof (orig @ (Range e mode r)) = do NonIndexed -> snd r IndexedPlus -> BinOp Sub (uncurry (BinOp Add) r) (Number "1") IndexedMinus -> BinOp Add (uncurry (BinOp Sub) r) (Number "1") +typeof (BinOp Add e Number{}) = typeof e typeof other = return $ TypeOf other -- combines a type with unpacked ranges diff --git a/test/basic/integer_array.sv b/test/basic/integer_array.sv index a4ff724..de19161 100644 --- a/test/basic/integer_array.sv +++ b/test/basic/integer_array.sv @@ -1,12 +1,24 @@ 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 }; + localparam integer A [4] = { 1, 2, 3, 4 }; + localparam byte B [4] = { 1, 2, 3, 4 }; + localparam bit C [4] = { 1, 2, 3, 4 }; + localparam integer signed D [4] = { -1, -2, -3, -4 }; + localparam byte signed E [4] = { -1, -2, -3, -4 }; + localparam bit signed F [4] = { -1, -2, -3, -4 }; + localparam integer G [4] = '{ 1, 2, 3, 4 }; + localparam byte H [4] = '{ 1, 2, 3, 4 }; + localparam bit I [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(A); `PRINT(B); `PRINT(C); `PRINT(D); + `PRINT(E); + `PRINT(F); + `PRINT(G); + `PRINT(H); + `PRINT(I); end endmodule diff --git a/test/basic/integer_array.v b/test/basic/integer_array.v index d68ab85..8f7ee03 100644 --- a/test/basic/integer_array.v +++ b/test/basic/integer_array.v @@ -1,10 +1,22 @@ 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 }; + localparam [0:127] A = { 32'h1, 32'h2, 32'h3, 32'h4 }; + localparam [0:31] B = { 8'h1, 8'h2, 8'h3, 8'h4 }; + localparam [0:3] C = { 1'h1, 1'h0, 1'h1, 1'h0 }; + localparam [0:127] D = { 32'hFFFFFFFF, 32'hFFFFFFFE, 32'hFFFFFFFD, 32'hFFFFFFFC }; + localparam [0:31] E = { 8'hFF, 8'hFE, 8'hFD, 8'hFC }; + localparam [0:3] F = { 1'h1, 1'h0, 1'h1, 1'h0 }; + localparam [0:127] G = { 32'h1, 32'h2, 32'h3, 32'h4 }; + localparam [0:31] H = { 8'h1, 8'h2, 8'h3, 8'h4 }; + localparam [0:3] I = { 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); + $display("%b %2d %2d", A, $bits(A), 32); + $display("%b %2d %2d", B, $bits(B), 8); + $display("%b %2d %2d", C, $bits(C), 1); + $display("%b %2d %2d", D, $bits(D), 32); + $display("%b %2d %2d", E, $bits(E), 8); + $display("%b %2d %2d", F, $bits(F), 1); + $display("%b %2d %2d", G, $bits(G), 32); + $display("%b %2d %2d", H, $bits(H), 8); + $display("%b %2d %2d", I, $bits(I), 1); end endmodule