aboutsummaryrefslogtreecommitdiffstats
path: root/src/vhdl
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2016-08-31 20:24:41 +0200
committerTristan Gingold <tgingold@free.fr>2016-09-01 06:36:52 +0200
commit4e6853861f3809d45424b6eb372ccd91ed76f0cb (patch)
tree68f1ea12f7aeca8c3174dbe9c2eb5225fe677db5 /src/vhdl
parenta7f63a8a08aeaef263c7d4a404d7d827cac89b9a (diff)
downloadghdl-4e6853861f3809d45424b6eb372ccd91ed76f0cb.tar.gz
ghdl-4e6853861f3809d45424b6eb372ccd91ed76f0cb.tar.bz2
ghdl-4e6853861f3809d45424b6eb372ccd91ed76f0cb.zip
vhdl08: parse and analyze interface types.
Diffstat (limited to 'src/vhdl')
-rw-r--r--src/vhdl/errorout.adb4
-rw-r--r--src/vhdl/evaluation.adb4
-rw-r--r--src/vhdl/iirs.adb18
-rw-r--r--src/vhdl/iirs.ads58
-rw-r--r--src/vhdl/nodes.adb1
-rw-r--r--src/vhdl/nodes.ads32
-rw-r--r--src/vhdl/nodes_meta.adb473
-rw-r--r--src/vhdl/nodes_meta.ads2
-rw-r--r--src/vhdl/parse.adb16
-rw-r--r--src/vhdl/sem_decls.adb90
-rw-r--r--src/vhdl/sem_names.adb7
-rw-r--r--src/vhdl/sem_scopes.adb16
-rw-r--r--src/vhdl/sem_types.adb2
-rw-r--r--src/vhdl/translate/trans-chap2.adb3
-rw-r--r--src/vhdl/translate/trans-chap7.adb3
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