From aabb982856fed89ebb696127803577fcec036508 Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Wed, 10 Aug 2022 16:53:11 +0200 Subject: vhdl: add Determined_Aggregate_Flag field. For #2166 --- src/vhdl/vhdl-nodes.adb | 16 +++ src/vhdl/vhdl-nodes.ads | 7 ++ src/vhdl/vhdl-nodes_meta.adb | 283 +++++++++++++++++++++++-------------------- src/vhdl/vhdl-nodes_meta.ads | 2 + src/vhdl/vhdl-sem_expr.adb | 3 + 5 files changed, 177 insertions(+), 134 deletions(-) (limited to 'src/vhdl') diff --git a/src/vhdl/vhdl-nodes.adb b/src/vhdl/vhdl-nodes.adb index f03e1ab92..9a12aae6c 100644 --- a/src/vhdl/vhdl-nodes.adb +++ b/src/vhdl/vhdl-nodes.adb @@ -6528,6 +6528,22 @@ package body Vhdl.Nodes is Set_Flag1 (Aggr, Flag); end Set_Aggregate_Expand_Flag; + function Get_Determined_Aggregate_Flag (Aggr : Iir) return Boolean is + begin + pragma Assert (Aggr /= Null_Iir); + pragma Assert (Has_Determined_Aggregate_Flag (Get_Kind (Aggr)), + "no field Determined_Aggregate_Flag"); + return Get_Flag2 (Aggr); + end Get_Determined_Aggregate_Flag; + + procedure Set_Determined_Aggregate_Flag (Aggr : Iir; Flag : Boolean) is + begin + pragma Assert (Aggr /= Null_Iir); + pragma Assert (Has_Determined_Aggregate_Flag (Get_Kind (Aggr)), + "no field Determined_Aggregate_Flag"); + Set_Flag2 (Aggr, Flag); + end Set_Determined_Aggregate_Flag; + function Get_Association_Choices_Chain (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 16907b607..f352542a1 100644 --- a/src/vhdl/vhdl-nodes.ads +++ b/src/vhdl/vhdl-nodes.ads @@ -4248,6 +4248,8 @@ package Vhdl.Nodes is -- If true, the aggregate can be statically built. This is an optimization -- and the conditions are defined in sem_expr. -- Get/Set_Aggregate_Expand_Flag (Flag1) + -- + -- Get/Set_Determined_Aggregate_Flag (Flag2) -- Iir_Kind_Aggregate_Info (Short) -- @@ -9263,6 +9265,11 @@ package Vhdl.Nodes is function Get_Aggregate_Expand_Flag (Aggr : Iir) return Boolean; procedure Set_Aggregate_Expand_Flag (Aggr : Iir; Flag : Boolean); + -- True if the bounds of the aggregated are determined by the context. + -- Field: Flag2 + function Get_Determined_Aggregate_Flag (Aggr : Iir) return Boolean; + procedure Set_Determined_Aggregate_Flag (Aggr : Iir; Flag : Boolean); + -- Chain of choices. -- Field: Field4 Chain function Get_Association_Choices_Chain (Target : Iir) return Iir; diff --git a/src/vhdl/vhdl-nodes_meta.adb b/src/vhdl/vhdl-nodes_meta.adb index e6e3129d3..310f31d86 100644 --- a/src/vhdl/vhdl-nodes_meta.adb +++ b/src/vhdl/vhdl-nodes_meta.adb @@ -335,6 +335,7 @@ package body Vhdl.Nodes_Meta is Field_Aggr_Others_Flag => Type_Boolean, Field_Aggr_Named_Flag => Type_Boolean, Field_Aggregate_Expand_Flag => Type_Boolean, + Field_Determined_Aggregate_Flag => Type_Boolean, Field_Association_Choices_Chain => Type_Iir, Field_Case_Statement_Alternative_Chain => Type_Iir, Field_Matching_Flag => Type_Boolean, @@ -1044,6 +1045,8 @@ package body Vhdl.Nodes_Meta is return "aggr_named_flag"; when Field_Aggregate_Expand_Flag => return "aggregate_expand_flag"; + when Field_Determined_Aggregate_Flag => + return "determined_aggregate_flag"; when Field_Association_Choices_Chain => return "association_choices_chain"; when Field_Case_Statement_Alternative_Chain => @@ -2462,6 +2465,8 @@ package body Vhdl.Nodes_Meta is return Attr_None; when Field_Aggregate_Expand_Flag => return Attr_None; + when Field_Determined_Aggregate_Flag => + return Attr_None; when Field_Association_Choices_Chain => return Attr_Chain; when Field_Case_Statement_Alternative_Chain => @@ -4240,6 +4245,7 @@ package body Vhdl.Nodes_Meta is Field_Base_Name, -- Iir_Kind_Aggregate Field_Aggregate_Expand_Flag, + Field_Determined_Aggregate_Flag, Field_Expr_Staticness, Field_Association_Choices_Chain, Field_Literal_Subtype, @@ -5512,140 +5518,140 @@ package body Vhdl.Nodes_Meta is Iir_Kind_Remainder_Operator => 1443, Iir_Kind_Exponentiation_Operator => 1448, Iir_Kind_Function_Call => 1456, - Iir_Kind_Aggregate => 1463, - Iir_Kind_Parenthesis_Expression => 1466, - Iir_Kind_Qualified_Expression => 1470, - Iir_Kind_Type_Conversion => 1475, - Iir_Kind_Allocator_By_Expression => 1480, - Iir_Kind_Allocator_By_Subtype => 1486, - Iir_Kind_Selected_Element => 1494, - Iir_Kind_Dereference => 1499, - Iir_Kind_Implicit_Dereference => 1504, - Iir_Kind_Slice_Name => 1511, - Iir_Kind_Indexed_Name => 1517, - Iir_Kind_Psl_Prev => 1523, - Iir_Kind_Psl_Stable => 1528, - Iir_Kind_Psl_Rose => 1533, - Iir_Kind_Psl_Fell => 1538, - Iir_Kind_Psl_Onehot => 1541, - Iir_Kind_Psl_Onehot0 => 1544, - Iir_Kind_Psl_Expression => 1546, - Iir_Kind_Sensitized_Process_Statement => 1568, - Iir_Kind_Process_Statement => 1589, - Iir_Kind_Concurrent_Simple_Signal_Assignment => 1602, - Iir_Kind_Concurrent_Conditional_Signal_Assignment => 1615, - Iir_Kind_Concurrent_Selected_Signal_Assignment => 1629, - Iir_Kind_Concurrent_Assertion_Statement => 1637, - Iir_Kind_Concurrent_Procedure_Call_Statement => 1644, - Iir_Kind_Concurrent_Break_Statement => 1652, - Iir_Kind_Psl_Assert_Directive => 1666, - Iir_Kind_Psl_Assume_Directive => 1678, - Iir_Kind_Psl_Cover_Directive => 1690, - Iir_Kind_Psl_Restrict_Directive => 1701, - Iir_Kind_Block_Statement => 1715, - Iir_Kind_If_Generate_Statement => 1726, - Iir_Kind_Case_Generate_Statement => 1735, - Iir_Kind_For_Generate_Statement => 1744, - Iir_Kind_Component_Instantiation_Statement => 1755, - Iir_Kind_Psl_Default_Clock => 1758, - Iir_Kind_Generate_Statement_Body => 1769, - Iir_Kind_If_Generate_Else_Clause => 1775, - Iir_Kind_Simple_Simultaneous_Statement => 1782, - Iir_Kind_Simultaneous_Null_Statement => 1786, - Iir_Kind_Simultaneous_Procedural_Statement => 1797, - Iir_Kind_Simultaneous_Case_Statement => 1806, - Iir_Kind_Simultaneous_If_Statement => 1815, - Iir_Kind_Simultaneous_Elsif => 1821, - Iir_Kind_Simple_Signal_Assignment_Statement => 1832, - Iir_Kind_Conditional_Signal_Assignment_Statement => 1843, - Iir_Kind_Selected_Waveform_Assignment_Statement => 1855, - Iir_Kind_Signal_Force_Assignment_Statement => 1865, - Iir_Kind_Signal_Release_Assignment_Statement => 1874, - Iir_Kind_Null_Statement => 1878, - Iir_Kind_Assertion_Statement => 1885, - Iir_Kind_Report_Statement => 1891, - Iir_Kind_Wait_Statement => 1899, - Iir_Kind_Variable_Assignment_Statement => 1906, - Iir_Kind_Conditional_Variable_Assignment_Statement => 1913, - Iir_Kind_Return_Statement => 1919, - Iir_Kind_For_Loop_Statement => 1930, - Iir_Kind_While_Loop_Statement => 1941, - Iir_Kind_Next_Statement => 1948, - Iir_Kind_Exit_Statement => 1955, - Iir_Kind_Case_Statement => 1964, - Iir_Kind_Procedure_Call_Statement => 1970, - Iir_Kind_Break_Statement => 1977, - Iir_Kind_If_Statement => 1987, - Iir_Kind_Suspend_State_Statement => 1991, - Iir_Kind_Elsif => 1997, - Iir_Kind_Character_Literal => 2004, - Iir_Kind_Simple_Name => 2011, - Iir_Kind_Selected_Name => 2019, - Iir_Kind_Operator_Symbol => 2024, - Iir_Kind_Reference_Name => 2029, - Iir_Kind_External_Constant_Name => 2038, - Iir_Kind_External_Signal_Name => 2047, - Iir_Kind_External_Variable_Name => 2057, - Iir_Kind_Selected_By_All_Name => 2063, - Iir_Kind_Parenthesis_Name => 2068, - Iir_Kind_Package_Pathname => 2072, - Iir_Kind_Absolute_Pathname => 2073, - Iir_Kind_Relative_Pathname => 2074, - Iir_Kind_Pathname_Element => 2079, - Iir_Kind_Base_Attribute => 2081, - Iir_Kind_Subtype_Attribute => 2086, - Iir_Kind_Element_Attribute => 2091, - Iir_Kind_Across_Attribute => 2096, - Iir_Kind_Through_Attribute => 2101, - Iir_Kind_Nature_Reference_Attribute => 2105, - Iir_Kind_Left_Type_Attribute => 2110, - Iir_Kind_Right_Type_Attribute => 2115, - Iir_Kind_High_Type_Attribute => 2120, - Iir_Kind_Low_Type_Attribute => 2125, - Iir_Kind_Ascending_Type_Attribute => 2130, - Iir_Kind_Image_Attribute => 2136, - Iir_Kind_Value_Attribute => 2142, - Iir_Kind_Pos_Attribute => 2148, - Iir_Kind_Val_Attribute => 2154, - Iir_Kind_Succ_Attribute => 2160, - Iir_Kind_Pred_Attribute => 2166, - Iir_Kind_Leftof_Attribute => 2172, - Iir_Kind_Rightof_Attribute => 2178, - Iir_Kind_Signal_Slew_Attribute => 2186, - Iir_Kind_Quantity_Slew_Attribute => 2194, - Iir_Kind_Ramp_Attribute => 2202, - Iir_Kind_Zoh_Attribute => 2210, - Iir_Kind_Ltf_Attribute => 2218, - Iir_Kind_Ztf_Attribute => 2228, - Iir_Kind_Dot_Attribute => 2235, - Iir_Kind_Integ_Attribute => 2242, - Iir_Kind_Quantity_Delayed_Attribute => 2250, - Iir_Kind_Above_Attribute => 2258, - Iir_Kind_Delayed_Attribute => 2267, - Iir_Kind_Stable_Attribute => 2276, - Iir_Kind_Quiet_Attribute => 2285, - Iir_Kind_Transaction_Attribute => 2294, - Iir_Kind_Event_Attribute => 2298, - Iir_Kind_Active_Attribute => 2302, - Iir_Kind_Last_Event_Attribute => 2306, - Iir_Kind_Last_Active_Attribute => 2310, - Iir_Kind_Last_Value_Attribute => 2314, - Iir_Kind_Driving_Attribute => 2318, - Iir_Kind_Driving_Value_Attribute => 2322, - Iir_Kind_Behavior_Attribute => 2322, - Iir_Kind_Structure_Attribute => 2322, - Iir_Kind_Simple_Name_Attribute => 2329, - Iir_Kind_Instance_Name_Attribute => 2334, - Iir_Kind_Path_Name_Attribute => 2339, - Iir_Kind_Left_Array_Attribute => 2346, - Iir_Kind_Right_Array_Attribute => 2353, - Iir_Kind_High_Array_Attribute => 2360, - Iir_Kind_Low_Array_Attribute => 2367, - Iir_Kind_Length_Array_Attribute => 2374, - Iir_Kind_Ascending_Array_Attribute => 2381, - Iir_Kind_Range_Array_Attribute => 2388, - Iir_Kind_Reverse_Range_Array_Attribute => 2395, - Iir_Kind_Attribute_Name => 2404 + Iir_Kind_Aggregate => 1464, + Iir_Kind_Parenthesis_Expression => 1467, + Iir_Kind_Qualified_Expression => 1471, + Iir_Kind_Type_Conversion => 1476, + Iir_Kind_Allocator_By_Expression => 1481, + Iir_Kind_Allocator_By_Subtype => 1487, + Iir_Kind_Selected_Element => 1495, + Iir_Kind_Dereference => 1500, + Iir_Kind_Implicit_Dereference => 1505, + Iir_Kind_Slice_Name => 1512, + Iir_Kind_Indexed_Name => 1518, + Iir_Kind_Psl_Prev => 1524, + Iir_Kind_Psl_Stable => 1529, + Iir_Kind_Psl_Rose => 1534, + Iir_Kind_Psl_Fell => 1539, + Iir_Kind_Psl_Onehot => 1542, + Iir_Kind_Psl_Onehot0 => 1545, + Iir_Kind_Psl_Expression => 1547, + Iir_Kind_Sensitized_Process_Statement => 1569, + Iir_Kind_Process_Statement => 1590, + Iir_Kind_Concurrent_Simple_Signal_Assignment => 1603, + Iir_Kind_Concurrent_Conditional_Signal_Assignment => 1616, + Iir_Kind_Concurrent_Selected_Signal_Assignment => 1630, + Iir_Kind_Concurrent_Assertion_Statement => 1638, + Iir_Kind_Concurrent_Procedure_Call_Statement => 1645, + Iir_Kind_Concurrent_Break_Statement => 1653, + Iir_Kind_Psl_Assert_Directive => 1667, + Iir_Kind_Psl_Assume_Directive => 1679, + Iir_Kind_Psl_Cover_Directive => 1691, + Iir_Kind_Psl_Restrict_Directive => 1702, + Iir_Kind_Block_Statement => 1716, + Iir_Kind_If_Generate_Statement => 1727, + Iir_Kind_Case_Generate_Statement => 1736, + Iir_Kind_For_Generate_Statement => 1745, + Iir_Kind_Component_Instantiation_Statement => 1756, + Iir_Kind_Psl_Default_Clock => 1759, + Iir_Kind_Generate_Statement_Body => 1770, + Iir_Kind_If_Generate_Else_Clause => 1776, + Iir_Kind_Simple_Simultaneous_Statement => 1783, + Iir_Kind_Simultaneous_Null_Statement => 1787, + Iir_Kind_Simultaneous_Procedural_Statement => 1798, + Iir_Kind_Simultaneous_Case_Statement => 1807, + Iir_Kind_Simultaneous_If_Statement => 1816, + Iir_Kind_Simultaneous_Elsif => 1822, + Iir_Kind_Simple_Signal_Assignment_Statement => 1833, + Iir_Kind_Conditional_Signal_Assignment_Statement => 1844, + Iir_Kind_Selected_Waveform_Assignment_Statement => 1856, + Iir_Kind_Signal_Force_Assignment_Statement => 1866, + Iir_Kind_Signal_Release_Assignment_Statement => 1875, + Iir_Kind_Null_Statement => 1879, + Iir_Kind_Assertion_Statement => 1886, + Iir_Kind_Report_Statement => 1892, + Iir_Kind_Wait_Statement => 1900, + Iir_Kind_Variable_Assignment_Statement => 1907, + Iir_Kind_Conditional_Variable_Assignment_Statement => 1914, + Iir_Kind_Return_Statement => 1920, + Iir_Kind_For_Loop_Statement => 1931, + Iir_Kind_While_Loop_Statement => 1942, + Iir_Kind_Next_Statement => 1949, + Iir_Kind_Exit_Statement => 1956, + Iir_Kind_Case_Statement => 1965, + Iir_Kind_Procedure_Call_Statement => 1971, + Iir_Kind_Break_Statement => 1978, + Iir_Kind_If_Statement => 1988, + Iir_Kind_Suspend_State_Statement => 1992, + Iir_Kind_Elsif => 1998, + Iir_Kind_Character_Literal => 2005, + Iir_Kind_Simple_Name => 2012, + Iir_Kind_Selected_Name => 2020, + Iir_Kind_Operator_Symbol => 2025, + Iir_Kind_Reference_Name => 2030, + Iir_Kind_External_Constant_Name => 2039, + Iir_Kind_External_Signal_Name => 2048, + Iir_Kind_External_Variable_Name => 2058, + Iir_Kind_Selected_By_All_Name => 2064, + Iir_Kind_Parenthesis_Name => 2069, + Iir_Kind_Package_Pathname => 2073, + Iir_Kind_Absolute_Pathname => 2074, + Iir_Kind_Relative_Pathname => 2075, + Iir_Kind_Pathname_Element => 2080, + Iir_Kind_Base_Attribute => 2082, + Iir_Kind_Subtype_Attribute => 2087, + Iir_Kind_Element_Attribute => 2092, + Iir_Kind_Across_Attribute => 2097, + Iir_Kind_Through_Attribute => 2102, + Iir_Kind_Nature_Reference_Attribute => 2106, + Iir_Kind_Left_Type_Attribute => 2111, + Iir_Kind_Right_Type_Attribute => 2116, + Iir_Kind_High_Type_Attribute => 2121, + Iir_Kind_Low_Type_Attribute => 2126, + Iir_Kind_Ascending_Type_Attribute => 2131, + Iir_Kind_Image_Attribute => 2137, + Iir_Kind_Value_Attribute => 2143, + Iir_Kind_Pos_Attribute => 2149, + Iir_Kind_Val_Attribute => 2155, + Iir_Kind_Succ_Attribute => 2161, + Iir_Kind_Pred_Attribute => 2167, + Iir_Kind_Leftof_Attribute => 2173, + Iir_Kind_Rightof_Attribute => 2179, + Iir_Kind_Signal_Slew_Attribute => 2187, + Iir_Kind_Quantity_Slew_Attribute => 2195, + Iir_Kind_Ramp_Attribute => 2203, + Iir_Kind_Zoh_Attribute => 2211, + Iir_Kind_Ltf_Attribute => 2219, + Iir_Kind_Ztf_Attribute => 2229, + Iir_Kind_Dot_Attribute => 2236, + Iir_Kind_Integ_Attribute => 2243, + Iir_Kind_Quantity_Delayed_Attribute => 2251, + Iir_Kind_Above_Attribute => 2259, + Iir_Kind_Delayed_Attribute => 2268, + Iir_Kind_Stable_Attribute => 2277, + Iir_Kind_Quiet_Attribute => 2286, + Iir_Kind_Transaction_Attribute => 2295, + Iir_Kind_Event_Attribute => 2299, + Iir_Kind_Active_Attribute => 2303, + Iir_Kind_Last_Event_Attribute => 2307, + Iir_Kind_Last_Active_Attribute => 2311, + Iir_Kind_Last_Value_Attribute => 2315, + Iir_Kind_Driving_Attribute => 2319, + Iir_Kind_Driving_Value_Attribute => 2323, + Iir_Kind_Behavior_Attribute => 2323, + Iir_Kind_Structure_Attribute => 2323, + Iir_Kind_Simple_Name_Attribute => 2330, + Iir_Kind_Instance_Name_Attribute => 2335, + Iir_Kind_Path_Name_Attribute => 2340, + Iir_Kind_Left_Array_Attribute => 2347, + Iir_Kind_Right_Array_Attribute => 2354, + Iir_Kind_High_Array_Attribute => 2361, + Iir_Kind_Low_Array_Attribute => 2368, + Iir_Kind_Length_Array_Attribute => 2375, + Iir_Kind_Ascending_Array_Attribute => 2382, + Iir_Kind_Range_Array_Attribute => 2389, + Iir_Kind_Reverse_Range_Array_Attribute => 2396, + Iir_Kind_Attribute_Name => 2405 ); function Get_Fields_First (K : Iir_Kind) return Fields_Index is @@ -5776,6 +5782,8 @@ package body Vhdl.Nodes_Meta is return Get_Aggr_Named_Flag (N); when Field_Aggregate_Expand_Flag => return Get_Aggregate_Expand_Flag (N); + when Field_Determined_Aggregate_Flag => + return Get_Determined_Aggregate_Flag (N); when Field_Matching_Flag => return Get_Matching_Flag (N); when Field_Has_Disconnect_Flag => @@ -5936,6 +5944,8 @@ package body Vhdl.Nodes_Meta is Set_Aggr_Named_Flag (N, V); when Field_Aggregate_Expand_Flag => Set_Aggregate_Expand_Flag (N, V); + when Field_Determined_Aggregate_Flag => + Set_Determined_Aggregate_Flag (N, V); when Field_Matching_Flag => Set_Matching_Flag (N, V); when Field_Has_Disconnect_Flag => @@ -12026,6 +12036,11 @@ package body Vhdl.Nodes_Meta is return K = Iir_Kind_Aggregate; end Has_Aggregate_Expand_Flag; + function Has_Determined_Aggregate_Flag (K : Iir_Kind) return Boolean is + begin + return K = Iir_Kind_Aggregate; + end Has_Determined_Aggregate_Flag; + function Has_Association_Choices_Chain (K : Iir_Kind) return Boolean is begin return K = Iir_Kind_Aggregate; diff --git a/src/vhdl/vhdl-nodes_meta.ads b/src/vhdl/vhdl-nodes_meta.ads index 940f6d8fb..9d18dcb2d 100644 --- a/src/vhdl/vhdl-nodes_meta.ads +++ b/src/vhdl/vhdl-nodes_meta.ads @@ -379,6 +379,7 @@ package Vhdl.Nodes_Meta is Field_Aggr_Others_Flag, Field_Aggr_Named_Flag, Field_Aggregate_Expand_Flag, + Field_Determined_Aggregate_Flag, Field_Association_Choices_Chain, Field_Case_Statement_Alternative_Chain, Field_Matching_Flag, @@ -979,6 +980,7 @@ package Vhdl.Nodes_Meta is function Has_Aggr_Others_Flag (K : Iir_Kind) return Boolean; function Has_Aggr_Named_Flag (K : Iir_Kind) return Boolean; function Has_Aggregate_Expand_Flag (K : Iir_Kind) return Boolean; + function Has_Determined_Aggregate_Flag (K : Iir_Kind) return Boolean; function Has_Association_Choices_Chain (K : Iir_Kind) return Boolean; function Has_Case_Statement_Alternative_Chain (K : Iir_Kind) return Boolean; diff --git a/src/vhdl/vhdl-sem_expr.adb b/src/vhdl/vhdl-sem_expr.adb index d4a8ef84e..2c9bd8645 100644 --- a/src/vhdl/vhdl-sem_expr.adb +++ b/src/vhdl/vhdl-sem_expr.adb @@ -3887,6 +3887,7 @@ package body Vhdl.Sem_Expr is Sub_Aggr := Get_Associated_Expr (Choice); case Get_Kind (Sub_Aggr) is when Iir_Kind_Aggregate => + Set_Determined_Aggregate_Flag (Sub_Aggr, Constrained); Sem_Array_Aggregate_1 (Sub_Aggr, A_Type, Infos, Constrained, Dim + 1); if not Get_Aggregate_Expand_Flag (Sub_Aggr) then @@ -4405,6 +4406,8 @@ package body Vhdl.Sem_Expr is Set_Expr_Staticness (Expr, Globally); end if; + Set_Determined_Aggregate_Flag (Expr, Constrained); + Set_Type (Expr, A_Type); -- FIXME: should free old type case Get_Kind (A_Type) is when Iir_Kind_Array_Subtype_Definition => -- cgit v1.2.3