aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2019-09-18 06:47:20 +0200
committerTristan Gingold <tgingold@free.fr>2019-09-18 18:45:25 +0200
commit48396102d53ed1c10a750a14ff75364d5c533e10 (patch)
tree33edab29fcac0c4e0110ce7ceb9a55e95cb92266
parent40e085168bdbaabd1730bffa1de7e450ae2fc0b7 (diff)
downloadghdl-48396102d53ed1c10a750a14ff75364d5c533e10.tar.gz
ghdl-48396102d53ed1c10a750a14ff75364d5c533e10.tar.bz2
ghdl-48396102d53ed1c10a750a14ff75364d5c533e10.zip
vhdl: add exit/next flags.
-rw-r--r--python/libghdl/thin/vhdl/nodes.py12
-rw-r--r--python/libghdl/thin/vhdl/nodes_meta.py198
-rw-r--r--src/vhdl/vhdl-nodes.adb32
-rw-r--r--src/vhdl/vhdl-nodes.ads22
-rw-r--r--src/vhdl/vhdl-nodes_meta.adb170
-rw-r--r--src/vhdl/vhdl-nodes_meta.ads4
-rw-r--r--src/vhdl/vhdl-sem_stmts.adb8
7 files changed, 288 insertions, 158 deletions
diff --git a/python/libghdl/thin/vhdl/nodes.py b/python/libghdl/thin/vhdl/nodes.py
index 8dbc7a092..335ebb240 100644
--- a/python/libghdl/thin/vhdl/nodes.py
+++ b/python/libghdl/thin/vhdl/nodes.py
@@ -681,6 +681,10 @@ class Iir_Kinds:
Iir_Kind.Anonymous_Type_Declaration,
Iir_Kind.Subtype_Declaration]
+ Next_Exit_Statement = [
+ Iir_Kind.Next_Statement,
+ Iir_Kind.Exit_Statement]
+
Association_Element = [
Iir_Kind.Association_Element_By_Expression,
Iir_Kind.Association_Element_By_Individual,
@@ -2123,6 +2127,14 @@ Get_Loop_Label = libghdl.vhdl__nodes__get_loop_label
Set_Loop_Label = libghdl.vhdl__nodes__set_loop_label
+Get_Exit_Flag = libghdl.vhdl__nodes__get_exit_flag
+
+Set_Exit_Flag = libghdl.vhdl__nodes__set_exit_flag
+
+Get_Next_Flag = libghdl.vhdl__nodes__get_next_flag
+
+Set_Next_Flag = libghdl.vhdl__nodes__set_next_flag
+
Get_Component_Name = libghdl.vhdl__nodes__get_component_name
Set_Component_Name = libghdl.vhdl__nodes__set_component_name
diff --git a/python/libghdl/thin/vhdl/nodes_meta.py b/python/libghdl/thin/vhdl/nodes_meta.py
index ec2cf03a8..e11dc5b78 100644
--- a/python/libghdl/thin/vhdl/nodes_meta.py
+++ b/python/libghdl/thin/vhdl/nodes_meta.py
@@ -296,101 +296,103 @@ class fields:
Parameter_Specification = 232
Parent = 233
Loop_Label = 234
- Component_Name = 235
- Instantiation_List = 236
- Entity_Aspect = 237
- Default_Entity_Aspect = 238
- Binding_Indication = 239
- Named_Entity = 240
- Alias_Declaration = 241
- Referenced_Name = 242
- Expr_Staticness = 243
- Error_Origin = 244
- Operand = 245
- Left = 246
- Right = 247
- Unit_Name = 248
- Name = 249
- Group_Template_Name = 250
- Name_Staticness = 251
- Prefix = 252
- Signature_Prefix = 253
- External_Pathname = 254
- Pathname_Suffix = 255
- Pathname_Expression = 256
- In_Formal_Flag = 257
- Slice_Subtype = 258
- Suffix = 259
- Index_Subtype = 260
- Parameter = 261
- Attr_Chain = 262
- Signal_Attribute_Declaration = 263
- Actual_Type = 264
- Actual_Type_Definition = 265
- Association_Chain = 266
- Individual_Association_Chain = 267
- Subprogram_Association_Chain = 268
- Aggregate_Info = 269
- Sub_Aggregate_Info = 270
- Aggr_Dynamic_Flag = 271
- Aggr_Min_Length = 272
- Aggr_Low_Limit = 273
- Aggr_High_Limit = 274
- Aggr_Others_Flag = 275
- Aggr_Named_Flag = 276
- Aggregate_Expand_Flag = 277
- Association_Choices_Chain = 278
- Case_Statement_Alternative_Chain = 279
- Choice_Staticness = 280
- Procedure_Call = 281
- Implementation = 282
- Parameter_Association_Chain = 283
- Method_Object = 284
- Subtype_Type_Mark = 285
- Type_Conversion_Subtype = 286
- Type_Mark = 287
- File_Type_Mark = 288
- Return_Type_Mark = 289
- Has_Disconnect_Flag = 290
- Has_Active_Flag = 291
- Is_Within_Flag = 292
- Type_Marks_List = 293
- Implicit_Alias_Flag = 294
- Alias_Signature = 295
- Attribute_Signature = 296
- Overload_List = 297
- Simple_Name_Identifier = 298
- Simple_Name_Subtype = 299
- Protected_Type_Body = 300
- Protected_Type_Declaration = 301
- Use_Flag = 302
- End_Has_Reserved_Id = 303
- End_Has_Identifier = 304
- End_Has_Postponed = 305
- Has_Label = 306
- Has_Begin = 307
- Has_End = 308
- Has_Is = 309
- Has_Pure = 310
- Has_Body = 311
- Has_Parameter = 312
- Has_Component = 313
- Has_Identifier_List = 314
- Has_Mode = 315
- Has_Class = 316
- Suspend_Flag = 317
- Is_Ref = 318
- Is_Forward_Ref = 319
- Psl_Property = 320
- Psl_Sequence = 321
- Psl_Declaration = 322
- Psl_Expression = 323
- Psl_Boolean = 324
- PSL_Clock = 325
- PSL_NFA = 326
- PSL_Nbr_States = 327
- PSL_Clock_Sensitivity = 328
- PSL_EOS_Flag = 329
+ Exit_Flag = 235
+ Next_Flag = 236
+ Component_Name = 237
+ Instantiation_List = 238
+ Entity_Aspect = 239
+ Default_Entity_Aspect = 240
+ Binding_Indication = 241
+ Named_Entity = 242
+ Alias_Declaration = 243
+ Referenced_Name = 244
+ Expr_Staticness = 245
+ Error_Origin = 246
+ Operand = 247
+ Left = 248
+ Right = 249
+ Unit_Name = 250
+ Name = 251
+ Group_Template_Name = 252
+ Name_Staticness = 253
+ Prefix = 254
+ Signature_Prefix = 255
+ External_Pathname = 256
+ Pathname_Suffix = 257
+ Pathname_Expression = 258
+ In_Formal_Flag = 259
+ Slice_Subtype = 260
+ Suffix = 261
+ Index_Subtype = 262
+ Parameter = 263
+ Attr_Chain = 264
+ Signal_Attribute_Declaration = 265
+ Actual_Type = 266
+ Actual_Type_Definition = 267
+ Association_Chain = 268
+ Individual_Association_Chain = 269
+ Subprogram_Association_Chain = 270
+ Aggregate_Info = 271
+ Sub_Aggregate_Info = 272
+ Aggr_Dynamic_Flag = 273
+ Aggr_Min_Length = 274
+ Aggr_Low_Limit = 275
+ Aggr_High_Limit = 276
+ Aggr_Others_Flag = 277
+ Aggr_Named_Flag = 278
+ Aggregate_Expand_Flag = 279
+ Association_Choices_Chain = 280
+ Case_Statement_Alternative_Chain = 281
+ Choice_Staticness = 282
+ Procedure_Call = 283
+ Implementation = 284
+ Parameter_Association_Chain = 285
+ Method_Object = 286
+ Subtype_Type_Mark = 287
+ Type_Conversion_Subtype = 288
+ Type_Mark = 289
+ File_Type_Mark = 290
+ Return_Type_Mark = 291
+ Has_Disconnect_Flag = 292
+ Has_Active_Flag = 293
+ Is_Within_Flag = 294
+ Type_Marks_List = 295
+ Implicit_Alias_Flag = 296
+ Alias_Signature = 297
+ Attribute_Signature = 298
+ Overload_List = 299
+ Simple_Name_Identifier = 300
+ Simple_Name_Subtype = 301
+ Protected_Type_Body = 302
+ Protected_Type_Declaration = 303
+ Use_Flag = 304
+ End_Has_Reserved_Id = 305
+ End_Has_Identifier = 306
+ End_Has_Postponed = 307
+ Has_Label = 308
+ Has_Begin = 309
+ Has_End = 310
+ Has_Is = 311
+ Has_Pure = 312
+ Has_Body = 313
+ Has_Parameter = 314
+ Has_Component = 315
+ Has_Identifier_List = 316
+ Has_Mode = 317
+ Has_Class = 318
+ Suspend_Flag = 319
+ Is_Ref = 320
+ Is_Forward_Ref = 321
+ Psl_Property = 322
+ Psl_Sequence = 323
+ Psl_Declaration = 324
+ Psl_Expression = 325
+ Psl_Boolean = 326
+ PSL_Clock = 327
+ PSL_NFA = 328
+ PSL_Nbr_States = 329
+ PSL_Clock_Sensitivity = 330
+ PSL_EOS_Flag = 331
Get_Boolean = libghdl.vhdl__nodes_meta__get_boolean
@@ -1161,6 +1163,12 @@ Has_Parent =\
Has_Loop_Label =\
libghdl.vhdl__nodes_meta__has_loop_label
+Has_Exit_Flag =\
+ libghdl.vhdl__nodes_meta__has_exit_flag
+
+Has_Next_Flag =\
+ libghdl.vhdl__nodes_meta__has_next_flag
+
Has_Component_Name =\
libghdl.vhdl__nodes_meta__has_component_name
diff --git a/src/vhdl/vhdl-nodes.adb b/src/vhdl/vhdl-nodes.adb
index 1a43a24c7..ffde6a5ab 100644
--- a/src/vhdl/vhdl-nodes.adb
+++ b/src/vhdl/vhdl-nodes.adb
@@ -5115,6 +5115,38 @@ package body Vhdl.Nodes is
Set_Field5 (Target, Stmt);
end Set_Loop_Label;
+ function Get_Exit_Flag (Stmt : Iir) return Boolean is
+ begin
+ pragma Assert (Stmt /= Null_Iir);
+ pragma Assert (Has_Exit_Flag (Get_Kind (Stmt)),
+ "no field Exit_Flag");
+ return Get_Flag1 (Stmt);
+ end Get_Exit_Flag;
+
+ procedure Set_Exit_Flag (Stmt : Iir; Flag : Boolean) is
+ begin
+ pragma Assert (Stmt /= Null_Iir);
+ pragma Assert (Has_Exit_Flag (Get_Kind (Stmt)),
+ "no field Exit_Flag");
+ Set_Flag1 (Stmt, Flag);
+ end Set_Exit_Flag;
+
+ function Get_Next_Flag (Stmt : Iir) return Boolean is
+ begin
+ pragma Assert (Stmt /= Null_Iir);
+ pragma Assert (Has_Next_Flag (Get_Kind (Stmt)),
+ "no field Next_Flag");
+ return Get_Flag2 (Stmt);
+ end Get_Next_Flag;
+
+ procedure Set_Next_Flag (Stmt : Iir; Flag : Boolean) is
+ begin
+ pragma Assert (Stmt /= Null_Iir);
+ pragma Assert (Has_Next_Flag (Get_Kind (Stmt)),
+ "no field Next_Flag");
+ Set_Flag2 (Stmt, Flag);
+ end Set_Next_Flag;
+
function Get_Component_Name (Target : Iir) return Iir is
begin
pragma Assert (Target /= Null_Iir);
diff --git a/src/vhdl/vhdl-nodes.ads b/src/vhdl/vhdl-nodes.ads
index 28e58bbb8..53c3ba053 100644
--- a/src/vhdl/vhdl-nodes.ads
+++ b/src/vhdl/vhdl-nodes.ads
@@ -3291,6 +3291,10 @@ package Vhdl.Nodes is
--
-- Get/Set_Is_Within_Flag (Flag5)
--
+ -- Get/Set_Exit_Flag (Flag1)
+ --
+ -- Get/Set_Next_Flag (Flag2)
+ --
-- Get/Set_End_Has_Identifier (Flag9)
--
-- Get/Set_Suspend_Flag (Flag11)
@@ -3310,6 +3314,10 @@ package Vhdl.Nodes is
--
-- Get/Set_Visible_Flag (Flag4)
--
+ -- Get/Set_Exit_Flag (Flag1)
+ --
+ -- Get/Set_Next_Flag (Flag2)
+ --
-- Get/Set_End_Has_Identifier (Flag9)
--
-- Get/Set_Suspend_Flag (Flag11)
@@ -5707,6 +5715,10 @@ package Vhdl.Nodes is
--Iir_Kind_Procedure_Call_Statement
Iir_Kind_If_Statement;
+ subtype Iir_Kinds_Next_Exit_Statement is Iir_Kind range
+ Iir_Kind_Next_Statement ..
+ Iir_Kind_Exit_Statement;
+
subtype Iir_Kinds_Variable_Assignment_Statement is Iir_Kind range
Iir_Kind_Variable_Assignment_Statement ..
Iir_Kind_Conditional_Variable_Assignment_Statement;
@@ -7372,6 +7384,16 @@ package Vhdl.Nodes is
function Get_Loop_Label (Target : Iir) return Iir;
procedure Set_Loop_Label (Target : Iir; Stmt : Iir);
+ -- True if there is an exit statement targetting this loop statement.
+ -- Field: Flag1
+ function Get_Exit_Flag (Stmt : Iir) return Boolean;
+ procedure Set_Exit_Flag (Stmt : Iir; Flag : Boolean);
+
+ -- True if there is a next statement targetting this loop statement.
+ -- Field: Flag2
+ function Get_Next_Flag (Stmt : Iir) return Boolean;
+ procedure Set_Next_Flag (Stmt : Iir; Flag : Boolean);
+
-- Component name for a component_configuration or
-- a configuration_specification.
-- Field: Field4
diff --git a/src/vhdl/vhdl-nodes_meta.adb b/src/vhdl/vhdl-nodes_meta.adb
index 05920a131..31b66a691 100644
--- a/src/vhdl/vhdl-nodes_meta.adb
+++ b/src/vhdl/vhdl-nodes_meta.adb
@@ -254,6 +254,8 @@ package body Vhdl.Nodes_Meta is
Field_Parameter_Specification => Type_Iir,
Field_Parent => Type_Iir,
Field_Loop_Label => Type_Iir,
+ Field_Exit_Flag => Type_Boolean,
+ Field_Next_Flag => Type_Boolean,
Field_Component_Name => Type_Iir,
Field_Instantiation_List => Type_Iir_Flist,
Field_Entity_Aspect => Type_Iir,
@@ -829,6 +831,10 @@ package body Vhdl.Nodes_Meta is
return "parent";
when Field_Loop_Label =>
return "loop_label";
+ when Field_Exit_Flag =>
+ return "exit_flag";
+ when Field_Next_Flag =>
+ return "next_flag";
when Field_Component_Name =>
return "component_name";
when Field_Instantiation_List =>
@@ -2053,6 +2059,10 @@ package body Vhdl.Nodes_Meta is
return Attr_Ref;
when Field_Loop_Label =>
return Attr_None;
+ when Field_Exit_Flag =>
+ return Attr_None;
+ when Field_Next_Flag =>
+ return Attr_None;
when Field_Component_Name =>
return Attr_None;
when Field_Instantiation_List =>
@@ -4085,7 +4095,9 @@ package body Vhdl.Nodes_Meta is
Field_Expression,
-- Iir_Kind_For_Loop_Statement
Field_Label,
+ Field_Exit_Flag,
Field_Suspend_Flag,
+ Field_Next_Flag,
Field_Visible_Flag,
Field_Is_Within_Flag,
Field_End_Has_Identifier,
@@ -4095,8 +4107,10 @@ package body Vhdl.Nodes_Meta is
Field_Sequential_Statement_Chain,
-- Iir_Kind_While_Loop_Statement
Field_Label,
+ Field_Exit_Flag,
Field_Suspend_Flag,
Field_Is_Ref,
+ Field_Next_Flag,
Field_Visible_Flag,
Field_End_Has_Identifier,
Field_Parent,
@@ -4739,69 +4753,69 @@ package body Vhdl.Nodes_Meta is
Iir_Kind_Variable_Assignment_Statement => 1608,
Iir_Kind_Conditional_Variable_Assignment_Statement => 1615,
Iir_Kind_Return_Statement => 1621,
- Iir_Kind_For_Loop_Statement => 1630,
- Iir_Kind_While_Loop_Statement => 1639,
- Iir_Kind_Next_Statement => 1646,
- Iir_Kind_Exit_Statement => 1653,
- Iir_Kind_Case_Statement => 1661,
- Iir_Kind_Procedure_Call_Statement => 1667,
- Iir_Kind_If_Statement => 1677,
- Iir_Kind_Elsif => 1683,
- Iir_Kind_Character_Literal => 1691,
- Iir_Kind_Simple_Name => 1699,
- Iir_Kind_Selected_Name => 1708,
- Iir_Kind_Operator_Symbol => 1714,
- Iir_Kind_Reference_Name => 1719,
- Iir_Kind_External_Constant_Name => 1727,
- Iir_Kind_External_Signal_Name => 1735,
- Iir_Kind_External_Variable_Name => 1744,
- Iir_Kind_Selected_By_All_Name => 1750,
- Iir_Kind_Parenthesis_Name => 1755,
- Iir_Kind_Package_Pathname => 1759,
- Iir_Kind_Absolute_Pathname => 1760,
- Iir_Kind_Relative_Pathname => 1761,
- Iir_Kind_Pathname_Element => 1766,
- Iir_Kind_Base_Attribute => 1768,
- Iir_Kind_Subtype_Attribute => 1773,
- Iir_Kind_Element_Attribute => 1778,
- Iir_Kind_Left_Type_Attribute => 1783,
- Iir_Kind_Right_Type_Attribute => 1788,
- Iir_Kind_High_Type_Attribute => 1793,
- Iir_Kind_Low_Type_Attribute => 1798,
- Iir_Kind_Ascending_Type_Attribute => 1803,
- Iir_Kind_Image_Attribute => 1809,
- Iir_Kind_Value_Attribute => 1815,
- Iir_Kind_Pos_Attribute => 1821,
- Iir_Kind_Val_Attribute => 1827,
- Iir_Kind_Succ_Attribute => 1833,
- Iir_Kind_Pred_Attribute => 1839,
- Iir_Kind_Leftof_Attribute => 1845,
- Iir_Kind_Rightof_Attribute => 1851,
- Iir_Kind_Delayed_Attribute => 1860,
- Iir_Kind_Stable_Attribute => 1869,
- Iir_Kind_Quiet_Attribute => 1878,
- Iir_Kind_Transaction_Attribute => 1887,
- Iir_Kind_Event_Attribute => 1891,
- Iir_Kind_Active_Attribute => 1895,
- Iir_Kind_Last_Event_Attribute => 1899,
- Iir_Kind_Last_Active_Attribute => 1903,
- Iir_Kind_Last_Value_Attribute => 1907,
- Iir_Kind_Driving_Attribute => 1911,
- Iir_Kind_Driving_Value_Attribute => 1915,
- Iir_Kind_Behavior_Attribute => 1915,
- Iir_Kind_Structure_Attribute => 1915,
- Iir_Kind_Simple_Name_Attribute => 1922,
- Iir_Kind_Instance_Name_Attribute => 1927,
- Iir_Kind_Path_Name_Attribute => 1932,
- Iir_Kind_Left_Array_Attribute => 1939,
- Iir_Kind_Right_Array_Attribute => 1946,
- Iir_Kind_High_Array_Attribute => 1953,
- Iir_Kind_Low_Array_Attribute => 1960,
- Iir_Kind_Length_Array_Attribute => 1967,
- Iir_Kind_Ascending_Array_Attribute => 1974,
- Iir_Kind_Range_Array_Attribute => 1981,
- Iir_Kind_Reverse_Range_Array_Attribute => 1988,
- Iir_Kind_Attribute_Name => 1997
+ Iir_Kind_For_Loop_Statement => 1632,
+ Iir_Kind_While_Loop_Statement => 1643,
+ Iir_Kind_Next_Statement => 1650,
+ Iir_Kind_Exit_Statement => 1657,
+ Iir_Kind_Case_Statement => 1665,
+ Iir_Kind_Procedure_Call_Statement => 1671,
+ Iir_Kind_If_Statement => 1681,
+ Iir_Kind_Elsif => 1687,
+ Iir_Kind_Character_Literal => 1695,
+ Iir_Kind_Simple_Name => 1703,
+ Iir_Kind_Selected_Name => 1712,
+ Iir_Kind_Operator_Symbol => 1718,
+ Iir_Kind_Reference_Name => 1723,
+ Iir_Kind_External_Constant_Name => 1731,
+ Iir_Kind_External_Signal_Name => 1739,
+ Iir_Kind_External_Variable_Name => 1748,
+ Iir_Kind_Selected_By_All_Name => 1754,
+ Iir_Kind_Parenthesis_Name => 1759,
+ Iir_Kind_Package_Pathname => 1763,
+ Iir_Kind_Absolute_Pathname => 1764,
+ Iir_Kind_Relative_Pathname => 1765,
+ Iir_Kind_Pathname_Element => 1770,
+ Iir_Kind_Base_Attribute => 1772,
+ Iir_Kind_Subtype_Attribute => 1777,
+ Iir_Kind_Element_Attribute => 1782,
+ Iir_Kind_Left_Type_Attribute => 1787,
+ Iir_Kind_Right_Type_Attribute => 1792,
+ Iir_Kind_High_Type_Attribute => 1797,
+ Iir_Kind_Low_Type_Attribute => 1802,
+ Iir_Kind_Ascending_Type_Attribute => 1807,
+ Iir_Kind_Image_Attribute => 1813,
+ Iir_Kind_Value_Attribute => 1819,
+ Iir_Kind_Pos_Attribute => 1825,
+ Iir_Kind_Val_Attribute => 1831,
+ Iir_Kind_Succ_Attribute => 1837,
+ Iir_Kind_Pred_Attribute => 1843,
+ Iir_Kind_Leftof_Attribute => 1849,
+ Iir_Kind_Rightof_Attribute => 1855,
+ Iir_Kind_Delayed_Attribute => 1864,
+ Iir_Kind_Stable_Attribute => 1873,
+ Iir_Kind_Quiet_Attribute => 1882,
+ Iir_Kind_Transaction_Attribute => 1891,
+ Iir_Kind_Event_Attribute => 1895,
+ Iir_Kind_Active_Attribute => 1899,
+ Iir_Kind_Last_Event_Attribute => 1903,
+ Iir_Kind_Last_Active_Attribute => 1907,
+ Iir_Kind_Last_Value_Attribute => 1911,
+ Iir_Kind_Driving_Attribute => 1915,
+ Iir_Kind_Driving_Value_Attribute => 1919,
+ Iir_Kind_Behavior_Attribute => 1919,
+ Iir_Kind_Structure_Attribute => 1919,
+ Iir_Kind_Simple_Name_Attribute => 1926,
+ Iir_Kind_Instance_Name_Attribute => 1931,
+ Iir_Kind_Path_Name_Attribute => 1936,
+ Iir_Kind_Left_Array_Attribute => 1943,
+ Iir_Kind_Right_Array_Attribute => 1950,
+ Iir_Kind_High_Array_Attribute => 1957,
+ Iir_Kind_Low_Array_Attribute => 1964,
+ Iir_Kind_Length_Array_Attribute => 1971,
+ Iir_Kind_Ascending_Array_Attribute => 1978,
+ Iir_Kind_Range_Array_Attribute => 1985,
+ Iir_Kind_Reverse_Range_Array_Attribute => 1992,
+ Iir_Kind_Attribute_Name => 2001
);
function Get_Fields_First (K : Iir_Kind) return Fields_Index is
@@ -4904,6 +4918,10 @@ package body Vhdl.Nodes_Meta is
return Get_Index_Constraint_Flag (N);
when Field_Hide_Implicit_Flag =>
return Get_Hide_Implicit_Flag (N);
+ when Field_Exit_Flag =>
+ return Get_Exit_Flag (N);
+ when Field_Next_Flag =>
+ return Get_Next_Flag (N);
when Field_In_Formal_Flag =>
return Get_In_Formal_Flag (N);
when Field_Aggr_Dynamic_Flag =>
@@ -5038,6 +5056,10 @@ package body Vhdl.Nodes_Meta is
Set_Index_Constraint_Flag (N, V);
when Field_Hide_Implicit_Flag =>
Set_Hide_Implicit_Flag (N, V);
+ when Field_Exit_Flag =>
+ Set_Exit_Flag (N, V);
+ when Field_Next_Flag =>
+ Set_Next_Flag (N, V);
when Field_In_Formal_Flag =>
Set_In_Formal_Flag (N, V);
when Field_Aggr_Dynamic_Flag =>
@@ -9590,6 +9612,28 @@ package body Vhdl.Nodes_Meta is
end case;
end Has_Loop_Label;
+ function Has_Exit_Flag (K : Iir_Kind) return Boolean is
+ begin
+ case K is
+ when Iir_Kind_For_Loop_Statement
+ | Iir_Kind_While_Loop_Statement =>
+ return True;
+ when others =>
+ return False;
+ end case;
+ end Has_Exit_Flag;
+
+ function Has_Next_Flag (K : Iir_Kind) return Boolean is
+ begin
+ case K is
+ when Iir_Kind_For_Loop_Statement
+ | Iir_Kind_While_Loop_Statement =>
+ return True;
+ when others =>
+ return False;
+ end case;
+ end Has_Next_Flag;
+
function Has_Component_Name (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 c9b5f7c30..7ff8f8e9e 100644
--- a/src/vhdl/vhdl-nodes_meta.ads
+++ b/src/vhdl/vhdl-nodes_meta.ads
@@ -296,6 +296,8 @@ package Vhdl.Nodes_Meta is
Field_Parameter_Specification,
Field_Parent,
Field_Loop_Label,
+ Field_Exit_Flag,
+ Field_Next_Flag,
Field_Component_Name,
Field_Instantiation_List,
Field_Entity_Aspect,
@@ -832,6 +834,8 @@ package Vhdl.Nodes_Meta is
function Has_Parameter_Specification (K : Iir_Kind) return Boolean;
function Has_Parent (K : Iir_Kind) return Boolean;
function Has_Loop_Label (K : Iir_Kind) return Boolean;
+ function Has_Exit_Flag (K : Iir_Kind) return Boolean;
+ function Has_Next_Flag (K : Iir_Kind) return Boolean;
function Has_Component_Name (K : Iir_Kind) return Boolean;
function Has_Instantiation_List (K : Iir_Kind) return Boolean;
function Has_Entity_Aspect (K : Iir_Kind) return Boolean;
diff --git a/src/vhdl/vhdl-sem_stmts.adb b/src/vhdl/vhdl-sem_stmts.adb
index ca02e505f..70035c321 100644
--- a/src/vhdl/vhdl-sem_stmts.adb
+++ b/src/vhdl/vhdl-sem_stmts.adb
@@ -1308,12 +1308,14 @@ package body Vhdl.Sem_Stmts is
Loop_Stmt: Iir;
P : Iir;
begin
+ -- Analyze condition (if present).
Cond := Get_Condition (Stmt);
if Cond /= Null_Iir then
Cond := Sem_Condition (Cond);
Set_Condition (Stmt, Cond);
end if;
+ -- Analyze label.
Loop_Label := Get_Loop_Label (Stmt);
if Loop_Label /= Null_Iir then
Loop_Label := Sem_Denoting_Name (Loop_Label);
@@ -1339,6 +1341,12 @@ package body Vhdl.Sem_Stmts is
when Iir_Kind_While_Loop_Statement
| Iir_Kind_For_Loop_Statement =>
if Loop_Stmt = Null_Iir or else P = Loop_Stmt then
+ case Iir_Kinds_Next_Exit_Statement (Get_Kind (Stmt)) is
+ when Iir_Kind_Next_Statement =>
+ Set_Next_Flag (P, True);
+ when Iir_Kind_Exit_Statement =>
+ Set_Exit_Flag (P, True);
+ end case;
exit;
end if;
when Iir_Kind_If_Statement