diff options
author | Tristan Gingold <tgingold@free.fr> | 2022-12-23 16:11:44 +0100 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2022-12-23 18:28:09 +0100 |
commit | 75717123881fd9af086cd93dc3be25d51fbb47f2 (patch) | |
tree | 49c6dfeab50552ae5df6716ac8c1a91353982921 | |
parent | 7763427a8d55963c056bba94f6b519dc3e78e739 (diff) | |
download | ghdl-75717123881fd9af086cd93dc3be25d51fbb47f2.tar.gz ghdl-75717123881fd9af086cd93dc3be25d51fbb47f2.tar.bz2 ghdl-75717123881fd9af086cd93dc3be25d51fbb47f2.zip |
trans-chap5.adb: handle package association in entities.
Fix #2264
-rw-r--r-- | src/vhdl/translate/trans-chap4.adb | 8 | ||||
-rw-r--r-- | src/vhdl/translate/trans-chap5.adb | 21 | ||||
-rw-r--r-- | src/vhdl/vhdl-sem_inst.adb | 16 | ||||
-rw-r--r-- | src/vhdl/vhdl-sem_stmts.adb | 2 |
4 files changed, 27 insertions, 20 deletions
diff --git a/src/vhdl/translate/trans-chap4.adb b/src/vhdl/translate/trans-chap4.adb index 18f9546a7..0f455a83d 100644 --- a/src/vhdl/translate/trans-chap4.adb +++ b/src/vhdl/translate/trans-chap4.adb @@ -1847,12 +1847,12 @@ package body Trans.Chap4 is when Iir_Kinds_Interface_Object_Declaration => Create_Object (Decl); when Iir_Kind_Interface_Package_Declaration => - if Get_Generic_Map_Aspect_Chain (Decl) = Null_Iir then + if Get_Generic_Map_Aspect_Chain (Decl) /= Null_Iir then + -- The package is instantiated by the interface. + Chap2.Translate_Package_Instantiation_Declaration (Decl); + else -- Need a formal Create_Package_Interface (Decl); - else - -- Instantiated. - Chap2.Translate_Package_Instantiation_Declaration (Decl); end if; when Iir_Kind_Interface_Type_Declaration | Iir_Kinds_Interface_Subprogram_Declaration => diff --git a/src/vhdl/translate/trans-chap5.adb b/src/vhdl/translate/trans-chap5.adb index 3924b8552..75ccca6b3 100644 --- a/src/vhdl/translate/trans-chap5.adb +++ b/src/vhdl/translate/trans-chap5.adb @@ -902,19 +902,24 @@ package body Trans.Chap5 is Actual : constant Iir := Get_Named_Entity (Get_Actual (Assoc)); Actual_Info : constant Ortho_Info_Acc := Get_Info (Actual); + Spec_Addr, Body_Addr : O_Enode; begin + Spec_Addr := New_Address + (Get_Instance_Ref + (Actual_Info.Package_Instance_Spec_Scope), + Uninst_Info.Package_Spec_Ptr_Type); + Body_Addr := New_Address + (Get_Instance_Ref + (Actual_Info.Package_Instance_Body_Scope), + Uninst_Info.Package_Body_Ptr_Type); + Set_Map_Env (Formal_Env); New_Assign_Stmt (Get_Var (Formal_Info.Package_Instance_Spec_Var), - New_Address - (Get_Instance_Ref - (Actual_Info.Package_Instance_Spec_Scope), - Uninst_Info.Package_Spec_Ptr_Type)); + Spec_Addr); New_Assign_Stmt (Get_Var (Formal_Info.Package_Instance_Body_Var), - New_Address - (Get_Instance_Ref - (Actual_Info.Package_Instance_Body_Scope), - Uninst_Info.Package_Body_Ptr_Type)); + Body_Addr); + Set_Map_Env (Actual_Env); end; when Iir_Kind_Association_Element_Type | Iir_Kind_Association_Element_Subprogram => diff --git a/src/vhdl/vhdl-sem_inst.adb b/src/vhdl/vhdl-sem_inst.adb index ff497e10a..c2594747b 100644 --- a/src/vhdl/vhdl-sem_inst.adb +++ b/src/vhdl/vhdl-sem_inst.adb @@ -1067,14 +1067,15 @@ package body Vhdl.Sem_Inst is procedure Instantiate_Generic_Map_Chain (Inst : Iir; Pkg : Iir) is pragma Unreferenced (Pkg); - Assoc : Iir; - Inter : Iir; + Assoc, Inter : Iir; + Inter_Iter : Iir; begin Assoc := Get_Generic_Map_Aspect_Chain (Inst); - Inter := Get_Generic_Chain (Inst); + Inter_Iter := Get_Generic_Chain (Inst); while Is_Valid (Assoc) loop + Inter := Get_Association_Interface (Assoc, Inter_Iter); Instantiate_Generic_Map (Assoc, Inter); - Next_Association_Interface (Assoc, Inter); + Next_Association_Interface (Assoc, Inter_Iter); end loop; end Instantiate_Generic_Map_Chain; @@ -1301,13 +1302,14 @@ package body Vhdl.Sem_Inst is Instantiate_Generic_Chain (Inst, Get_Generic_Chain (Comp), True)); declare - Assoc, Inter : Iir; + Assoc, Inter, Inter_Iter : Iir; begin Assoc := Get_Generic_Map_Aspect_Chain (Map); - Inter := Get_Generic_Chain (Inst); + Inter_Iter := Get_Generic_Chain (Inst); while Is_Valid (Assoc) loop + Inter := Get_Association_Interface (Assoc, Inter_Iter); Instantiate_Generic_Map (Assoc, Inter); - Next_Association_Interface (Assoc, Inter); + Next_Association_Interface (Assoc, Inter_Iter); end loop; end; diff --git a/src/vhdl/vhdl-sem_stmts.adb b/src/vhdl/vhdl-sem_stmts.adb index c1c2431e1..1b5228520 100644 --- a/src/vhdl/vhdl-sem_stmts.adb +++ b/src/vhdl/vhdl-sem_stmts.adb @@ -1958,7 +1958,7 @@ package body Vhdl.Sem_Stmts is case Get_Kind (Inter) is when Iir_Kind_Interface_Package_Declaration | Iir_Kind_Interface_Type_Declaration => - Has_Type_Gen := True; + return True; when others => null; end case; |