From eb93ba67fc80b9a9b6ff2c4366bb62945eb3bfab Mon Sep 17 00:00:00 2001 From: Zachary Snow Date: Sat, 6 Jun 2020 21:26:14 -0400 Subject: [PATCH] integer atom explicit sign cast support --- src/Convert/SizeCast.hs | 5 +++++ src/Language/SystemVerilog/AST/Type.hs | 8 ++++---- test/basic/cast.sv | 8 ++++++++ test/basic/cast.v | 14 ++++++++++++++ test/lib/functions.sh | 2 +- 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/Convert/SizeCast.hs b/src/Convert/SizeCast.hs index ec4cdc1..a6d4ee9 100644 --- a/src/Convert/SizeCast.hs +++ b/src/Convert/SizeCast.hs @@ -162,4 +162,9 @@ typeSigning :: Type -> Maybe Signing typeSigning (Net _ sg _) = Just sg typeSigning (Implicit sg _) = Just sg typeSigning (IntegerVector _ sg _) = Just sg +typeSigning (IntegerAtom t sg ) = + Just $ case (sg, t) of + (Unspecified, TTime) -> Unsigned + (Unspecified, _ ) -> Signed + (_ , _ ) -> sg typeSigning _ = Nothing diff --git a/src/Language/SystemVerilog/AST/Type.hs b/src/Language/SystemVerilog/AST/Type.hs index 8f52ddb..8dfe63b 100644 --- a/src/Language/SystemVerilog/AST/Type.hs +++ b/src/Language/SystemVerilog/AST/Type.hs @@ -120,10 +120,10 @@ nullRange t rs1 = (tf, rs2) = typeRanges t' elaborateIntegerAtom :: Type -> Type -elaborateIntegerAtom (IntegerAtom TInt sg) = baseIntType sg Signed 32 -elaborateIntegerAtom (IntegerAtom TShortint sg) = baseIntType sg Signed 16 -elaborateIntegerAtom (IntegerAtom TLongint sg) = baseIntType sg Signed 64 -elaborateIntegerAtom (IntegerAtom TByte sg) = baseIntType sg Unspecified 8 +elaborateIntegerAtom (IntegerAtom TInt sg) = baseIntType sg Signed 32 +elaborateIntegerAtom (IntegerAtom TShortint sg) = baseIntType sg Signed 16 +elaborateIntegerAtom (IntegerAtom TLongint sg) = baseIntType sg Signed 64 +elaborateIntegerAtom (IntegerAtom TByte sg) = baseIntType sg Signed 8 elaborateIntegerAtom other = other -- makes a integer "compatible" type with the given signing, base signing and diff --git a/test/basic/cast.sv b/test/basic/cast.sv index 93febe3..55f24e4 100644 --- a/test/basic/cast.sv +++ b/test/basic/cast.sv @@ -33,4 +33,12 @@ module top; $display("%b", 5'(1'sb1)); end + parameter W = 9; + initial begin + byte i = -1; + byte unsigned j = -1; + $display("%b", W'(i)); + $display("%b", W'(j)); + end + endmodule diff --git a/test/basic/cast.v b/test/basic/cast.v index 9b15639..6e6e57e 100644 --- a/test/basic/cast.v +++ b/test/basic/cast.v @@ -36,4 +36,18 @@ module top; $display("%b", 5'sb11111); end + parameter W = 9; + initial begin : block + reg signed [7:0] i; + reg [7:0] j; + reg [8:0] i_extended; + reg [8:0] j_extended; + i = -1; + j = -1; + i_extended = i; + j_extended = j; + $display("%b", i_extended); + $display("%b", j_extended); + end + endmodule diff --git a/test/lib/functions.sh b/test/lib/functions.sh index 6284518..57583a0 100644 --- a/test/lib/functions.sh +++ b/test/lib/functions.sh @@ -66,7 +66,7 @@ assertConverts() { assertFalse "conversion of $ac_file still contains dimension queries" $? echo "$filtered" | egrep "\s(int\|bit\|logic\|byte\|struct\|enum\|longint\|shortint)\s" assertFalse "conversion of $ac_file still contains SV types" $? - echo "$filtered" | grep "[^$]unsigned" > /dev/null + echo "$filtered" | grep "[^\$a-zA-Z_]unsigned" > /dev/null assertFalse "conversion of $ac_file still contains unsigned keyword" $? }