diff options
-rw-r--r-- | src/libraries.adb | 42 | ||||
-rw-r--r-- | src/vhdl/canon.adb | 66 | ||||
-rw-r--r-- | src/vhdl/sem_inst.adb | 10 | ||||
-rw-r--r-- | src/vhdl/translate/trans-chap12.adb | 4 | ||||
-rw-r--r-- | src/vhdl/translate/trans-chap2.adb | 188 | ||||
-rw-r--r-- | src/vhdl/translate/trans-chap2.ads | 2 | ||||
-rw-r--r-- | src/vhdl/translate/trans-chap4.adb | 14 | ||||
-rw-r--r-- | src/vhdl/translate/trans-rtis.adb | 11 |
8 files changed, 186 insertions, 151 deletions
diff --git a/src/libraries.adb b/src/libraries.adb index 6173af87d..3f737f466 100644 --- a/src/libraries.adb +++ b/src/libraries.adb @@ -23,8 +23,6 @@ with System; with Errorout; use Errorout; with Scanner; with Iirs_Utils; use Iirs_Utils; -with Iir_Chains; -with Nodes_Meta; with Parse; with Name_Table; use Name_Table; with Str_Table; @@ -35,7 +33,6 @@ with Std_Package; with Disp_Tree; with Disp_Vhdl; with Sem; -with Sem_Inst; with Post_Sems; with Canon; with Nodes_GC; @@ -1605,45 +1602,6 @@ package body Libraries is Canon.Canonicalize (Unit); - -- The library unit may have been changed from package instantiation - -- to package declaration. - Lib_Unit := Get_Library_Unit (Unit); - - -- FIXME: for Main only ? - if Get_Kind (Lib_Unit) = Iir_Kind_Package_Declaration - and then not Get_Need_Body (Lib_Unit) - and then Get_Need_Instance_Bodies (Lib_Unit) - then - -- This is a package declaration without body. If there are package - -- instantiations within that package and if the instances need - -- bodies, create them. Ideally they should be created in the - -- package body, but as we don't know if there is one, do it now. - Set_Package_Instantiation_Bodies_Chain - (Lib_Unit, Canon.Create_Instantiation_Bodies (Lib_Unit, Lib_Unit)); - elsif Get_Kind (Lib_Unit) = Iir_Kind_Package_Body - and then Get_Need_Instance_Bodies (Get_Package (Lib_Unit)) - then - -- If there are package instances in the package declaration and if - -- they need bodies, create them now that the body (of the package - -- containing the instances) is analyzed. - Iir_Chains.Append_Chain - (Lib_Unit, Nodes_Meta.Field_Declaration_Chain, - Canon.Create_Instantiation_Bodies (Get_Package (Lib_Unit), - Lib_Unit)); - elsif Get_Kind (Lib_Unit) = Iir_Kind_Package_Declaration - and then Get_Package_Origin (Lib_Unit) /= Null_Iir - and then (Get_Kind (Get_Package_Origin (Lib_Unit)) - = Iir_Kind_Package_Instantiation_Declaration) - then - -- Instantiate the body for package instantiation. - declare - Bod : Iir; - begin - Bod := Sem_Inst.Instantiate_Package_Body (Lib_Unit); - Set_Package_Body (Lib_Unit, Bod); - end; - end if; - if (Main or Flags.Dump_All) and then Flags.Dump_Canon then Disp_Tree.Disp_Tree (Unit); end if; diff --git a/src/vhdl/canon.adb b/src/vhdl/canon.adb index 471058843..eb1378c1c 100644 --- a/src/vhdl/canon.adb +++ b/src/vhdl/canon.adb @@ -2592,6 +2592,7 @@ package body Canon is function Canon_Package_Instantiation_Declaration (Decl : Iir) return Iir is Pkg : constant Iir := Get_Uninstantiated_Package_Decl (Decl); + Bod : Iir; begin -- Canon map aspect. Set_Generic_Map_Aspect_Chain @@ -2600,41 +2601,20 @@ package body Canon is (Get_Generic_Chain (Decl), Get_Generic_Map_Aspect_Chain (Decl), Decl)); - if Get_Macro_Expanded_Flag (Pkg) then - declare - New_Decl : Iir; - New_Hdr : Iir; - begin - -- Replace package instantiation by the macro-expanded - -- generic-mapped package. - -- Use move semantics. - -- FIXME: adjust Parent. - New_Decl := Create_Iir (Iir_Kind_Package_Declaration); - Location_Copy (New_Decl, Decl); - Set_Parent (New_Decl, Get_Parent (Decl)); - Set_Identifier (New_Decl, Get_Identifier (Decl)); - Set_Need_Body (New_Decl, False); - - New_Hdr := Create_Iir (Iir_Kind_Package_Header); - Set_Package_Header (New_Decl, New_Hdr); - Location_Copy (New_Hdr, Get_Package_Header (Pkg)); - Set_Generic_Chain (New_Hdr, Get_Generic_Chain (Decl)); - Set_Generic_Map_Aspect_Chain - (New_Hdr, Get_Generic_Map_Aspect_Chain (Decl)); - Set_Generic_Chain (Decl, Null_Iir); - Set_Generic_Map_Aspect_Chain (Decl, Null_Iir); - - Set_Declaration_Chain (New_Decl, Get_Declaration_Chain (Decl)); - Set_Declaration_Chain (Decl, Null_Iir); - Set_Chain (New_Decl, Get_Chain (Decl)); - Set_Chain (Decl, Null_Iir); - - Set_Package_Origin (New_Decl, Decl); - return New_Decl; - end; - else - return Decl; + -- Generate the body now. + -- Note: according to the LRM, if the instantiation occurs within a + -- package, the body of the instance should be appended to the package + -- body. + -- FIXME: generate only if generating code for this unit. + if Get_Macro_Expanded_Flag (Pkg) + and then Get_Need_Body (Pkg) + then + Bod := Sem_Inst.Instantiate_Package_Body (Decl); + Set_Parent (Bod, Get_Parent (Decl)); + Set_Package_Body (Decl, Bod); end if; + + return Decl; end Canon_Package_Instantiation_Declaration; function Create_Instantiation_Bodies @@ -2643,15 +2623,15 @@ package body Canon is First, Last : Iir; El : Iir; Bod : Iir; - Orig : Iir; + Spec : Iir; begin Sub_Chain_Init (First, Last); El := Get_Declaration_Chain (Decl); while Is_Valid (El) loop - if Get_Kind (El) = Iir_Kind_Package_Declaration then - Orig := Get_Package_Origin (El); - if Orig /= Null_Iir - and then Get_Need_Body (Get_Uninstantiated_Package_Decl (Orig)) + if Get_Kind (El) = Iir_Kind_Package_Instantiation_Declaration then + Spec := Get_Uninstantiated_Package_Decl (El); + if Get_Macro_Expanded_Flag (Spec) + and then Get_Need_Body (Spec) then -- That's a package instantiation of a package that needs a -- body. Therefore, the instantiation also needs a body. @@ -2667,11 +2647,9 @@ package body Canon is return First; end Create_Instantiation_Bodies; - function Canon_Declaration (Top : Iir_Design_Unit; - Decl : Iir; - Parent : Iir; - Decl_Parent : Iir) - return Iir + function Canon_Declaration + (Top : Iir_Design_Unit; Decl : Iir; Parent : Iir; Decl_Parent : Iir) + return Iir is Stmts : Iir; begin diff --git a/src/vhdl/sem_inst.adb b/src/vhdl/sem_inst.adb index caba67456..b396e6327 100644 --- a/src/vhdl/sem_inst.adb +++ b/src/vhdl/sem_inst.adb @@ -861,8 +861,7 @@ package body Sem_Inst is function Instantiate_Package_Body (Inst : Iir) return Iir is - Inst_Decl : constant Iir := Get_Package_Origin (Inst); - Pkg : constant Iir := Get_Uninstantiated_Package_Decl (Inst_Decl); + Pkg : constant Iir := Get_Uninstantiated_Package_Decl (Inst); Prev_Instance_File : constant Source_File_Entry := Instance_File; Mark : constant Instance_Index_Type := Prev_Instance_Table.Last; Res : Iir; @@ -877,7 +876,6 @@ package body Sem_Inst is Set_Instance (Pkg, Inst); declare Pkg_Hdr : constant Iir := Get_Package_Header (Pkg); - Inst_Hdr : constant Iir := Get_Package_Header (Inst); Pkg_El : Iir; Inst_El : Iir; Inter_El : Iir; @@ -886,7 +884,7 @@ package body Sem_Inst is -- In the body, references to interface object are redirected to the -- instantiated interface objects. Pkg_El := Get_Generic_Chain (Pkg_Hdr); - Inst_El := Get_Generic_Chain (Inst_Hdr); + Inst_El := Get_Generic_Chain (Inst); while Is_Valid (Pkg_El) loop if Get_Kind (Pkg_El) in Iir_Kinds_Interface_Object_Declaration then Set_Instance (Pkg_El, Inst_El); @@ -897,8 +895,8 @@ package body Sem_Inst is -- In the body, references to interface type are substitued to the -- mapped type. - Inst_El := Get_Generic_Map_Aspect_Chain (Inst_Hdr); - Inter_El := Get_Generic_Chain (Inst_Hdr); + Inst_El := Get_Generic_Map_Aspect_Chain (Inst); + Inter_El := Get_Generic_Chain (Inst); while Is_Valid (Inst_El) loop case Get_Kind (Inst_El) is when Iir_Kind_Association_Element_Type => diff --git a/src/vhdl/translate/trans-chap12.adb b/src/vhdl/translate/trans-chap12.adb index 4d25fd77e..28883babb 100644 --- a/src/vhdl/translate/trans-chap12.adb +++ b/src/vhdl/translate/trans-chap12.adb @@ -711,9 +711,7 @@ package body Trans.Chap12 is Lib_Unit := Get_Library_Unit (Unit); case Get_Kind (Lib_Unit) is when Iir_Kind_Package_Declaration => - if not Get_Elab_Flag (Unit) - and then Get_Package_Origin (Lib_Unit) = Null_Iir - then + if not Get_Elab_Flag (Unit) then Chap2.Elab_Package_Body (Lib_Unit, Null_Iir); end if; when Iir_Kind_Entity_Declaration => diff --git a/src/vhdl/translate/trans-chap2.adb b/src/vhdl/translate/trans-chap2.adb index 015bca20d..065a85f52 100644 --- a/src/vhdl/translate/trans-chap2.adb +++ b/src/vhdl/translate/trans-chap2.adb @@ -755,21 +755,20 @@ package body Trans.Chap2 is Pop_Instance_Factory (Info.Package_Body_Scope'Access); end Pop_Package_Instance_Factory; - procedure Translate_Package_Declaration (Decl : Iir_Package_Declaration) + -- Translate a package declaration or a macro-expanded package + -- instantiation. HEADER is the node containing generic and generic_map. + procedure Translate_Package (Decl : Iir; Header : Iir) is Is_Nested : constant Boolean := Is_Nested_Package (Decl); - Header : constant Iir := Get_Package_Header (Decl); + Is_Uninstantiated : constant Boolean := + Get_Kind (Decl) = Iir_Kind_Package_Declaration + and then Is_Uninstantiated_Package (Decl); Mark : Id_Mark_Type; Info : Ortho_Info_Acc; Interface_List : O_Inter_List; Prev_Subprg_Instance : Subprgs.Subprg_Instance_Stack; Bod : Iir; begin - -- Skip uninstantiated package that have to be macro-expanded. - if Get_Macro_Expanded_Flag (Decl) then - return; - end if; - Info := Add_Info (Decl, Kind_Package); if Is_Nested then @@ -777,7 +776,7 @@ package body Trans.Chap2 is end if; -- Translate declarations. - if Is_Uninstantiated_Package (Decl) then + if Is_Uninstantiated then -- Create an instance for the spec. Push_Instance_Factory (Info.Package_Spec_Scope'Access); Chap4.Translate_Generic_Chain (Header); @@ -806,10 +805,6 @@ package body Trans.Chap2 is Chap4.Translate_Generic_Chain (Header); end if; Chap4.Translate_Declaration_Chain (Decl); - Bod := Get_Package_Instantiation_Bodies_Chain (Decl); - if Is_Valid (Bod) then - Chap4.Translate_Declaration_Chain (Bod); - end if; if not Is_Nested then Info.Package_Elab_Var := Create_Var (Create_Var_Identifier ("ELABORATED"), Ghdl_Bool_Type); @@ -821,9 +816,17 @@ package body Trans.Chap2 is -- For nested package, this will be translated when translating -- subprograms. Chap4.Translate_Declaration_Chain_Subprograms (Decl); + -- Bod := Get_Package_Instantiation_Bodies_Chain (Decl); + -- if Is_Valid (Bod) then + -- Chap4.Translate_Declaration_Chain_Subprograms (Bod); + -- end if; + end if; + + -- Translate bodies of instances. + if Get_Kind (Decl) = Iir_Kind_Package_Declaration then Bod := Get_Package_Instantiation_Bodies_Chain (Decl); if Is_Valid (Bod) then - Chap4.Translate_Declaration_Chain_Subprograms (Bod); + Chap4.Translate_Declaration_Chain (Bod); end if; end if; @@ -837,7 +840,7 @@ package body Trans.Chap2 is (Interface_List, Info.Package_Elab_Body_Subprg); end if; - if Is_Uninstantiated_Package (Decl) then + if Is_Uninstantiated then Subprgs.Pop_Subprg_Instance (Wki_Instance, Prev_Subprg_Instance); -- The spec elaborator has a spec instance argument. @@ -862,16 +865,16 @@ package body Trans.Chap2 is if Global_Storage = O_Storage_Public then -- Create elaboration procedure for the spec - Elab_Package (Decl); + Elab_Package (Decl, Header); end if; end if; - if Is_Uninstantiated_Package (Decl) then + if Is_Uninstantiated then Subprgs.Pop_Subprg_Instance (Wki_Instance, Prev_Subprg_Instance); end if; Save_Local_Identifier (Info.Package_Local_Id); - if Is_Uninstantiated_Package (Decl) + if Is_Uninstantiated and then not Get_Need_Body (Decl) and then Get_Package_Body (Decl) = Null_Iir then @@ -884,18 +887,58 @@ package body Trans.Chap2 is if Is_Nested then Pop_Identifier_Prefix (Mark); end if; + end Translate_Package; + + procedure Translate_Package_Declaration (Decl : Iir_Package_Declaration) + is + El : Iir; + Bod : Iir; + begin + -- Skip uninstantiated package that have to be macro-expanded. + if Get_Macro_Expanded_Flag (Decl) then + return; + end if; + + Translate_Package (Decl, Get_Package_Header (Decl)); + + if Global_Storage = O_Storage_Public then + -- If there are package instances declared that were macro-expanded + -- and if the package has (possibly) no body, translate the bodies + -- of the instances. + if Get_Need_Instance_Bodies (Decl) +-- and not Get_Need_Body (Decl) + then + El := Get_Declaration_Chain (Decl); + while Is_Valid (El) loop + if Get_Kind (El) = Iir_Kind_Package_Instantiation_Declaration + then + Bod := Get_Package_Body (El); + if Is_Valid (Bod) then + Translate_Package_Body (Bod); + end if; + end if; + El := Get_Chain (El); + end loop; + end if; + end if; end Translate_Package_Declaration; procedure Translate_Package_Body (Bod : Iir_Package_Body) is Is_Nested : constant Boolean := Is_Nested_Package (Bod); Spec : constant Iir_Package_Declaration := Get_Package (Bod); + + -- True if the package spec is a package declaration. It could be a + -- package instantiation declaration. + Is_Spec_Decl : constant Boolean := + Get_Kind (Spec) = Iir_Kind_Package_Declaration; + Info : constant Ortho_Info_Acc := Get_Info (Spec); Prev_Storage : constant O_Storage := Global_Storage; Prev_Subprg_Instance : Subprgs.Subprg_Instance_Stack; Mark : Id_Mark_Type; begin - if Get_Macro_Expanded_Flag (Spec) then + if Is_Spec_Decl and then Get_Macro_Expanded_Flag (Spec) then return; end if; @@ -904,7 +947,7 @@ package body Trans.Chap2 is end if; -- Translate declarations. - if Is_Uninstantiated_Package (Spec) then + if Is_Spec_Decl and then Is_Uninstantiated_Package (Spec) then Push_Package_Instance_Factory (Spec); -- Translate the specifications. @@ -921,7 +964,7 @@ package body Trans.Chap2 is return; end if; - if not Is_Uninstantiated_Package (Spec) then + if not (Is_Spec_Decl and then Is_Uninstantiated_Package (Spec)) then Restore_Local_Identifier (Info.Package_Local_Id); Chap4.Translate_Declaration_Chain (Bod); @@ -935,7 +978,7 @@ package body Trans.Chap2 is Rtis.Generate_Unit (Bod); end if; - if Is_Uninstantiated_Package (Spec) then + if Is_Spec_Decl and then Is_Uninstantiated_Package (Spec) then -- Add access to the specs. Subprgs.Push_Subprg_Instance (Info.Package_Body_Scope'Access, Info.Package_Body_Ptr_Type, @@ -945,13 +988,13 @@ package body Trans.Chap2 is Info.Package_Body_Scope'Access); end if; - if not Is_Nested then + if not Is_Nested or else not Is_Spec_Decl then -- Translate subprograms. For nested package, this has to be called -- when translating subprograms. Chap4.Translate_Declaration_Chain_Subprograms (Bod); end if; - if Is_Uninstantiated_Package (Spec) then + if Is_Spec_Decl and then Is_Uninstantiated_Package (Spec) then Clear_Scope (Info.Package_Spec_Scope); Subprgs.Pop_Subprg_Instance (Wki_Instance, Prev_Subprg_Instance); end if; @@ -967,7 +1010,8 @@ package body Trans.Chap2 is end if; end Translate_Package_Body; - procedure Elab_Package (Spec : Iir_Package_Declaration) + -- Elaborate a package or a package instantiation. + procedure Elab_Package (Spec : Iir; Header : Iir) is Is_Nested : constant Boolean := Is_Nested_Package (Spec); Info : constant Ortho_Info_Acc := Get_Info (Spec); @@ -982,8 +1026,8 @@ package body Trans.Chap2 is Elab_Dependence (Get_Design_Unit (Spec)); - if not Is_Uninstantiated_Package (Spec) - and then Get_Kind (Get_Parent (Spec)) = Iir_Kind_Design_Unit + if not (Get_Kind (Spec) = Iir_Kind_Package_Declaration + and then Is_Uninstantiated_Package (Spec)) then -- Register the top level package. This is done dynamically, as -- we know only during elaboration that the design depends on a @@ -999,9 +1043,11 @@ package body Trans.Chap2 is Open_Temp; end if; - if Is_Generic_Mapped_Package (Spec) then + if Is_Valid (Header) + and then Is_Valid (Get_Generic_Map_Aspect_Chain (Header)) + then Chap5.Elab_Generic_Map_Aspect - (Get_Package_Header (Spec), Get_Package_Header (Spec), + (Header, Header, (Info.Package_Spec_Scope'Access, Info.Package_Spec_Scope)); end if; Chap4.Elab_Declaration_Chain (Spec, Final); @@ -1017,16 +1063,23 @@ package body Trans.Chap2 is procedure Elab_Package_Body (Spec : Iir_Package_Declaration; Bod : Iir) is + Is_Spec_Decl : constant Boolean := + Get_Kind (Spec) = Iir_Kind_Package_Declaration; + Info : constant Ortho_Info_Acc := Get_Info (Spec); If_Blk : O_If_Block; Constr : O_Assoc_List; Final : Boolean; begin + if Is_Spec_Decl and then Get_Macro_Expanded_Flag (Spec) then + return; + end if; + Start_Subprogram_Body (Info.Package_Elab_Body_Subprg); Push_Local_Factory; Subprgs.Start_Subprg_Instance_Use (Info.Package_Elab_Body_Instance); - if Is_Uninstantiated_Package (Spec) then + if Is_Spec_Decl and then Is_Uninstantiated_Package (Spec) then Set_Scope_Via_Field (Info.Package_Spec_Scope, Info.Package_Spec_Field, Info.Package_Body_Scope'Access); @@ -1053,7 +1106,7 @@ package body Trans.Chap2 is Close_Temp; end if; - if Is_Uninstantiated_Package (Spec) then + if Is_Spec_Decl and then Is_Uninstantiated_Package (Spec) then Clear_Scope (Info.Package_Spec_Scope); end if; @@ -1346,8 +1399,25 @@ package body Trans.Chap2 is Info : Ortho_Info_Acc; Interface_List : O_Inter_List; begin - -- Canon must have replaced instatiation by generic-mapped packages. - pragma Assert (not Get_Macro_Expanded_Flag (Spec)); + if Get_Macro_Expanded_Flag (Spec) then + -- Macro-expanded instantiations are translated like a package. + Translate_Package (Inst, Inst); + + -- For top-level package, generate code for the body. + if Global_Storage = O_Storage_Public + and then not Is_Nested_Package (Inst) + then + declare + Bod : constant Iir := Get_Package_Body (Inst); + begin + if Is_Valid (Bod) then + Translate_Package_Body (Bod); + end if; + end; + end if; + + return; + end if; Instantiate_Info_Package (Inst); Info := Get_Info (Inst); @@ -1402,6 +1472,11 @@ package body Trans.Chap2 is Info : constant Ortho_Info_Acc := Get_Info (Inst); Constr : O_Assoc_List; begin + if Get_Macro_Expanded_Flag (Spec) then + Elab_Package (Inst, Inst); + return; + end if; + Set_Scope_Via_Var (Pkg_Info.Package_Body_Scope, Info.Package_Instance_Body_Var); @@ -1423,22 +1498,12 @@ package body Trans.Chap2 is Clear_Scope (Pkg_Info.Package_Body_Scope); end Elab_Package_Instantiation_Declaration; - procedure Elab_Dependence_Package (Pkg : Iir_Package_Declaration) + procedure Elab_Dependence_Package (Pkg : Iir) is Info : Ortho_Info_Acc; If_Blk : O_If_Block; Constr : O_Assoc_List; begin - -- Std.Standard is pre-elaborated. - if Pkg = Standard_Package then - return; - end if; - - -- Nothing to do for uninstantiated package. - if Is_Uninstantiated_Package (Pkg) then - return; - end if; - -- Call the package elaborator only if not already elaborated. Info := Get_Info (Pkg); Start_If_Stmt @@ -1451,13 +1516,36 @@ package body Trans.Chap2 is Finish_If_Stmt (If_Blk); end Elab_Dependence_Package; - procedure Elab_Dependence_Package_Instantiation (Pkg : Iir) - is - Info : constant Ortho_Info_Acc := Get_Info (Pkg); - Constr : O_Assoc_List; + procedure Elab_Dependence_Package_Declaration + (Pkg : Iir_Package_Declaration) is begin - Start_Association (Constr, Info.Package_Instance_Elab_Subprg); - New_Procedure_Call (Constr); + -- Std.Standard is pre-elaborated. + if Pkg = Standard_Package then + return; + end if; + + -- Nothing to do for uninstantiated package. + if Is_Uninstantiated_Package (Pkg) then + return; + end if; + + Elab_Dependence_Package (Pkg); + end Elab_Dependence_Package_Declaration; + + procedure Elab_Dependence_Package_Instantiation (Pkg : Iir) is + begin + if Get_Macro_Expanded_Flag (Get_Uninstantiated_Package_Decl (Pkg)) then + -- Handled as a normal package + Elab_Dependence_Package (Pkg); + else + declare + Info : constant Ortho_Info_Acc := Get_Info (Pkg); + Constr : O_Assoc_List; + begin + Start_Association (Constr, Info.Package_Instance_Elab_Subprg); + New_Procedure_Call (Constr); + end; + end if; end Elab_Dependence_Package_Instantiation; procedure Elab_Dependence (Design_Unit: Iir_Design_Unit) @@ -1475,7 +1563,7 @@ package body Trans.Chap2 is Library_Unit := Get_Library_Unit (Design); case Get_Kind (Library_Unit) is when Iir_Kind_Package_Declaration => - Elab_Dependence_Package (Library_Unit); + Elab_Dependence_Package_Declaration (Library_Unit); when Iir_Kind_Package_Instantiation_Declaration => Elab_Dependence_Package_Instantiation (Library_Unit); when Iir_Kind_Entity_Declaration => diff --git a/src/vhdl/translate/trans-chap2.ads b/src/vhdl/translate/trans-chap2.ads index 74247d6e1..4d81c2bf6 100644 --- a/src/vhdl/translate/trans-chap2.ads +++ b/src/vhdl/translate/trans-chap2.ads @@ -35,7 +35,7 @@ package Trans.Chap2 is procedure Translate_Package_Body (Bod : Iir_Package_Body); procedure Translate_Package_Instantiation_Declaration (Inst : Iir); - procedure Elab_Package (Spec : Iir_Package_Declaration); + procedure Elab_Package (Spec : Iir; Header : Iir); procedure Elab_Package_Body (Spec : Iir_Package_Declaration; Bod : Iir); procedure Elab_Package_Instantiation_Declaration (Inst : Iir); diff --git a/src/vhdl/translate/trans-chap4.adb b/src/vhdl/translate/trans-chap4.adb index 14d04d486..ba5853935 100644 --- a/src/vhdl/translate/trans-chap4.adb +++ b/src/vhdl/translate/trans-chap4.adb @@ -2388,6 +2388,18 @@ package body Trans.Chap4 is Translate_Declaration_Chain_Subprograms (El); Pop_Identifier_Prefix (Mark); end; + when Iir_Kind_Package_Instantiation_Declaration => + if Get_Macro_Expanded_Flag + (Get_Uninstantiated_Package_Decl (El)) + then + declare + Mark : Id_Mark_Type; + begin + Push_Identifier_Prefix (Mark, Get_Identifier (El)); + Translate_Declaration_Chain_Subprograms (El); + Pop_Identifier_Prefix (Mark); + end; + end if; when others => null; end case; @@ -2485,7 +2497,7 @@ package body Trans.Chap4 is null; when Iir_Kind_Package_Declaration => - Chap2.Elab_Package (Decl); + Chap2.Elab_Package (Decl, Get_Package_Header (Decl)); -- FIXME: finalizer when Iir_Kind_Package_Body => declare diff --git a/src/vhdl/translate/trans-rtis.adb b/src/vhdl/translate/trans-rtis.adb index 672ef9b5b..7623b5032 100644 --- a/src/vhdl/translate/trans-rtis.adb +++ b/src/vhdl/translate/trans-rtis.adb @@ -2606,7 +2606,8 @@ package body Trans.Rtis is Field_Off := O_Cnode_Null; case Get_Kind (Blk) is - when Iir_Kind_Package_Declaration => + when Iir_Kind_Package_Declaration + | Iir_Kind_Package_Instantiation_Declaration => Kind := Ghdl_Rtik_Package; Generate_Declaration_Chain (Get_Declaration_Chain (Blk), Rti); when Iir_Kind_Package_Body => @@ -2747,7 +2748,8 @@ package body Trans.Rtis is when Iir_Kind_Process_Statement | Iir_Kind_Sensitized_Process_Statement => Info.Process_Rti_Const := Rti; - when Iir_Kind_Package_Declaration => + when Iir_Kind_Package_Declaration + | Iir_Kind_Package_Instantiation_Declaration => Info.Package_Rti_Const := Rti; when Iir_Kind_Package_Body => -- Replace package declaration RTI with the body one. @@ -2861,8 +2863,9 @@ package body Trans.Rtis is -- Compute parent RTI. case Get_Kind (Lib_Unit) is when Iir_Kind_Package_Declaration - | Iir_Kind_Entity_Declaration - | Iir_Kind_Configuration_Declaration => + | Iir_Kind_Entity_Declaration + | Iir_Kind_Configuration_Declaration + | Iir_Kind_Package_Instantiation_Declaration => -- The library. declare Lib : Iir_Library_Declaration; |