From 48396102d53ed1c10a750a14ff75364d5c533e10 Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Wed, 18 Sep 2019 06:47:20 +0200 Subject: vhdl: add exit/next flags. --- python/libghdl/thin/vhdl/nodes.py | 12 ++ python/libghdl/thin/vhdl/nodes_meta.py | 198 +++++++++++++++++---------------- src/vhdl/vhdl-nodes.adb | 32 ++++++ src/vhdl/vhdl-nodes.ads | 22 ++++ src/vhdl/vhdl-nodes_meta.adb | 170 +++++++++++++++++----------- src/vhdl/vhdl-nodes_meta.ads | 4 + src/vhdl/vhdl-sem_stmts.adb | 8 ++ 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 -- cgit v1.2.3