aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pyGHDL/libghdl/vhdl/nodes.py13
-rw-r--r--pyGHDL/libghdl/vhdl/nodes_meta.py463
-rw-r--r--src/vhdl/vhdl-nodes.adb16
-rw-r--r--src/vhdl/vhdl-nodes.ads7
-rw-r--r--src/vhdl/vhdl-nodes_meta.adb438
-rw-r--r--src/vhdl/vhdl-nodes_meta.ads2
-rw-r--r--src/vhdl/vhdl-parse.adb31
7 files changed, 532 insertions, 438 deletions
diff --git a/pyGHDL/libghdl/vhdl/nodes.py b/pyGHDL/libghdl/vhdl/nodes.py
index 45b6d1ee6..eba36f86c 100644
--- a/pyGHDL/libghdl/vhdl/nodes.py
+++ b/pyGHDL/libghdl/vhdl/nodes.py
@@ -3712,6 +3712,19 @@ def Set_Label(obj: Iir, value: NameId) -> None:
@export
+@BindToLibGHDL("vhdl__nodes__get_return_identifier")
+def Get_Return_Identifier(obj: Iir) -> Iir:
+ """"""
+ return 0
+
+
+@export
+@BindToLibGHDL("vhdl__nodes__set_return_identifier")
+def Set_Return_Identifier(obj: Iir, value: Iir) -> None:
+ """"""
+
+
+@export
@BindToLibGHDL("vhdl__nodes__get_visible_flag")
def Get_Visible_Flag(obj: Iir) -> Boolean:
""""""
diff --git a/pyGHDL/libghdl/vhdl/nodes_meta.py b/pyGHDL/libghdl/vhdl/nodes_meta.py
index 4602d0ac2..3a5f7e2b8 100644
--- a/pyGHDL/libghdl/vhdl/nodes_meta.py
+++ b/pyGHDL/libghdl/vhdl/nodes_meta.py
@@ -261,234 +261,235 @@ class fields(IntEnum):
Primary_Unit = 141
Identifier = 142
Label = 143
- Visible_Flag = 144
- Range_Constraint = 145
- Direction = 146
- Left_Limit = 147
- Right_Limit = 148
- Left_Limit_Expr = 149
- Right_Limit_Expr = 150
- Parent_Type = 151
- Simple_Nature = 152
- Base_Nature = 153
- Resolution_Indication = 154
- Record_Element_Resolution_Chain = 155
- Tolerance = 156
- Plus_Terminal_Name = 157
- Minus_Terminal_Name = 158
- Plus_Terminal = 159
- Minus_Terminal = 160
- Magnitude_Expression = 161
- Phase_Expression = 162
- Power_Expression = 163
- Simultaneous_Left = 164
- Simultaneous_Right = 165
- Text_File_Flag = 166
- Only_Characters_Flag = 167
- Is_Character_Type = 168
- Nature_Staticness = 169
- Type_Staticness = 170
- Constraint_State = 171
- Index_Subtype_List = 172
- Index_Subtype_Definition_List = 173
- Element_Subtype_Indication = 174
- Element_Subtype = 175
- Element_Subnature_Indication = 176
- Element_Subnature = 177
- Index_Constraint_List = 178
- Array_Element_Constraint = 179
- Has_Array_Constraint_Flag = 180
- Has_Element_Constraint_Flag = 181
- Elements_Declaration_List = 182
- Owned_Elements_Chain = 183
- Designated_Type = 184
- Designated_Subtype_Indication = 185
- Index_List = 186
- Reference = 187
- Nature_Declarator = 188
- Across_Type_Mark = 189
- Through_Type_Mark = 190
- Across_Type_Definition = 191
- Through_Type_Definition = 192
- Across_Type = 193
- Through_Type = 194
- Target = 195
- Waveform_Chain = 196
- Guard = 197
- Delay_Mechanism = 198
- Reject_Time_Expression = 199
- Force_Mode = 200
- Has_Force_Mode = 201
- Sensitivity_List = 202
- Process_Origin = 203
- Package_Origin = 204
- Condition_Clause = 205
- Break_Element = 206
- Selector_Quantity = 207
- Break_Quantity = 208
- Timeout_Clause = 209
- Postponed_Flag = 210
- Callees_List = 211
- Passive_Flag = 212
- Resolution_Function_Flag = 213
- Wait_State = 214
- All_Sensitized_State = 215
- Seen_Flag = 216
- Pure_Flag = 217
- Foreign_Flag = 218
- Resolved_Flag = 219
- Signal_Type_Flag = 220
- Has_Signal_Flag = 221
- Purity_State = 222
- Elab_Flag = 223
- Vendor_Library_Flag = 224
- Configuration_Mark_Flag = 225
- Configuration_Done_Flag = 226
- Index_Constraint_Flag = 227
- Hide_Implicit_Flag = 228
- Assertion_Condition = 229
- Report_Expression = 230
- Severity_Expression = 231
- Instantiated_Unit = 232
- Generic_Map_Aspect_Chain = 233
- Port_Map_Aspect_Chain = 234
- Configuration_Name = 235
- Component_Configuration = 236
- Configuration_Specification = 237
- Default_Binding_Indication = 238
- Default_Configuration_Declaration = 239
- Expression = 240
- Conditional_Expression_Chain = 241
- Allocator_Designated_Type = 242
- Selected_Waveform_Chain = 243
- Conditional_Waveform_Chain = 244
- Guard_Expression = 245
- Guard_Decl = 246
- Guard_Sensitivity_List = 247
- Signal_Attribute_Chain = 248
- Block_Block_Configuration = 249
- Package_Header = 250
- Block_Header = 251
- Uninstantiated_Package_Name = 252
- Uninstantiated_Package_Decl = 253
- Instance_Source_File = 254
- Generate_Block_Configuration = 255
- Generate_Statement_Body = 256
- Alternative_Label = 257
- Generate_Else_Clause = 258
- Condition = 259
- Else_Clause = 260
- Parameter_Specification = 261
- Parent = 262
- Loop_Label = 263
- Exit_Flag = 264
- Next_Flag = 265
- Component_Name = 266
- Instantiation_List = 267
- Entity_Aspect = 268
- Default_Entity_Aspect = 269
- Binding_Indication = 270
- Named_Entity = 271
- Referenced_Name = 272
- Expr_Staticness = 273
- Scalar_Size = 274
- Error_Origin = 275
- Operand = 276
- Left = 277
- Right = 278
- Unit_Name = 279
- Name = 280
- Group_Template_Name = 281
- Name_Staticness = 282
- Prefix = 283
- Signature_Prefix = 284
- External_Pathname = 285
- Pathname_Suffix = 286
- Pathname_Expression = 287
- In_Formal_Flag = 288
- Slice_Subtype = 289
- Suffix = 290
- Index_Subtype = 291
- Parameter = 292
- Parameter_2 = 293
- Parameter_3 = 294
- Parameter_4 = 295
- Attr_Chain = 296
- Signal_Attribute_Declaration = 297
- Actual_Type = 298
- Actual_Type_Definition = 299
- Association_Chain = 300
- Individual_Association_Chain = 301
- Subprogram_Association_Chain = 302
- Aggregate_Info = 303
- Sub_Aggregate_Info = 304
- Aggr_Dynamic_Flag = 305
- Aggr_Min_Length = 306
- Aggr_Low_Limit = 307
- Aggr_High_Limit = 308
- Aggr_Others_Flag = 309
- Aggr_Named_Flag = 310
- Aggregate_Expand_Flag = 311
- Association_Choices_Chain = 312
- Case_Statement_Alternative_Chain = 313
- Matching_Flag = 314
- Choice_Staticness = 315
- Procedure_Call = 316
- Implementation = 317
- Parameter_Association_Chain = 318
- Method_Object = 319
- Subtype_Type_Mark = 320
- Subnature_Nature_Mark = 321
- Type_Conversion_Subtype = 322
- Type_Mark = 323
- File_Type_Mark = 324
- Return_Type_Mark = 325
- Has_Disconnect_Flag = 326
- Has_Active_Flag = 327
- Is_Within_Flag = 328
- Type_Marks_List = 329
- Implicit_Alias_Flag = 330
- Alias_Signature = 331
- Attribute_Signature = 332
- Overload_List = 333
- Simple_Name_Identifier = 334
- Simple_Name_Subtype = 335
- Protected_Type_Body = 336
- Protected_Type_Declaration = 337
- Use_Flag = 338
- End_Has_Reserved_Id = 339
- End_Has_Identifier = 340
- End_Has_Postponed = 341
- Has_Label = 342
- Has_Begin = 343
- Has_End = 344
- Has_Is = 345
- Has_Pure = 346
- Has_Body = 347
- Has_Parameter = 348
- Has_Component = 349
- Has_Identifier_List = 350
- Has_Mode = 351
- Has_Class = 352
- Has_Delay_Mechanism = 353
- Suspend_Flag = 354
- Is_Ref = 355
- Is_Forward_Ref = 356
- Psl_Property = 357
- Psl_Sequence = 358
- Psl_Declaration = 359
- Psl_Expression = 360
- Psl_Boolean = 361
- PSL_Clock = 362
- PSL_NFA = 363
- PSL_Nbr_States = 364
- PSL_Clock_Sensitivity = 365
- PSL_EOS_Flag = 366
- PSL_Abort_Flag = 367
- Count_Expression = 368
- Clock_Expression = 369
- Default_Clock = 370
- Foreign_Node = 371
+ Return_Identifier = 144
+ Visible_Flag = 145
+ Range_Constraint = 146
+ Direction = 147
+ Left_Limit = 148
+ Right_Limit = 149
+ Left_Limit_Expr = 150
+ Right_Limit_Expr = 151
+ Parent_Type = 152
+ Simple_Nature = 153
+ Base_Nature = 154
+ Resolution_Indication = 155
+ Record_Element_Resolution_Chain = 156
+ Tolerance = 157
+ Plus_Terminal_Name = 158
+ Minus_Terminal_Name = 159
+ Plus_Terminal = 160
+ Minus_Terminal = 161
+ Magnitude_Expression = 162
+ Phase_Expression = 163
+ Power_Expression = 164
+ Simultaneous_Left = 165
+ Simultaneous_Right = 166
+ Text_File_Flag = 167
+ Only_Characters_Flag = 168
+ Is_Character_Type = 169
+ Nature_Staticness = 170
+ Type_Staticness = 171
+ Constraint_State = 172
+ Index_Subtype_List = 173
+ Index_Subtype_Definition_List = 174
+ Element_Subtype_Indication = 175
+ Element_Subtype = 176
+ Element_Subnature_Indication = 177
+ Element_Subnature = 178
+ Index_Constraint_List = 179
+ Array_Element_Constraint = 180
+ Has_Array_Constraint_Flag = 181
+ Has_Element_Constraint_Flag = 182
+ Elements_Declaration_List = 183
+ Owned_Elements_Chain = 184
+ Designated_Type = 185
+ Designated_Subtype_Indication = 186
+ Index_List = 187
+ Reference = 188
+ Nature_Declarator = 189
+ Across_Type_Mark = 190
+ Through_Type_Mark = 191
+ Across_Type_Definition = 192
+ Through_Type_Definition = 193
+ Across_Type = 194
+ Through_Type = 195
+ Target = 196
+ Waveform_Chain = 197
+ Guard = 198
+ Delay_Mechanism = 199
+ Reject_Time_Expression = 200
+ Force_Mode = 201
+ Has_Force_Mode = 202
+ Sensitivity_List = 203
+ Process_Origin = 204
+ Package_Origin = 205
+ Condition_Clause = 206
+ Break_Element = 207
+ Selector_Quantity = 208
+ Break_Quantity = 209
+ Timeout_Clause = 210
+ Postponed_Flag = 211
+ Callees_List = 212
+ Passive_Flag = 213
+ Resolution_Function_Flag = 214
+ Wait_State = 215
+ All_Sensitized_State = 216
+ Seen_Flag = 217
+ Pure_Flag = 218
+ Foreign_Flag = 219
+ Resolved_Flag = 220
+ Signal_Type_Flag = 221
+ Has_Signal_Flag = 222
+ Purity_State = 223
+ Elab_Flag = 224
+ Vendor_Library_Flag = 225
+ Configuration_Mark_Flag = 226
+ Configuration_Done_Flag = 227
+ Index_Constraint_Flag = 228
+ Hide_Implicit_Flag = 229
+ Assertion_Condition = 230
+ Report_Expression = 231
+ Severity_Expression = 232
+ Instantiated_Unit = 233
+ Generic_Map_Aspect_Chain = 234
+ Port_Map_Aspect_Chain = 235
+ Configuration_Name = 236
+ Component_Configuration = 237
+ Configuration_Specification = 238
+ Default_Binding_Indication = 239
+ Default_Configuration_Declaration = 240
+ Expression = 241
+ Conditional_Expression_Chain = 242
+ Allocator_Designated_Type = 243
+ Selected_Waveform_Chain = 244
+ Conditional_Waveform_Chain = 245
+ Guard_Expression = 246
+ Guard_Decl = 247
+ Guard_Sensitivity_List = 248
+ Signal_Attribute_Chain = 249
+ Block_Block_Configuration = 250
+ Package_Header = 251
+ Block_Header = 252
+ Uninstantiated_Package_Name = 253
+ Uninstantiated_Package_Decl = 254
+ Instance_Source_File = 255
+ Generate_Block_Configuration = 256
+ Generate_Statement_Body = 257
+ Alternative_Label = 258
+ Generate_Else_Clause = 259
+ Condition = 260
+ Else_Clause = 261
+ Parameter_Specification = 262
+ Parent = 263
+ Loop_Label = 264
+ Exit_Flag = 265
+ Next_Flag = 266
+ Component_Name = 267
+ Instantiation_List = 268
+ Entity_Aspect = 269
+ Default_Entity_Aspect = 270
+ Binding_Indication = 271
+ Named_Entity = 272
+ Referenced_Name = 273
+ Expr_Staticness = 274
+ Scalar_Size = 275
+ Error_Origin = 276
+ Operand = 277
+ Left = 278
+ Right = 279
+ Unit_Name = 280
+ Name = 281
+ Group_Template_Name = 282
+ Name_Staticness = 283
+ Prefix = 284
+ Signature_Prefix = 285
+ External_Pathname = 286
+ Pathname_Suffix = 287
+ Pathname_Expression = 288
+ In_Formal_Flag = 289
+ Slice_Subtype = 290
+ Suffix = 291
+ Index_Subtype = 292
+ Parameter = 293
+ Parameter_2 = 294
+ Parameter_3 = 295
+ Parameter_4 = 296
+ Attr_Chain = 297
+ Signal_Attribute_Declaration = 298
+ Actual_Type = 299
+ Actual_Type_Definition = 300
+ Association_Chain = 301
+ Individual_Association_Chain = 302
+ Subprogram_Association_Chain = 303
+ Aggregate_Info = 304
+ Sub_Aggregate_Info = 305
+ Aggr_Dynamic_Flag = 306
+ Aggr_Min_Length = 307
+ Aggr_Low_Limit = 308
+ Aggr_High_Limit = 309
+ Aggr_Others_Flag = 310
+ Aggr_Named_Flag = 311
+ Aggregate_Expand_Flag = 312
+ Association_Choices_Chain = 313
+ Case_Statement_Alternative_Chain = 314
+ Matching_Flag = 315
+ Choice_Staticness = 316
+ Procedure_Call = 317
+ Implementation = 318
+ Parameter_Association_Chain = 319
+ Method_Object = 320
+ Subtype_Type_Mark = 321
+ Subnature_Nature_Mark = 322
+ Type_Conversion_Subtype = 323
+ Type_Mark = 324
+ File_Type_Mark = 325
+ Return_Type_Mark = 326
+ Has_Disconnect_Flag = 327
+ Has_Active_Flag = 328
+ Is_Within_Flag = 329
+ Type_Marks_List = 330
+ Implicit_Alias_Flag = 331
+ Alias_Signature = 332
+ Attribute_Signature = 333
+ Overload_List = 334
+ Simple_Name_Identifier = 335
+ Simple_Name_Subtype = 336
+ Protected_Type_Body = 337
+ Protected_Type_Declaration = 338
+ Use_Flag = 339
+ End_Has_Reserved_Id = 340
+ End_Has_Identifier = 341
+ End_Has_Postponed = 342
+ Has_Label = 343
+ Has_Begin = 344
+ Has_End = 345
+ Has_Is = 346
+ Has_Pure = 347
+ Has_Body = 348
+ Has_Parameter = 349
+ Has_Component = 350
+ Has_Identifier_List = 351
+ Has_Mode = 352
+ Has_Class = 353
+ Has_Delay_Mechanism = 354
+ Suspend_Flag = 355
+ Is_Ref = 356
+ Is_Forward_Ref = 357
+ Psl_Property = 358
+ Psl_Sequence = 359
+ Psl_Declaration = 360
+ Psl_Expression = 361
+ Psl_Boolean = 362
+ PSL_Clock = 363
+ PSL_NFA = 364
+ PSL_Nbr_States = 365
+ PSL_Clock_Sensitivity = 366
+ PSL_EOS_Flag = 367
+ PSL_Abort_Flag = 368
+ Count_Expression = 369
+ Clock_Expression = 370
+ Default_Clock = 371
+ Foreign_Node = 372
def Get_Boolean(node, field):
@@ -1488,6 +1489,12 @@ def Has_Label(kind: IirKind) -> bool:
@export
+@BindToLibGHDL("vhdl__nodes_meta__has_return_identifier")
+def Has_Return_Identifier(kind: IirKind) -> bool:
+ """"""
+
+
+@export
@BindToLibGHDL("vhdl__nodes_meta__has_visible_flag")
def Has_Visible_Flag(kind: IirKind) -> bool:
""""""
diff --git a/src/vhdl/vhdl-nodes.adb b/src/vhdl/vhdl-nodes.adb
index 94c01f275..947cd771d 100644
--- a/src/vhdl/vhdl-nodes.adb
+++ b/src/vhdl/vhdl-nodes.adb
@@ -3711,6 +3711,22 @@ package body Vhdl.Nodes is
Set_Field3 (Target, Name_Id_To_Iir (Label));
end Set_Label;
+ function Get_Return_Identifier (Target : Iir) return Iir is
+ begin
+ pragma Assert (Target /= Null_Iir);
+ pragma Assert (Has_Return_Identifier (Get_Kind (Target)),
+ "no field Return_Identifier");
+ return Get_Field11 (Target);
+ end Get_Return_Identifier;
+
+ procedure Set_Return_Identifier (Target : Iir; Decl : Iir) is
+ begin
+ pragma Assert (Target /= Null_Iir);
+ pragma Assert (Has_Return_Identifier (Get_Kind (Target)),
+ "no field Return_Identifier");
+ Set_Field11 (Target, Decl);
+ end Set_Return_Identifier;
+
function Get_Visible_Flag (Target : Iir) return Boolean is
begin
pragma Assert (Target /= Null_Iir);
diff --git a/src/vhdl/vhdl-nodes.ads b/src/vhdl/vhdl-nodes.ads
index a36566a5c..aac961bb6 100644
--- a/src/vhdl/vhdl-nodes.ads
+++ b/src/vhdl/vhdl-nodes.ads
@@ -1606,6 +1606,8 @@ package Vhdl.Nodes is
--
-- Get/Set_Subprogram_Depth (Field10)
--
+ -- Get/Set_Return_Identifier (Field11)
+ --
-- Get/Set_Overload_Number (Field12)
--
-- Get/Set_Seen_Flag (Flag1)
@@ -8183,6 +8185,11 @@ package Vhdl.Nodes is
function Get_Label (Target : Iir) return Name_Id;
procedure Set_Label (Target : Iir; Label : Name_Id);
+ -- Return a subtype declaration for the return subtype (vhdl-19)
+ -- Field: Field11
+ function Get_Return_Identifier (Target : Iir) return Iir;
+ procedure Set_Return_Identifier (Target : Iir; Decl : Iir);
+
-- Get/Set the visible flag of a declaration.
-- The visible flag is true to make invalid the use of the identifier
-- during its declaration. It is set to false when the identifier is added
diff --git a/src/vhdl/vhdl-nodes_meta.adb b/src/vhdl/vhdl-nodes_meta.adb
index 53eceebd9..f08c00504 100644
--- a/src/vhdl/vhdl-nodes_meta.adb
+++ b/src/vhdl/vhdl-nodes_meta.adb
@@ -161,6 +161,7 @@ package body Vhdl.Nodes_Meta is
Field_Primary_Unit => Type_Iir,
Field_Identifier => Type_Name_Id,
Field_Label => Type_Name_Id,
+ Field_Return_Identifier => Type_Iir,
Field_Visible_Flag => Type_Boolean,
Field_Range_Constraint => Type_Iir,
Field_Direction => Type_Direction_Type,
@@ -687,6 +688,8 @@ package body Vhdl.Nodes_Meta is
return "identifier";
when Field_Label =>
return "label";
+ when Field_Return_Identifier =>
+ return "return_identifier";
when Field_Visible_Flag =>
return "visible_flag";
when Field_Range_Constraint =>
@@ -2083,6 +2086,8 @@ package body Vhdl.Nodes_Meta is
return Attr_None;
when Field_Label =>
return Attr_None;
+ when Field_Return_Identifier =>
+ return Attr_None;
when Field_Visible_Flag =>
return Attr_None;
when Field_Range_Constraint =>
@@ -3485,6 +3490,7 @@ package body Vhdl.Nodes_Meta is
Field_Generic_Chain,
Field_Return_Type_Mark,
Field_Subprogram_Body,
+ Field_Return_Identifier,
-- Iir_Kind_Procedure_Declaration
Field_Subprogram_Depth,
Field_Overload_Number,
@@ -3510,6 +3516,7 @@ package body Vhdl.Nodes_Meta is
Field_Generic_Chain,
Field_Return_Type_Mark,
Field_Subprogram_Body,
+ Field_Return_Identifier,
-- Iir_Kind_Function_Body
Field_Impure_Depth,
Field_End_Has_Reserved_Id,
@@ -5364,214 +5371,214 @@ package body Vhdl.Nodes_Meta is
Iir_Kind_Psl_Declaration => 776,
Iir_Kind_Psl_Endpoint_Declaration => 790,
Iir_Kind_Enumeration_Literal => 802,
- Iir_Kind_Function_Declaration => 827,
- Iir_Kind_Procedure_Declaration => 851,
- Iir_Kind_Function_Body => 861,
- Iir_Kind_Procedure_Body => 872,
- Iir_Kind_Function_Instantiation_Declaration => 883,
- Iir_Kind_Procedure_Instantiation_Declaration => 893,
- Iir_Kind_Terminal_Declaration => 902,
- Iir_Kind_Object_Alias_Declaration => 914,
- Iir_Kind_Free_Quantity_Declaration => 926,
- Iir_Kind_Spectrum_Quantity_Declaration => 939,
- Iir_Kind_Noise_Quantity_Declaration => 951,
- Iir_Kind_Across_Quantity_Declaration => 967,
- Iir_Kind_Through_Quantity_Declaration => 983,
- Iir_Kind_File_Declaration => 998,
- Iir_Kind_Guard_Signal_Declaration => 1012,
- Iir_Kind_Signal_Declaration => 1029,
- Iir_Kind_Variable_Declaration => 1042,
- Iir_Kind_Constant_Declaration => 1056,
- Iir_Kind_Iterator_Declaration => 1068,
- Iir_Kind_Interface_Constant_Declaration => 1085,
- Iir_Kind_Interface_Variable_Declaration => 1101,
- Iir_Kind_Interface_Signal_Declaration => 1122,
- Iir_Kind_Interface_File_Declaration => 1138,
- Iir_Kind_Interface_Quantity_Declaration => 1154,
- Iir_Kind_Interface_Terminal_Declaration => 1166,
- Iir_Kind_Interface_Type_Declaration => 1177,
- Iir_Kind_Interface_Package_Declaration => 1190,
- Iir_Kind_Interface_Function_Declaration => 1208,
- Iir_Kind_Interface_Procedure_Declaration => 1222,
- Iir_Kind_Signal_Attribute_Declaration => 1225,
- Iir_Kind_Identity_Operator => 1229,
- Iir_Kind_Negation_Operator => 1233,
- Iir_Kind_Absolute_Operator => 1237,
- Iir_Kind_Not_Operator => 1241,
- Iir_Kind_Implicit_Condition_Operator => 1245,
- Iir_Kind_Condition_Operator => 1249,
- Iir_Kind_Reduction_And_Operator => 1253,
- Iir_Kind_Reduction_Or_Operator => 1257,
- Iir_Kind_Reduction_Nand_Operator => 1261,
- Iir_Kind_Reduction_Nor_Operator => 1265,
- Iir_Kind_Reduction_Xor_Operator => 1269,
- Iir_Kind_Reduction_Xnor_Operator => 1273,
- Iir_Kind_And_Operator => 1278,
- Iir_Kind_Or_Operator => 1283,
- Iir_Kind_Nand_Operator => 1288,
- Iir_Kind_Nor_Operator => 1293,
- Iir_Kind_Xor_Operator => 1298,
- Iir_Kind_Xnor_Operator => 1303,
- Iir_Kind_Equality_Operator => 1308,
- Iir_Kind_Inequality_Operator => 1313,
- Iir_Kind_Less_Than_Operator => 1318,
- Iir_Kind_Less_Than_Or_Equal_Operator => 1323,
- Iir_Kind_Greater_Than_Operator => 1328,
- Iir_Kind_Greater_Than_Or_Equal_Operator => 1333,
- Iir_Kind_Match_Equality_Operator => 1338,
- Iir_Kind_Match_Inequality_Operator => 1343,
- Iir_Kind_Match_Less_Than_Operator => 1348,
- Iir_Kind_Match_Less_Than_Or_Equal_Operator => 1353,
- Iir_Kind_Match_Greater_Than_Operator => 1358,
- Iir_Kind_Match_Greater_Than_Or_Equal_Operator => 1363,
- Iir_Kind_Sll_Operator => 1368,
- Iir_Kind_Sla_Operator => 1373,
- Iir_Kind_Srl_Operator => 1378,
- Iir_Kind_Sra_Operator => 1383,
- Iir_Kind_Rol_Operator => 1388,
- Iir_Kind_Ror_Operator => 1393,
- Iir_Kind_Addition_Operator => 1398,
- Iir_Kind_Substraction_Operator => 1403,
- Iir_Kind_Concatenation_Operator => 1408,
- Iir_Kind_Multiplication_Operator => 1413,
- Iir_Kind_Division_Operator => 1418,
- Iir_Kind_Modulus_Operator => 1423,
- Iir_Kind_Remainder_Operator => 1428,
- Iir_Kind_Exponentiation_Operator => 1433,
- Iir_Kind_Function_Call => 1441,
- Iir_Kind_Aggregate => 1448,
- Iir_Kind_Parenthesis_Expression => 1451,
- Iir_Kind_Qualified_Expression => 1455,
- Iir_Kind_Type_Conversion => 1460,
- Iir_Kind_Allocator_By_Expression => 1465,
- Iir_Kind_Allocator_By_Subtype => 1471,
- Iir_Kind_Selected_Element => 1479,
- Iir_Kind_Dereference => 1484,
- Iir_Kind_Implicit_Dereference => 1489,
- Iir_Kind_Slice_Name => 1496,
- Iir_Kind_Indexed_Name => 1502,
- Iir_Kind_Psl_Prev => 1508,
- Iir_Kind_Psl_Stable => 1513,
- Iir_Kind_Psl_Rose => 1518,
- Iir_Kind_Psl_Fell => 1523,
- Iir_Kind_Psl_Onehot => 1526,
- Iir_Kind_Psl_Onehot0 => 1529,
- Iir_Kind_Psl_Expression => 1531,
- Iir_Kind_Sensitized_Process_Statement => 1552,
- Iir_Kind_Process_Statement => 1572,
- Iir_Kind_Concurrent_Simple_Signal_Assignment => 1585,
- Iir_Kind_Concurrent_Conditional_Signal_Assignment => 1598,
- Iir_Kind_Concurrent_Selected_Signal_Assignment => 1612,
- Iir_Kind_Concurrent_Assertion_Statement => 1620,
- Iir_Kind_Concurrent_Procedure_Call_Statement => 1627,
- Iir_Kind_Concurrent_Break_Statement => 1635,
- Iir_Kind_Psl_Assert_Directive => 1649,
- Iir_Kind_Psl_Assume_Directive => 1661,
- Iir_Kind_Psl_Cover_Directive => 1673,
- Iir_Kind_Psl_Restrict_Directive => 1684,
- Iir_Kind_Block_Statement => 1698,
- Iir_Kind_If_Generate_Statement => 1709,
- Iir_Kind_Case_Generate_Statement => 1718,
- Iir_Kind_For_Generate_Statement => 1727,
- Iir_Kind_Component_Instantiation_Statement => 1738,
- Iir_Kind_Psl_Default_Clock => 1741,
- Iir_Kind_Generate_Statement_Body => 1752,
- Iir_Kind_If_Generate_Else_Clause => 1758,
- Iir_Kind_Simple_Simultaneous_Statement => 1765,
- Iir_Kind_Simultaneous_Null_Statement => 1769,
- Iir_Kind_Simultaneous_Procedural_Statement => 1780,
- Iir_Kind_Simultaneous_Case_Statement => 1789,
- Iir_Kind_Simultaneous_If_Statement => 1798,
- Iir_Kind_Simultaneous_Elsif => 1804,
- Iir_Kind_Simple_Signal_Assignment_Statement => 1815,
- Iir_Kind_Conditional_Signal_Assignment_Statement => 1826,
- Iir_Kind_Selected_Waveform_Assignment_Statement => 1838,
- Iir_Kind_Signal_Force_Assignment_Statement => 1848,
- Iir_Kind_Signal_Release_Assignment_Statement => 1857,
- Iir_Kind_Null_Statement => 1861,
- Iir_Kind_Assertion_Statement => 1868,
- Iir_Kind_Report_Statement => 1874,
- Iir_Kind_Wait_Statement => 1882,
- Iir_Kind_Variable_Assignment_Statement => 1889,
- Iir_Kind_Conditional_Variable_Assignment_Statement => 1896,
- Iir_Kind_Return_Statement => 1902,
- Iir_Kind_For_Loop_Statement => 1913,
- Iir_Kind_While_Loop_Statement => 1924,
- Iir_Kind_Next_Statement => 1931,
- Iir_Kind_Exit_Statement => 1938,
- Iir_Kind_Case_Statement => 1947,
- Iir_Kind_Procedure_Call_Statement => 1953,
- Iir_Kind_Break_Statement => 1960,
- Iir_Kind_If_Statement => 1970,
- Iir_Kind_Elsif => 1976,
- Iir_Kind_Character_Literal => 1983,
- Iir_Kind_Simple_Name => 1990,
- Iir_Kind_Selected_Name => 1998,
- Iir_Kind_Operator_Symbol => 2003,
- Iir_Kind_Reference_Name => 2008,
- Iir_Kind_External_Constant_Name => 2017,
- Iir_Kind_External_Signal_Name => 2026,
- Iir_Kind_External_Variable_Name => 2036,
- Iir_Kind_Selected_By_All_Name => 2042,
- Iir_Kind_Parenthesis_Name => 2047,
- Iir_Kind_Package_Pathname => 2051,
- Iir_Kind_Absolute_Pathname => 2052,
- Iir_Kind_Relative_Pathname => 2053,
- Iir_Kind_Pathname_Element => 2058,
- Iir_Kind_Base_Attribute => 2060,
- Iir_Kind_Subtype_Attribute => 2065,
- Iir_Kind_Element_Attribute => 2070,
- Iir_Kind_Across_Attribute => 2075,
- Iir_Kind_Through_Attribute => 2080,
- Iir_Kind_Nature_Reference_Attribute => 2084,
- Iir_Kind_Left_Type_Attribute => 2089,
- Iir_Kind_Right_Type_Attribute => 2094,
- Iir_Kind_High_Type_Attribute => 2099,
- Iir_Kind_Low_Type_Attribute => 2104,
- Iir_Kind_Ascending_Type_Attribute => 2109,
- Iir_Kind_Image_Attribute => 2115,
- Iir_Kind_Value_Attribute => 2121,
- Iir_Kind_Pos_Attribute => 2127,
- Iir_Kind_Val_Attribute => 2133,
- Iir_Kind_Succ_Attribute => 2139,
- Iir_Kind_Pred_Attribute => 2145,
- Iir_Kind_Leftof_Attribute => 2151,
- Iir_Kind_Rightof_Attribute => 2157,
- Iir_Kind_Signal_Slew_Attribute => 2165,
- Iir_Kind_Quantity_Slew_Attribute => 2173,
- Iir_Kind_Ramp_Attribute => 2181,
- Iir_Kind_Zoh_Attribute => 2189,
- Iir_Kind_Ltf_Attribute => 2197,
- Iir_Kind_Ztf_Attribute => 2207,
- Iir_Kind_Dot_Attribute => 2214,
- Iir_Kind_Integ_Attribute => 2221,
- Iir_Kind_Above_Attribute => 2229,
- Iir_Kind_Quantity_Delayed_Attribute => 2237,
- Iir_Kind_Delayed_Attribute => 2246,
- Iir_Kind_Stable_Attribute => 2255,
- Iir_Kind_Quiet_Attribute => 2264,
- Iir_Kind_Transaction_Attribute => 2273,
- Iir_Kind_Event_Attribute => 2277,
- Iir_Kind_Active_Attribute => 2281,
- Iir_Kind_Last_Event_Attribute => 2285,
- Iir_Kind_Last_Active_Attribute => 2289,
- Iir_Kind_Last_Value_Attribute => 2293,
- Iir_Kind_Driving_Attribute => 2297,
- Iir_Kind_Driving_Value_Attribute => 2301,
- Iir_Kind_Behavior_Attribute => 2301,
- Iir_Kind_Structure_Attribute => 2301,
- Iir_Kind_Simple_Name_Attribute => 2308,
- Iir_Kind_Instance_Name_Attribute => 2313,
- Iir_Kind_Path_Name_Attribute => 2318,
- Iir_Kind_Left_Array_Attribute => 2325,
- Iir_Kind_Right_Array_Attribute => 2332,
- Iir_Kind_High_Array_Attribute => 2339,
- Iir_Kind_Low_Array_Attribute => 2346,
- Iir_Kind_Length_Array_Attribute => 2353,
- Iir_Kind_Ascending_Array_Attribute => 2360,
- Iir_Kind_Range_Array_Attribute => 2367,
- Iir_Kind_Reverse_Range_Array_Attribute => 2374,
- Iir_Kind_Attribute_Name => 2383
+ Iir_Kind_Function_Declaration => 828,
+ Iir_Kind_Procedure_Declaration => 853,
+ Iir_Kind_Function_Body => 863,
+ Iir_Kind_Procedure_Body => 874,
+ Iir_Kind_Function_Instantiation_Declaration => 885,
+ Iir_Kind_Procedure_Instantiation_Declaration => 895,
+ Iir_Kind_Terminal_Declaration => 904,
+ Iir_Kind_Object_Alias_Declaration => 916,
+ Iir_Kind_Free_Quantity_Declaration => 928,
+ Iir_Kind_Spectrum_Quantity_Declaration => 941,
+ Iir_Kind_Noise_Quantity_Declaration => 953,
+ Iir_Kind_Across_Quantity_Declaration => 969,
+ Iir_Kind_Through_Quantity_Declaration => 985,
+ Iir_Kind_File_Declaration => 1000,
+ Iir_Kind_Guard_Signal_Declaration => 1014,
+ Iir_Kind_Signal_Declaration => 1031,
+ Iir_Kind_Variable_Declaration => 1044,
+ Iir_Kind_Constant_Declaration => 1058,
+ Iir_Kind_Iterator_Declaration => 1070,
+ Iir_Kind_Interface_Constant_Declaration => 1087,
+ Iir_Kind_Interface_Variable_Declaration => 1103,
+ Iir_Kind_Interface_Signal_Declaration => 1124,
+ Iir_Kind_Interface_File_Declaration => 1140,
+ Iir_Kind_Interface_Quantity_Declaration => 1156,
+ Iir_Kind_Interface_Terminal_Declaration => 1168,
+ Iir_Kind_Interface_Type_Declaration => 1179,
+ Iir_Kind_Interface_Package_Declaration => 1192,
+ Iir_Kind_Interface_Function_Declaration => 1210,
+ Iir_Kind_Interface_Procedure_Declaration => 1224,
+ Iir_Kind_Signal_Attribute_Declaration => 1227,
+ Iir_Kind_Identity_Operator => 1231,
+ Iir_Kind_Negation_Operator => 1235,
+ Iir_Kind_Absolute_Operator => 1239,
+ Iir_Kind_Not_Operator => 1243,
+ Iir_Kind_Implicit_Condition_Operator => 1247,
+ Iir_Kind_Condition_Operator => 1251,
+ Iir_Kind_Reduction_And_Operator => 1255,
+ Iir_Kind_Reduction_Or_Operator => 1259,
+ Iir_Kind_Reduction_Nand_Operator => 1263,
+ Iir_Kind_Reduction_Nor_Operator => 1267,
+ Iir_Kind_Reduction_Xor_Operator => 1271,
+ Iir_Kind_Reduction_Xnor_Operator => 1275,
+ Iir_Kind_And_Operator => 1280,
+ Iir_Kind_Or_Operator => 1285,
+ Iir_Kind_Nand_Operator => 1290,
+ Iir_Kind_Nor_Operator => 1295,
+ Iir_Kind_Xor_Operator => 1300,
+ Iir_Kind_Xnor_Operator => 1305,
+ Iir_Kind_Equality_Operator => 1310,
+ Iir_Kind_Inequality_Operator => 1315,
+ Iir_Kind_Less_Than_Operator => 1320,
+ Iir_Kind_Less_Than_Or_Equal_Operator => 1325,
+ Iir_Kind_Greater_Than_Operator => 1330,
+ Iir_Kind_Greater_Than_Or_Equal_Operator => 1335,
+ Iir_Kind_Match_Equality_Operator => 1340,
+ Iir_Kind_Match_Inequality_Operator => 1345,
+ Iir_Kind_Match_Less_Than_Operator => 1350,
+ Iir_Kind_Match_Less_Than_Or_Equal_Operator => 1355,
+ Iir_Kind_Match_Greater_Than_Operator => 1360,
+ Iir_Kind_Match_Greater_Than_Or_Equal_Operator => 1365,
+ Iir_Kind_Sll_Operator => 1370,
+ Iir_Kind_Sla_Operator => 1375,
+ Iir_Kind_Srl_Operator => 1380,
+ Iir_Kind_Sra_Operator => 1385,
+ Iir_Kind_Rol_Operator => 1390,
+ Iir_Kind_Ror_Operator => 1395,
+ Iir_Kind_Addition_Operator => 1400,
+ Iir_Kind_Substraction_Operator => 1405,
+ Iir_Kind_Concatenation_Operator => 1410,
+ Iir_Kind_Multiplication_Operator => 1415,
+ Iir_Kind_Division_Operator => 1420,
+ Iir_Kind_Modulus_Operator => 1425,
+ Iir_Kind_Remainder_Operator => 1430,
+ Iir_Kind_Exponentiation_Operator => 1435,
+ Iir_Kind_Function_Call => 1443,
+ Iir_Kind_Aggregate => 1450,
+ Iir_Kind_Parenthesis_Expression => 1453,
+ Iir_Kind_Qualified_Expression => 1457,
+ Iir_Kind_Type_Conversion => 1462,
+ Iir_Kind_Allocator_By_Expression => 1467,
+ Iir_Kind_Allocator_By_Subtype => 1473,
+ Iir_Kind_Selected_Element => 1481,
+ Iir_Kind_Dereference => 1486,
+ Iir_Kind_Implicit_Dereference => 1491,
+ Iir_Kind_Slice_Name => 1498,
+ Iir_Kind_Indexed_Name => 1504,
+ Iir_Kind_Psl_Prev => 1510,
+ Iir_Kind_Psl_Stable => 1515,
+ Iir_Kind_Psl_Rose => 1520,
+ Iir_Kind_Psl_Fell => 1525,
+ Iir_Kind_Psl_Onehot => 1528,
+ Iir_Kind_Psl_Onehot0 => 1531,
+ Iir_Kind_Psl_Expression => 1533,
+ Iir_Kind_Sensitized_Process_Statement => 1554,
+ Iir_Kind_Process_Statement => 1574,
+ Iir_Kind_Concurrent_Simple_Signal_Assignment => 1587,
+ Iir_Kind_Concurrent_Conditional_Signal_Assignment => 1600,
+ Iir_Kind_Concurrent_Selected_Signal_Assignment => 1614,
+ Iir_Kind_Concurrent_Assertion_Statement => 1622,
+ Iir_Kind_Concurrent_Procedure_Call_Statement => 1629,
+ Iir_Kind_Concurrent_Break_Statement => 1637,
+ Iir_Kind_Psl_Assert_Directive => 1651,
+ Iir_Kind_Psl_Assume_Directive => 1663,
+ Iir_Kind_Psl_Cover_Directive => 1675,
+ Iir_Kind_Psl_Restrict_Directive => 1686,
+ Iir_Kind_Block_Statement => 1700,
+ Iir_Kind_If_Generate_Statement => 1711,
+ Iir_Kind_Case_Generate_Statement => 1720,
+ Iir_Kind_For_Generate_Statement => 1729,
+ Iir_Kind_Component_Instantiation_Statement => 1740,
+ Iir_Kind_Psl_Default_Clock => 1743,
+ Iir_Kind_Generate_Statement_Body => 1754,
+ Iir_Kind_If_Generate_Else_Clause => 1760,
+ Iir_Kind_Simple_Simultaneous_Statement => 1767,
+ Iir_Kind_Simultaneous_Null_Statement => 1771,
+ Iir_Kind_Simultaneous_Procedural_Statement => 1782,
+ Iir_Kind_Simultaneous_Case_Statement => 1791,
+ Iir_Kind_Simultaneous_If_Statement => 1800,
+ Iir_Kind_Simultaneous_Elsif => 1806,
+ Iir_Kind_Simple_Signal_Assignment_Statement => 1817,
+ Iir_Kind_Conditional_Signal_Assignment_Statement => 1828,
+ Iir_Kind_Selected_Waveform_Assignment_Statement => 1840,
+ Iir_Kind_Signal_Force_Assignment_Statement => 1850,
+ Iir_Kind_Signal_Release_Assignment_Statement => 1859,
+ Iir_Kind_Null_Statement => 1863,
+ Iir_Kind_Assertion_Statement => 1870,
+ Iir_Kind_Report_Statement => 1876,
+ Iir_Kind_Wait_Statement => 1884,
+ Iir_Kind_Variable_Assignment_Statement => 1891,
+ Iir_Kind_Conditional_Variable_Assignment_Statement => 1898,
+ Iir_Kind_Return_Statement => 1904,
+ Iir_Kind_For_Loop_Statement => 1915,
+ Iir_Kind_While_Loop_Statement => 1926,
+ Iir_Kind_Next_Statement => 1933,
+ Iir_Kind_Exit_Statement => 1940,
+ Iir_Kind_Case_Statement => 1949,
+ Iir_Kind_Procedure_Call_Statement => 1955,
+ Iir_Kind_Break_Statement => 1962,
+ Iir_Kind_If_Statement => 1972,
+ Iir_Kind_Elsif => 1978,
+ Iir_Kind_Character_Literal => 1985,
+ Iir_Kind_Simple_Name => 1992,
+ Iir_Kind_Selected_Name => 2000,
+ Iir_Kind_Operator_Symbol => 2005,
+ Iir_Kind_Reference_Name => 2010,
+ Iir_Kind_External_Constant_Name => 2019,
+ Iir_Kind_External_Signal_Name => 2028,
+ Iir_Kind_External_Variable_Name => 2038,
+ Iir_Kind_Selected_By_All_Name => 2044,
+ Iir_Kind_Parenthesis_Name => 2049,
+ Iir_Kind_Package_Pathname => 2053,
+ Iir_Kind_Absolute_Pathname => 2054,
+ Iir_Kind_Relative_Pathname => 2055,
+ Iir_Kind_Pathname_Element => 2060,
+ Iir_Kind_Base_Attribute => 2062,
+ Iir_Kind_Subtype_Attribute => 2067,
+ Iir_Kind_Element_Attribute => 2072,
+ Iir_Kind_Across_Attribute => 2077,
+ Iir_Kind_Through_Attribute => 2082,
+ Iir_Kind_Nature_Reference_Attribute => 2086,
+ Iir_Kind_Left_Type_Attribute => 2091,
+ Iir_Kind_Right_Type_Attribute => 2096,
+ Iir_Kind_High_Type_Attribute => 2101,
+ Iir_Kind_Low_Type_Attribute => 2106,
+ Iir_Kind_Ascending_Type_Attribute => 2111,
+ Iir_Kind_Image_Attribute => 2117,
+ Iir_Kind_Value_Attribute => 2123,
+ Iir_Kind_Pos_Attribute => 2129,
+ Iir_Kind_Val_Attribute => 2135,
+ Iir_Kind_Succ_Attribute => 2141,
+ Iir_Kind_Pred_Attribute => 2147,
+ Iir_Kind_Leftof_Attribute => 2153,
+ Iir_Kind_Rightof_Attribute => 2159,
+ Iir_Kind_Signal_Slew_Attribute => 2167,
+ Iir_Kind_Quantity_Slew_Attribute => 2175,
+ Iir_Kind_Ramp_Attribute => 2183,
+ Iir_Kind_Zoh_Attribute => 2191,
+ Iir_Kind_Ltf_Attribute => 2199,
+ Iir_Kind_Ztf_Attribute => 2209,
+ Iir_Kind_Dot_Attribute => 2216,
+ Iir_Kind_Integ_Attribute => 2223,
+ Iir_Kind_Above_Attribute => 2231,
+ Iir_Kind_Quantity_Delayed_Attribute => 2239,
+ Iir_Kind_Delayed_Attribute => 2248,
+ Iir_Kind_Stable_Attribute => 2257,
+ Iir_Kind_Quiet_Attribute => 2266,
+ Iir_Kind_Transaction_Attribute => 2275,
+ Iir_Kind_Event_Attribute => 2279,
+ Iir_Kind_Active_Attribute => 2283,
+ Iir_Kind_Last_Event_Attribute => 2287,
+ Iir_Kind_Last_Active_Attribute => 2291,
+ Iir_Kind_Last_Value_Attribute => 2295,
+ Iir_Kind_Driving_Attribute => 2299,
+ Iir_Kind_Driving_Value_Attribute => 2303,
+ Iir_Kind_Behavior_Attribute => 2303,
+ Iir_Kind_Structure_Attribute => 2303,
+ Iir_Kind_Simple_Name_Attribute => 2310,
+ Iir_Kind_Instance_Name_Attribute => 2315,
+ Iir_Kind_Path_Name_Attribute => 2320,
+ Iir_Kind_Left_Array_Attribute => 2327,
+ Iir_Kind_Right_Array_Attribute => 2334,
+ Iir_Kind_High_Array_Attribute => 2341,
+ Iir_Kind_Low_Array_Attribute => 2348,
+ Iir_Kind_Length_Array_Attribute => 2355,
+ Iir_Kind_Ascending_Array_Attribute => 2362,
+ Iir_Kind_Range_Array_Attribute => 2369,
+ Iir_Kind_Reverse_Range_Array_Attribute => 2376,
+ Iir_Kind_Attribute_Name => 2385
);
function Get_Fields_First (K : Iir_Kind) return Fields_Index is
@@ -6210,6 +6217,8 @@ package body Vhdl.Nodes_Meta is
return Get_Unit_Chain (N);
when Field_Primary_Unit =>
return Get_Primary_Unit (N);
+ when Field_Return_Identifier =>
+ return Get_Return_Identifier (N);
when Field_Range_Constraint =>
return Get_Range_Constraint (N);
when Field_Left_Limit =>
@@ -6666,6 +6675,8 @@ package body Vhdl.Nodes_Meta is
Set_Unit_Chain (N, V);
when Field_Primary_Unit =>
Set_Primary_Unit (N, V);
+ when Field_Return_Identifier =>
+ Set_Return_Identifier (N, V);
when Field_Range_Constraint =>
Set_Range_Constraint (N, V);
when Field_Left_Limit =>
@@ -9564,6 +9575,17 @@ package body Vhdl.Nodes_Meta is
end case;
end Has_Label;
+ function Has_Return_Identifier (K : Iir_Kind) return Boolean is
+ begin
+ case K is
+ when Iir_Kind_Function_Declaration
+ | Iir_Kind_Procedure_Declaration =>
+ return True;
+ when others =>
+ return False;
+ end case;
+ end Has_Return_Identifier;
+
function Has_Visible_Flag (K : Iir_Kind) return Boolean is
begin
case K is
diff --git a/src/vhdl/vhdl-nodes_meta.ads b/src/vhdl/vhdl-nodes_meta.ads
index 44ae8b048..15e9c1b3d 100644
--- a/src/vhdl/vhdl-nodes_meta.ads
+++ b/src/vhdl/vhdl-nodes_meta.ads
@@ -205,6 +205,7 @@ package Vhdl.Nodes_Meta is
Field_Primary_Unit,
Field_Identifier,
Field_Label,
+ Field_Return_Identifier,
Field_Visible_Flag,
Field_Range_Constraint,
Field_Direction,
@@ -791,6 +792,7 @@ package Vhdl.Nodes_Meta is
function Has_Primary_Unit (K : Iir_Kind) return Boolean;
function Has_Identifier (K : Iir_Kind) return Boolean;
function Has_Label (K : Iir_Kind) return Boolean;
+ function Has_Return_Identifier (K : Iir_Kind) return Boolean;
function Has_Visible_Flag (K : Iir_Kind) return Boolean;
function Has_Range_Constraint (K : Iir_Kind) return Boolean;
function Has_Direction (K : Iir_Kind) return Boolean;
diff --git a/src/vhdl/vhdl-parse.adb b/src/vhdl/vhdl-parse.adb
index e84f7d726..6e574b0a5 100644
--- a/src/vhdl/vhdl-parse.adb
+++ b/src/vhdl/vhdl-parse.adb
@@ -2100,6 +2100,8 @@ package body Vhdl.Parse is
is
Old : Iir;
pragma Unreferenced (Old);
+ Tm : Iir;
+ Ret : Iir;
Inters : Iir;
begin
if Current_Token = Tok_Parameter then
@@ -2141,8 +2143,27 @@ package body Vhdl.Parse is
-- Skip 'return'
Scan;
- Set_Return_Type_Mark
- (Subprg, Parse_Type_Mark (Check_Paren => True));
+ Tm := Parse_Type_Mark (Check_Paren => True);
+
+ if Current_Token = Tok_Of then
+ if Vhdl_Std < Vhdl_19 then
+ Error_Msg_Parse
+ ("return identifier not allowed before vhdl 2019");
+ end if;
+ pragma Assert (Get_Kind (Tm) = Iir_Kind_Simple_Name);
+ Ret := Create_Iir (Iir_Kind_Subtype_Declaration);
+ Location_Copy (Ret, Tm);
+ Set_Identifier (Ret, Get_Identifier (Tm));
+ Set_Return_Identifier (Subprg, Ret);
+ Free_Iir (Tm);
+
+ -- Skip 'of'
+ Scan;
+
+ Tm := Parse_Type_Mark (Check_Paren => True);
+ end if;
+
+ Set_Return_Type_Mark (Subprg, Tm);
end if;
else
if Is_Func and Required then
@@ -8298,6 +8319,12 @@ package body Vhdl.Parse is
-- | [ PURE | IMPURE ] FUNCTION designator [ ( formal_parameter_list ) ]
-- RETURN type_mark
--
+ -- [ LRM19 4.2 Subprogram declarations ]
+ -- function_specification ::=
+ -- [ PURE | IMPURE ] FUNCTION designator
+ -- subprogram_header [ [ PARAMETER ] ( formal_parameter_list) ]
+ -- RETURN [ return_identifier OF ] type_mark
+ --
-- [ LRM93 2.2 ]
-- subprogram_body ::=
-- subprogram_specification IS