aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2022-05-31 06:03:01 +0200
committerTristan Gingold <tgingold@free.fr>2022-05-31 18:28:26 +0200
commit2cb57ff6f665c72ea5c21b894aad9950fcf7608f (patch)
tree022a48f4a7634a9f73493b358024938db81ac47d /src
parentaf908ae0045f13ebd067aa4c087ff7f638a14edc (diff)
downloadghdl-2cb57ff6f665c72ea5c21b894aad9950fcf7608f.tar.gz
ghdl-2cb57ff6f665c72ea5c21b894aad9950fcf7608f.tar.bz2
ghdl-2cb57ff6f665c72ea5c21b894aad9950fcf7608f.zip
vhdl: recognize numeric_bit.to_unsigned
Diffstat (limited to 'src')
-rw-r--r--src/vhdl/vhdl-ieee-numeric.adb42
-rw-r--r--src/vhdl/vhdl-ieee-numeric.ads7
-rw-r--r--src/vhdl/vhdl-nodes.ads10
-rw-r--r--src/vhdl/vhdl-post_sems.adb3
4 files changed, 57 insertions, 5 deletions
diff --git a/src/vhdl/vhdl-ieee-numeric.adb b/src/vhdl/vhdl-ieee-numeric.adb
index 2e26eb187..96432df56 100644
--- a/src/vhdl/vhdl-ieee-numeric.adb
+++ b/src/vhdl/vhdl-ieee-numeric.adb
@@ -618,6 +618,9 @@ package body Vhdl.Ieee.Numeric is
elsif Arg_Type = Ieee.Std_Logic_1164.Std_Logic_Vector_Type then
Sign := Type_Slv;
Kind := Arg_Vect;
+ elsif Arg_Type = Vhdl.Std_Package.Bit_Type_Definition then
+ Sign := Type_Log;
+ Kind := Arg_Scal;
else
raise Error;
end if;
@@ -667,21 +670,36 @@ package body Vhdl.Ieee.Numeric is
Set_Implicit_Definition (Decl, Pats (Pkg, Arg1_Sign));
end Handle_Unary;
- procedure Handle_To_Unsigned is
+ procedure Handle_To_Unsigned
+ is
+ Predefined : Iir_Predefined_Functions;
begin
if Arg1_Kind = Arg_Scal and Arg1_Sign = Type_Unsigned then
if Arg2_Kind = Arg_Scal and Arg2_Sign = Type_Unsigned then
- Set_Implicit_Definition
- (Decl, Iir_Predefined_Ieee_Numeric_Std_Touns_Nat_Nat_Uns);
+ case Pkg is
+ when Pkg_Std =>
+ Predefined :=
+ Iir_Predefined_Ieee_Numeric_Std_Touns_Nat_Nat_Uns;
+ when Pkg_Bit =>
+ Predefined :=
+ Iir_Predefined_Ieee_Numeric_Bit_Touns_Nat_Nat_Uns;
+ end case;
elsif Arg2_Kind = Arg_Vect and Arg2_Sign = Type_Unsigned then
- Set_Implicit_Definition
- (Decl, Iir_Predefined_Ieee_Numeric_Std_Touns_Nat_Uns_Uns);
+ case Pkg is
+ when Pkg_Std =>
+ Predefined :=
+ Iir_Predefined_Ieee_Numeric_Std_Touns_Nat_Uns_Uns;
+ when Pkg_Bit =>
+ Predefined :=
+ Iir_Predefined_Ieee_Numeric_Bit_Touns_Nat_Uns_Uns;
+ end case;
else
raise Error;
end if;
else
raise Error;
end if;
+ Set_Implicit_Definition (Decl, Predefined);
end Handle_To_Unsigned;
procedure Handle_To_Signed is
@@ -1048,4 +1066,18 @@ package body Vhdl.Ieee.Numeric is
Numeric_Std_Unsigned_Type := Null_Iir;
Numeric_Std_Signed_Type := Null_Iir;
end Extract_Std_Declarations;
+
+ procedure Extract_Bit_Declarations (Pkg : Iir_Package_Declaration) is
+ begin
+ Numeric_Bit_Pkg := Pkg;
+
+ Extract_Declarations
+ (Pkg, Pkg_Bit, Numeric_Bit_Unsigned_Type, Numeric_Bit_Signed_Type);
+ exception
+ when Error =>
+ Error_Msg_Sem (+Pkg, "package ieee.numeric_bit is ill-formed");
+ Numeric_Bit_Pkg := Null_Iir;
+ Numeric_Bit_Unsigned_Type := Null_Iir;
+ Numeric_Bit_Signed_Type := Null_Iir;
+ end Extract_Bit_Declarations;
end Vhdl.Ieee.Numeric;
diff --git a/src/vhdl/vhdl-ieee-numeric.ads b/src/vhdl/vhdl-ieee-numeric.ads
index 6a329d07c..7b2a7ae8c 100644
--- a/src/vhdl/vhdl-ieee-numeric.ads
+++ b/src/vhdl/vhdl-ieee-numeric.ads
@@ -19,6 +19,13 @@ package Vhdl.Ieee.Numeric is
Numeric_Std_Unsigned_Type : Iir_Array_Type_Definition := Null_Iir;
Numeric_Std_Signed_Type : Iir_Array_Type_Definition := Null_Iir;
+ Numeric_Bit_Pkg : Iir_Package_Declaration := Null_Iir;
+ Numeric_Bit_Unsigned_Type : Iir_Array_Type_Definition := Null_Iir;
+ Numeric_Bit_Signed_Type : Iir_Array_Type_Definition := Null_Iir;
+
-- Extract declarations from PKG (ieee.numeric_std).
procedure Extract_Std_Declarations (Pkg : Iir_Package_Declaration);
+
+ -- Extract declarations from PKG (ieee.numeric_bit).
+ procedure Extract_Bit_Declarations (Pkg : Iir_Package_Declaration);
end Vhdl.Ieee.Numeric;
diff --git a/src/vhdl/vhdl-nodes.ads b/src/vhdl/vhdl-nodes.ads
index df51efb68..ae92272e1 100644
--- a/src/vhdl/vhdl-nodes.ads
+++ b/src/vhdl/vhdl-nodes.ads
@@ -5953,6 +5953,16 @@ package Vhdl.Nodes is
Iir_Predefined_Ieee_Numeric_Std_To_01_Uns,
Iir_Predefined_Ieee_Numeric_Std_To_01_Sgn,
+ -- numeric_bit
+
+ -- To_Integer, To_Unsigned, to_Signed
+ Iir_Predefined_Ieee_Numeric_Bit_Toint_Uns_Nat,
+ Iir_Predefined_Ieee_Numeric_Bit_Toint_Sgn_Int,
+ Iir_Predefined_Ieee_Numeric_Bit_Touns_Nat_Nat_Uns,
+ Iir_Predefined_Ieee_Numeric_Bit_Touns_Nat_Uns_Uns,
+ Iir_Predefined_Ieee_Numeric_Bit_Tosgn_Int_Nat_Sgn,
+ Iir_Predefined_Ieee_Numeric_Bit_Tosgn_Int_Sgn_Sgn,
+
-- Numeric_Std_Unsigned (ieee2008)
Iir_Predefined_Ieee_Numeric_Std_Unsigned_To_Integer_Slv_Nat,
Iir_Predefined_Ieee_Numeric_Std_Unsigned_To_Slv_Nat_Nat_Slv,
diff --git a/src/vhdl/vhdl-post_sems.adb b/src/vhdl/vhdl-post_sems.adb
index d4748354d..cbf508f78 100644
--- a/src/vhdl/vhdl-post_sems.adb
+++ b/src/vhdl/vhdl-post_sems.adb
@@ -59,6 +59,9 @@ package body Vhdl.Post_Sems is
Vhdl.Ieee.Std_Logic_1164.Extract_Declarations (Lib_Unit);
when Name_VITAL_Timing =>
Vhdl.Ieee.Vital_Timing.Extract_Declarations (Lib_Unit);
+ when Name_Numeric_Bit =>
+ Vhdl.Ieee.Numeric.Extract_Bit_Declarations
+ (Lib_Unit);
when Name_Numeric_Std =>
Vhdl.Ieee.Numeric.Extract_Std_Declarations
(Lib_Unit);