diff options
Diffstat (limited to 'src/vhdl/vhdl-ieee-numeric.adb')
-rw-r--r-- | src/vhdl/vhdl-ieee-numeric.adb | 130 |
1 files changed, 113 insertions, 17 deletions
diff --git a/src/vhdl/vhdl-ieee-numeric.adb b/src/vhdl/vhdl-ieee-numeric.adb index 2e26eb187..3a77bd0e8 100644 --- a/src/vhdl/vhdl-ieee-numeric.adb +++ b/src/vhdl/vhdl-ieee-numeric.adb @@ -466,9 +466,13 @@ package body Vhdl.Ieee.Numeric is (Pkg_Std => (Type_Unsigned => (Arg_Vect_Vect => Iir_Predefined_Ieee_Numeric_Std_And_Uns_Uns, + Arg_Vect_Log => Iir_Predefined_Ieee_Numeric_Std_And_Uns_Log, + Arg_Log_Vect => Iir_Predefined_Ieee_Numeric_Std_And_Log_Uns, others => Iir_Predefined_None), Type_Signed => (Arg_Vect_Vect => Iir_Predefined_Ieee_Numeric_Std_And_Sgn_Sgn, + Arg_Vect_Log => Iir_Predefined_Ieee_Numeric_Std_And_Sgn_Log, + Arg_Log_Vect => Iir_Predefined_Ieee_Numeric_Std_And_Log_Sgn, others => Iir_Predefined_None)), Pkg_Bit => (others => @@ -478,9 +482,13 @@ package body Vhdl.Ieee.Numeric is (Pkg_Std => (Type_Unsigned => (Arg_Vect_Vect => Iir_Predefined_Ieee_Numeric_Std_Or_Uns_Uns, + Arg_Vect_Log => Iir_Predefined_Ieee_Numeric_Std_Or_Uns_Log, + Arg_Log_Vect => Iir_Predefined_Ieee_Numeric_Std_Or_Log_Uns, others => Iir_Predefined_None), Type_Signed => (Arg_Vect_Vect => Iir_Predefined_Ieee_Numeric_Std_Or_Sgn_Sgn, + Arg_Vect_Log => Iir_Predefined_Ieee_Numeric_Std_Or_Sgn_Log, + Arg_Log_Vect => Iir_Predefined_Ieee_Numeric_Std_Or_Log_Sgn, others => Iir_Predefined_None)), Pkg_Bit => (others => @@ -490,9 +498,13 @@ package body Vhdl.Ieee.Numeric is (Pkg_Std => (Type_Unsigned => (Arg_Vect_Vect => Iir_Predefined_Ieee_Numeric_Std_Nand_Uns_Uns, + Arg_Vect_Log => Iir_Predefined_Ieee_Numeric_Std_Nand_Uns_Log, + Arg_Log_Vect => Iir_Predefined_Ieee_Numeric_Std_Nand_Log_Uns, others => Iir_Predefined_None), Type_Signed => (Arg_Vect_Vect => Iir_Predefined_Ieee_Numeric_Std_Nand_Sgn_Sgn, + Arg_Vect_Log => Iir_Predefined_Ieee_Numeric_Std_Nand_Sgn_Log, + Arg_Log_Vect => Iir_Predefined_Ieee_Numeric_Std_Nand_Log_Sgn, others => Iir_Predefined_None)), Pkg_Bit => (others => @@ -502,9 +514,13 @@ package body Vhdl.Ieee.Numeric is (Pkg_Std => (Type_Unsigned => (Arg_Vect_Vect => Iir_Predefined_Ieee_Numeric_Std_Nor_Uns_Uns, + Arg_Vect_Log => Iir_Predefined_Ieee_Numeric_Std_Nor_Uns_Log, + Arg_Log_Vect => Iir_Predefined_Ieee_Numeric_Std_Nor_Log_Uns, others => Iir_Predefined_None), Type_Signed => (Arg_Vect_Vect => Iir_Predefined_Ieee_Numeric_Std_Nor_Sgn_Sgn, + Arg_Vect_Log => Iir_Predefined_Ieee_Numeric_Std_Nor_Sgn_Log, + Arg_Log_Vect => Iir_Predefined_Ieee_Numeric_Std_Nor_Log_Sgn, others => Iir_Predefined_None)), Pkg_Bit => (others => @@ -514,9 +530,13 @@ package body Vhdl.Ieee.Numeric is (Pkg_Std => (Type_Unsigned => (Arg_Vect_Vect => Iir_Predefined_Ieee_Numeric_Std_Xor_Uns_Uns, + Arg_Vect_Log => Iir_Predefined_Ieee_Numeric_Std_Xor_Uns_Log, + Arg_Log_Vect => Iir_Predefined_Ieee_Numeric_Std_Xor_Log_Uns, others => Iir_Predefined_None), Type_Signed => (Arg_Vect_Vect => Iir_Predefined_Ieee_Numeric_Std_Xor_Sgn_Sgn, + Arg_Vect_Log => Iir_Predefined_Ieee_Numeric_Std_Xor_Sgn_Log, + Arg_Log_Vect => Iir_Predefined_Ieee_Numeric_Std_Xor_Log_Sgn, others => Iir_Predefined_None)), Pkg_Bit => (others => @@ -526,9 +546,13 @@ package body Vhdl.Ieee.Numeric is (Pkg_Std => (Type_Unsigned => (Arg_Vect_Vect => Iir_Predefined_Ieee_Numeric_Std_Xnor_Uns_Uns, + Arg_Vect_Log => Iir_Predefined_Ieee_Numeric_Std_Xnor_Uns_Log, + Arg_Log_Vect => Iir_Predefined_Ieee_Numeric_Std_Xnor_Log_Uns, others => Iir_Predefined_None), Type_Signed => (Arg_Vect_Vect => Iir_Predefined_Ieee_Numeric_Std_Xnor_Sgn_Sgn, + Arg_Vect_Log => Iir_Predefined_Ieee_Numeric_Std_Xnor_Sgn_Log, + Arg_Log_Vect => Iir_Predefined_Ieee_Numeric_Std_Xnor_Log_Sgn, others => Iir_Predefined_None)), Pkg_Bit => (others => @@ -582,6 +606,34 @@ package body Vhdl.Ieee.Numeric is (Type_Signed => Iir_Predefined_Ieee_Numeric_Std_Find_Rightmost_Sgn, Type_Unsigned => Iir_Predefined_Ieee_Numeric_Std_Find_Rightmost_Uns); + To_01_Patterns : constant Shift_Pattern_Type := + (Type_Signed => Iir_Predefined_Ieee_Numeric_Std_To_01_Sgn, + Type_Unsigned => Iir_Predefined_Ieee_Numeric_Std_To_01_Uns); + + To_X01_Patterns : constant Shift_Pattern_Type := + (Type_Signed => Iir_Predefined_Ieee_Numeric_Std_To_X01_Sgn, + Type_Unsigned => Iir_Predefined_Ieee_Numeric_Std_To_X01_Uns); + + To_X01z_Patterns : constant Shift_Pattern_Type := + (Type_Signed => Iir_Predefined_Ieee_Numeric_Std_To_X01Z_Sgn, + Type_Unsigned => Iir_Predefined_Ieee_Numeric_Std_To_X01Z_Uns); + + To_Ux01_Patterns : constant Shift_Pattern_Type := + (Type_Signed => Iir_Predefined_Ieee_Numeric_Std_To_UX01_Sgn, + Type_Unsigned => Iir_Predefined_Ieee_Numeric_Std_To_UX01_Uns); + + Is_X_Patterns : constant Shift_Pattern_Type := + (Type_Signed => Iir_Predefined_Ieee_Numeric_Std_Is_X_Sgn, + Type_Unsigned => Iir_Predefined_Ieee_Numeric_Std_Is_X_Uns); + + To_Hstring_Patterns : constant Shift_Pattern_Type := + (Type_Signed => Iir_Predefined_Ieee_Numeric_Std_To_Hstring_Sgn, + Type_Unsigned => Iir_Predefined_Ieee_Numeric_Std_To_Hstring_Uns); + + To_Ostring_Patterns : constant Shift_Pattern_Type := + (Type_Signed => Iir_Predefined_Ieee_Numeric_Std_To_Ostring_Sgn, + Type_Unsigned => Iir_Predefined_Ieee_Numeric_Std_To_Ostring_Uns); + Error : exception; procedure Extract_Declarations (Pkg_Decl : Iir_Package_Declaration; @@ -618,6 +670,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 +722,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 @@ -786,18 +856,20 @@ package body Vhdl.Ieee.Numeric is raise Error; end if; - case Arg1_Sign is - when Type_Unsigned => - Predefined := Iir_Predefined_Ieee_Numeric_Std_To_01_Uns; - when Type_Signed => - Predefined := Iir_Predefined_Ieee_Numeric_Std_To_01_Sgn; - when others => - raise Error; - end case; + Predefined := To_01_Patterns (Arg1_Sign); Set_Implicit_Definition (Decl, Predefined); end Handle_To_01; + procedure Handle_To_X01 (Pats : Shift_Pattern_Type) is + begin + if Arg1_Kind /= Arg_Vect then + raise Error; + end if; + + Set_Implicit_Definition (Decl, Pats (Arg1_Sign)); + end Handle_To_X01; + procedure Handle_Shift (Pats : Shift_Pattern_Type; Sh_Sign : Sign_Kind) is Res : Iir_Predefined_Functions; @@ -955,10 +1027,6 @@ package body Vhdl.Ieee.Numeric is Handle_Binary (Xor_Patterns); when Name_Xnor => Handle_Binary (Xnor_Patterns); - when Name_To_Bstring - | Name_To_Ostring - | Name_To_Hstring => - null; when Name_To_Unsigned => Handle_To_Unsigned; when Name_To_Signed => @@ -1019,6 +1087,20 @@ package body Vhdl.Ieee.Numeric is Handle_Unary (Red_Xor_Patterns); when Name_Xnor => Handle_Unary (Red_Xnor_Patterns); + when Name_To_X01 => + Handle_To_X01 (To_X01_Patterns); + when Name_To_X01Z => + Handle_To_X01 (To_X01z_Patterns); + when Name_To_UX01 => + Handle_To_X01 (To_Ux01_Patterns); + when Name_Is_X => + Handle_To_X01 (Is_X_Patterns); + when Name_To_Bstring => + null; + when Name_To_Ostring => + Handle_To_X01 (To_Ostring_Patterns); + when Name_To_Hstring => + Handle_To_X01 (To_Hstring_Patterns); when others => null; end case; @@ -1048,4 +1130,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; |