aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2020-09-16 21:14:31 +0200
committerTristan Gingold <tgingold@free.fr>2020-09-16 21:14:31 +0200
commit970afd54338ed04440c23a7b625f5c660e858cb2 (patch)
tree65d1d80d3cc07874ab75435dc1e94d59d906914f /src
parent63fd2ca7ce387c914668f8393962751a55ac4138 (diff)
downloadghdl-970afd54338ed04440c23a7b625f5c660e858cb2.tar.gz
ghdl-970afd54338ed04440c23a7b625f5c660e858cb2.tar.bz2
ghdl-970afd54338ed04440c23a7b625f5c660e858cb2.zip
vhdl: recognize find_leftmost/find_rightmost. For #1460
Diffstat (limited to 'src')
-rw-r--r--src/std_names.adb2
-rw-r--r--src/std_names.ads4
-rw-r--r--src/vhdl/vhdl-ieee-numeric.adb30
-rw-r--r--src/vhdl/vhdl-nodes.ads6
4 files changed, 41 insertions, 1 deletions
diff --git a/src/std_names.adb b/src/std_names.adb
index 8855b3b75..0545fdbaa 100644
--- a/src/std_names.adb
+++ b/src/std_names.adb
@@ -676,6 +676,8 @@ package body Std_Names is
Def ("shr", Name_Shr);
Def ("ext", Name_Ext);
Def ("sxt", Name_Sxt);
+ Def ("find_leftmost", Name_Find_Leftmost);
+ Def ("find_rightmost", Name_Find_Rightmost);
Def ("allconst", Name_Allconst);
Def ("allseq", Name_Allseq);
diff --git a/src/std_names.ads b/src/std_names.ads
index 1bcc6943d..0d8950171 100644
--- a/src/std_names.ads
+++ b/src/std_names.ads
@@ -759,7 +759,9 @@ package Std_Names is
Name_Shr : constant Name_Id := Name_First_Ieee_Name + 046;
Name_Ext : constant Name_Id := Name_First_Ieee_Name + 047;
Name_Sxt : constant Name_Id := Name_First_Ieee_Name + 048;
- Name_Last_Ieee_Name : constant Name_Id := Name_Sxt;
+ Name_Find_Leftmost : constant Name_Id := Name_First_Ieee_Name + 049;
+ Name_Find_Rightmost : constant Name_Id := Name_First_Ieee_Name + 050;
+ Name_Last_Ieee_Name : constant Name_Id := Name_Find_Rightmost;
Name_First_Synthesis : constant Name_Id := Name_Last_Ieee_Name + 1;
Name_Allconst : constant Name_Id := Name_First_Synthesis + 000;
diff --git a/src/vhdl/vhdl-ieee-numeric.adb b/src/vhdl/vhdl-ieee-numeric.adb
index fae624d78..b7fb3975d 100644
--- a/src/vhdl/vhdl-ieee-numeric.adb
+++ b/src/vhdl/vhdl-ieee-numeric.adb
@@ -568,6 +568,14 @@ package body Vhdl.Ieee.Numeric is
(Type_Signed => Iir_Predefined_Ieee_Numeric_Std_Sra_Sgn_Int,
Type_Unsigned => Iir_Predefined_Ieee_Numeric_Std_Sra_Uns_Int);
+ Leftmost_Patterns : constant Shift_Pattern_Type :=
+ (Type_Signed => Iir_Predefined_Ieee_Numeric_Std_Find_Leftmost_Sgn,
+ Type_Unsigned => Iir_Predefined_Ieee_Numeric_Std_Find_Leftmost_Uns);
+
+ Rightmost_Patterns : constant Shift_Pattern_Type :=
+ (Type_Signed => Iir_Predefined_Ieee_Numeric_Std_Find_Rightmost_Sgn,
+ Type_Unsigned => Iir_Predefined_Ieee_Numeric_Std_Find_Rightmost_Uns);
+
Error : exception;
procedure Extract_Declarations (Pkg_Decl : Iir_Package_Declaration;
@@ -801,6 +809,24 @@ package body Vhdl.Ieee.Numeric is
Set_Implicit_Definition (Decl, Res);
end if;
end Handle_Shift;
+
+ procedure Handle_Find (Pats : Shift_Pattern_Type)
+ is
+ Res : Iir_Predefined_Functions;
+ begin
+ if Arg1_Kind = Arg_Vect
+ and then Arg2_Kind = Arg_Scal
+ and then Arg2_Sign = Type_Log
+ then
+ case Arg1_Sign is
+ when Type_Signed | Type_Unsigned =>
+ Res := Pats (Arg1_Sign);
+ when others =>
+ Res := Iir_Predefined_None;
+ end case;
+ Set_Implicit_Definition (Decl, Res);
+ end if;
+ end Handle_Find;
begin
Decl := Get_Declaration_Chain (Pkg_Decl);
@@ -951,6 +977,10 @@ package body Vhdl.Ieee.Numeric is
Handle_Shift (Rol_Patterns, Type_Unsigned);
when Name_Rotate_Right =>
Handle_Shift (Ror_Patterns, Type_Unsigned);
+ when Name_Find_Leftmost =>
+ Handle_Find (Leftmost_Patterns);
+ when Name_Find_Rightmost =>
+ Handle_Find (Rightmost_Patterns);
when Name_To_01 =>
Handle_To_01;
when others =>
diff --git a/src/vhdl/vhdl-nodes.ads b/src/vhdl/vhdl-nodes.ads
index 82a45c3ed..f98ff93a0 100644
--- a/src/vhdl/vhdl-nodes.ads
+++ b/src/vhdl/vhdl-nodes.ads
@@ -5807,6 +5807,12 @@ package Vhdl.Nodes is
Iir_Predefined_Ieee_Numeric_Std_Xor_Uns,
Iir_Predefined_Ieee_Numeric_Std_Xnor_Uns,
+ -- Find.
+ Iir_Predefined_Ieee_Numeric_Std_Find_Leftmost_Uns,
+ Iir_Predefined_Ieee_Numeric_Std_Find_Rightmost_Uns,
+ Iir_Predefined_Ieee_Numeric_Std_Find_Leftmost_Sgn,
+ Iir_Predefined_Ieee_Numeric_Std_Find_Rightmost_Sgn,
+
-- Std_Match functions.
Iir_Predefined_Ieee_Numeric_Std_Match_Log,
Iir_Predefined_Ieee_Numeric_Std_Match_Uns,