From 8a5fe99b279b1ce1ea7fe4313a24d0f3a399149d Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Thu, 26 Dec 2019 07:14:25 +0100 Subject: vhdl: add Has_Delay_Machanism for optional 'inertial' printing. --- src/vhdl/vhdl-nodes.adb | 16 ++++ src/vhdl/vhdl-nodes.ads | 11 +++ src/vhdl/vhdl-nodes_meta.adb | 212 ++++++++++++++++++++++++------------------- src/vhdl/vhdl-nodes_meta.ads | 2 + src/vhdl/vhdl-parse.adb | 15 ++- src/vhdl/vhdl-prints.adb | 2 + 6 files changed, 165 insertions(+), 93 deletions(-) (limited to 'src') diff --git a/src/vhdl/vhdl-nodes.adb b/src/vhdl/vhdl-nodes.adb index ffde6a5ab..b71de7906 100644 --- a/src/vhdl/vhdl-nodes.adb +++ b/src/vhdl/vhdl-nodes.adb @@ -6468,6 +6468,22 @@ package body Vhdl.Nodes is Set_Flag11 (Decl, Flag); end Set_Has_Class; + function Get_Has_Delay_Mechanism (Stmt : Iir) return Boolean is + begin + pragma Assert (Stmt /= Null_Iir); + pragma Assert (Has_Has_Delay_Mechanism (Get_Kind (Stmt)), + "no field Has_Delay_Mechanism"); + return Get_Flag2 (Stmt); + end Get_Has_Delay_Mechanism; + + procedure Set_Has_Delay_Mechanism (Stmt : Iir; Flag : Boolean) is + begin + pragma Assert (Stmt /= Null_Iir); + pragma Assert (Has_Has_Delay_Mechanism (Get_Kind (Stmt)), + "no field Has_Delay_Mechanism"); + Set_Flag2 (Stmt, Flag); + end Set_Has_Delay_Mechanism; + function Get_Suspend_Flag (Stmt : Iir) return Boolean is begin pragma Assert (Stmt /= Null_Iir); diff --git a/src/vhdl/vhdl-nodes.ads b/src/vhdl/vhdl-nodes.ads index 688c30555..3c3ef8241 100644 --- a/src/vhdl/vhdl-nodes.ads +++ b/src/vhdl/vhdl-nodes.ads @@ -2848,6 +2848,8 @@ package Vhdl.Nodes is -- -- Get/Set_Delay_Mechanism (Flag1) -- + -- Get/Set_Has_Delay_Mechanism (Flag2) + -- -- Get/Set_Postponed_Flag (Flag3) -- -- Get/Set_Visible_Flag (Flag4) @@ -3388,6 +3390,8 @@ package Vhdl.Nodes is -- -- Get/Set_Delay_Mechanism (Flag1) -- + -- Get/Set_Has_Delay_Mechanism (Flag2) + -- -- Get/Set_Visible_Flag (Flag4) -- -- True if the target of the assignment is guarded @@ -7870,6 +7874,13 @@ package Vhdl.Nodes is function Get_Has_Class (Decl : Iir) return Boolean; procedure Set_Has_Class (Decl : Iir; Flag : Boolean); + -- Layout flag for signal assignment. If True, the delay mechanism is + -- present. This is obviously true for transport or inertial with reject, + -- but the simple 'inertial' is optional. + -- Field: Flag2 + function Get_Has_Delay_Mechanism (Stmt : Iir) return Boolean; + procedure Set_Has_Delay_Mechanism (Stmt : Iir; Flag : Boolean); + -- Set on wait, procedure call and composite statements when there is a -- sub-statement that can suspend a procedure or a process. Also set -- on procedure declaration. Note that the flag is conservative: it must diff --git a/src/vhdl/vhdl-nodes_meta.adb b/src/vhdl/vhdl-nodes_meta.adb index 98f77cebb..b27ac9249 100644 --- a/src/vhdl/vhdl-nodes_meta.adb +++ b/src/vhdl/vhdl-nodes_meta.adb @@ -338,6 +338,7 @@ package body Vhdl.Nodes_Meta is Field_Has_Identifier_List => Type_Boolean, Field_Has_Mode => Type_Boolean, Field_Has_Class => Type_Boolean, + Field_Has_Delay_Mechanism => Type_Boolean, Field_Suspend_Flag => Type_Boolean, Field_Is_Ref => Type_Boolean, Field_Is_Forward_Ref => Type_Boolean, @@ -999,6 +1000,8 @@ package body Vhdl.Nodes_Meta is return "has_mode"; when Field_Has_Class => return "has_class"; + when Field_Has_Delay_Mechanism => + return "has_delay_mechanism"; when Field_Suspend_Flag => return "suspend_flag"; when Field_Is_Ref => @@ -2227,6 +2230,8 @@ package body Vhdl.Nodes_Meta is return Attr_None; when Field_Has_Class => return Attr_None; + when Field_Has_Delay_Mechanism => + return Attr_None; when Field_Suspend_Flag => return Attr_None; when Field_Is_Ref => @@ -3815,6 +3820,7 @@ package body Vhdl.Nodes_Meta is Field_Label, Field_Delay_Mechanism, Field_Is_Ref, + Field_Has_Delay_Mechanism, Field_Postponed_Flag, Field_Visible_Flag, Field_Guarded_Target_State, @@ -3828,6 +3834,7 @@ package body Vhdl.Nodes_Meta is Field_Label, Field_Delay_Mechanism, Field_Is_Ref, + Field_Has_Delay_Mechanism, Field_Postponed_Flag, Field_Visible_Flag, Field_Guarded_Target_State, @@ -3841,6 +3848,7 @@ package body Vhdl.Nodes_Meta is Field_Label, Field_Delay_Mechanism, Field_Is_Ref, + Field_Has_Delay_Mechanism, Field_Postponed_Flag, Field_Visible_Flag, Field_Guarded_Target_State, @@ -4014,6 +4022,7 @@ package body Vhdl.Nodes_Meta is Field_Label, Field_Delay_Mechanism, Field_Is_Ref, + Field_Has_Delay_Mechanism, Field_Visible_Flag, Field_Guarded_Target_State, Field_Parent, @@ -4025,6 +4034,7 @@ package body Vhdl.Nodes_Meta is Field_Label, Field_Delay_Mechanism, Field_Is_Ref, + Field_Has_Delay_Mechanism, Field_Visible_Flag, Field_Guarded_Target_State, Field_Parent, @@ -4036,6 +4046,7 @@ package body Vhdl.Nodes_Meta is Field_Label, Field_Delay_Mechanism, Field_Is_Ref, + Field_Has_Delay_Mechanism, Field_Visible_Flag, Field_Guarded_Target_State, Field_Parent, @@ -4728,97 +4739,97 @@ package body Vhdl.Nodes_Meta is Iir_Kind_Psl_Expression => 1326, Iir_Kind_Sensitized_Process_Statement => 1347, Iir_Kind_Process_Statement => 1367, - Iir_Kind_Concurrent_Simple_Signal_Assignment => 1379, - Iir_Kind_Concurrent_Conditional_Signal_Assignment => 1391, - Iir_Kind_Concurrent_Selected_Signal_Assignment => 1404, - Iir_Kind_Concurrent_Assertion_Statement => 1412, - Iir_Kind_Concurrent_Procedure_Call_Statement => 1419, - Iir_Kind_Psl_Assert_Directive => 1432, - Iir_Kind_Psl_Assume_Directive => 1443, - Iir_Kind_Psl_Cover_Directive => 1455, - Iir_Kind_Psl_Restrict_Directive => 1466, - Iir_Kind_Block_Statement => 1480, - Iir_Kind_If_Generate_Statement => 1491, - Iir_Kind_Case_Generate_Statement => 1500, - Iir_Kind_For_Generate_Statement => 1509, - Iir_Kind_Component_Instantiation_Statement => 1520, - Iir_Kind_Psl_Default_Clock => 1524, - Iir_Kind_Simple_Simultaneous_Statement => 1531, - Iir_Kind_Generate_Statement_Body => 1542, - Iir_Kind_If_Generate_Else_Clause => 1548, - Iir_Kind_Simple_Signal_Assignment_Statement => 1558, - Iir_Kind_Conditional_Signal_Assignment_Statement => 1568, - Iir_Kind_Selected_Waveform_Assignment_Statement => 1579, - Iir_Kind_Null_Statement => 1583, - Iir_Kind_Assertion_Statement => 1590, - Iir_Kind_Report_Statement => 1596, - Iir_Kind_Wait_Statement => 1604, - Iir_Kind_Variable_Assignment_Statement => 1611, - Iir_Kind_Conditional_Variable_Assignment_Statement => 1618, - Iir_Kind_Return_Statement => 1624, - Iir_Kind_For_Loop_Statement => 1635, - Iir_Kind_While_Loop_Statement => 1646, - Iir_Kind_Next_Statement => 1653, - Iir_Kind_Exit_Statement => 1660, - Iir_Kind_Case_Statement => 1668, - Iir_Kind_Procedure_Call_Statement => 1674, - Iir_Kind_If_Statement => 1684, - Iir_Kind_Elsif => 1690, - Iir_Kind_Character_Literal => 1698, - Iir_Kind_Simple_Name => 1706, - Iir_Kind_Selected_Name => 1715, - Iir_Kind_Operator_Symbol => 1721, - Iir_Kind_Reference_Name => 1726, - Iir_Kind_External_Constant_Name => 1734, - Iir_Kind_External_Signal_Name => 1742, - Iir_Kind_External_Variable_Name => 1751, - Iir_Kind_Selected_By_All_Name => 1757, - Iir_Kind_Parenthesis_Name => 1762, - Iir_Kind_Package_Pathname => 1766, - Iir_Kind_Absolute_Pathname => 1767, - Iir_Kind_Relative_Pathname => 1768, - Iir_Kind_Pathname_Element => 1773, - Iir_Kind_Base_Attribute => 1775, - Iir_Kind_Subtype_Attribute => 1780, - Iir_Kind_Element_Attribute => 1785, - Iir_Kind_Left_Type_Attribute => 1790, - Iir_Kind_Right_Type_Attribute => 1795, - Iir_Kind_High_Type_Attribute => 1800, - Iir_Kind_Low_Type_Attribute => 1805, - Iir_Kind_Ascending_Type_Attribute => 1810, - Iir_Kind_Image_Attribute => 1816, - Iir_Kind_Value_Attribute => 1822, - Iir_Kind_Pos_Attribute => 1828, - Iir_Kind_Val_Attribute => 1834, - Iir_Kind_Succ_Attribute => 1840, - Iir_Kind_Pred_Attribute => 1846, - Iir_Kind_Leftof_Attribute => 1852, - Iir_Kind_Rightof_Attribute => 1858, - Iir_Kind_Delayed_Attribute => 1867, - Iir_Kind_Stable_Attribute => 1876, - Iir_Kind_Quiet_Attribute => 1885, - Iir_Kind_Transaction_Attribute => 1894, - Iir_Kind_Event_Attribute => 1898, - Iir_Kind_Active_Attribute => 1902, - Iir_Kind_Last_Event_Attribute => 1906, - Iir_Kind_Last_Active_Attribute => 1910, - Iir_Kind_Last_Value_Attribute => 1914, - Iir_Kind_Driving_Attribute => 1918, - Iir_Kind_Driving_Value_Attribute => 1922, - Iir_Kind_Behavior_Attribute => 1922, - Iir_Kind_Structure_Attribute => 1922, - Iir_Kind_Simple_Name_Attribute => 1929, - Iir_Kind_Instance_Name_Attribute => 1934, - Iir_Kind_Path_Name_Attribute => 1939, - Iir_Kind_Left_Array_Attribute => 1946, - Iir_Kind_Right_Array_Attribute => 1953, - Iir_Kind_High_Array_Attribute => 1960, - Iir_Kind_Low_Array_Attribute => 1967, - Iir_Kind_Length_Array_Attribute => 1974, - Iir_Kind_Ascending_Array_Attribute => 1981, - Iir_Kind_Range_Array_Attribute => 1988, - Iir_Kind_Reverse_Range_Array_Attribute => 1995, - Iir_Kind_Attribute_Name => 2004 + Iir_Kind_Concurrent_Simple_Signal_Assignment => 1380, + Iir_Kind_Concurrent_Conditional_Signal_Assignment => 1393, + Iir_Kind_Concurrent_Selected_Signal_Assignment => 1407, + Iir_Kind_Concurrent_Assertion_Statement => 1415, + Iir_Kind_Concurrent_Procedure_Call_Statement => 1422, + Iir_Kind_Psl_Assert_Directive => 1435, + Iir_Kind_Psl_Assume_Directive => 1446, + Iir_Kind_Psl_Cover_Directive => 1458, + Iir_Kind_Psl_Restrict_Directive => 1469, + Iir_Kind_Block_Statement => 1483, + Iir_Kind_If_Generate_Statement => 1494, + Iir_Kind_Case_Generate_Statement => 1503, + Iir_Kind_For_Generate_Statement => 1512, + Iir_Kind_Component_Instantiation_Statement => 1523, + Iir_Kind_Psl_Default_Clock => 1527, + Iir_Kind_Simple_Simultaneous_Statement => 1534, + Iir_Kind_Generate_Statement_Body => 1545, + Iir_Kind_If_Generate_Else_Clause => 1551, + Iir_Kind_Simple_Signal_Assignment_Statement => 1562, + Iir_Kind_Conditional_Signal_Assignment_Statement => 1573, + Iir_Kind_Selected_Waveform_Assignment_Statement => 1585, + Iir_Kind_Null_Statement => 1589, + Iir_Kind_Assertion_Statement => 1596, + Iir_Kind_Report_Statement => 1602, + Iir_Kind_Wait_Statement => 1610, + Iir_Kind_Variable_Assignment_Statement => 1617, + Iir_Kind_Conditional_Variable_Assignment_Statement => 1624, + Iir_Kind_Return_Statement => 1630, + Iir_Kind_For_Loop_Statement => 1641, + Iir_Kind_While_Loop_Statement => 1652, + Iir_Kind_Next_Statement => 1659, + Iir_Kind_Exit_Statement => 1666, + Iir_Kind_Case_Statement => 1674, + Iir_Kind_Procedure_Call_Statement => 1680, + Iir_Kind_If_Statement => 1690, + Iir_Kind_Elsif => 1696, + Iir_Kind_Character_Literal => 1704, + Iir_Kind_Simple_Name => 1712, + Iir_Kind_Selected_Name => 1721, + Iir_Kind_Operator_Symbol => 1727, + Iir_Kind_Reference_Name => 1732, + Iir_Kind_External_Constant_Name => 1740, + Iir_Kind_External_Signal_Name => 1748, + Iir_Kind_External_Variable_Name => 1757, + Iir_Kind_Selected_By_All_Name => 1763, + Iir_Kind_Parenthesis_Name => 1768, + Iir_Kind_Package_Pathname => 1772, + Iir_Kind_Absolute_Pathname => 1773, + Iir_Kind_Relative_Pathname => 1774, + Iir_Kind_Pathname_Element => 1779, + Iir_Kind_Base_Attribute => 1781, + Iir_Kind_Subtype_Attribute => 1786, + Iir_Kind_Element_Attribute => 1791, + Iir_Kind_Left_Type_Attribute => 1796, + Iir_Kind_Right_Type_Attribute => 1801, + Iir_Kind_High_Type_Attribute => 1806, + Iir_Kind_Low_Type_Attribute => 1811, + Iir_Kind_Ascending_Type_Attribute => 1816, + Iir_Kind_Image_Attribute => 1822, + Iir_Kind_Value_Attribute => 1828, + Iir_Kind_Pos_Attribute => 1834, + Iir_Kind_Val_Attribute => 1840, + Iir_Kind_Succ_Attribute => 1846, + Iir_Kind_Pred_Attribute => 1852, + Iir_Kind_Leftof_Attribute => 1858, + Iir_Kind_Rightof_Attribute => 1864, + Iir_Kind_Delayed_Attribute => 1873, + Iir_Kind_Stable_Attribute => 1882, + Iir_Kind_Quiet_Attribute => 1891, + Iir_Kind_Transaction_Attribute => 1900, + Iir_Kind_Event_Attribute => 1904, + Iir_Kind_Active_Attribute => 1908, + Iir_Kind_Last_Event_Attribute => 1912, + Iir_Kind_Last_Active_Attribute => 1916, + Iir_Kind_Last_Value_Attribute => 1920, + Iir_Kind_Driving_Attribute => 1924, + Iir_Kind_Driving_Value_Attribute => 1928, + Iir_Kind_Behavior_Attribute => 1928, + Iir_Kind_Structure_Attribute => 1928, + Iir_Kind_Simple_Name_Attribute => 1935, + Iir_Kind_Instance_Name_Attribute => 1940, + Iir_Kind_Path_Name_Attribute => 1945, + Iir_Kind_Left_Array_Attribute => 1952, + Iir_Kind_Right_Array_Attribute => 1959, + Iir_Kind_High_Array_Attribute => 1966, + Iir_Kind_Low_Array_Attribute => 1973, + Iir_Kind_Length_Array_Attribute => 1980, + Iir_Kind_Ascending_Array_Attribute => 1987, + Iir_Kind_Range_Array_Attribute => 1994, + Iir_Kind_Reverse_Range_Array_Attribute => 2001, + Iir_Kind_Attribute_Name => 2010 ); function Get_Fields_First (K : Iir_Kind) return Fields_Index is @@ -4973,6 +4984,8 @@ package body Vhdl.Nodes_Meta is return Get_Has_Mode (N); when Field_Has_Class => return Get_Has_Class (N); + when Field_Has_Delay_Mechanism => + return Get_Has_Delay_Mechanism (N); when Field_Suspend_Flag => return Get_Suspend_Flag (N); when Field_Is_Ref => @@ -5111,6 +5124,8 @@ package body Vhdl.Nodes_Meta is Set_Has_Mode (N, V); when Field_Has_Class => Set_Has_Class (N, V); + when Field_Has_Delay_Mechanism => + Set_Has_Delay_Mechanism (N, V); when Field_Suspend_Flag => Set_Suspend_Flag (N, V); when Field_Is_Ref => @@ -10878,6 +10893,21 @@ package body Vhdl.Nodes_Meta is end case; end Has_Has_Class; + function Has_Has_Delay_Mechanism (K : Iir_Kind) return Boolean is + begin + case K is + when Iir_Kind_Concurrent_Simple_Signal_Assignment + | Iir_Kind_Concurrent_Conditional_Signal_Assignment + | Iir_Kind_Concurrent_Selected_Signal_Assignment + | Iir_Kind_Simple_Signal_Assignment_Statement + | Iir_Kind_Conditional_Signal_Assignment_Statement + | Iir_Kind_Selected_Waveform_Assignment_Statement => + return True; + when others => + return False; + end case; + end Has_Has_Delay_Mechanism; + function Has_Suspend_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 7ff8f8e9e..7b674ddbe 100644 --- a/src/vhdl/vhdl-nodes_meta.ads +++ b/src/vhdl/vhdl-nodes_meta.ads @@ -380,6 +380,7 @@ package Vhdl.Nodes_Meta is Field_Has_Identifier_List, Field_Has_Mode, Field_Has_Class, + Field_Has_Delay_Mechanism, Field_Suspend_Flag, Field_Is_Ref, Field_Is_Forward_Ref, @@ -919,6 +920,7 @@ package Vhdl.Nodes_Meta is function Has_Has_Identifier_List (K : Iir_Kind) return Boolean; function Has_Has_Mode (K : Iir_Kind) return Boolean; function Has_Has_Class (K : Iir_Kind) return Boolean; + function Has_Has_Delay_Mechanism (K : Iir_Kind) return Boolean; function Has_Suspend_Flag (K : Iir_Kind) return Boolean; function Has_Is_Ref (K : Iir_Kind) return Boolean; function Has_Is_Forward_Ref (K : Iir_Kind) return Boolean; diff --git a/src/vhdl/vhdl-parse.adb b/src/vhdl/vhdl-parse.adb index f46535623..a628acf54 100644 --- a/src/vhdl/vhdl-parse.adb +++ b/src/vhdl/vhdl-parse.adb @@ -6104,6 +6104,9 @@ package body Vhdl.Parse is begin if Current_Token = Tok_Transport then Set_Delay_Mechanism (Assign, Iir_Transport_Delay); + Set_Has_Delay_Mechanism (Assign, True); + + -- Skip 'transport'. Scan; else Set_Delay_Mechanism (Assign, Iir_Inertial_Delay); @@ -6112,15 +6115,23 @@ package body Vhdl.Parse is Error_Msg_Parse ("'reject' delay mechanism not allowed in vhdl 87"); end if; + Set_Has_Delay_Mechanism (Assign, True); + + -- Skip 'reject'. Scan; + Set_Reject_Time_Expression (Assign, Parse_Expression); - Expect (Tok_Inertial); - Scan; + + -- Skip 'inertial'. + Expect_Scan (Tok_Inertial); elsif Current_Token = Tok_Inertial then if Flags.Vhdl_Std = Vhdl_87 then Error_Msg_Parse ("'inertial' keyword not allowed in vhdl 87"); end if; + Set_Has_Delay_Mechanism (Assign, True); + + -- Skip 'inertial'. Scan; end if; end if; diff --git a/src/vhdl/vhdl-prints.adb b/src/vhdl/vhdl-prints.adb index d64ea2b96..aa36cd4e0 100644 --- a/src/vhdl/vhdl-prints.adb +++ b/src/vhdl/vhdl-prints.adb @@ -2297,6 +2297,8 @@ package body Vhdl.Prints is Disp_Token (Ctxt, Tok_Reject); Print (Ctxt, Expr); Disp_Token (Ctxt, Tok_Inertial); + elsif Get_Has_Delay_Mechanism (Stmt) then + Disp_Token (Ctxt, Tok_Inertial); end if; end case; end Disp_Delay_Mechanism; -- cgit v1.2.3