diff options
author | Tristan Gingold <tgingold@free.fr> | 2016-09-14 02:19:31 +0200 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2016-09-14 02:19:31 +0200 |
commit | ca600772c5253e9672336a222498c375c6692427 (patch) | |
tree | 6f4219667078183b5751c0ac9025ef1f92c60479 /src/vhdl | |
parent | 707123f09bb373ce6d239d406121c220e3ba7813 (diff) | |
download | ghdl-ca600772c5253e9672336a222498c375c6692427.tar.gz ghdl-ca600772c5253e9672336a222498c375c6692427.tar.bz2 ghdl-ca600772c5253e9672336a222498c375c6692427.zip |
vhdl08: add support for nested package instantiation.
Diffstat (limited to 'src/vhdl')
-rw-r--r-- | src/vhdl/translate/trans-chap2.adb | 38 | ||||
-rw-r--r-- | src/vhdl/translate/trans-chap2.ads | 2 | ||||
-rw-r--r-- | src/vhdl/translate/trans-chap4.adb | 4 | ||||
-rw-r--r-- | src/vhdl/translate/trans.adb | 20 | ||||
-rw-r--r-- | src/vhdl/translate/trans.ads | 4 |
5 files changed, 54 insertions, 14 deletions
diff --git a/src/vhdl/translate/trans-chap2.adb b/src/vhdl/translate/trans-chap2.adb index 351157aba..daa9d4e13 100644 --- a/src/vhdl/translate/trans-chap2.adb +++ b/src/vhdl/translate/trans-chap2.adb @@ -1302,7 +1302,6 @@ package body Trans.Chap2 is Pkg_Info : constant Ortho_Info_Acc := Get_Info (Spec); Info : Ortho_Info_Acc; Interface_List : O_Inter_List; - Constr : O_Assoc_List; begin Instantiate_Info_Package (Inst); Info := Get_Info (Inst); @@ -1313,18 +1312,18 @@ package body Trans.Chap2 is (Create_Var_Identifier (Inst), Get_Scope_Type (Pkg_Info.Package_Body_Scope)); - if Is_Nested_Package (Inst) then - return; - end if; - -- FIXME: this is correct only for global instantiation, and only if -- there is only one. - Set_Scope_Via_Decl (Info.Package_Instance_Body_Scope, - Get_Var_Label (Info.Package_Instance_Body_Var)); + Set_Scope_Via_Var (Info.Package_Instance_Body_Scope, + Info.Package_Instance_Body_Var); Set_Scope_Via_Field (Info.Package_Instance_Spec_Scope, Pkg_Info.Package_Spec_Field, Info.Package_Instance_Body_Scope'Access); + if Is_Nested_Package (Inst) then + return; + end if; + -- Declare elaboration procedure Start_Procedure_Decl (Interface_List, Create_Identifier ("ELAB"), Global_Storage); @@ -1344,8 +1343,23 @@ package body Trans.Chap2 is Elab_Dependence (Get_Design_Unit (Inst)); - Set_Scope_Via_Decl (Pkg_Info.Package_Body_Scope, - Get_Var_Label (Info.Package_Instance_Body_Var)); + Elab_Package_Instantiation_Declaration (Inst); + + -- Chap2.Finish_Subprg_Instance_Use + -- (Info.Package_Instance_Elab_Instance); + Finish_Subprogram_Body; + end Translate_Package_Instantiation_Declaration; + + procedure Elab_Package_Instantiation_Declaration (Inst : Iir) + is + Spec : constant Iir := + Get_Named_Entity (Get_Uninstantiated_Package_Name (Inst)); + Pkg_Info : constant Ortho_Info_Acc := Get_Info (Spec); + Info : constant Ortho_Info_Acc := Get_Info (Inst); + Constr : O_Assoc_List; + begin + Set_Scope_Via_Var (Pkg_Info.Package_Body_Scope, + Info.Package_Instance_Body_Var); Set_Scope_Via_Field (Pkg_Info.Package_Spec_Scope, Pkg_Info.Package_Spec_Field, @@ -1362,11 +1376,7 @@ package body Trans.Chap2 is New_Procedure_Call (Constr); Clear_Scope (Pkg_Info.Package_Body_Scope); - - -- Chap2.Finish_Subprg_Instance_Use - -- (Info.Package_Instance_Elab_Instance); - Finish_Subprogram_Body; - end Translate_Package_Instantiation_Declaration; + end Elab_Package_Instantiation_Declaration; procedure Elab_Dependence_Package (Pkg : Iir_Package_Declaration) is diff --git a/src/vhdl/translate/trans-chap2.ads b/src/vhdl/translate/trans-chap2.ads index fe398cc29..21e0e2ae6 100644 --- a/src/vhdl/translate/trans-chap2.ads +++ b/src/vhdl/translate/trans-chap2.ads @@ -37,6 +37,8 @@ package Trans.Chap2 is procedure Elab_Package_Body (Spec : Iir_Package_Declaration; Bod : Iir); + procedure Elab_Package_Instantiation_Declaration (Inst : Iir); + -- Add info for an interface_package_declaration or a -- package_instantiation_declaration procedure Instantiate_Info_Package (Inst : Iir); diff --git a/src/vhdl/translate/trans-chap4.adb b/src/vhdl/translate/trans-chap4.adb index 9634fbe57..c69eb63b5 100644 --- a/src/vhdl/translate/trans-chap4.adb +++ b/src/vhdl/translate/trans-chap4.adb @@ -2467,6 +2467,10 @@ package body Trans.Chap4 is Need_Final := Need_Final or Nested_Final; end; + when Iir_Kind_Package_Instantiation_Declaration => + -- FIXME: finalizers ? + Chap2.Elab_Package_Instantiation_Declaration (Decl); + when others => Error_Kind ("elab_declaration_chain", Decl); end case; diff --git a/src/vhdl/translate/trans.adb b/src/vhdl/translate/trans.adb index 6efa94701..a87c4e7b1 100644 --- a/src/vhdl/translate/trans.adb +++ b/src/vhdl/translate/trans.adb @@ -403,6 +403,26 @@ package body Trans is Kind => Var_Scope_Decl, D => Decl); end Set_Scope_Via_Decl; + procedure Set_Scope_Via_Var + (Scope : in out Var_Scope_Type; Var : Var_Type) is + begin + pragma Assert (Scope.Kind = Var_Scope_None); + case Var.Kind is + when Var_Scope => + Scope := (Scope_Type => Scope.Scope_Type, + Kind => Var_Scope_Field, + Field => Var.I_Field, + Up_Link => Var.I_Scope); + when Var_Global + | Var_Local => + Scope := (Scope_Type => Scope.Scope_Type, + Kind => Var_Scope_Decl, + D => Var.E); + when Var_None => + raise Internal_Error; + end case; + end Set_Scope_Via_Var; + procedure Clear_Scope (Scope : in out Var_Scope_Type) is begin pragma Assert (Scope.Kind /= Var_Scope_None); diff --git a/src/vhdl/translate/trans.ads b/src/vhdl/translate/trans.ads index 1ce061817..5f9248af1 100644 --- a/src/vhdl/translate/trans.ads +++ b/src/vhdl/translate/trans.ads @@ -306,6 +306,10 @@ package Trans is procedure Set_Scope_Via_Var_Ptr (Scope : in out Var_Scope_Type; Var : Var_Type); + -- Variables/scopes defined in SCOPE can be accesses through VAR. + procedure Set_Scope_Via_Var + (Scope : in out Var_Scope_Type; Var : Var_Type); + -- No more accesses to SCOPE_TYPE are allowed. Scopes must be cleared -- before being set. procedure Clear_Scope (Scope : in out Var_Scope_Type); |