From 2cb57ff6f665c72ea5c21b894aad9950fcf7608f Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Tue, 31 May 2022 06:03:01 +0200 Subject: vhdl: recognize numeric_bit.to_unsigned --- src/vhdl/vhdl-ieee-numeric.adb | 42 +++++++++++++++++++++++++++++++++++++----- src/vhdl/vhdl-ieee-numeric.ads | 7 +++++++ src/vhdl/vhdl-nodes.ads | 10 ++++++++++ src/vhdl/vhdl-post_sems.adb | 3 +++ 4 files changed, 57 insertions(+), 5 deletions(-) (limited to 'src') 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); -- cgit v1.2.3