diff options
author | Tristan Gingold <tgingold@free.fr> | 2016-09-01 06:26:39 +0200 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2016-09-01 21:17:13 +0200 |
commit | 3d73c2660aa6e32d8976f5a73494c425bb9ce73f (patch) | |
tree | 56775e53f258675b0ea4dfbfcb5c212387ac65b1 | |
parent | 4e6853861f3809d45424b6eb372ccd91ed76f0cb (diff) | |
download | ghdl-3d73c2660aa6e32d8976f5a73494c425bb9ce73f.tar.gz ghdl-3d73c2660aa6e32d8976f5a73494c425bb9ce73f.tar.bz2 ghdl-3d73c2660aa6e32d8976f5a73494c425bb9ce73f.zip |
vhdl08: preliminary work for nested package and type association.
-rw-r--r-- | src/vhdl/canon.adb | 32 | ||||
-rw-r--r-- | src/vhdl/errorout.adb | 3 | ||||
-rw-r--r-- | src/vhdl/iirs.adb | 19 | ||||
-rw-r--r-- | src/vhdl/iirs.ads | 55 | ||||
-rw-r--r-- | src/vhdl/nodes_meta.adb | 524 | ||||
-rw-r--r-- | src/vhdl/parse.adb | 36 | ||||
-rw-r--r-- | src/vhdl/sem.adb | 16 | ||||
-rw-r--r-- | src/vhdl/sem.ads | 9 | ||||
-rw-r--r-- | src/vhdl/sem_assocs.adb | 76 | ||||
-rw-r--r-- | src/vhdl/sem_decls.adb | 8 | ||||
-rw-r--r-- | src/vhdl/sem_inst.adb | 12 | ||||
-rw-r--r-- | src/vhdl/sem_scopes.adb | 1 |
12 files changed, 474 insertions, 317 deletions
diff --git a/src/vhdl/canon.adb b/src/vhdl/canon.adb index f3cc675e8..74b271f80 100644 --- a/src/vhdl/canon.adb +++ b/src/vhdl/canon.adb @@ -887,7 +887,8 @@ package body Canon is end if; when Iir_Kind_Association_Element_By_Individual => Found := True; - when Iir_Kind_Association_Element_Package => + when Iir_Kind_Association_Element_Package + | Iir_Kind_Association_Element_Type => goto Done; when others => Error_Kind ("canon_association_chain", Assoc_El); @@ -2551,6 +2552,19 @@ package body Canon is end if; end Canon_Subtype_Indication_If_Anonymous; + procedure Canon_Package_Instantiation_Declaration (Decl : Iir) + is + Pkg : constant Iir := + Get_Named_Entity (Get_Uninstantiated_Package_Name (Decl)); + Hdr : constant Iir := Get_Package_Header (Pkg); + begin + Set_Generic_Map_Aspect_Chain + (Decl, + Canon_Association_Chain_And_Actuals + (Get_Generic_Chain (Hdr), + Get_Generic_Map_Aspect_Chain (Decl), Decl)); + end Canon_Package_Instantiation_Declaration; + procedure Canon_Declaration (Top : Iir_Design_Unit; Decl : Iir; Parent : Iir; @@ -2632,6 +2646,10 @@ package body Canon is when Iir_Kind_Configuration_Specification => Canon_Component_Specification (Decl, Parent); Canon_Component_Configuration (Top, Decl); + + when Iir_Kind_Package_Instantiation_Declaration => + Canon_Package_Instantiation_Declaration (Decl); + -- declare -- List : Iir_List; -- Binding : Iir_Binding_Indication; @@ -3000,17 +3018,7 @@ package body Canon is Canon_Declarations (Unit, El, Null_Iir); Canon_Block_Configuration (Unit, Get_Block_Configuration (El)); when Iir_Kind_Package_Instantiation_Declaration => - declare - Pkg : constant Iir := - Get_Named_Entity (Get_Uninstantiated_Package_Name (El)); - Hdr : constant Iir := Get_Package_Header (Pkg); - begin - Set_Generic_Map_Aspect_Chain - (El, - Canon_Association_Chain_And_Actuals - (Get_Generic_Chain (Hdr), - Get_Generic_Map_Aspect_Chain (El), El)); - end; + Canon_Package_Instantiation_Declaration (El); when Iir_Kind_Context_Declaration => null; when others => diff --git a/src/vhdl/errorout.adb b/src/vhdl/errorout.adb index e937cda57..1181af907 100644 --- a/src/vhdl/errorout.adb +++ b/src/vhdl/errorout.adb @@ -715,7 +715,8 @@ package body Errorout is when Iir_Kind_Association_Element_By_Individual => return "individual association element"; when Iir_Kind_Association_Element_By_Expression - | Iir_Kind_Association_Element_Package => + | Iir_Kind_Association_Element_Package + | Iir_Kind_Association_Element_Type => return "association element"; when Iir_Kind_Overload_List => return "overloaded name or expression"; diff --git a/src/vhdl/iirs.adb b/src/vhdl/iirs.adb index 05acf1b3a..72c645c2a 100644 --- a/src/vhdl/iirs.adb +++ b/src/vhdl/iirs.adb @@ -266,6 +266,7 @@ package body Iirs is | Iir_Kind_Association_Element_By_Individual | Iir_Kind_Association_Element_Open | Iir_Kind_Association_Element_Package + | Iir_Kind_Association_Element_Type | Iir_Kind_Choice_By_Others | Iir_Kind_Choice_By_Expression | Iir_Kind_Choice_By_Range @@ -309,7 +310,6 @@ package body Iirs is | Iir_Kind_Subtype_Declaration | Iir_Kind_Nature_Declaration | Iir_Kind_Subnature_Declaration - | Iir_Kind_Package_Declaration | Iir_Kind_Package_Body | Iir_Kind_Configuration_Declaration | Iir_Kind_Context_Declaration @@ -477,6 +477,7 @@ package body Iirs is | Iir_Kind_Floating_Subtype_Definition | Iir_Kind_Subtype_Definition | Iir_Kind_Scalar_Nature_Definition + | Iir_Kind_Package_Declaration | Iir_Kind_Package_Instantiation_Declaration | Iir_Kind_Entity_Declaration | Iir_Kind_Architecture_Body @@ -1700,7 +1701,7 @@ package body Iirs is pragma Assert (Pkg /= Null_Iir); pragma Assert (Has_Package_Body (Get_Kind (Pkg)), "no field Package_Body"); - return Get_Field2 (Pkg); + return Get_Field5 (Pkg); end Get_Package_Body; procedure Set_Package_Body (Pkg : Iir; Decl : Iir) is @@ -1708,7 +1709,7 @@ package body Iirs is pragma Assert (Pkg /= Null_Iir); pragma Assert (Has_Package_Body (Get_Kind (Pkg)), "no field Package_Body"); - Set_Field2 (Pkg, Decl); + Set_Field5 (Pkg, Decl); end Set_Package_Body; function Get_Need_Body (Decl : Iir_Package_Declaration) return Boolean is @@ -3787,7 +3788,7 @@ package body Iirs is pragma Assert (Pkg /= Null_Iir); pragma Assert (Has_Package_Header (Get_Kind (Pkg)), "no field Package_Header"); - return Get_Field5 (Pkg); + return Get_Field6 (Pkg); end Get_Package_Header; procedure Set_Package_Header (Pkg : Iir; Header : Iir) is @@ -3795,7 +3796,7 @@ package body Iirs is pragma Assert (Pkg /= Null_Iir); pragma Assert (Has_Package_Header (Get_Kind (Pkg)), "no field Package_Header"); - Set_Field5 (Pkg, Header); + Set_Field6 (Pkg, Header); end Set_Package_Header; function Get_Block_Header (Target : Iir) return Iir is @@ -3819,7 +3820,7 @@ package body Iirs is pragma Assert (Inst /= Null_Iir); pragma Assert (Has_Uninstantiated_Package_Name (Get_Kind (Inst)), "no field Uninstantiated_Package_Name"); - return Get_Field5 (Inst); + return Get_Field7 (Inst); end Get_Uninstantiated_Package_Name; procedure Set_Uninstantiated_Package_Name (Inst : Iir; Name : Iir) is @@ -3827,7 +3828,7 @@ package body Iirs is pragma Assert (Inst /= Null_Iir); pragma Assert (Has_Uninstantiated_Package_Name (Get_Kind (Inst)), "no field Uninstantiated_Package_Name"); - Set_Field5 (Inst, Name); + Set_Field7 (Inst, Name); end Set_Uninstantiated_Package_Name; function Get_Generate_Block_Configuration (Target : Iir) return Iir is @@ -4413,7 +4414,7 @@ package body Iirs is pragma Assert (Target /= Null_Iir); pragma Assert (Has_Actual_Type (Get_Kind (Target)), "no field Actual_Type"); - return Get_Field3 (Target); + return Get_Field5 (Target); end Get_Actual_Type; procedure Set_Actual_Type (Target : Iir; Atype : Iir) is @@ -4421,7 +4422,7 @@ package body Iirs is pragma Assert (Target /= Null_Iir); pragma Assert (Has_Actual_Type (Get_Kind (Target)), "no field Actual_Type"); - Set_Field3 (Target, Atype); + Set_Field5 (Target, Atype); end Set_Actual_Type; function Get_Associated_Interface (Assoc : Iir) return Iir is diff --git a/src/vhdl/iirs.ads b/src/vhdl/iirs.ads index da25f490f..3efcea38e 100644 --- a/src/vhdl/iirs.ads +++ b/src/vhdl/iirs.ads @@ -390,6 +390,7 @@ package Iirs is -- Iir_Kind_Association_Element_Open (Short) -- Iir_Kind_Association_Element_By_Individual (Short) -- Iir_Kind_Association_Element_Package (Short) + -- Iir_Kind_Association_Element_Type (Short) -- These are used for association element of an association list with -- an interface (ie subprogram call, port map, generic map). -- @@ -399,19 +400,14 @@ package Iirs is -- -- Only for Iir_Kind_Association_Element_By_Expression: -- Only for Iir_Kind_Association_Element_Package: + -- Only for Iir_Kind_Association_Element_Type: -- Get/Set_Actual (Field3) -- -- Only for Iir_Kind_Association_Element_By_Individual: - -- Get/Set_Actual_Type (Field3) - -- - -- Only for Iir_Kind_Association_Element_By_Individual: - -- Must be Locally unless there is an error on one choice. - -- Get/Set_Choice_Staticness (State2) - -- - -- Only for Iir_Kind_Association_Element_By_Individual: -- Get/Set_Individual_Association_Chain (Field4) -- -- Only for Iir_Kind_Association_Element_Package: + -- Only for Iir_Kind_Association_Element_Type: -- Get/Set_Associated_Interface (Field4) -- -- A function call or a type conversion for the association. @@ -419,6 +415,10 @@ package Iirs is -- Only for Iir_Kind_Association_Element_By_Expression: -- Get/Set_In_Conversion (Field4) -- + -- Only for Iir_Kind_Association_Element_By_Individual: + -- Only for Iir_Kind_Association_Element_Type: + -- Get/Set_Actual_Type (Field5) + -- -- Only for Iir_Kind_Association_Element_By_Expression: -- Get/Set_Out_Conversion (Field5) -- @@ -430,6 +430,10 @@ package Iirs is -- -- Only for Iir_Kind_Association_Element_Open: -- Get/Set_Artificial_Flag (Flag3) + -- + -- Only for Iir_Kind_Association_Element_By_Individual: + -- Must be Locally unless there is an error on one choice. + -- Get/Set_Choice_Staticness (State2) -- Iir_Kind_Waveform_Element (Short) -- @@ -825,20 +829,23 @@ package Iirs is -- -- Get/Set_Generic_Map_Aspect_Chain (Field8) - -- Iir_Kind_Package_Declaration (Short) + -- Iir_Kind_Package_Declaration (Medium) -- -- Get/Set_Parent (Field0) -- Get/Set_Design_Unit (Alias Field0) -- -- Get/Set_Declaration_Chain (Field1) -- - -- Get/Set_Package_Body (Field2) + -- For nested packages + -- Get/Set_Chain (Field2) -- -- Get/Set_Identifier (Field3) -- -- Get/Set_Attribute_Value_Chain (Field4) -- - -- Get/Set_Package_Header (Field5) + -- Get/Set_Package_Body (Field5) + -- + -- Get/Set_Package_Header (Field6) -- -- Get/Set_Need_Body (Flag1) -- @@ -857,6 +864,9 @@ package Iirs is -- -- Get/Set_Declaration_Chain (Field1) -- + -- For nested packages. + -- Get/Set_Chain (Field2) + -- -- Get/Set_Identifier (Field3) -- -- Get/Set_Attribute_Value_Chain (Field4) @@ -875,16 +885,19 @@ package Iirs is -- -- Get/Set_Declaration_Chain (Field1) -- - -- Get/Set_Package_Body (Field2) + -- For nested packages + -- Get/Set_Chain (Field2) -- -- Get/Set_Identifier (Field3) -- -- Get/Set_Attribute_Value_Chain (Field4) -- - -- Get/Set_Uninstantiated_Package_Name (Field5) + -- Get/Set_Package_Body (Field5) -- -- Get/Set_Generic_Chain (Field6) -- + -- Get/Set_Uninstantiated_Package_Name (Field7) + -- -- Get/Set_Generic_Map_Aspect_Chain (Field8) -- -- Get/Set_Visible_Flag (Flag4) @@ -1225,10 +1238,10 @@ package Iirs is -- -- Get/Set_Attribute_Value_Chain (Field4) -- - -- Get/Set_Uninstantiated_Package_Name (Field5) - -- -- Get/Set_Generic_Chain (Field6) -- + -- Get/Set_Uninstantiated_Package_Name (Field7) + -- -- Get/Set_Generic_Map_Aspect_Chain (Field8) -- -- Get/Set_Visible_Flag (Flag4) @@ -3730,6 +3743,7 @@ package Iirs is Iir_Kind_Association_Element_By_Individual, Iir_Kind_Association_Element_Open, Iir_Kind_Association_Element_Package, + Iir_Kind_Association_Element_Type, Iir_Kind_Choice_By_Others, Iir_Kind_Choice_By_Expression, Iir_Kind_Choice_By_Range, @@ -5701,7 +5715,7 @@ package Iirs is procedure Set_Package (Package_Body : Iir; Decl : Iir); -- The package body corresponding to the package declaration. - -- Field: Field2 Ref + -- Field: Field5 Ref function Get_Package_Body (Pkg : Iir) return Iir; procedure Set_Package_Body (Pkg : Iir; Decl : Iir); @@ -6373,7 +6387,7 @@ package Iirs is function Get_Block_Block_Configuration (Block : Iir) return Iir; procedure Set_Block_Block_Configuration (Block : Iir; Conf : Iir); - -- Field: Field5 + -- Field: Field6 function Get_Package_Header (Pkg : Iir) return Iir; procedure Set_Package_Header (Pkg : Iir; Header : Iir); @@ -6381,7 +6395,7 @@ package Iirs is function Get_Block_Header (Target : Iir) return Iir; procedure Set_Block_Header (Target : Iir; Header : Iir); - -- Field: Field5 + -- Field: Field7 function Get_Uninstantiated_Package_Name (Inst : Iir) return Iir; procedure Set_Uninstantiated_Package_Name (Inst : Iir; Name : Iir); @@ -6558,9 +6572,10 @@ package Iirs is procedure Set_Parameter (Target : Iir; Param : Iir); -- Type of the actual for an association by individual. - -- Unless the formal is an unconstrained array type, this is the same as - -- the formal type. - -- Field: Field3 + -- Unless the formal is an unconstrained array type, this is the same as + -- the formal type. + -- Subtype indiciation for a type association. + -- Field: Field5 function Get_Actual_Type (Target : Iir) return Iir; procedure Set_Actual_Type (Target : Iir; Atype : Iir); diff --git a/src/vhdl/nodes_meta.adb b/src/vhdl/nodes_meta.adb index ae9c29c8e..4e09367f7 100644 --- a/src/vhdl/nodes_meta.adb +++ b/src/vhdl/nodes_meta.adb @@ -997,6 +997,8 @@ package body Nodes_Meta is return "association_element_open"; when Iir_Kind_Association_Element_Package => return "association_element_package"; + when Iir_Kind_Association_Element_Type => + return "association_element_type"; when Iir_Kind_Choice_By_Others => return "choice_by_others"; when Iir_Kind_Choice_By_Expression => @@ -2219,8 +2221,8 @@ package body Nodes_Meta is Field_Choice_Staticness, Field_Formal, Field_Chain, - Field_Actual_Type, Field_Individual_Association_Chain, + Field_Actual_Type, -- Iir_Kind_Association_Element_Open Field_Whole_Association_Flag, Field_Collapse_Signal_Flag, @@ -2234,6 +2236,14 @@ package body Nodes_Meta is Field_Chain, Field_Actual, Field_Associated_Interface, + -- Iir_Kind_Association_Element_Type + Field_Whole_Association_Flag, + Field_Collapse_Signal_Flag, + Field_Formal, + Field_Chain, + Field_Actual, + Field_Actual_Type, + Field_Associated_Interface, -- Iir_Kind_Choice_By_Others Field_Same_Alternative_Flag, Field_Chain, @@ -2620,6 +2630,7 @@ package body Nodes_Meta is Field_End_Has_Reserved_Id, Field_End_Has_Identifier, Field_Declaration_Chain, + Field_Chain, Field_Attribute_Value_Chain, Field_Package_Header, Field_Parent, @@ -2630,9 +2641,10 @@ package body Nodes_Meta is Field_End_Has_Reserved_Id, Field_End_Has_Identifier, Field_Declaration_Chain, + Field_Chain, Field_Attribute_Value_Chain, - Field_Uninstantiated_Package_Name, Field_Generic_Chain, + Field_Uninstantiated_Package_Name, Field_Generic_Map_Aspect_Chain, Field_Parent, Field_Package_Body, @@ -2641,6 +2653,7 @@ package body Nodes_Meta is Field_End_Has_Reserved_Id, Field_End_Has_Identifier, Field_Declaration_Chain, + Field_Chain, Field_Attribute_Value_Chain, Field_Parent, Field_Package, @@ -3103,8 +3116,8 @@ package body Nodes_Meta is Field_Declaration_Chain, Field_Chain, Field_Attribute_Value_Chain, - Field_Uninstantiated_Package_Name, Field_Generic_Chain, + Field_Uninstantiated_Package_Name, Field_Generic_Map_Aspect_Chain, Field_Parent, -- Iir_Kind_Identity_Operator @@ -4145,242 +4158,243 @@ package body Nodes_Meta is Iir_Kind_Association_Element_By_Individual => 108, Iir_Kind_Association_Element_Open => 113, Iir_Kind_Association_Element_Package => 119, - Iir_Kind_Choice_By_Others => 124, - Iir_Kind_Choice_By_Expression => 131, - Iir_Kind_Choice_By_Range => 138, - Iir_Kind_Choice_By_None => 143, - Iir_Kind_Choice_By_Name => 149, - Iir_Kind_Entity_Aspect_Entity => 151, - Iir_Kind_Entity_Aspect_Configuration => 152, - Iir_Kind_Entity_Aspect_Open => 152, - Iir_Kind_Block_Configuration => 158, - Iir_Kind_Block_Header => 162, - Iir_Kind_Component_Configuration => 168, - Iir_Kind_Binding_Indication => 174, - Iir_Kind_Entity_Class => 176, - Iir_Kind_Attribute_Value => 184, - Iir_Kind_Signature => 187, - Iir_Kind_Aggregate_Info => 194, - Iir_Kind_Procedure_Call => 198, - Iir_Kind_Record_Element_Constraint => 204, - Iir_Kind_Array_Element_Resolution => 205, - Iir_Kind_Record_Resolution => 206, - Iir_Kind_Record_Element_Resolution => 209, - Iir_Kind_Attribute_Specification => 218, - Iir_Kind_Disconnection_Specification => 223, - Iir_Kind_Configuration_Specification => 228, - Iir_Kind_Access_Type_Definition => 235, - Iir_Kind_Incomplete_Type_Definition => 242, - Iir_Kind_Interface_Type_Definition => 248, - Iir_Kind_File_Type_Definition => 255, - Iir_Kind_Protected_Type_Declaration => 264, - Iir_Kind_Record_Type_Definition => 274, - Iir_Kind_Array_Type_Definition => 286, - Iir_Kind_Array_Subtype_Definition => 301, - Iir_Kind_Record_Subtype_Definition => 312, - Iir_Kind_Access_Subtype_Definition => 320, - Iir_Kind_Physical_Subtype_Definition => 329, - Iir_Kind_Floating_Subtype_Definition => 339, - Iir_Kind_Integer_Subtype_Definition => 348, - Iir_Kind_Enumeration_Subtype_Definition => 357, - Iir_Kind_Enumeration_Type_Definition => 366, - Iir_Kind_Integer_Type_Definition => 372, - Iir_Kind_Floating_Type_Definition => 378, - Iir_Kind_Physical_Type_Definition => 387, - Iir_Kind_Range_Expression => 393, - Iir_Kind_Protected_Type_Body => 400, - Iir_Kind_Wildcard_Type_Definition => 405, - Iir_Kind_Subtype_Definition => 409, - Iir_Kind_Scalar_Nature_Definition => 413, - Iir_Kind_Overload_List => 414, - Iir_Kind_Type_Declaration => 420, - Iir_Kind_Anonymous_Type_Declaration => 425, - Iir_Kind_Subtype_Declaration => 433, - Iir_Kind_Nature_Declaration => 439, - Iir_Kind_Subnature_Declaration => 445, - Iir_Kind_Package_Declaration => 455, - Iir_Kind_Package_Instantiation_Declaration => 466, - Iir_Kind_Package_Body => 473, - Iir_Kind_Configuration_Declaration => 482, - Iir_Kind_Entity_Declaration => 494, - Iir_Kind_Architecture_Body => 506, - Iir_Kind_Context_Declaration => 512, - Iir_Kind_Package_Header => 514, - Iir_Kind_Unit_Declaration => 523, - Iir_Kind_Library_Declaration => 530, - Iir_Kind_Component_Declaration => 540, - Iir_Kind_Attribute_Declaration => 547, - Iir_Kind_Group_Template_Declaration => 553, - Iir_Kind_Group_Declaration => 560, - Iir_Kind_Element_Declaration => 567, - Iir_Kind_Non_Object_Alias_Declaration => 575, - Iir_Kind_Psl_Declaration => 583, - Iir_Kind_Psl_Endpoint_Declaration => 597, - Iir_Kind_Terminal_Declaration => 603, - Iir_Kind_Free_Quantity_Declaration => 612, - Iir_Kind_Across_Quantity_Declaration => 624, - Iir_Kind_Through_Quantity_Declaration => 636, - Iir_Kind_Enumeration_Literal => 647, - Iir_Kind_Function_Declaration => 671, - Iir_Kind_Procedure_Declaration => 694, - Iir_Kind_Function_Body => 704, - Iir_Kind_Procedure_Body => 715, - Iir_Kind_Object_Alias_Declaration => 727, - Iir_Kind_File_Declaration => 742, - Iir_Kind_Guard_Signal_Declaration => 755, - Iir_Kind_Signal_Declaration => 772, - Iir_Kind_Variable_Declaration => 785, - Iir_Kind_Constant_Declaration => 799, - Iir_Kind_Iterator_Declaration => 811, - Iir_Kind_Interface_Constant_Declaration => 827, - Iir_Kind_Interface_Variable_Declaration => 843, - Iir_Kind_Interface_Signal_Declaration => 864, - Iir_Kind_Interface_File_Declaration => 880, - Iir_Kind_Interface_Type_Declaration => 890, - Iir_Kind_Interface_Package_Declaration => 899, - Iir_Kind_Identity_Operator => 903, - Iir_Kind_Negation_Operator => 907, - Iir_Kind_Absolute_Operator => 911, - Iir_Kind_Not_Operator => 915, - Iir_Kind_Condition_Operator => 919, - Iir_Kind_Reduction_And_Operator => 923, - Iir_Kind_Reduction_Or_Operator => 927, - Iir_Kind_Reduction_Nand_Operator => 931, - Iir_Kind_Reduction_Nor_Operator => 935, - Iir_Kind_Reduction_Xor_Operator => 939, - Iir_Kind_Reduction_Xnor_Operator => 943, - Iir_Kind_And_Operator => 948, - Iir_Kind_Or_Operator => 953, - Iir_Kind_Nand_Operator => 958, - Iir_Kind_Nor_Operator => 963, - Iir_Kind_Xor_Operator => 968, - Iir_Kind_Xnor_Operator => 973, - Iir_Kind_Equality_Operator => 978, - Iir_Kind_Inequality_Operator => 983, - Iir_Kind_Less_Than_Operator => 988, - Iir_Kind_Less_Than_Or_Equal_Operator => 993, - Iir_Kind_Greater_Than_Operator => 998, - Iir_Kind_Greater_Than_Or_Equal_Operator => 1003, - Iir_Kind_Match_Equality_Operator => 1008, - Iir_Kind_Match_Inequality_Operator => 1013, - Iir_Kind_Match_Less_Than_Operator => 1018, - Iir_Kind_Match_Less_Than_Or_Equal_Operator => 1023, - Iir_Kind_Match_Greater_Than_Operator => 1028, - Iir_Kind_Match_Greater_Than_Or_Equal_Operator => 1033, - Iir_Kind_Sll_Operator => 1038, - Iir_Kind_Sla_Operator => 1043, - Iir_Kind_Srl_Operator => 1048, - Iir_Kind_Sra_Operator => 1053, - Iir_Kind_Rol_Operator => 1058, - Iir_Kind_Ror_Operator => 1063, - Iir_Kind_Addition_Operator => 1068, - Iir_Kind_Substraction_Operator => 1073, - Iir_Kind_Concatenation_Operator => 1078, - Iir_Kind_Multiplication_Operator => 1083, - Iir_Kind_Division_Operator => 1088, - Iir_Kind_Modulus_Operator => 1093, - Iir_Kind_Remainder_Operator => 1098, - Iir_Kind_Exponentiation_Operator => 1103, - Iir_Kind_Function_Call => 1111, - Iir_Kind_Aggregate => 1117, - Iir_Kind_Parenthesis_Expression => 1120, - Iir_Kind_Qualified_Expression => 1124, - Iir_Kind_Type_Conversion => 1129, - Iir_Kind_Allocator_By_Expression => 1133, - Iir_Kind_Allocator_By_Subtype => 1139, - Iir_Kind_Selected_Element => 1145, - Iir_Kind_Dereference => 1150, - Iir_Kind_Implicit_Dereference => 1155, - Iir_Kind_Slice_Name => 1162, - Iir_Kind_Indexed_Name => 1168, - Iir_Kind_Psl_Expression => 1170, - Iir_Kind_Sensitized_Process_Statement => 1190, - Iir_Kind_Process_Statement => 1210, - Iir_Kind_Concurrent_Simple_Signal_Assignment => 1221, - Iir_Kind_Concurrent_Conditional_Signal_Assignment => 1232, - Iir_Kind_Concurrent_Selected_Signal_Assignment => 1244, - Iir_Kind_Concurrent_Assertion_Statement => 1252, - Iir_Kind_Psl_Default_Clock => 1256, - Iir_Kind_Psl_Assert_Statement => 1269, - Iir_Kind_Psl_Cover_Statement => 1282, - Iir_Kind_Concurrent_Procedure_Call_Statement => 1289, - Iir_Kind_Block_Statement => 1302, - Iir_Kind_If_Generate_Statement => 1312, - Iir_Kind_Case_Generate_Statement => 1321, - Iir_Kind_For_Generate_Statement => 1330, - Iir_Kind_Component_Instantiation_Statement => 1340, - Iir_Kind_Simple_Simultaneous_Statement => 1347, - Iir_Kind_Generate_Statement_Body => 1358, - Iir_Kind_If_Generate_Else_Clause => 1363, - Iir_Kind_Simple_Signal_Assignment_Statement => 1372, - Iir_Kind_Conditional_Signal_Assignment_Statement => 1381, - Iir_Kind_Null_Statement => 1385, - Iir_Kind_Assertion_Statement => 1392, - Iir_Kind_Report_Statement => 1398, - Iir_Kind_Wait_Statement => 1405, - Iir_Kind_Variable_Assignment_Statement => 1411, - Iir_Kind_Conditional_Variable_Assignment_Statement => 1417, - Iir_Kind_Return_Statement => 1423, - Iir_Kind_For_Loop_Statement => 1432, - Iir_Kind_While_Loop_Statement => 1440, - Iir_Kind_Next_Statement => 1446, - Iir_Kind_Exit_Statement => 1452, - Iir_Kind_Case_Statement => 1460, - Iir_Kind_Procedure_Call_Statement => 1466, - Iir_Kind_If_Statement => 1475, - Iir_Kind_Elsif => 1480, - Iir_Kind_Character_Literal => 1487, - Iir_Kind_Simple_Name => 1494, - Iir_Kind_Selected_Name => 1502, - Iir_Kind_Operator_Symbol => 1507, - Iir_Kind_Selected_By_All_Name => 1512, - Iir_Kind_Parenthesis_Name => 1516, - Iir_Kind_External_Constant_Name => 1525, - Iir_Kind_External_Signal_Name => 1534, - Iir_Kind_External_Variable_Name => 1543, - Iir_Kind_Package_Pathname => 1546, - Iir_Kind_Absolute_Pathname => 1547, - Iir_Kind_Relative_Pathname => 1548, - Iir_Kind_Pathname_Element => 1552, - Iir_Kind_Base_Attribute => 1554, - Iir_Kind_Left_Type_Attribute => 1559, - Iir_Kind_Right_Type_Attribute => 1564, - Iir_Kind_High_Type_Attribute => 1569, - Iir_Kind_Low_Type_Attribute => 1574, - Iir_Kind_Ascending_Type_Attribute => 1579, - Iir_Kind_Image_Attribute => 1585, - Iir_Kind_Value_Attribute => 1591, - Iir_Kind_Pos_Attribute => 1597, - Iir_Kind_Val_Attribute => 1603, - Iir_Kind_Succ_Attribute => 1609, - Iir_Kind_Pred_Attribute => 1615, - Iir_Kind_Leftof_Attribute => 1621, - Iir_Kind_Rightof_Attribute => 1627, - Iir_Kind_Delayed_Attribute => 1635, - Iir_Kind_Stable_Attribute => 1643, - Iir_Kind_Quiet_Attribute => 1651, - Iir_Kind_Transaction_Attribute => 1659, - Iir_Kind_Event_Attribute => 1663, - Iir_Kind_Active_Attribute => 1667, - Iir_Kind_Last_Event_Attribute => 1671, - Iir_Kind_Last_Active_Attribute => 1675, - Iir_Kind_Last_Value_Attribute => 1679, - Iir_Kind_Driving_Attribute => 1683, - Iir_Kind_Driving_Value_Attribute => 1687, - Iir_Kind_Behavior_Attribute => 1687, - Iir_Kind_Structure_Attribute => 1687, - Iir_Kind_Simple_Name_Attribute => 1694, - Iir_Kind_Instance_Name_Attribute => 1699, - Iir_Kind_Path_Name_Attribute => 1704, - Iir_Kind_Left_Array_Attribute => 1711, - Iir_Kind_Right_Array_Attribute => 1718, - Iir_Kind_High_Array_Attribute => 1725, - Iir_Kind_Low_Array_Attribute => 1732, - Iir_Kind_Length_Array_Attribute => 1739, - Iir_Kind_Ascending_Array_Attribute => 1746, - Iir_Kind_Range_Array_Attribute => 1753, - Iir_Kind_Reverse_Range_Array_Attribute => 1760, - Iir_Kind_Attribute_Name => 1768 + Iir_Kind_Association_Element_Type => 126, + Iir_Kind_Choice_By_Others => 131, + Iir_Kind_Choice_By_Expression => 138, + Iir_Kind_Choice_By_Range => 145, + Iir_Kind_Choice_By_None => 150, + Iir_Kind_Choice_By_Name => 156, + Iir_Kind_Entity_Aspect_Entity => 158, + Iir_Kind_Entity_Aspect_Configuration => 159, + Iir_Kind_Entity_Aspect_Open => 159, + Iir_Kind_Block_Configuration => 165, + Iir_Kind_Block_Header => 169, + Iir_Kind_Component_Configuration => 175, + Iir_Kind_Binding_Indication => 181, + Iir_Kind_Entity_Class => 183, + Iir_Kind_Attribute_Value => 191, + Iir_Kind_Signature => 194, + Iir_Kind_Aggregate_Info => 201, + Iir_Kind_Procedure_Call => 205, + Iir_Kind_Record_Element_Constraint => 211, + Iir_Kind_Array_Element_Resolution => 212, + Iir_Kind_Record_Resolution => 213, + Iir_Kind_Record_Element_Resolution => 216, + Iir_Kind_Attribute_Specification => 225, + Iir_Kind_Disconnection_Specification => 230, + Iir_Kind_Configuration_Specification => 235, + Iir_Kind_Access_Type_Definition => 242, + Iir_Kind_Incomplete_Type_Definition => 249, + Iir_Kind_Interface_Type_Definition => 255, + Iir_Kind_File_Type_Definition => 262, + Iir_Kind_Protected_Type_Declaration => 271, + Iir_Kind_Record_Type_Definition => 281, + Iir_Kind_Array_Type_Definition => 293, + Iir_Kind_Array_Subtype_Definition => 308, + Iir_Kind_Record_Subtype_Definition => 319, + Iir_Kind_Access_Subtype_Definition => 327, + Iir_Kind_Physical_Subtype_Definition => 336, + Iir_Kind_Floating_Subtype_Definition => 346, + Iir_Kind_Integer_Subtype_Definition => 355, + Iir_Kind_Enumeration_Subtype_Definition => 364, + Iir_Kind_Enumeration_Type_Definition => 373, + Iir_Kind_Integer_Type_Definition => 379, + Iir_Kind_Floating_Type_Definition => 385, + Iir_Kind_Physical_Type_Definition => 394, + Iir_Kind_Range_Expression => 400, + Iir_Kind_Protected_Type_Body => 407, + Iir_Kind_Wildcard_Type_Definition => 412, + Iir_Kind_Subtype_Definition => 416, + Iir_Kind_Scalar_Nature_Definition => 420, + Iir_Kind_Overload_List => 421, + Iir_Kind_Type_Declaration => 427, + Iir_Kind_Anonymous_Type_Declaration => 432, + Iir_Kind_Subtype_Declaration => 440, + Iir_Kind_Nature_Declaration => 446, + Iir_Kind_Subnature_Declaration => 452, + Iir_Kind_Package_Declaration => 463, + Iir_Kind_Package_Instantiation_Declaration => 475, + Iir_Kind_Package_Body => 483, + Iir_Kind_Configuration_Declaration => 492, + Iir_Kind_Entity_Declaration => 504, + Iir_Kind_Architecture_Body => 516, + Iir_Kind_Context_Declaration => 522, + Iir_Kind_Package_Header => 524, + Iir_Kind_Unit_Declaration => 533, + Iir_Kind_Library_Declaration => 540, + Iir_Kind_Component_Declaration => 550, + Iir_Kind_Attribute_Declaration => 557, + Iir_Kind_Group_Template_Declaration => 563, + Iir_Kind_Group_Declaration => 570, + Iir_Kind_Element_Declaration => 577, + Iir_Kind_Non_Object_Alias_Declaration => 585, + Iir_Kind_Psl_Declaration => 593, + Iir_Kind_Psl_Endpoint_Declaration => 607, + Iir_Kind_Terminal_Declaration => 613, + Iir_Kind_Free_Quantity_Declaration => 622, + Iir_Kind_Across_Quantity_Declaration => 634, + Iir_Kind_Through_Quantity_Declaration => 646, + Iir_Kind_Enumeration_Literal => 657, + Iir_Kind_Function_Declaration => 681, + Iir_Kind_Procedure_Declaration => 704, + Iir_Kind_Function_Body => 714, + Iir_Kind_Procedure_Body => 725, + Iir_Kind_Object_Alias_Declaration => 737, + Iir_Kind_File_Declaration => 752, + Iir_Kind_Guard_Signal_Declaration => 765, + Iir_Kind_Signal_Declaration => 782, + Iir_Kind_Variable_Declaration => 795, + Iir_Kind_Constant_Declaration => 809, + Iir_Kind_Iterator_Declaration => 821, + Iir_Kind_Interface_Constant_Declaration => 837, + Iir_Kind_Interface_Variable_Declaration => 853, + Iir_Kind_Interface_Signal_Declaration => 874, + Iir_Kind_Interface_File_Declaration => 890, + Iir_Kind_Interface_Type_Declaration => 900, + Iir_Kind_Interface_Package_Declaration => 909, + Iir_Kind_Identity_Operator => 913, + Iir_Kind_Negation_Operator => 917, + Iir_Kind_Absolute_Operator => 921, + Iir_Kind_Not_Operator => 925, + Iir_Kind_Condition_Operator => 929, + Iir_Kind_Reduction_And_Operator => 933, + Iir_Kind_Reduction_Or_Operator => 937, + Iir_Kind_Reduction_Nand_Operator => 941, + Iir_Kind_Reduction_Nor_Operator => 945, + Iir_Kind_Reduction_Xor_Operator => 949, + Iir_Kind_Reduction_Xnor_Operator => 953, + Iir_Kind_And_Operator => 958, + Iir_Kind_Or_Operator => 963, + Iir_Kind_Nand_Operator => 968, + Iir_Kind_Nor_Operator => 973, + Iir_Kind_Xor_Operator => 978, + Iir_Kind_Xnor_Operator => 983, + Iir_Kind_Equality_Operator => 988, + Iir_Kind_Inequality_Operator => 993, + Iir_Kind_Less_Than_Operator => 998, + Iir_Kind_Less_Than_Or_Equal_Operator => 1003, + Iir_Kind_Greater_Than_Operator => 1008, + Iir_Kind_Greater_Than_Or_Equal_Operator => 1013, + Iir_Kind_Match_Equality_Operator => 1018, + Iir_Kind_Match_Inequality_Operator => 1023, + Iir_Kind_Match_Less_Than_Operator => 1028, + Iir_Kind_Match_Less_Than_Or_Equal_Operator => 1033, + Iir_Kind_Match_Greater_Than_Operator => 1038, + Iir_Kind_Match_Greater_Than_Or_Equal_Operator => 1043, + Iir_Kind_Sll_Operator => 1048, + Iir_Kind_Sla_Operator => 1053, + Iir_Kind_Srl_Operator => 1058, + Iir_Kind_Sra_Operator => 1063, + Iir_Kind_Rol_Operator => 1068, + Iir_Kind_Ror_Operator => 1073, + Iir_Kind_Addition_Operator => 1078, + Iir_Kind_Substraction_Operator => 1083, + Iir_Kind_Concatenation_Operator => 1088, + Iir_Kind_Multiplication_Operator => 1093, + Iir_Kind_Division_Operator => 1098, + Iir_Kind_Modulus_Operator => 1103, + Iir_Kind_Remainder_Operator => 1108, + Iir_Kind_Exponentiation_Operator => 1113, + Iir_Kind_Function_Call => 1121, + Iir_Kind_Aggregate => 1127, + Iir_Kind_Parenthesis_Expression => 1130, + Iir_Kind_Qualified_Expression => 1134, + Iir_Kind_Type_Conversion => 1139, + Iir_Kind_Allocator_By_Expression => 1143, + Iir_Kind_Allocator_By_Subtype => 1149, + Iir_Kind_Selected_Element => 1155, + Iir_Kind_Dereference => 1160, + Iir_Kind_Implicit_Dereference => 1165, + Iir_Kind_Slice_Name => 1172, + Iir_Kind_Indexed_Name => 1178, + Iir_Kind_Psl_Expression => 1180, + Iir_Kind_Sensitized_Process_Statement => 1200, + Iir_Kind_Process_Statement => 1220, + Iir_Kind_Concurrent_Simple_Signal_Assignment => 1231, + Iir_Kind_Concurrent_Conditional_Signal_Assignment => 1242, + Iir_Kind_Concurrent_Selected_Signal_Assignment => 1254, + Iir_Kind_Concurrent_Assertion_Statement => 1262, + Iir_Kind_Psl_Default_Clock => 1266, + Iir_Kind_Psl_Assert_Statement => 1279, + Iir_Kind_Psl_Cover_Statement => 1292, + Iir_Kind_Concurrent_Procedure_Call_Statement => 1299, + Iir_Kind_Block_Statement => 1312, + Iir_Kind_If_Generate_Statement => 1322, + Iir_Kind_Case_Generate_Statement => 1331, + Iir_Kind_For_Generate_Statement => 1340, + Iir_Kind_Component_Instantiation_Statement => 1350, + Iir_Kind_Simple_Simultaneous_Statement => 1357, + Iir_Kind_Generate_Statement_Body => 1368, + Iir_Kind_If_Generate_Else_Clause => 1373, + Iir_Kind_Simple_Signal_Assignment_Statement => 1382, + Iir_Kind_Conditional_Signal_Assignment_Statement => 1391, + Iir_Kind_Null_Statement => 1395, + Iir_Kind_Assertion_Statement => 1402, + Iir_Kind_Report_Statement => 1408, + Iir_Kind_Wait_Statement => 1415, + Iir_Kind_Variable_Assignment_Statement => 1421, + Iir_Kind_Conditional_Variable_Assignment_Statement => 1427, + Iir_Kind_Return_Statement => 1433, + Iir_Kind_For_Loop_Statement => 1442, + Iir_Kind_While_Loop_Statement => 1450, + Iir_Kind_Next_Statement => 1456, + Iir_Kind_Exit_Statement => 1462, + Iir_Kind_Case_Statement => 1470, + Iir_Kind_Procedure_Call_Statement => 1476, + Iir_Kind_If_Statement => 1485, + Iir_Kind_Elsif => 1490, + Iir_Kind_Character_Literal => 1497, + Iir_Kind_Simple_Name => 1504, + Iir_Kind_Selected_Name => 1512, + Iir_Kind_Operator_Symbol => 1517, + Iir_Kind_Selected_By_All_Name => 1522, + Iir_Kind_Parenthesis_Name => 1526, + Iir_Kind_External_Constant_Name => 1535, + Iir_Kind_External_Signal_Name => 1544, + Iir_Kind_External_Variable_Name => 1553, + Iir_Kind_Package_Pathname => 1556, + Iir_Kind_Absolute_Pathname => 1557, + Iir_Kind_Relative_Pathname => 1558, + Iir_Kind_Pathname_Element => 1562, + Iir_Kind_Base_Attribute => 1564, + Iir_Kind_Left_Type_Attribute => 1569, + Iir_Kind_Right_Type_Attribute => 1574, + Iir_Kind_High_Type_Attribute => 1579, + Iir_Kind_Low_Type_Attribute => 1584, + Iir_Kind_Ascending_Type_Attribute => 1589, + Iir_Kind_Image_Attribute => 1595, + Iir_Kind_Value_Attribute => 1601, + Iir_Kind_Pos_Attribute => 1607, + Iir_Kind_Val_Attribute => 1613, + Iir_Kind_Succ_Attribute => 1619, + Iir_Kind_Pred_Attribute => 1625, + Iir_Kind_Leftof_Attribute => 1631, + Iir_Kind_Rightof_Attribute => 1637, + Iir_Kind_Delayed_Attribute => 1645, + Iir_Kind_Stable_Attribute => 1653, + Iir_Kind_Quiet_Attribute => 1661, + Iir_Kind_Transaction_Attribute => 1669, + Iir_Kind_Event_Attribute => 1673, + Iir_Kind_Active_Attribute => 1677, + Iir_Kind_Last_Event_Attribute => 1681, + Iir_Kind_Last_Active_Attribute => 1685, + Iir_Kind_Last_Value_Attribute => 1689, + Iir_Kind_Driving_Attribute => 1693, + Iir_Kind_Driving_Value_Attribute => 1697, + Iir_Kind_Behavior_Attribute => 1697, + Iir_Kind_Structure_Attribute => 1697, + Iir_Kind_Simple_Name_Attribute => 1704, + Iir_Kind_Instance_Name_Attribute => 1709, + Iir_Kind_Path_Name_Attribute => 1714, + Iir_Kind_Left_Array_Attribute => 1721, + Iir_Kind_Right_Array_Attribute => 1728, + Iir_Kind_High_Array_Attribute => 1735, + Iir_Kind_Low_Array_Attribute => 1742, + Iir_Kind_Length_Array_Attribute => 1749, + Iir_Kind_Ascending_Array_Attribute => 1756, + Iir_Kind_Range_Array_Attribute => 1763, + Iir_Kind_Reverse_Range_Array_Attribute => 1770, + Iir_Kind_Attribute_Name => 1778 ); function Get_Fields (K : Iir_Kind) return Fields_Array @@ -6516,7 +6530,8 @@ package body Nodes_Meta is when Iir_Kind_Association_Element_By_Expression | Iir_Kind_Association_Element_By_Individual | Iir_Kind_Association_Element_Open - | Iir_Kind_Association_Element_Package => + | Iir_Kind_Association_Element_Package + | Iir_Kind_Association_Element_Type => return True; when others => return False; @@ -6527,7 +6542,8 @@ package body Nodes_Meta is begin case K is when Iir_Kind_Association_Element_By_Expression - | Iir_Kind_Association_Element_Package => + | Iir_Kind_Association_Element_Package + | Iir_Kind_Association_Element_Type => return True; when others => return False; @@ -6550,7 +6566,8 @@ package body Nodes_Meta is when Iir_Kind_Association_Element_By_Expression | Iir_Kind_Association_Element_By_Individual | Iir_Kind_Association_Element_Open - | Iir_Kind_Association_Element_Package => + | Iir_Kind_Association_Element_Package + | Iir_Kind_Association_Element_Type => return True; when others => return False; @@ -6563,7 +6580,8 @@ package body Nodes_Meta is when Iir_Kind_Association_Element_By_Expression | Iir_Kind_Association_Element_By_Individual | Iir_Kind_Association_Element_Open - | Iir_Kind_Association_Element_Package => + | Iir_Kind_Association_Element_Package + | Iir_Kind_Association_Element_Type => return True; when others => return False; @@ -6800,6 +6818,7 @@ package body Nodes_Meta is | Iir_Kind_Association_Element_By_Individual | Iir_Kind_Association_Element_Open | Iir_Kind_Association_Element_Package + | Iir_Kind_Association_Element_Type | Iir_Kind_Choice_By_Others | Iir_Kind_Choice_By_Expression | Iir_Kind_Choice_By_Range @@ -6819,6 +6838,9 @@ package body Nodes_Meta is | Iir_Kind_Subtype_Declaration | Iir_Kind_Nature_Declaration | Iir_Kind_Subnature_Declaration + | Iir_Kind_Package_Declaration + | Iir_Kind_Package_Instantiation_Declaration + | Iir_Kind_Package_Body | Iir_Kind_Unit_Declaration | Iir_Kind_Library_Declaration | Iir_Kind_Component_Declaration @@ -9337,12 +9359,24 @@ package body Nodes_Meta is function Has_Actual_Type (K : Iir_Kind) return Boolean is begin - return K = Iir_Kind_Association_Element_By_Individual; + case K is + when Iir_Kind_Association_Element_By_Individual + | Iir_Kind_Association_Element_Type => + return True; + when others => + return False; + end case; end Has_Actual_Type; function Has_Associated_Interface (K : Iir_Kind) return Boolean is begin - return K = Iir_Kind_Association_Element_Package; + case K is + when Iir_Kind_Association_Element_Package + | Iir_Kind_Association_Element_Type => + return True; + when others => + return False; + end case; end Has_Associated_Interface; function Has_Association_Chain (K : Iir_Kind) return Boolean is diff --git a/src/vhdl/parse.adb b/src/vhdl/parse.adb index 4be6c1ce6..eda42e380 100644 --- a/src/vhdl/parse.adb +++ b/src/vhdl/parse.adb @@ -69,6 +69,7 @@ package body Parse is function Parse_Signature return Iir_Signature; procedure Parse_Declarative_Part (Parent : Iir); function Parse_Tolerance_Aspect_Opt return Iir; + function Parse_Package (Parent : Iir) return Iir; Expect_Error: exception; @@ -80,7 +81,9 @@ package body Parse is procedure Set_End_Location (Node : Iir) is begin - Set_End_Location (Node, Get_Token_Location); + if Get_Kind (Node) = Iir_Kind_Design_Unit then + Set_End_Location (Node, Get_Token_Location); + end if; end Set_End_Location; procedure Unexpected (Where: String) is @@ -3879,6 +3882,12 @@ package body Parse is Decl := Parse_Use_Clause; when Tok_Group => Decl := Parse_Group; + when Tok_Package => + if Vhdl_Std < Vhdl_08 then + Error_Msg_Parse + ("nested package not allowed before vhdl 2008"); + end if; + Decl := Parse_Package (Parent); when Tok_Identifier => Error_Msg_Parse @@ -7969,8 +7978,9 @@ package body Parse is -- package_header -- LRM08 -- package_declarative_part -- END [ PACKAGE ] [ PACKAGE_simple_name ] ; - procedure Parse_Package_Declaration + function Parse_Package_Declaration (Unit : Iir_Design_Unit; Id : Name_Id; Loc : Location_Type) + return Iir is Res: Iir_Package_Declaration; begin @@ -8005,7 +8015,7 @@ package body Parse is Check_End_Name (Res); Expect (Tok_Semi_Colon); - Set_Library_Unit (Unit, Res); + return Res; end Parse_Package_Declaration; -- precond : BODY @@ -8016,7 +8026,7 @@ package body Parse is -- PACKAGE BODY PACKAGE_simple_name IS -- package_body_declarative_part -- END [ PACKAGE BODY ] [ PACKAGE_simple_name ] ; - procedure Parse_Package_Body (Unit : Iir_Design_Unit) + function Parse_Package_Body (Unit : Iir_Design_Unit) return Iir is Res: Iir; begin @@ -8056,7 +8066,7 @@ package body Parse is Check_End_Name (Res); Expect (Tok_Semi_Colon); - Set_Library_Unit (Unit, Res); + return Res; end Parse_Package_Body; -- precond : NEW @@ -8096,10 +8106,11 @@ package body Parse is -- package_declaration -- | package_body -- | package_instantiation_declaration - procedure Parse_Package (Unit : Iir_Design_Unit) + function Parse_Package (Parent : Iir) return Iir is Loc : Location_Type; Id : Name_Id; + Res : Iir; begin -- Skip 'package' Scan; @@ -8108,7 +8119,7 @@ package body Parse is -- Skip 'body' Scan; - Parse_Package_Body (Unit); + return Parse_Package_Body (Parent); else Expect (Tok_Identifier); Id := Current_Identifier; @@ -8122,13 +8133,12 @@ package body Parse is Scan; if Current_Token = Tok_New then - Set_Library_Unit - (Unit, - Parse_Package_Instantiation_Declaration (Id, Loc)); + Res := Parse_Package_Instantiation_Declaration (Id, Loc); -- Note: there is no 'end' in instantiation. - Set_End_Location (Unit, Get_Token_Location); + Set_End_Location (Parent); + return Res; else - Parse_Package_Declaration (Unit, Id, Loc); + return Parse_Package_Declaration (Parent, Id, Loc); end if; end if; end Parse_Package; @@ -8331,7 +8341,7 @@ package body Parse is when Tok_Architecture => Parse_Architecture_Body (Res); when Tok_Package => - Parse_Package (Res); + Set_Library_Unit (Res, Parse_Package (Res)); when Tok_Configuration => Parse_Configuration_Declaration (Res); when others => diff --git a/src/vhdl/sem.adb b/src/vhdl/sem.adb index dab4d9f83..38dc3a0c0 100644 --- a/src/vhdl/sem.adb +++ b/src/vhdl/sem.adb @@ -429,10 +429,11 @@ package body Sem is Check_Read (Get_Actual (El)); when Iir_Kind_Association_Element_Open | Iir_Kind_Association_Element_By_Individual - | Iir_Kind_Association_Element_Package => + | Iir_Kind_Association_Element_Package + | Iir_Kind_Association_Element_Type => null; when others => - Error_Kind ("sem_generic_map_association_chain(1)", El); + Error_Kind ("sem_generic_association_chain(1)", El); end case; El := Get_Chain (El); end loop; @@ -2548,6 +2549,17 @@ package body Sem is null; when Iir_Kind_Protected_Type_Body => null; + when Iir_Kind_Package_Declaration => + -- LRM08 4.8 Package bodies + -- A package body that is not a library unit shall appear + -- immediately within the same declarative region as the + -- corresponding package declaration and textually subsequent + -- to that package declaration. + return True; + when Iir_Kind_Package_Body => + null; + when Iir_Kind_Package_Instantiation_Declaration => + null; when Iir_Kind_Nature_Declaration | Iir_Kind_Subnature_Declaration => null; diff --git a/src/vhdl/sem.ads b/src/vhdl/sem.ads index 21bf89328..12cbc13e8 100644 --- a/src/vhdl/sem.ads +++ b/src/vhdl/sem.ads @@ -70,6 +70,15 @@ package Sem is -- LRM 2.2 Subprogram Bodies. procedure Sem_Subprogram_Body (Subprg: Iir); + -- LRM 2.5 Package Declarations. + procedure Sem_Package_Declaration (Decl: Iir_Package_Declaration); + + -- LRM 2.6 Package Bodies. + procedure Sem_Package_Body (Decl: Iir); + + -- LRM08 4.9 Package Instantiation Declaration + procedure Sem_Package_Instantiation_Declaration (Decl : Iir); + -- Do late analysis checks (pure rules). procedure Sem_Analysis_Checks_List (Unit : Iir_Design_Unit; Emit_Warnings : Boolean); diff --git a/src/vhdl/sem_assocs.adb b/src/vhdl/sem_assocs.adb index 10d4f7896..8c56e971e 100644 --- a/src/vhdl/sem_assocs.adb +++ b/src/vhdl/sem_assocs.adb @@ -21,6 +21,7 @@ with Flags; use Flags; with Types; use Types; with Iirs_Utils; use Iirs_Utils; with Sem_Names; use Sem_Names; +with Sem_Types; with Iir_Chains; use Iir_Chains; with Xrefs; @@ -33,6 +34,8 @@ package body Sem_Assocs is case Get_Kind (Inter) is when Iir_Kind_Interface_Package_Declaration => N_Assoc := Create_Iir (Iir_Kind_Association_Element_Package); + when Iir_Kind_Interface_Type_Declaration => + N_Assoc := Create_Iir (Iir_Kind_Association_Element_Type); when others => Error_Kind ("rewrite_non_object_association", Inter); end case; @@ -1341,29 +1344,26 @@ package body Sem_Assocs is Match := Fully_Compatible; end Sem_Association_Open; - procedure Sem_Association_Package + procedure Sem_Association_Package_Type_Not_Finish (Assoc : Iir; Inter : Iir; - Finish : Boolean; - Match : out Compatibility_Level) - is - Formal : constant Iir := Get_Formal (Assoc); - Actual : Iir; - Package_Inter : Iir; + Match : out Compatibility_Level) is begin - if not Finish then - if Get_Associated_Interface (Assoc) = Inter then - Match := Fully_Compatible; - else - Match := Not_Compatible; - end if; - return; + -- Can be associated only once + if Get_Associated_Interface (Assoc) = Inter then + Match := Fully_Compatible; + else + Match := Not_Compatible; end if; + end Sem_Association_Package_Type_Not_Finish; + procedure Sem_Association_Package_Type_Finish (Assoc : Iir; Inter : Iir) + is + Formal : constant Iir := Get_Formal (Assoc); + begin -- Always match (as this is a generic association, there is no -- need to resolve overload). pragma Assert (Get_Associated_Interface (Assoc) = Inter); - Match := Fully_Compatible; if Formal /= Null_Iir then pragma Assert (Get_Kind (Formal) = Iir_Kind_Simple_Name); @@ -1372,6 +1372,24 @@ package body Sem_Assocs is Set_Base_Name (Formal, Inter); Xrefs.Xref_Ref (Formal, Inter); end if; + end Sem_Association_Package_Type_Finish; + + procedure Sem_Association_Package + (Assoc : Iir; + Inter : Iir; + Finish : Boolean; + Match : out Compatibility_Level) + is + Actual : Iir; + Package_Inter : Iir; + begin + if not Finish then + Sem_Association_Package_Type_Not_Finish (Assoc, Inter, Match); + return; + end if; + + Match := Fully_Compatible; + Sem_Association_Package_Type_Finish (Assoc, Inter); -- Analyze actual. Actual := Get_Actual (Assoc); @@ -1421,6 +1439,31 @@ package body Sem_Assocs is return; end Sem_Association_Package; + procedure Sem_Association_Type + (Assoc : Iir; + Inter : Iir; + Finish : Boolean; + Match : out Compatibility_Level) + is + Actual : Iir; + begin + if not Finish then + Sem_Association_Package_Type_Not_Finish (Assoc, Inter, Match); + return; + end if; + + Match := Fully_Compatible; + Sem_Association_Package_Type_Finish (Assoc, Inter); + Actual := Get_Actual (Assoc); + + -- LRM08 6.5.7.2 Generic map aspects + -- An actual associated with a formal generic type must be a subtype + -- indication. + -- FIXME: ghdl only supports type_mark! + Actual := Sem_Types.Sem_Subtype_Indication (Actual); + Set_Actual_Type (Assoc, Get_Type (Actual)); + end Sem_Association_Type; + -- Associate ASSOC with interface INTERFACE -- This sets MATCH. procedure Sem_Association_By_Expression @@ -1658,6 +1701,9 @@ package body Sem_Assocs is when Iir_Kind_Association_Element_Package => Sem_Association_Package (Assoc, Inter, Finish, Match); + when Iir_Kind_Association_Element_Type => + Sem_Association_Type (Assoc, Inter, Finish, Match); + when Iir_Kind_Association_Element_By_Expression => Sem_Association_By_Expression (Assoc, Inter, Finish, Match); diff --git a/src/vhdl/sem_decls.adb b/src/vhdl/sem_decls.adb index 43406648e..cb1fe09ab 100644 --- a/src/vhdl/sem_decls.adb +++ b/src/vhdl/sem_decls.adb @@ -2973,6 +2973,14 @@ package body Sem_Decls is null; when Iir_Kind_Protected_Type_Body => Sem_Protected_Type_Body (Decl); + + when Iir_Kind_Package_Declaration => + Sem_Package_Declaration (Decl); + when Iir_Kind_Package_Body => + Sem_Package_Body (Decl); + when Iir_Kind_Package_Instantiation_Declaration => + Sem_Package_Instantiation_Declaration (Decl); + when Iir_Kind_Nature_Declaration => Sem_Nature_Declaration (Decl); when Iir_Kind_Terminal_Declaration => diff --git a/src/vhdl/sem_inst.adb b/src/vhdl/sem_inst.adb index 4fd153c32..ae4a6975b 100644 --- a/src/vhdl/sem_inst.adb +++ b/src/vhdl/sem_inst.adb @@ -439,6 +439,8 @@ package body Sem_Inst is when Iir_Kind_Interface_Package_Declaration => Set_Uninstantiated_Package_Name (Res, Get_Uninstantiated_Package_Name (Inter)); + when Iir_Kind_Interface_Type_Declaration => + Set_Type (Res, Get_Type (Inter)); when others => Error_Kind ("instantiate_generic_chain", Res); end case; @@ -604,6 +606,16 @@ package body Sem_Inst is Set_Instance_On_Chain (Get_Declaration_Chain (Sub_Pkg), Get_Declaration_Chain (Sub_Inst)); end; + when Iir_Kind_Association_Element_Type => + -- Replace the incomplete interface type by the actual subtype + -- indication. + declare + Inter_Type_Def : constant Iir := + Get_Type (Get_Associated_Interface (Assoc)); + Actual_Type : constant Iir := Get_Actual_Type (Assoc); + begin + Set_Instance (Inter_Type_Def, Actual_Type); + end; when others => Error_Kind ("instantiate_generic_map_chain", Assoc); end case; diff --git a/src/vhdl/sem_scopes.adb b/src/vhdl/sem_scopes.adb index d30ca4380..422bd9ba4 100644 --- a/src/vhdl/sem_scopes.adb +++ b/src/vhdl/sem_scopes.adb @@ -969,6 +969,7 @@ package body Sem_Scopes is | Iir_Kind_Terminal_Declaration | Iir_Kind_Entity_Declaration | Iir_Kind_Package_Declaration + | Iir_Kind_Package_Instantiation_Declaration | Iir_Kind_Configuration_Declaration | Iir_Kind_Context_Declaration | Iir_Kinds_Concurrent_Statement |