diff options
author | Tristan Gingold <tgingold@free.fr> | 2023-03-22 03:43:51 +0100 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2023-03-22 04:44:25 +0100 |
commit | 3fa9561c3c54ef31ef4fd80ee240bc56029f90d0 (patch) | |
tree | 0ac910d44263305c29fee948aa60810c8c0c2f4f /src | |
parent | 3f9512b68752421200b4fc34645a25a494c01c9f (diff) | |
download | ghdl-3fa9561c3c54ef31ef4fd80ee240bc56029f90d0.tar.gz ghdl-3fa9561c3c54ef31ef4fd80ee240bc56029f90d0.tar.bz2 ghdl-3fa9561c3c54ef31ef4fd80ee240bc56029f90d0.zip |
vhdl: generate and handle package_instantiation_body
Diffstat (limited to 'src')
-rw-r--r-- | src/vhdl/translate/trans-chap2.adb | 13 | ||||
-rw-r--r-- | src/vhdl/translate/trans-chap4.adb | 15 | ||||
-rw-r--r-- | src/vhdl/translate/trans-rtis.adb | 6 | ||||
-rw-r--r-- | src/vhdl/vhdl-canon.adb | 75 | ||||
-rw-r--r-- | src/vhdl/vhdl-sem_inst.adb | 10 |
5 files changed, 108 insertions, 11 deletions
diff --git a/src/vhdl/translate/trans-chap2.adb b/src/vhdl/translate/trans-chap2.adb index b95f0eee0..896c7b4e8 100644 --- a/src/vhdl/translate/trans-chap2.adb +++ b/src/vhdl/translate/trans-chap2.adb @@ -1614,16 +1614,15 @@ package body Trans.Chap2 is declare Bod : constant Iir := Get_Instance_Package_Body (Inst); begin - if Is_Valid (Bod) then + if Get_Immediate_Body_Flag (Inst) then Translate_Package_Body (Bod); - else + elsif not Get_Need_Body (Spec) + and then not Is_Nested_Package (Inst) + and then Global_Storage /= O_Storage_External + then -- As an elaboration subprogram for the body is always -- needed, generate it. - if Global_Storage /= O_Storage_External then - if not Is_Nested_Package (Inst) then - Elab_Package_Body (Inst, Null_Iir); - end if; - end if; + Elab_Package_Body (Inst, Null_Iir); end if; end; return; diff --git a/src/vhdl/translate/trans-chap4.adb b/src/vhdl/translate/trans-chap4.adb index ab1633eaf..07e3f9030 100644 --- a/src/vhdl/translate/trans-chap4.adb +++ b/src/vhdl/translate/trans-chap4.adb @@ -2026,6 +2026,8 @@ package body Trans.Chap4 is Chap2.Translate_Package_Body (Decl); when Iir_Kind_Package_Instantiation_Declaration => Chap2.Translate_Package_Instantiation_Declaration (Decl); + when Iir_Kind_Package_Instantiation_Body => + Chap2.Translate_Package_Body (Decl); when Iir_Kind_Group_Template_Declaration => null; @@ -2711,12 +2713,21 @@ package body Trans.Chap4 is Translate_Declaration_Chain_Subprograms (El, What); if Is_Valid (Bod) and then Global_Storage /= O_Storage_External + and then Get_Immediate_Body_Flag (El) then Translate_Declaration_Chain_Subprograms (Bod, What); end if; Pop_Identifier_Prefix (Mark); end; end if; + when Iir_Kind_Package_Instantiation_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 others => null; end case; @@ -2835,6 +2846,10 @@ package body Trans.Chap4 is -- FIXME: finalizers ? Chap2.Elab_Package_Instantiation_Declaration (Decl); + when Iir_Kind_Package_Instantiation_Body => + -- No elaboration code for nested package. + null; + when Iir_Kind_Psl_Default_Clock => null; when Iir_Kind_Psl_Declaration => diff --git a/src/vhdl/translate/trans-rtis.adb b/src/vhdl/translate/trans-rtis.adb index 8b3c2cd04..3a9dabbb6 100644 --- a/src/vhdl/translate/trans-rtis.adb +++ b/src/vhdl/translate/trans-rtis.adb @@ -2414,7 +2414,8 @@ package body Trans.Rtis is end if; when Iir_Kind_Package_Instantiation_Declaration - | Iir_Kind_Interface_Package_Declaration => + | Iir_Kind_Interface_Package_Declaration + | Iir_Kind_Package_Instantiation_Body => -- FIXME: todo null; @@ -2909,6 +2910,9 @@ package body Trans.Rtis is when Iir_Kind_Configuration_Declaration => -- No RTI for configurations. return; + when Iir_Kind_Package_Instantiation_Body => + -- No RTI for instantiation bodies. + return; when Iir_Kind_Architecture_Body => if Info.Block_Rti_Const /= O_Dnode_Null then return; diff --git a/src/vhdl/vhdl-canon.adb b/src/vhdl/vhdl-canon.adb index 2f58f2e23..0294d1c2e 100644 --- a/src/vhdl/vhdl-canon.adb +++ b/src/vhdl/vhdl-canon.adb @@ -3223,6 +3223,20 @@ package body Vhdl.Canon is end if; end Canon_Subtype_Indication_If_Owned; + function Instantiation_Needs_Immediate_Body_P (Decl : Iir) return Boolean + is + Parent : constant Iir := Get_Parent (Decl); + begin + if Get_Kind (Parent) /= Iir_Kind_Package_Declaration then + -- TODO: also package instantiation ? + return True; + end if; + if not Get_Need_Body (Parent) then + return True; + end if; + return False; + end Instantiation_Needs_Immediate_Body_P; + -- Return the new package declaration (if any). procedure Canon_Package_Instantiation_Declaration (Decl : Iir) is @@ -3243,13 +3257,70 @@ package body Vhdl.Canon is -- FIXME: generate only if generating code for this unit. if Get_Macro_Expanded_Flag (Pkg) and then Get_Need_Body (Pkg) + and then Instantiation_Needs_Immediate_Body_P (Decl) then + Set_Immediate_Body_Flag (Decl, True); Bod := Sem_Inst.Instantiate_Package_Body (Decl); Set_Parent (Bod, Get_Parent (Decl)); Set_Instance_Package_Body (Decl, Bod); end if; end Canon_Package_Instantiation_Declaration; + procedure Canon_Package_Body (Bod : Iir) + is + Decl : Iir; + Prev_Decl : Iir; + begin + Decl := Get_Declaration_Chain (Bod); + Prev_Decl := Null_Iir; + while Decl /= Null_Iir loop + Canon_Declaration (Null_Iir, Decl, Null_Iir); + Prev_Decl := Decl; + Decl := Get_Chain (Prev_Decl); + end loop; + + -- Add bodies of package instantiations. + if Vhdl_Std >= Vhdl_08 then + declare + Pkg : constant Iir := Get_Package (Bod); + Pkg_Decl : Iir; + Pkg_Spec : Iir; + Inst_Bod : Iir; + begin + -- For each declaration of the package + Pkg_Decl := Get_Declaration_Chain (Pkg); + while Pkg_Decl /= Null_Iir loop + if (Get_Kind (Pkg_Decl) + = Iir_Kind_Package_Instantiation_Declaration) + then + -- This is a package instantiation... + Pkg_Spec := Get_Uninstantiated_Package_Decl (Pkg_Decl); + if Get_Need_Body (Pkg_Spec) + and then Get_Macro_Expanded_Flag (Pkg_Spec) + then + -- ... that needs a body. Create the body. + Inst_Bod := Sem_Inst.Instantiate_Package_Body (Pkg_Decl); + Set_Parent (Inst_Bod, Bod); + pragma Assert + (Get_Instance_Package_Body (Pkg_Decl) = Null_Iir); + Set_Instance_Package_Body (Pkg_Decl, Inst_Bod); + + -- Append. + if Prev_Decl = Null_Iir then + Set_Declaration_Chain (Bod, Inst_Bod); + else + Set_Chain (Prev_Decl, Inst_Bod); + end if; + Prev_Decl := Inst_Bod; + end if; + end if; + + Pkg_Decl := Get_Chain (Pkg_Decl); + end loop; + end; + end if; + end Canon_Package_Body; + procedure Canon_Declaration (Top : Iir_Design_Unit; Decl : Iir; Parent : Iir) is @@ -3351,7 +3422,7 @@ package body Vhdl.Canon is when Iir_Kind_Package_Declaration => Canon_Declarations (Top, Decl, Null_Iir); when Iir_Kind_Package_Body => - Canon_Declarations (Top, Decl, Parent); + Canon_Package_Body (Decl); when Iir_Kind_Package_Instantiation_Declaration => Canon_Package_Instantiation_Declaration (Decl); @@ -3795,7 +3866,7 @@ package body Vhdl.Canon is when Iir_Kind_Package_Declaration => Canon_Declarations (Unit, El, Null_Iir); when Iir_Kind_Package_Body => - Canon_Declarations (Unit, El, Null_Iir); + Canon_Package_Body (El); when Iir_Kind_Configuration_Declaration => Canon_Declarations (Unit, El, Null_Iir); if Canon_Flag_Configurations then diff --git a/src/vhdl/vhdl-sem_inst.adb b/src/vhdl/vhdl-sem_inst.adb index 57225e2ae..66754d91d 100644 --- a/src/vhdl/vhdl-sem_inst.adb +++ b/src/vhdl/vhdl-sem_inst.adb @@ -1219,6 +1219,7 @@ package body Vhdl.Sem_Inst is 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; + Bod : constant Iir := Get_Package_Body (Pkg); Res : Iir; begin Create_Relocation (Inst, Pkg); @@ -1302,7 +1303,14 @@ package body Vhdl.Sem_Inst is (Get_Declaration_Chain (Pkg), Get_Declaration_Chain (Inst)); -- Instantiate the body. - Res := Instantiate_Iir (Get_Package_Body (Pkg), False); + + Res := Create_Iir (Iir_Kind_Package_Instantiation_Body); + Location_Copy (Res, Inst); + Set_Declaration_Chain + (Res, Instantiate_Iir_Chain (Get_Declaration_Chain (Bod))); + Set_Attribute_Value_Chain + (Res, Instantiate_Iir_Chain (Get_Attribute_Value_Chain (Bod))); + Set_Package (Res, Inst); Set_Identifier (Res, Get_Identifier (Inst)); -- Restore. |