diff options
author | Tristan Gingold <tgingold@free.fr> | 2016-08-31 20:24:41 +0200 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2016-09-01 06:36:52 +0200 |
commit | 4e6853861f3809d45424b6eb372ccd91ed76f0cb (patch) | |
tree | 68f1ea12f7aeca8c3174dbe9c2eb5225fe677db5 | |
parent | a7f63a8a08aeaef263c7d4a404d7d827cac89b9a (diff) | |
download | ghdl-4e6853861f3809d45424b6eb372ccd91ed76f0cb.tar.gz ghdl-4e6853861f3809d45424b6eb372ccd91ed76f0cb.tar.bz2 ghdl-4e6853861f3809d45424b6eb372ccd91ed76f0cb.zip |
vhdl08: parse and analyze interface types.
-rw-r--r-- | src/vhdl/errorout.adb | 4 | ||||
-rw-r--r-- | src/vhdl/evaluation.adb | 4 | ||||
-rw-r--r-- | src/vhdl/iirs.adb | 18 | ||||
-rw-r--r-- | src/vhdl/iirs.ads | 58 | ||||
-rw-r--r-- | src/vhdl/nodes.adb | 1 | ||||
-rw-r--r-- | src/vhdl/nodes.ads | 32 | ||||
-rw-r--r-- | src/vhdl/nodes_meta.adb | 473 | ||||
-rw-r--r-- | src/vhdl/nodes_meta.ads | 2 | ||||
-rw-r--r-- | src/vhdl/parse.adb | 16 | ||||
-rw-r--r-- | src/vhdl/sem_decls.adb | 90 | ||||
-rw-r--r-- | src/vhdl/sem_names.adb | 7 | ||||
-rw-r--r-- | src/vhdl/sem_scopes.adb | 16 | ||||
-rw-r--r-- | src/vhdl/sem_types.adb | 2 | ||||
-rw-r--r-- | src/vhdl/translate/trans-chap2.adb | 3 | ||||
-rw-r--r-- | src/vhdl/translate/trans-chap7.adb | 3 |
15 files changed, 477 insertions, 252 deletions
diff --git a/src/vhdl/errorout.adb b/src/vhdl/errorout.adb index c7b9ef528..e937cda57 100644 --- a/src/vhdl/errorout.adb +++ b/src/vhdl/errorout.adb @@ -751,6 +751,8 @@ package body Errorout is return Disp_Type (Node, "floating type"); when Iir_Kind_Incomplete_Type_Definition => return Disp_Type (Node, "incomplete type"); + when Iir_Kind_Interface_Type_Definition => + return Disp_Type (Node, "interface type"); when Iir_Kind_Protected_Type_Declaration => return Disp_Type (Node, "protected type"); when Iir_Kind_Protected_Type_Body => @@ -877,6 +879,8 @@ package body Errorout is return Disp_Identifier (Node, "file interface"); when Iir_Kind_Interface_Package_Declaration => return Disp_Identifier (Node, "package interface"); + when Iir_Kind_Interface_Type_Declaration => + return Disp_Identifier (Node, "type interface"); when Iir_Kind_Signal_Declaration => return Disp_Identifier (Node, "signal"); when Iir_Kind_Variable_Declaration => diff --git a/src/vhdl/evaluation.adb b/src/vhdl/evaluation.adb index f774208b2..0c561f195 100644 --- a/src/vhdl/evaluation.adb +++ b/src/vhdl/evaluation.adb @@ -1450,6 +1450,10 @@ package body Evaluation is -- TODO raise Internal_Error; + when Iir_Predefined_Interface_Type_Equality + | Iir_Predefined_Interface_Type_Inequality => + raise Internal_Error; + when Iir_Predefined_Explicit => raise Internal_Error; end case; diff --git a/src/vhdl/iirs.adb b/src/vhdl/iirs.adb index 72cb6daa4..05acf1b3a 100644 --- a/src/vhdl/iirs.adb +++ b/src/vhdl/iirs.adb @@ -288,6 +288,7 @@ package body Iirs is | Iir_Kind_Configuration_Specification | Iir_Kind_Access_Type_Definition | Iir_Kind_Incomplete_Type_Definition + | Iir_Kind_Interface_Type_Definition | Iir_Kind_File_Type_Definition | Iir_Kind_Protected_Type_Declaration | Iir_Kind_Record_Type_Definition @@ -330,6 +331,7 @@ package body Iirs is | Iir_Kind_Interface_Variable_Declaration | Iir_Kind_Interface_Signal_Declaration | Iir_Kind_Interface_File_Declaration + | Iir_Kind_Interface_Type_Declaration | Iir_Kind_Identity_Operator | Iir_Kind_Negation_Operator | Iir_Kind_Absolute_Operator @@ -1885,6 +1887,22 @@ package body Iirs is Set_Field4 (Target, Def); end Set_Subtype_Definition; + function Get_Interface_Type_Subprograms (Target : Iir) return Iir is + begin + pragma Assert (Target /= Null_Iir); + pragma Assert (Has_Interface_Type_Subprograms (Get_Kind (Target)), + "no field Interface_Type_Subprograms"); + return Get_Field4 (Target); + end Get_Interface_Type_Subprograms; + + procedure Set_Interface_Type_Subprograms (Target : Iir; Subprg : Iir) is + begin + pragma Assert (Target /= Null_Iir); + pragma Assert (Has_Interface_Type_Subprograms (Get_Kind (Target)), + "no field Interface_Type_Subprograms"); + Set_Field4 (Target, Subprg); + end Set_Interface_Type_Subprograms; + function Get_Nature (Target : Iir) return Iir is begin pragma Assert (Target /= Null_Iir); diff --git a/src/vhdl/iirs.ads b/src/vhdl/iirs.ads index 87b25804f..da25f490f 100644 --- a/src/vhdl/iirs.ads +++ b/src/vhdl/iirs.ads @@ -1180,6 +1180,28 @@ package Iirs is -- -- Get/Set_Name_Staticness (State2) + -- Iir_Kind_Interface_Type_Declaration (Short) + -- + -- Get/Set_Parent (Field0) + -- + -- Get/Set_Type (Field1) + -- + -- Get/Set_Chain (Field2) + -- + -- Get/Set_Identifier (Field3) + -- + -- Get/Set_Interface_Type_Subprograms (Field4) + -- + -- Get/Set_Has_Identifier_List (Flag3) + -- + -- Get/Set_Visible_Flag (Flag4) + -- + -- Get/Set_Use_Flag (Flag6) + -- + -- Get/Set_Is_Ref (Flag7) + -- + -- Get/Set_Name_Staticness (State2) + -- Iir_Kind_Interface_Package_Declaration (Medium) -- -- LRM08 6.5.5 Interface package declarations @@ -2096,6 +2118,22 @@ package Iirs is -- -- Get/Set_Has_Signal_Flag (Flag3) + -- Iir_Kind_Interface_Type_Definition (Short) + -- Type definition for an interface type. + -- + -- Set to interface type declaration. + -- Get/Set_Type_Declarator (Field3) + -- + -- Get/Set_Base_Type (Field4) + -- + -- Get/Set_Type_Staticness (State1) + -- + -- Get/Set_Resolved_Flag (Flag1) + -- + -- Get/Set_Signal_Type_Flag (Flag2) + -- + -- Get/Set_Has_Signal_Flag (Flag3) + -- Iir_Kind_Protected_Type_Declaration (Short) -- -- Get/Set_Declaration_Chain (Field1) @@ -3723,6 +3761,7 @@ package Iirs is -- kinds: disc: discrete, st: subtype. Iir_Kind_Access_Type_Definition, Iir_Kind_Incomplete_Type_Definition, + Iir_Kind_Interface_Type_Definition, Iir_Kind_File_Type_Definition, Iir_Kind_Protected_Type_Declaration, Iir_Kind_Record_Type_Definition, -- composite @@ -3796,6 +3835,7 @@ package Iirs is Iir_Kind_Interface_Variable_Declaration, -- object, interface Iir_Kind_Interface_Signal_Declaration, -- object, interface Iir_Kind_Interface_File_Declaration, -- object, interface + Iir_Kind_Interface_Type_Declaration, Iir_Kind_Interface_Package_Declaration, -- Expressions. @@ -4288,6 +4328,10 @@ package Iirs is Iir_Predefined_Std_Ulogic_Array_Match_Equality, Iir_Predefined_Std_Ulogic_Array_Match_Inequality, + -- For interface type + Iir_Predefined_Interface_Type_Equality, + Iir_Predefined_Interface_Type_Inequality, + -- -- Predefined attribute functions. -- Iir_Predefined_Attribute_Image, -- Iir_Predefined_Attribute_Value, @@ -4507,6 +4551,7 @@ package Iirs is subtype Iir_Kinds_Type_And_Subtype_Definition is Iir_Kind range Iir_Kind_Access_Type_Definition .. --Iir_Kind_Incomplete_Type_Definition + --Iir_Kind_Interface_Type_Definition --Iir_Kind_File_Type_Definition --Iir_Kind_Protected_Type_Declaration --Iir_Kind_Record_Type_Definition @@ -4645,6 +4690,14 @@ package Iirs is --Iir_Kind_Interface_Signal_Declaration Iir_Kind_Interface_File_Declaration; + subtype Iir_Kinds_Interface_Declaration is Iir_Kind range + Iir_Kind_Interface_Constant_Declaration .. + --Iir_Kind_Interface_Variable_Declaration + --Iir_Kind_Interface_Signal_Declaration + --Iir_Kind_Interface_File_Declaration + --Iir_Kind_Interface_Type_Declaration + Iir_Kind_Interface_Package_Declaration; + subtype Iir_Kinds_Object_Declaration is Iir_Kind range Iir_Kind_Object_Alias_Declaration .. --Iir_Kind_File_Declaration @@ -5703,6 +5756,11 @@ package Iirs is function Get_Subtype_Definition (Target : Iir) return Iir; procedure Set_Subtype_Definition (Target : Iir; Def : Iir); + -- Implicit operations of an interface type declaration. + -- Field: Field4 + function Get_Interface_Type_Subprograms (Target : Iir) return Iir; + procedure Set_Interface_Type_Subprograms (Target : Iir; Subprg : Iir); + -- Field: Field1 function Get_Nature (Target : Iir) return Iir; procedure Set_Nature (Target : Iir; Nature : Iir); diff --git a/src/vhdl/nodes.adb b/src/vhdl/nodes.adb index 88548f78a..884f9d69b 100644 --- a/src/vhdl/nodes.adb +++ b/src/vhdl/nodes.adb @@ -88,7 +88,6 @@ package body Nodes is Kind => 0, State1 | State2 => 0, Odigit1 => 0, - Unused_Odigit2 => 0, Location => Location_Nil, Field0 | Field1 | Field2 | Field3 => Null_Node, Field4 | Field5 => Null_Node, diff --git a/src/vhdl/nodes.ads b/src/vhdl/nodes.ads index 92a173fdd..f816a560b 100644 --- a/src/vhdl/nodes.ads +++ b/src/vhdl/nodes.ads @@ -28,7 +28,7 @@ package Nodes is type Bit2_Type is range 0 .. 2 ** 2 - 1; type Bit3_Type is range 0 .. 2 ** 3 - 1; - type Kind_Type is range 0 .. 255; + type Kind_Type is range 0 .. 2 ** 9 - 1; -- Format of a node. type Format_Type is @@ -39,14 +39,6 @@ package Nodes is Format_Int ); - -- Current layout: (rem) - -- Format: 2 bits 30 - -- Flags: 6*1 bits 24 - -- Nkind: 8 bits 16 (vhdl: 216 nodes) - -- State: 2*2 bits 12 - -- Flags: 6*1 bits 6 - -- Odigit: 2*3 bits 0 - -- Common fields are: -- Flag1 : Boolean -- Flag2 : Boolean @@ -292,18 +284,6 @@ private Flag4 : Boolean := False; Flag5 : Boolean := False; Flag6 : Boolean := False; - - -- Kind field use 8 bits. - -- So, on 32 bits systems, there are 24 bits left. - -- + 8 (8 * 1) - -- + 10 (5 * 2) - -- + 6 (2 * 3) - -- = 24 - - Kind : Kind_Type; - - State1 : Bit2_Type := 0; - State2 : Bit2_Type := 0; Flag7 : Boolean := False; Flag8 : Boolean := False; Flag9 : Boolean := False; @@ -311,8 +291,16 @@ private Flag11 : Boolean := False; Flag12 : Boolean := False; + Flag13 : Boolean := False; + Flag14 : Boolean := False; + + -- 2*2 + 1*3 = 7 bits + State1 : Bit2_Type := 0; + State2 : Bit2_Type := 0; Odigit1 : Bit3_Type := 0; - Unused_Odigit2 : Bit3_Type := 0; + + -- 9 bits + Kind : Kind_Type; -- Location. Location: Location_Type := Location_Nil; diff --git a/src/vhdl/nodes_meta.adb b/src/vhdl/nodes_meta.adb index 8145a986d..ae9c29c8e 100644 --- a/src/vhdl/nodes_meta.adb +++ b/src/vhdl/nodes_meta.adb @@ -104,6 +104,7 @@ package body Nodes_Meta is Field_Discrete_Range => Type_Iir, Field_Type_Definition => Type_Iir, Field_Subtype_Definition => Type_Iir, + Field_Interface_Type_Subprograms => Type_Iir, Field_Nature => Type_Iir, Field_Mode => Type_Iir_Mode, Field_Guarded_Signal_Flag => Type_Boolean, @@ -504,6 +505,8 @@ package body Nodes_Meta is return "type_definition"; when Field_Subtype_Definition => return "subtype_definition"; + when Field_Interface_Type_Subprograms => + return "interface_type_subprograms"; when Field_Nature => return "nature"; when Field_Mode => @@ -1046,6 +1049,8 @@ package body Nodes_Meta is return "access_type_definition"; when Iir_Kind_Incomplete_Type_Definition => return "incomplete_type_definition"; + when Iir_Kind_Interface_Type_Definition => + return "interface_type_definition"; when Iir_Kind_File_Type_Definition => return "file_type_definition"; when Iir_Kind_Protected_Type_Declaration => @@ -1174,6 +1179,8 @@ package body Nodes_Meta is return "interface_signal_declaration"; when Iir_Kind_Interface_File_Declaration => return "interface_file_declaration"; + when Iir_Kind_Interface_Type_Declaration => + return "interface_type_declaration"; when Iir_Kind_Interface_Package_Declaration => return "interface_package_declaration"; when Iir_Kind_Identity_Operator => @@ -1638,6 +1645,8 @@ package body Nodes_Meta is return Attr_None; when Field_Subtype_Definition => return Attr_None; + when Field_Interface_Type_Subprograms => + return Attr_None; when Field_Nature => return Attr_None; when Field_Mode => @@ -2374,6 +2383,13 @@ package body Nodes_Meta is Field_Incomplete_Type_List, Field_Type_Declarator, Field_Base_Type, + -- Iir_Kind_Interface_Type_Definition + Field_Resolved_Flag, + Field_Signal_Type_Flag, + Field_Has_Signal_Flag, + Field_Type_Staticness, + Field_Type_Declarator, + Field_Base_Type, -- Iir_Kind_File_Type_Definition Field_Resolved_Flag, Field_Signal_Type_Flag, @@ -3070,6 +3086,17 @@ package body Nodes_Meta is Field_Subtype_Indication, Field_Parent, Field_Type, + -- Iir_Kind_Interface_Type_Declaration + Field_Identifier, + Field_Has_Identifier_List, + Field_Visible_Flag, + Field_Use_Flag, + Field_Is_Ref, + Field_Name_Staticness, + Field_Chain, + Field_Interface_Type_Subprograms, + Field_Parent, + Field_Type, -- Iir_Kind_Interface_Package_Declaration Field_Identifier, Field_Visible_Flag, @@ -4144,214 +4171,216 @@ package body Nodes_Meta is Iir_Kind_Configuration_Specification => 228, Iir_Kind_Access_Type_Definition => 235, Iir_Kind_Incomplete_Type_Definition => 242, - Iir_Kind_File_Type_Definition => 249, - Iir_Kind_Protected_Type_Declaration => 258, - Iir_Kind_Record_Type_Definition => 268, - Iir_Kind_Array_Type_Definition => 280, - Iir_Kind_Array_Subtype_Definition => 295, - Iir_Kind_Record_Subtype_Definition => 306, - Iir_Kind_Access_Subtype_Definition => 314, - Iir_Kind_Physical_Subtype_Definition => 323, - Iir_Kind_Floating_Subtype_Definition => 333, - Iir_Kind_Integer_Subtype_Definition => 342, - Iir_Kind_Enumeration_Subtype_Definition => 351, - Iir_Kind_Enumeration_Type_Definition => 360, - Iir_Kind_Integer_Type_Definition => 366, - Iir_Kind_Floating_Type_Definition => 372, - Iir_Kind_Physical_Type_Definition => 381, - Iir_Kind_Range_Expression => 387, - Iir_Kind_Protected_Type_Body => 394, - Iir_Kind_Wildcard_Type_Definition => 399, - Iir_Kind_Subtype_Definition => 403, - Iir_Kind_Scalar_Nature_Definition => 407, - Iir_Kind_Overload_List => 408, - Iir_Kind_Type_Declaration => 414, - Iir_Kind_Anonymous_Type_Declaration => 419, - Iir_Kind_Subtype_Declaration => 427, - Iir_Kind_Nature_Declaration => 433, - Iir_Kind_Subnature_Declaration => 439, - Iir_Kind_Package_Declaration => 449, - Iir_Kind_Package_Instantiation_Declaration => 460, - Iir_Kind_Package_Body => 467, - Iir_Kind_Configuration_Declaration => 476, - Iir_Kind_Entity_Declaration => 488, - Iir_Kind_Architecture_Body => 500, - Iir_Kind_Context_Declaration => 506, - Iir_Kind_Package_Header => 508, - Iir_Kind_Unit_Declaration => 517, - Iir_Kind_Library_Declaration => 524, - Iir_Kind_Component_Declaration => 534, - Iir_Kind_Attribute_Declaration => 541, - Iir_Kind_Group_Template_Declaration => 547, - Iir_Kind_Group_Declaration => 554, - Iir_Kind_Element_Declaration => 561, - Iir_Kind_Non_Object_Alias_Declaration => 569, - Iir_Kind_Psl_Declaration => 577, - Iir_Kind_Psl_Endpoint_Declaration => 591, - Iir_Kind_Terminal_Declaration => 597, - Iir_Kind_Free_Quantity_Declaration => 606, - Iir_Kind_Across_Quantity_Declaration => 618, - Iir_Kind_Through_Quantity_Declaration => 630, - Iir_Kind_Enumeration_Literal => 641, - Iir_Kind_Function_Declaration => 665, - Iir_Kind_Procedure_Declaration => 688, - Iir_Kind_Function_Body => 698, - Iir_Kind_Procedure_Body => 709, - Iir_Kind_Object_Alias_Declaration => 721, - Iir_Kind_File_Declaration => 736, - Iir_Kind_Guard_Signal_Declaration => 749, - Iir_Kind_Signal_Declaration => 766, - Iir_Kind_Variable_Declaration => 779, - Iir_Kind_Constant_Declaration => 793, - Iir_Kind_Iterator_Declaration => 805, - Iir_Kind_Interface_Constant_Declaration => 821, - Iir_Kind_Interface_Variable_Declaration => 837, - Iir_Kind_Interface_Signal_Declaration => 858, - Iir_Kind_Interface_File_Declaration => 874, - Iir_Kind_Interface_Package_Declaration => 883, - Iir_Kind_Identity_Operator => 887, - Iir_Kind_Negation_Operator => 891, - Iir_Kind_Absolute_Operator => 895, - Iir_Kind_Not_Operator => 899, - Iir_Kind_Condition_Operator => 903, - Iir_Kind_Reduction_And_Operator => 907, - Iir_Kind_Reduction_Or_Operator => 911, - Iir_Kind_Reduction_Nand_Operator => 915, - Iir_Kind_Reduction_Nor_Operator => 919, - Iir_Kind_Reduction_Xor_Operator => 923, - Iir_Kind_Reduction_Xnor_Operator => 927, - Iir_Kind_And_Operator => 932, - Iir_Kind_Or_Operator => 937, - Iir_Kind_Nand_Operator => 942, - Iir_Kind_Nor_Operator => 947, - Iir_Kind_Xor_Operator => 952, - Iir_Kind_Xnor_Operator => 957, - Iir_Kind_Equality_Operator => 962, - Iir_Kind_Inequality_Operator => 967, - Iir_Kind_Less_Than_Operator => 972, - Iir_Kind_Less_Than_Or_Equal_Operator => 977, - Iir_Kind_Greater_Than_Operator => 982, - Iir_Kind_Greater_Than_Or_Equal_Operator => 987, - Iir_Kind_Match_Equality_Operator => 992, - Iir_Kind_Match_Inequality_Operator => 997, - Iir_Kind_Match_Less_Than_Operator => 1002, - Iir_Kind_Match_Less_Than_Or_Equal_Operator => 1007, - Iir_Kind_Match_Greater_Than_Operator => 1012, - Iir_Kind_Match_Greater_Than_Or_Equal_Operator => 1017, - Iir_Kind_Sll_Operator => 1022, - Iir_Kind_Sla_Operator => 1027, - Iir_Kind_Srl_Operator => 1032, - Iir_Kind_Sra_Operator => 1037, - Iir_Kind_Rol_Operator => 1042, - Iir_Kind_Ror_Operator => 1047, - Iir_Kind_Addition_Operator => 1052, - Iir_Kind_Substraction_Operator => 1057, - Iir_Kind_Concatenation_Operator => 1062, - Iir_Kind_Multiplication_Operator => 1067, - Iir_Kind_Division_Operator => 1072, - Iir_Kind_Modulus_Operator => 1077, - Iir_Kind_Remainder_Operator => 1082, - Iir_Kind_Exponentiation_Operator => 1087, - Iir_Kind_Function_Call => 1095, - Iir_Kind_Aggregate => 1101, - Iir_Kind_Parenthesis_Expression => 1104, - Iir_Kind_Qualified_Expression => 1108, - Iir_Kind_Type_Conversion => 1113, - Iir_Kind_Allocator_By_Expression => 1117, - Iir_Kind_Allocator_By_Subtype => 1123, - Iir_Kind_Selected_Element => 1129, - Iir_Kind_Dereference => 1134, - Iir_Kind_Implicit_Dereference => 1139, - Iir_Kind_Slice_Name => 1146, - Iir_Kind_Indexed_Name => 1152, - Iir_Kind_Psl_Expression => 1154, - Iir_Kind_Sensitized_Process_Statement => 1174, - Iir_Kind_Process_Statement => 1194, - Iir_Kind_Concurrent_Simple_Signal_Assignment => 1205, - Iir_Kind_Concurrent_Conditional_Signal_Assignment => 1216, - Iir_Kind_Concurrent_Selected_Signal_Assignment => 1228, - Iir_Kind_Concurrent_Assertion_Statement => 1236, - Iir_Kind_Psl_Default_Clock => 1240, - Iir_Kind_Psl_Assert_Statement => 1253, - Iir_Kind_Psl_Cover_Statement => 1266, - Iir_Kind_Concurrent_Procedure_Call_Statement => 1273, - Iir_Kind_Block_Statement => 1286, - Iir_Kind_If_Generate_Statement => 1296, - Iir_Kind_Case_Generate_Statement => 1305, - Iir_Kind_For_Generate_Statement => 1314, - Iir_Kind_Component_Instantiation_Statement => 1324, - Iir_Kind_Simple_Simultaneous_Statement => 1331, - Iir_Kind_Generate_Statement_Body => 1342, - Iir_Kind_If_Generate_Else_Clause => 1347, - Iir_Kind_Simple_Signal_Assignment_Statement => 1356, - Iir_Kind_Conditional_Signal_Assignment_Statement => 1365, - Iir_Kind_Null_Statement => 1369, - Iir_Kind_Assertion_Statement => 1376, - Iir_Kind_Report_Statement => 1382, - Iir_Kind_Wait_Statement => 1389, - Iir_Kind_Variable_Assignment_Statement => 1395, - Iir_Kind_Conditional_Variable_Assignment_Statement => 1401, - Iir_Kind_Return_Statement => 1407, - Iir_Kind_For_Loop_Statement => 1416, - Iir_Kind_While_Loop_Statement => 1424, - Iir_Kind_Next_Statement => 1430, - Iir_Kind_Exit_Statement => 1436, - Iir_Kind_Case_Statement => 1444, - Iir_Kind_Procedure_Call_Statement => 1450, - Iir_Kind_If_Statement => 1459, - Iir_Kind_Elsif => 1464, - Iir_Kind_Character_Literal => 1471, - Iir_Kind_Simple_Name => 1478, - Iir_Kind_Selected_Name => 1486, - Iir_Kind_Operator_Symbol => 1491, - Iir_Kind_Selected_By_All_Name => 1496, - Iir_Kind_Parenthesis_Name => 1500, - Iir_Kind_External_Constant_Name => 1509, - Iir_Kind_External_Signal_Name => 1518, - Iir_Kind_External_Variable_Name => 1527, - Iir_Kind_Package_Pathname => 1530, - Iir_Kind_Absolute_Pathname => 1531, - Iir_Kind_Relative_Pathname => 1532, - Iir_Kind_Pathname_Element => 1536, - Iir_Kind_Base_Attribute => 1538, - Iir_Kind_Left_Type_Attribute => 1543, - Iir_Kind_Right_Type_Attribute => 1548, - Iir_Kind_High_Type_Attribute => 1553, - Iir_Kind_Low_Type_Attribute => 1558, - Iir_Kind_Ascending_Type_Attribute => 1563, - Iir_Kind_Image_Attribute => 1569, - Iir_Kind_Value_Attribute => 1575, - Iir_Kind_Pos_Attribute => 1581, - Iir_Kind_Val_Attribute => 1587, - Iir_Kind_Succ_Attribute => 1593, - Iir_Kind_Pred_Attribute => 1599, - Iir_Kind_Leftof_Attribute => 1605, - Iir_Kind_Rightof_Attribute => 1611, - Iir_Kind_Delayed_Attribute => 1619, - Iir_Kind_Stable_Attribute => 1627, - Iir_Kind_Quiet_Attribute => 1635, - Iir_Kind_Transaction_Attribute => 1643, - Iir_Kind_Event_Attribute => 1647, - Iir_Kind_Active_Attribute => 1651, - Iir_Kind_Last_Event_Attribute => 1655, - Iir_Kind_Last_Active_Attribute => 1659, - Iir_Kind_Last_Value_Attribute => 1663, - Iir_Kind_Driving_Attribute => 1667, - Iir_Kind_Driving_Value_Attribute => 1671, - Iir_Kind_Behavior_Attribute => 1671, - Iir_Kind_Structure_Attribute => 1671, - Iir_Kind_Simple_Name_Attribute => 1678, - Iir_Kind_Instance_Name_Attribute => 1683, - Iir_Kind_Path_Name_Attribute => 1688, - Iir_Kind_Left_Array_Attribute => 1695, - Iir_Kind_Right_Array_Attribute => 1702, - Iir_Kind_High_Array_Attribute => 1709, - Iir_Kind_Low_Array_Attribute => 1716, - Iir_Kind_Length_Array_Attribute => 1723, - Iir_Kind_Ascending_Array_Attribute => 1730, - Iir_Kind_Range_Array_Attribute => 1737, - Iir_Kind_Reverse_Range_Array_Attribute => 1744, - Iir_Kind_Attribute_Name => 1752 + 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 ); function Get_Fields (K : Iir_Kind) return Fields_Array @@ -4803,6 +4832,8 @@ package body Nodes_Meta is return Get_Type_Definition (N); when Field_Subtype_Definition => return Get_Subtype_Definition (N); + when Field_Interface_Type_Subprograms => + return Get_Interface_Type_Subprograms (N); when Field_Nature => return Get_Nature (N); when Field_Base_Name => @@ -5173,6 +5204,8 @@ package body Nodes_Meta is Set_Type_Definition (N, V); when Field_Subtype_Definition => Set_Subtype_Definition (N, V); + when Field_Interface_Type_Subprograms => + Set_Interface_Type_Subprograms (N, V); when Field_Nature => Set_Nature (N, V); when Field_Base_Name => @@ -6813,6 +6846,7 @@ package body Nodes_Meta is | Iir_Kind_Interface_Variable_Declaration | Iir_Kind_Interface_Signal_Declaration | Iir_Kind_Interface_File_Declaration + | Iir_Kind_Interface_Type_Declaration | Iir_Kind_Interface_Package_Declaration | Iir_Kind_Sensitized_Process_Statement | Iir_Kind_Process_Statement @@ -6926,6 +6960,7 @@ package body Nodes_Meta is | Iir_Kind_Interface_Variable_Declaration | Iir_Kind_Interface_Signal_Declaration | Iir_Kind_Interface_File_Declaration + | Iir_Kind_Interface_Type_Declaration | Iir_Kind_Identity_Operator | Iir_Kind_Negation_Operator | Iir_Kind_Absolute_Operator @@ -7081,6 +7116,11 @@ package body Nodes_Meta is return K = Iir_Kind_Anonymous_Type_Declaration; end Has_Subtype_Definition; + function Has_Interface_Type_Subprograms (K : Iir_Kind) return Boolean is + begin + return K = Iir_Kind_Interface_Type_Declaration; + end Has_Interface_Type_Subprograms; + function Has_Nature (K : Iir_Kind) return Boolean is begin case K is @@ -7450,6 +7490,7 @@ package body Nodes_Meta is when Iir_Kind_Error | Iir_Kind_Access_Type_Definition | Iir_Kind_Incomplete_Type_Definition + | Iir_Kind_Interface_Type_Definition | Iir_Kind_File_Type_Definition | Iir_Kind_Protected_Type_Declaration | Iir_Kind_Record_Type_Definition @@ -7545,6 +7586,7 @@ package body Nodes_Meta is | Iir_Kind_Interface_Variable_Declaration | Iir_Kind_Interface_Signal_Declaration | Iir_Kind_Interface_File_Declaration + | Iir_Kind_Interface_Type_Declaration | Iir_Kind_Interface_Package_Declaration | Iir_Kind_Sensitized_Process_Statement | Iir_Kind_Process_Statement @@ -7675,6 +7717,7 @@ package body Nodes_Meta is | Iir_Kind_Interface_Variable_Declaration | Iir_Kind_Interface_Signal_Declaration | Iir_Kind_Interface_File_Declaration + | Iir_Kind_Interface_Type_Declaration | Iir_Kind_Interface_Package_Declaration | Iir_Kind_Sensitized_Process_Statement | Iir_Kind_Process_Statement @@ -7750,6 +7793,7 @@ package body Nodes_Meta is when Iir_Kind_Error | Iir_Kind_Access_Type_Definition | Iir_Kind_Incomplete_Type_Definition + | Iir_Kind_Interface_Type_Definition | Iir_Kind_File_Type_Definition | Iir_Kind_Protected_Type_Declaration | Iir_Kind_Record_Type_Definition @@ -7860,6 +7904,7 @@ package body Nodes_Meta is when Iir_Kind_Error | Iir_Kind_Access_Type_Definition | Iir_Kind_Incomplete_Type_Definition + | Iir_Kind_Interface_Type_Definition | Iir_Kind_File_Type_Definition | Iir_Kind_Protected_Type_Declaration | Iir_Kind_Record_Type_Definition @@ -8206,6 +8251,7 @@ package body Nodes_Meta is when Iir_Kind_Error | Iir_Kind_Access_Type_Definition | Iir_Kind_Incomplete_Type_Definition + | Iir_Kind_Interface_Type_Definition | Iir_Kind_File_Type_Definition | Iir_Kind_Protected_Type_Declaration | Iir_Kind_Record_Type_Definition @@ -8234,6 +8280,7 @@ package body Nodes_Meta is when Iir_Kind_Error | Iir_Kind_Access_Type_Definition | Iir_Kind_Incomplete_Type_Definition + | Iir_Kind_Interface_Type_Definition | Iir_Kind_File_Type_Definition | Iir_Kind_Protected_Type_Declaration | Iir_Kind_Record_Type_Definition @@ -8261,6 +8308,7 @@ package body Nodes_Meta is case K is when Iir_Kind_Error | Iir_Kind_Incomplete_Type_Definition + | Iir_Kind_Interface_Type_Definition | Iir_Kind_Record_Type_Definition | Iir_Kind_Array_Type_Definition | Iir_Kind_Array_Subtype_Definition @@ -8652,6 +8700,7 @@ package body Nodes_Meta is | Iir_Kind_Interface_Variable_Declaration | Iir_Kind_Interface_Signal_Declaration | Iir_Kind_Interface_File_Declaration + | Iir_Kind_Interface_Type_Declaration | Iir_Kind_Interface_Package_Declaration | Iir_Kind_Sensitized_Process_Statement | Iir_Kind_Process_Statement @@ -9084,6 +9133,7 @@ package body Nodes_Meta is | Iir_Kind_Interface_Variable_Declaration | Iir_Kind_Interface_Signal_Declaration | Iir_Kind_Interface_File_Declaration + | Iir_Kind_Interface_Type_Declaration | Iir_Kind_Function_Call | Iir_Kind_Selected_Element | Iir_Kind_Dereference @@ -9652,7 +9702,8 @@ package body Nodes_Meta is | Iir_Kind_Interface_Constant_Declaration | Iir_Kind_Interface_Variable_Declaration | Iir_Kind_Interface_Signal_Declaration - | Iir_Kind_Interface_File_Declaration => + | Iir_Kind_Interface_File_Declaration + | Iir_Kind_Interface_Type_Declaration => return True; when others => return False; @@ -9803,7 +9854,8 @@ package body Nodes_Meta is | Iir_Kind_Interface_Constant_Declaration | Iir_Kind_Interface_Variable_Declaration | Iir_Kind_Interface_Signal_Declaration - | Iir_Kind_Interface_File_Declaration => + | Iir_Kind_Interface_File_Declaration + | Iir_Kind_Interface_Type_Declaration => return True; when others => return False; @@ -9870,6 +9922,7 @@ package body Nodes_Meta is | Iir_Kind_Interface_Variable_Declaration | Iir_Kind_Interface_Signal_Declaration | Iir_Kind_Interface_File_Declaration + | Iir_Kind_Interface_Type_Declaration | Iir_Kind_Allocator_By_Subtype | Iir_Kind_External_Constant_Name | Iir_Kind_External_Signal_Name diff --git a/src/vhdl/nodes_meta.ads b/src/vhdl/nodes_meta.ads index 3ffff9e7e..60f86cd7b 100644 --- a/src/vhdl/nodes_meta.ads +++ b/src/vhdl/nodes_meta.ads @@ -144,6 +144,7 @@ package Nodes_Meta is Field_Discrete_Range, Field_Type_Definition, Field_Subtype_Definition, + Field_Interface_Type_Subprograms, Field_Nature, Field_Mode, Field_Guarded_Signal_Flag, @@ -631,6 +632,7 @@ package Nodes_Meta is function Has_Discrete_Range (K : Iir_Kind) return Boolean; function Has_Type_Definition (K : Iir_Kind) return Boolean; function Has_Subtype_Definition (K : Iir_Kind) return Boolean; + function Has_Interface_Type_Subprograms (K : Iir_Kind) return Boolean; function Has_Nature (K : Iir_Kind) return Boolean; function Has_Mode (K : Iir_Kind) return Boolean; function Has_Guarded_Signal_Flag (K : Iir_Kind) return Boolean; diff --git a/src/vhdl/parse.adb b/src/vhdl/parse.adb index a3b9a52b0..4be6c1ce6 100644 --- a/src/vhdl/parse.adb +++ b/src/vhdl/parse.adb @@ -1497,6 +1497,22 @@ package body Parse is ("package interface not allowed before vhdl 08"); end if; Inters := Parse_Interface_Package_Declaration; + when Tok_Type => + if Ctxt /= Generic_Interface_List then + Error_Msg_Parse + ("type interface only allowed in generic interface"); + elsif Flags.Vhdl_Std < Vhdl_08 then + Error_Msg_Parse + ("type interface not allowed before vhdl 08"); + end if; + Inters := Create_Iir (Iir_Kind_Interface_Type_Declaration); + Scan_Expect (Tok_Identifier, + "am identifier is expected after 'type'"); + Set_Identifier (Inters, Current_Identifier); + Set_Location (Inters); + + -- Skip identifier + Scan; when Tok_Right_Paren => if Res = Null_Iir then Error_Msg_Parse diff --git a/src/vhdl/sem_decls.adb b/src/vhdl/sem_decls.adb index 37c35afc2..43406648e 100644 --- a/src/vhdl/sem_decls.adb +++ b/src/vhdl/sem_decls.adb @@ -36,6 +36,15 @@ with Xrefs; use Xrefs; use Iir_Chains; package body Sem_Decls is + function Create_Anonymous_Interface + (Atype : Iir) return Iir_Interface_Constant_Declaration; + function Create_Implicit_Function (Name : Name_Id; + Decl : Iir; + Def : Iir_Predefined_Functions; + Interface_Chain : Iir; + Return_Type : Iir) + return Iir; + -- Region that can declare signals. Used to add implicit declarations. Current_Signals_Region : Implicit_Signal_Declaration_Type := (Null_Iir, False, Null_Iir, Null_Iir); @@ -91,6 +100,8 @@ package body Sem_Decls is null; when Iir_Kind_Protected_Type_Declaration => null; + when Iir_Kind_Interface_Type_Definition => + null; when Iir_Kind_Access_Type_Definition | Iir_Kind_Access_Subtype_Definition => null; @@ -379,6 +390,46 @@ package body Sem_Decls is Xref_Decl (Inter); end Sem_Interface_Package_Declaration; + procedure Sem_Interface_Type_Declaration (Inter : Iir) + is + Def : Iir; + Finters : Iir; + Op_Eq, Op_Neq : Iir; + begin + -- Create type definition. + Def := Create_Iir (Iir_Kind_Interface_Type_Definition); + Set_Location (Def, Get_Location (Inter)); + Set_Type_Declarator (Def, Inter); + Set_Type (Inter, Def); + Set_Base_Type (Def, Def); + Set_Type_Staticness (Def, None); + Set_Resolved_Flag (Def, False); + Set_Signal_Type_Flag (Def, True); + Set_Has_Signal_Flag (Def, False); + + -- Create operations for the interface type. + Finters := Create_Anonymous_Interface (Def); + Set_Chain (Finters, Create_Anonymous_Interface (Def)); + + Op_Eq := Create_Implicit_Function + (Std_Names.Name_Op_Equality, + Inter, Iir_Predefined_Interface_Type_Equality, + Finters, Std_Package.Boolean_Type_Definition); + + Op_Neq := Create_Implicit_Function + (Std_Names.Name_Op_Inequality, + Inter, Iir_Predefined_Interface_Type_Inequality, + Finters, Std_Package.Boolean_Type_Definition); + + Set_Interface_Type_Subprograms (Inter, Op_Eq); + Set_Chain (Op_Eq, Op_Neq); + + Sem_Scopes.Add_Name (Inter); + Sem_Scopes.Add_Name (Op_Eq); + Sem_Scopes.Add_Name (Op_Neq); + Xref_Decl (Inter); + end Sem_Interface_Type_Declaration; + procedure Sem_Interface_Chain (Interface_Chain: Iir; Interface_Kind : Interface_Kind_Type) is @@ -393,14 +444,14 @@ package body Sem_Decls is Inter := Interface_Chain; while Inter /= Null_Iir loop - case Get_Kind (Inter) is + case Iir_Kinds_Interface_Declaration (Get_Kind (Inter)) is when Iir_Kinds_Interface_Object_Declaration => Sem_Interface_Object_Declaration (Inter, Last, Interface_Kind); Last := Inter; when Iir_Kind_Interface_Package_Declaration => Sem_Interface_Package_Declaration (Inter); - when others => - raise Internal_Error; + when Iir_Kind_Interface_Type_Declaration => + Sem_Interface_Type_Declaration (Inter); end case; Inter := Get_Chain (Inter); end loop; @@ -666,6 +717,28 @@ package body Sem_Decls is return Inter; end Create_Anonymous_Interface; + -- Create an implicit/predefined function for DECL. + function Create_Implicit_Function (Name : Name_Id; + Decl : Iir; + Def : Iir_Predefined_Functions; + Interface_Chain : Iir; + Return_Type : Iir) + return Iir + is + Operation : Iir_Function_Declaration; + begin + Operation := Create_Iir (Iir_Kind_Function_Declaration); + Location_Copy (Operation, Decl); + Set_Parent (Operation, Get_Parent (Decl)); + Set_Interface_Declaration_Chain (Operation, Interface_Chain); + Set_Return_Type (Operation, Return_Type); + Set_Implicit_Definition (Operation, Def); + Set_Identifier (Operation, Name); + Set_Visible_Flag (Operation, True); + Compute_Subprogram_Hash (Operation); + return Operation; + end Create_Implicit_Function; + procedure Create_Implicit_Operations (Decl : Iir; Is_Std_Standard : Boolean := False) is @@ -682,15 +755,8 @@ package body Sem_Decls is is Operation : Iir_Function_Declaration; begin - Operation := Create_Iir (Iir_Kind_Function_Declaration); - Location_Copy (Operation, Decl); - Set_Parent (Operation, Get_Parent (Decl)); - Set_Interface_Declaration_Chain (Operation, Interface_Chain); - Set_Return_Type (Operation, Return_Type); - Set_Implicit_Definition (Operation, Def); - Set_Identifier (Operation, Name); - Set_Visible_Flag (Operation, True); - Compute_Subprogram_Hash (Operation); + Operation := Create_Implicit_Function + (Name, Decl, Def, Interface_Chain, Return_Type); Insert_Incr (Last, Operation); end Add_Operation; diff --git a/src/vhdl/sem_names.adb b/src/vhdl/sem_names.adb index 9290ae6e2..18d0ee338 100644 --- a/src/vhdl/sem_names.adb +++ b/src/vhdl/sem_names.adb @@ -870,7 +870,9 @@ package body Sem_Names is Atype := Get_Named_Entity (Res); if Get_Kind (Atype) = Iir_Kind_Type_Declaration then Atype := Get_Type_Definition (Atype); - elsif Get_Kind (Atype) = Iir_Kind_Subtype_Declaration then + elsif Get_Kind (Atype) = Iir_Kind_Subtype_Declaration + or else Get_Kind (Atype) = Iir_Kind_Interface_Type_Declaration + then Atype := Get_Type (Atype); else Error_Msg_Sem @@ -1517,7 +1519,8 @@ package body Sem_Names is | Iir_Kind_Attribute_Declaration | Iir_Kind_Non_Object_Alias_Declaration | Iir_Kind_Library_Declaration - | Iir_Kind_Interface_Package_Declaration => + | Iir_Kind_Interface_Package_Declaration + | Iir_Kind_Interface_Type_Declaration => Name_Res := Finish_Sem_Denoting_Name (Name, Res); Set_Base_Name (Name_Res, Res); return Name_Res; diff --git a/src/vhdl/sem_scopes.adb b/src/vhdl/sem_scopes.adb index af4456b15..d30ca4380 100644 --- a/src/vhdl/sem_scopes.adb +++ b/src/vhdl/sem_scopes.adb @@ -956,10 +956,7 @@ package body Sem_Scopes is | Iir_Kind_File_Declaration | Iir_Kind_Object_Alias_Declaration | Iir_Kind_Non_Object_Alias_Declaration - | Iir_Kind_Interface_Constant_Declaration - | Iir_Kind_Interface_Signal_Declaration - | Iir_Kind_Interface_Variable_Declaration - | Iir_Kind_Interface_File_Declaration + | Iir_Kinds_Interface_Object_Declaration | Iir_Kind_Interface_Package_Declaration | Iir_Kind_Component_Declaration | Iir_Kind_Attribute_Declaration @@ -1019,6 +1016,17 @@ package body Sem_Scopes is end loop; end if; end; + when Iir_Kind_Interface_Type_Declaration => + Handle_Decl (Decl, Arg); + declare + El : Iir; + begin + El := Get_Interface_Type_Subprograms (Decl); + while El /= Null_Iir loop + Handle_Decl (El, Arg); + El := Get_Chain (El); + end loop; + end; when Iir_Kind_Use_Clause | Iir_Kind_Context_Reference => Handle_Decl (Decl, Arg); diff --git a/src/vhdl/sem_types.adb b/src/vhdl/sem_types.adb index 9fca01ef1..6986949e5 100644 --- a/src/vhdl/sem_types.adb +++ b/src/vhdl/sem_types.adb @@ -110,6 +110,8 @@ package body Sem_Types is when Iir_Kind_Incomplete_Type_Definition => -- No need to copy the flag. null; + when Iir_Kind_Interface_Type_Definition => + null; when others => Error_Kind ("set_type_has_signal(2)", Atype); end case; diff --git a/src/vhdl/translate/trans-chap2.adb b/src/vhdl/translate/trans-chap2.adb index fe1ffc7e0..5ff3ee3c7 100644 --- a/src/vhdl/translate/trans-chap2.adb +++ b/src/vhdl/translate/trans-chap2.adb @@ -384,7 +384,8 @@ package body Trans.Chap2 is when Iir_Kinds_Composite_Type_Definition => -- At least for "=". return True; - when Iir_Kind_Incomplete_Type_Definition => + when Iir_Kind_Incomplete_Type_Definition + | Iir_Kind_Interface_Type_Definition => null; end case; when others => diff --git a/src/vhdl/translate/trans-chap7.adb b/src/vhdl/translate/trans-chap7.adb index 451dfcba6..c743cefa5 100644 --- a/src/vhdl/translate/trans-chap7.adb +++ b/src/vhdl/translate/trans-chap7.adb @@ -5459,6 +5459,9 @@ package body Trans.Chap7 is when Iir_Predefined_Error | Iir_Predefined_Explicit => raise Internal_Error; + when Iir_Predefined_Interface_Type_Equality + | Iir_Predefined_Interface_Type_Inequality => + raise Internal_Error; when Iir_Predefined_Boolean_And | Iir_Predefined_Boolean_Or | Iir_Predefined_Boolean_Xor |