aboutsummaryrefslogtreecommitdiffstats
path: root/src/vhdl/vhdl-ieee-numeric.adb
diff options
context:
space:
mode:
Diffstat (limited to 'src/vhdl/vhdl-ieee-numeric.adb')
-rw-r--r--src/vhdl/vhdl-ieee-numeric.adb130
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;