aboutsummaryrefslogtreecommitdiffstats
path: root/src/synth
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2023-01-28 20:09:56 +0100
committerTristan Gingold <tgingold@free.fr>2023-01-28 20:09:56 +0100
commit3930d6a2c064e16ad71de3bc19dacdbd9b96c11a (patch)
treecbf2f3e6da1c7c4fc7d673a862a35251747db1c7 /src/synth
parentd668cd01ffb82e91fbec587df547087d291f0fbb (diff)
downloadghdl-3930d6a2c064e16ad71de3bc19dacdbd9b96c11a.tar.gz
ghdl-3930d6a2c064e16ad71de3bc19dacdbd9b96c11a.tar.bz2
ghdl-3930d6a2c064e16ad71de3bc19dacdbd9b96c11a.zip
synth: improve support of interface type
Diffstat (limited to 'src/synth')
-rw-r--r--src/synth/elab-vhdl_annotations.adb110
-rw-r--r--src/synth/elab-vhdl_insts.adb2
2 files changed, 82 insertions, 30 deletions
diff --git a/src/synth/elab-vhdl_annotations.adb b/src/synth/elab-vhdl_annotations.adb
index c92d83bee..7165db5de 100644
--- a/src/synth/elab-vhdl_annotations.adb
+++ b/src/synth/elab-vhdl_annotations.adb
@@ -342,6 +342,44 @@ package body Elab.Vhdl_Annotations is
Annotate_Declaration_List (Package_Info, Get_Declaration_Chain (Inter));
end Annotate_Interface_Package_Declaration;
+ -- If WITH_TYPES is true, also annotate interface object subtypes. This is
+ -- set except for parameters (as the interface subtypes are elaborated
+ -- with the subprogram declaration).
+ procedure Annotate_Interface_Declaration
+ (Block_Info : Sim_Info_Acc; Decl : Iir; With_Types : Boolean) is
+ begin
+ if With_Types
+ and then Get_Kind (Decl) in Iir_Kinds_Interface_Object_Declaration
+ and then not Get_Is_Ref (Decl)
+ then
+ Annotate_Anonymous_Type_Definition (Block_Info, Get_Type (Decl));
+ end if;
+ case Get_Kind (Decl) is
+ when Iir_Kind_Interface_Signal_Declaration =>
+ Create_Signal_Info (Block_Info, Decl);
+ when Iir_Kind_Interface_Variable_Declaration
+ | Iir_Kind_Interface_Constant_Declaration
+ | Iir_Kind_Interface_File_Declaration =>
+ Create_Object_Info (Block_Info, Decl);
+ when Iir_Kind_Interface_Package_Declaration =>
+ Annotate_Interface_Package_Declaration (Block_Info, Decl);
+ when Iir_Kind_Interface_Type_Declaration =>
+ -- Create an info on the interface_type_definition.
+ -- This is needed for a generic type in an entity, as the
+ -- nodes are not instantiated.
+ Create_Object_Info
+ (Block_Info, Get_Interface_Type_Definition (Decl));
+ when Iir_Kinds_Interface_Subprogram_Declaration =>
+ -- Macro-expanded
+ null;
+ when others =>
+ Error_Kind ("annotate_interface_list", Decl);
+ end case;
+ end Annotate_Interface_Declaration;
+
+ -- If WITH_TYPES is true, also annotate interface object subtypes. This is
+ -- set except for parameters (as the interface subtypes are elaborated
+ -- with the subprogram declaration).
procedure Annotate_Interface_List
(Block_Info: Sim_Info_Acc; Decl_Chain: Iir; With_Types : Boolean)
is
@@ -349,33 +387,7 @@ package body Elab.Vhdl_Annotations is
begin
Decl := Decl_Chain;
while Decl /= Null_Iir loop
- if With_Types
- and then Get_Kind (Decl) in Iir_Kinds_Interface_Object_Declaration
- and then not Get_Is_Ref (Decl)
- then
- Annotate_Anonymous_Type_Definition (Block_Info, Get_Type (Decl));
- end if;
- case Get_Kind (Decl) is
- when Iir_Kind_Interface_Signal_Declaration =>
- Create_Signal_Info (Block_Info, Decl);
- when Iir_Kind_Interface_Variable_Declaration
- | Iir_Kind_Interface_Constant_Declaration
- | Iir_Kind_Interface_File_Declaration =>
- Create_Object_Info (Block_Info, Decl);
- when Iir_Kind_Interface_Package_Declaration =>
- Annotate_Interface_Package_Declaration (Block_Info, Decl);
- when Iir_Kind_Interface_Type_Declaration =>
- -- Create an info on the interface_type_definition.
- -- This is needed for a generic type in an entity, as the
- -- nodes are not instantiated.
- Create_Object_Info
- (Block_Info, Get_Interface_Type_Definition (Decl));
- when Iir_Kinds_Interface_Subprogram_Declaration =>
- -- Macro-expanded
- null;
- when others =>
- Error_Kind ("annotate_interface_list", Decl);
- end case;
+ Annotate_Interface_Declaration (Block_Info, Decl, With_Types);
Decl := Get_Chain (Decl);
end loop;
end Annotate_Interface_List;
@@ -486,8 +498,39 @@ package body Elab.Vhdl_Annotations is
end if;
if Is_Inst then
- Annotate_Interface_List
- (Package_Info, Get_Generic_Chain (Decl), True);
+ -- Annotate the interfaces, but specially handle interface type.
+ declare
+ use Elab.Vhdl_Utils;
+ Init : Association_Iterator_Init;
+ It : Association_Iterator;
+ Assoc : Iir;
+ Inter : Iir;
+ Act : Iir;
+ begin
+ Init := Association_Iterator_Build
+ (Get_Generic_Chain (Decl),
+ Get_Generic_Map_Aspect_Chain (Decl));
+
+ -- Need to use iterators so that associations are processed in the
+ -- order of the interfaces.
+ Association_Iterate_Init (It, Init);
+ Association_Iterate_Next (It, Inter, Assoc);
+ while Inter /= Null_Node loop
+ Annotate_Interface_Declaration (Package_Info, Inter, True);
+
+ if Get_Kind (Inter) = Iir_Kind_Interface_Type_Declaration then
+ -- For anonymous subtype, re-use the annotation of the
+ -- interface type definition.
+ -- If it is named, the definition will be reachable.
+ Act := Get_Actual (Assoc);
+ if Get_Kind (Act) not in Iir_Kinds_Denoting_Name then
+ Set_Ann
+ (Act, Get_Ann (Get_Interface_Type_Definition (Inter)));
+ end if;
+ end if;
+ Association_Iterate_Next (It, Inter, Assoc);
+ end loop;
+ end;
else
Header := Get_Package_Header (Decl);
if Header /= Null_Iir then
@@ -616,7 +659,14 @@ package body Elab.Vhdl_Annotations is
| Iir_Kind_Anonymous_Type_Declaration =>
Annotate_Type_Definition (Block_Info, Get_Type_Definition (Decl));
when Iir_Kind_Subtype_Declaration =>
- Annotate_Type_Definition (Block_Info, Get_Type (Decl));
+ declare
+ Ind : constant Iir := Get_Subtype_Indication (Decl);
+ begin
+ -- No annotation for aliases.
+ if Get_Kind (Ind) not in Iir_Kinds_Denoting_Name then
+ Annotate_Type_Definition (Block_Info, Get_Type (Decl));
+ end if;
+ end;
when Iir_Kind_Protected_Type_Body =>
Annotate_Protected_Type_Body (Block_Info, Decl);
diff --git a/src/synth/elab-vhdl_insts.adb b/src/synth/elab-vhdl_insts.adb
index bacc53e6f..1c800b8b4 100644
--- a/src/synth/elab-vhdl_insts.adb
+++ b/src/synth/elab-vhdl_insts.adb
@@ -170,8 +170,10 @@ package body Elab.Vhdl_Insts is
Act := Get_Type (Act);
end if;
if Get_Kind (Act) in Iir_Kinds_Subtype_Definition then
+ -- Need to elaborate the subtype.
Act_Typ := Synth_Subtype_Indication (Syn_Inst, Act);
else
+ -- An existing type.
Act_Typ := Get_Subtype_Object (Syn_Inst, Act);
end if;
Act_Typ := Unshare (Act_Typ, Instance_Pool);