From 827588370d9c3ce38beb646f99a081f52fcc91b6 Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Wed, 22 Mar 2023 03:38:34 +0100 Subject: trans-chap2: improve support for nested package instantiation --- src/vhdl/translate/trans-chap2.adb | 9 ++++++--- src/vhdl/translate/trans-chap4.adb | 31 ++++++++++++++++++++++--------- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/vhdl/translate/trans-chap2.adb b/src/vhdl/translate/trans-chap2.adb index 6bf69a8fb..b95f0eee0 100644 --- a/src/vhdl/translate/trans-chap2.adb +++ b/src/vhdl/translate/trans-chap2.adb @@ -1686,15 +1686,18 @@ package body Trans.Chap2 is -- Macro-expanded instances are handled like a regular package. if Get_Macro_Expanded_Flag (Spec) then declare + Spec_Parent : constant Iir := Get_Parent (Spec); Bod : constant Iir := Get_Package_Body (Spec); Inst_Bod : constant Iir := Get_Instance_Package_Body (Inst); Final : Boolean; begin -- There are no routines generated to elaborate macro-expanded -- packages, but dependencies still need to be elaborated. - Elab_Dependence (Get_Design_Unit (Spec)); - if Bod /= Null_Iir then - Elab_Dependence (Get_Design_Unit (Bod)); + if Get_Kind (Spec_Parent) = Iir_Kind_Design_Unit then + Elab_Dependence (Get_Design_Unit (Spec)); + if Bod /= Null_Iir then + Elab_Dependence (Get_Design_Unit (Bod)); + end if; end if; Elab_Package (Inst, Inst); diff --git a/src/vhdl/translate/trans-chap4.adb b/src/vhdl/translate/trans-chap4.adb index 41a83b8c8..ab1633eaf 100644 --- a/src/vhdl/translate/trans-chap4.adb +++ b/src/vhdl/translate/trans-chap4.adb @@ -2596,6 +2596,23 @@ package body Trans.Chap4 is Create_Union_Scope (State_Scope.all, Scope_Type); end Translate_Statements_Chain_State_Declaration; + -- PKG is a nested package declaration or package body + -- Translate only if non-generic or non-macro expanded. + -- SPEC is the corresponding package declaration. + procedure Translate_Declaration_Chain_Subprograms_Package + (Pkg : Iir; Spec : Iir; What : Subprg_Translate_Kind) + is + Mark : Id_Mark_Type; + begin + if Get_Package_Header (Spec) = Null_Iir + or else not Get_Macro_Expanded_Flag (Spec) + then + Push_Identifier_Prefix (Mark, Get_Identifier (Pkg)); + Translate_Declaration_Chain_Subprograms (Pkg, What); + Pop_Identifier_Prefix (Mark); + end if; + end Translate_Declaration_Chain_Subprograms_Package; + procedure Translate_Declaration_Chain_Subprograms (Parent : Iir; What : Subprg_Translate_Kind) is @@ -2677,15 +2694,11 @@ package body Trans.Chap4 is Chap3.Translate_Protected_Type_Body_Subprograms_Spec (El); Chap3.Translate_Protected_Type_Body_Subprograms_Body (El); end if; - when Iir_Kind_Package_Declaration - | Iir_Kind_Package_Body => - declare - Mark : Id_Mark_Type; - begin - Push_Identifier_Prefix (Mark, Get_Identifier (El)); - Translate_Declaration_Chain_Subprograms (El, What); - Pop_Identifier_Prefix (Mark); - end; + when Iir_Kind_Package_Declaration => + Translate_Declaration_Chain_Subprograms_Package (El, El, What); + when Iir_Kind_Package_Body => + Translate_Declaration_Chain_Subprograms_Package + (El, Get_Package (El), What); when Iir_Kind_Package_Instantiation_Declaration => if Get_Macro_Expanded_Flag (Get_Uninstantiated_Package_Decl (El)) -- cgit v1.2.3