aboutsummaryrefslogtreecommitdiffstats
path: root/src/vhdl
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2016-09-14 02:19:31 +0200
committerTristan Gingold <tgingold@free.fr>2016-09-14 02:19:31 +0200
commitca600772c5253e9672336a222498c375c6692427 (patch)
tree6f4219667078183b5751c0ac9025ef1f92c60479 /src/vhdl
parent707123f09bb373ce6d239d406121c220e3ba7813 (diff)
downloadghdl-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.adb38
-rw-r--r--src/vhdl/translate/trans-chap2.ads2
-rw-r--r--src/vhdl/translate/trans-chap4.adb4
-rw-r--r--src/vhdl/translate/trans.adb20
-rw-r--r--src/vhdl/translate/trans.ads4
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);