diff options
author | Tristan Gingold <tgingold@free.fr> | 2016-10-04 20:48:53 +0200 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2016-10-04 20:48:53 +0200 |
commit | 05bdcc96e259b338328812f4b3c4fb68f3c13f3c (patch) | |
tree | 0186f64c99f067600322f1338be16e1ff5f95057 /src/vhdl | |
parent | deac06f0a1aee47a6c4504e2a439842584066b84 (diff) | |
download | ghdl-05bdcc96e259b338328812f4b3c4fb68f3c13f3c.tar.gz ghdl-05bdcc96e259b338328812f4b3c4fb68f3c13f3c.tar.bz2 ghdl-05bdcc96e259b338328812f4b3c4fb68f3c13f3c.zip |
Fix attribute specification with non-static expression
Diffstat (limited to 'src/vhdl')
-rw-r--r-- | src/vhdl/iirs.ads | 3 | ||||
-rw-r--r-- | src/vhdl/nodes_meta.adb | 436 | ||||
-rw-r--r-- | src/vhdl/sem_specs.adb | 44 | ||||
-rw-r--r-- | src/vhdl/translate/trans-chap5.adb | 41 | ||||
-rw-r--r-- | src/vhdl/translate/trans-chap6.adb | 17 |
5 files changed, 293 insertions, 248 deletions
diff --git a/src/vhdl/iirs.ads b/src/vhdl/iirs.ads index ae194fa8c..6c3ed2bf8 100644 --- a/src/vhdl/iirs.ads +++ b/src/vhdl/iirs.ads @@ -697,9 +697,6 @@ package Iirs is -- -- Get/Set_Parent (Field0) -- - -- The type can be constrained due to the expression. - -- Get/Set_Type (Field1) - -- -- Get/Set_Chain (Field2) -- -- Get/Set_Entity_Class (Field3) diff --git a/src/vhdl/nodes_meta.adb b/src/vhdl/nodes_meta.adb index bfad5ab47..b94f57dcc 100644 --- a/src/vhdl/nodes_meta.adb +++ b/src/vhdl/nodes_meta.adb @@ -2419,7 +2419,6 @@ package body Nodes_Meta is Field_Attribute_Specification_Chain, Field_Entity_Name_List, Field_Parent, - Field_Type, -- Iir_Kind_Disconnection_Specification Field_Chain, Field_Signal_List, @@ -4278,223 +4277,223 @@ package body Nodes_Meta is Iir_Kind_Array_Element_Resolution => 215, Iir_Kind_Record_Resolution => 216, Iir_Kind_Record_Element_Resolution => 219, - Iir_Kind_Attribute_Specification => 228, - Iir_Kind_Disconnection_Specification => 233, - Iir_Kind_Configuration_Specification => 238, - Iir_Kind_Access_Type_Definition => 246, - Iir_Kind_Incomplete_Type_Definition => 254, - Iir_Kind_Interface_Type_Definition => 261, - Iir_Kind_File_Type_Definition => 268, - Iir_Kind_Protected_Type_Declaration => 277, - Iir_Kind_Record_Type_Definition => 287, - Iir_Kind_Array_Type_Definition => 299, - Iir_Kind_Array_Subtype_Definition => 314, - Iir_Kind_Record_Subtype_Definition => 325, - Iir_Kind_Access_Subtype_Definition => 333, - Iir_Kind_Physical_Subtype_Definition => 342, - Iir_Kind_Floating_Subtype_Definition => 352, - Iir_Kind_Integer_Subtype_Definition => 361, - Iir_Kind_Enumeration_Subtype_Definition => 370, - Iir_Kind_Enumeration_Type_Definition => 379, - Iir_Kind_Integer_Type_Definition => 385, - Iir_Kind_Floating_Type_Definition => 391, - Iir_Kind_Physical_Type_Definition => 400, - Iir_Kind_Range_Expression => 408, - Iir_Kind_Protected_Type_Body => 415, - Iir_Kind_Wildcard_Type_Definition => 420, - Iir_Kind_Subtype_Definition => 424, - Iir_Kind_Scalar_Nature_Definition => 428, - Iir_Kind_Overload_List => 429, - Iir_Kind_Type_Declaration => 436, - Iir_Kind_Anonymous_Type_Declaration => 442, - Iir_Kind_Subtype_Declaration => 450, - Iir_Kind_Nature_Declaration => 456, - Iir_Kind_Subnature_Declaration => 462, - Iir_Kind_Package_Declaration => 477, - Iir_Kind_Package_Instantiation_Declaration => 489, - Iir_Kind_Package_Body => 497, - Iir_Kind_Configuration_Declaration => 506, - Iir_Kind_Entity_Declaration => 518, - Iir_Kind_Architecture_Body => 530, - Iir_Kind_Context_Declaration => 536, - Iir_Kind_Package_Header => 538, - Iir_Kind_Unit_Declaration => 547, - Iir_Kind_Library_Declaration => 554, - Iir_Kind_Component_Declaration => 564, - Iir_Kind_Attribute_Declaration => 571, - Iir_Kind_Group_Template_Declaration => 577, - Iir_Kind_Group_Declaration => 584, - Iir_Kind_Element_Declaration => 591, - Iir_Kind_Non_Object_Alias_Declaration => 599, - Iir_Kind_Psl_Declaration => 607, - Iir_Kind_Psl_Endpoint_Declaration => 621, - Iir_Kind_Terminal_Declaration => 627, - Iir_Kind_Free_Quantity_Declaration => 636, - Iir_Kind_Across_Quantity_Declaration => 648, - Iir_Kind_Through_Quantity_Declaration => 660, - Iir_Kind_Enumeration_Literal => 671, - Iir_Kind_Function_Declaration => 695, - Iir_Kind_Procedure_Declaration => 718, - Iir_Kind_Function_Body => 728, - Iir_Kind_Procedure_Body => 739, - Iir_Kind_Object_Alias_Declaration => 751, - Iir_Kind_File_Declaration => 766, - Iir_Kind_Guard_Signal_Declaration => 779, - Iir_Kind_Signal_Declaration => 796, - Iir_Kind_Variable_Declaration => 809, - Iir_Kind_Constant_Declaration => 823, - Iir_Kind_Iterator_Declaration => 835, - Iir_Kind_Interface_Constant_Declaration => 851, - Iir_Kind_Interface_Variable_Declaration => 867, - Iir_Kind_Interface_Signal_Declaration => 888, - Iir_Kind_Interface_File_Declaration => 904, - Iir_Kind_Interface_Type_Declaration => 914, - Iir_Kind_Interface_Package_Declaration => 924, - Iir_Kind_Interface_Function_Declaration => 940, - Iir_Kind_Interface_Procedure_Declaration => 952, - Iir_Kind_Identity_Operator => 956, - Iir_Kind_Negation_Operator => 960, - Iir_Kind_Absolute_Operator => 964, - Iir_Kind_Not_Operator => 968, - Iir_Kind_Condition_Operator => 972, - Iir_Kind_Reduction_And_Operator => 976, - Iir_Kind_Reduction_Or_Operator => 980, - Iir_Kind_Reduction_Nand_Operator => 984, - Iir_Kind_Reduction_Nor_Operator => 988, - Iir_Kind_Reduction_Xor_Operator => 992, - Iir_Kind_Reduction_Xnor_Operator => 996, - Iir_Kind_And_Operator => 1001, - Iir_Kind_Or_Operator => 1006, - Iir_Kind_Nand_Operator => 1011, - Iir_Kind_Nor_Operator => 1016, - Iir_Kind_Xor_Operator => 1021, - Iir_Kind_Xnor_Operator => 1026, - Iir_Kind_Equality_Operator => 1031, - Iir_Kind_Inequality_Operator => 1036, - Iir_Kind_Less_Than_Operator => 1041, - Iir_Kind_Less_Than_Or_Equal_Operator => 1046, - Iir_Kind_Greater_Than_Operator => 1051, - Iir_Kind_Greater_Than_Or_Equal_Operator => 1056, - Iir_Kind_Match_Equality_Operator => 1061, - Iir_Kind_Match_Inequality_Operator => 1066, - Iir_Kind_Match_Less_Than_Operator => 1071, - Iir_Kind_Match_Less_Than_Or_Equal_Operator => 1076, - Iir_Kind_Match_Greater_Than_Operator => 1081, - Iir_Kind_Match_Greater_Than_Or_Equal_Operator => 1086, - Iir_Kind_Sll_Operator => 1091, - Iir_Kind_Sla_Operator => 1096, - Iir_Kind_Srl_Operator => 1101, - Iir_Kind_Sra_Operator => 1106, - Iir_Kind_Rol_Operator => 1111, - Iir_Kind_Ror_Operator => 1116, - Iir_Kind_Addition_Operator => 1121, - Iir_Kind_Substraction_Operator => 1126, - Iir_Kind_Concatenation_Operator => 1131, - Iir_Kind_Multiplication_Operator => 1136, - Iir_Kind_Division_Operator => 1141, - Iir_Kind_Modulus_Operator => 1146, - Iir_Kind_Remainder_Operator => 1151, - Iir_Kind_Exponentiation_Operator => 1156, - Iir_Kind_Function_Call => 1164, - Iir_Kind_Aggregate => 1170, - Iir_Kind_Parenthesis_Expression => 1173, - Iir_Kind_Qualified_Expression => 1177, - Iir_Kind_Type_Conversion => 1182, - Iir_Kind_Allocator_By_Expression => 1186, - Iir_Kind_Allocator_By_Subtype => 1192, - Iir_Kind_Selected_Element => 1198, - Iir_Kind_Dereference => 1203, - Iir_Kind_Implicit_Dereference => 1208, - Iir_Kind_Slice_Name => 1215, - Iir_Kind_Indexed_Name => 1221, - Iir_Kind_Psl_Expression => 1223, - Iir_Kind_Sensitized_Process_Statement => 1243, - Iir_Kind_Process_Statement => 1263, - Iir_Kind_Concurrent_Simple_Signal_Assignment => 1274, - Iir_Kind_Concurrent_Conditional_Signal_Assignment => 1285, - Iir_Kind_Concurrent_Selected_Signal_Assignment => 1297, - Iir_Kind_Concurrent_Assertion_Statement => 1305, - Iir_Kind_Concurrent_Procedure_Call_Statement => 1312, - Iir_Kind_Psl_Assert_Statement => 1325, - Iir_Kind_Psl_Cover_Statement => 1338, - Iir_Kind_Block_Statement => 1351, - Iir_Kind_If_Generate_Statement => 1361, - Iir_Kind_Case_Generate_Statement => 1370, - Iir_Kind_For_Generate_Statement => 1379, - Iir_Kind_Component_Instantiation_Statement => 1389, - Iir_Kind_Psl_Default_Clock => 1393, - Iir_Kind_Simple_Simultaneous_Statement => 1400, - Iir_Kind_Generate_Statement_Body => 1411, - Iir_Kind_If_Generate_Else_Clause => 1416, - Iir_Kind_Simple_Signal_Assignment_Statement => 1425, - Iir_Kind_Conditional_Signal_Assignment_Statement => 1434, - Iir_Kind_Null_Statement => 1438, - Iir_Kind_Assertion_Statement => 1445, - Iir_Kind_Report_Statement => 1451, - Iir_Kind_Wait_Statement => 1458, - Iir_Kind_Variable_Assignment_Statement => 1464, - Iir_Kind_Conditional_Variable_Assignment_Statement => 1470, - Iir_Kind_Return_Statement => 1476, - Iir_Kind_For_Loop_Statement => 1485, - Iir_Kind_While_Loop_Statement => 1493, - Iir_Kind_Next_Statement => 1499, - Iir_Kind_Exit_Statement => 1505, - Iir_Kind_Case_Statement => 1513, - Iir_Kind_Procedure_Call_Statement => 1519, - Iir_Kind_If_Statement => 1528, - Iir_Kind_Elsif => 1533, - Iir_Kind_Character_Literal => 1540, - Iir_Kind_Simple_Name => 1547, - Iir_Kind_Selected_Name => 1555, - Iir_Kind_Operator_Symbol => 1560, - Iir_Kind_Selected_By_All_Name => 1565, - Iir_Kind_Parenthesis_Name => 1569, - Iir_Kind_External_Constant_Name => 1578, - Iir_Kind_External_Signal_Name => 1587, - Iir_Kind_External_Variable_Name => 1596, - Iir_Kind_Package_Pathname => 1599, - Iir_Kind_Absolute_Pathname => 1600, - Iir_Kind_Relative_Pathname => 1601, - Iir_Kind_Pathname_Element => 1605, - Iir_Kind_Base_Attribute => 1607, - Iir_Kind_Left_Type_Attribute => 1612, - Iir_Kind_Right_Type_Attribute => 1617, - Iir_Kind_High_Type_Attribute => 1622, - Iir_Kind_Low_Type_Attribute => 1627, - Iir_Kind_Ascending_Type_Attribute => 1632, - Iir_Kind_Image_Attribute => 1638, - Iir_Kind_Value_Attribute => 1644, - Iir_Kind_Pos_Attribute => 1650, - Iir_Kind_Val_Attribute => 1656, - Iir_Kind_Succ_Attribute => 1662, - Iir_Kind_Pred_Attribute => 1668, - Iir_Kind_Leftof_Attribute => 1674, - Iir_Kind_Rightof_Attribute => 1680, - Iir_Kind_Delayed_Attribute => 1688, - Iir_Kind_Stable_Attribute => 1696, - Iir_Kind_Quiet_Attribute => 1704, - Iir_Kind_Transaction_Attribute => 1712, - Iir_Kind_Event_Attribute => 1716, - Iir_Kind_Active_Attribute => 1720, - Iir_Kind_Last_Event_Attribute => 1724, - Iir_Kind_Last_Active_Attribute => 1728, - Iir_Kind_Last_Value_Attribute => 1732, - Iir_Kind_Driving_Attribute => 1736, - Iir_Kind_Driving_Value_Attribute => 1740, - Iir_Kind_Behavior_Attribute => 1740, - Iir_Kind_Structure_Attribute => 1740, - Iir_Kind_Simple_Name_Attribute => 1747, - Iir_Kind_Instance_Name_Attribute => 1752, - Iir_Kind_Path_Name_Attribute => 1757, - Iir_Kind_Left_Array_Attribute => 1764, - Iir_Kind_Right_Array_Attribute => 1771, - Iir_Kind_High_Array_Attribute => 1778, - Iir_Kind_Low_Array_Attribute => 1785, - Iir_Kind_Length_Array_Attribute => 1792, - Iir_Kind_Ascending_Array_Attribute => 1799, - Iir_Kind_Range_Array_Attribute => 1806, - Iir_Kind_Reverse_Range_Array_Attribute => 1813, - Iir_Kind_Attribute_Name => 1821 + Iir_Kind_Attribute_Specification => 227, + Iir_Kind_Disconnection_Specification => 232, + Iir_Kind_Configuration_Specification => 237, + Iir_Kind_Access_Type_Definition => 245, + Iir_Kind_Incomplete_Type_Definition => 253, + Iir_Kind_Interface_Type_Definition => 260, + Iir_Kind_File_Type_Definition => 267, + Iir_Kind_Protected_Type_Declaration => 276, + Iir_Kind_Record_Type_Definition => 286, + Iir_Kind_Array_Type_Definition => 298, + Iir_Kind_Array_Subtype_Definition => 313, + Iir_Kind_Record_Subtype_Definition => 324, + Iir_Kind_Access_Subtype_Definition => 332, + Iir_Kind_Physical_Subtype_Definition => 341, + Iir_Kind_Floating_Subtype_Definition => 351, + Iir_Kind_Integer_Subtype_Definition => 360, + Iir_Kind_Enumeration_Subtype_Definition => 369, + Iir_Kind_Enumeration_Type_Definition => 378, + Iir_Kind_Integer_Type_Definition => 384, + Iir_Kind_Floating_Type_Definition => 390, + Iir_Kind_Physical_Type_Definition => 399, + Iir_Kind_Range_Expression => 407, + Iir_Kind_Protected_Type_Body => 414, + Iir_Kind_Wildcard_Type_Definition => 419, + Iir_Kind_Subtype_Definition => 423, + Iir_Kind_Scalar_Nature_Definition => 427, + Iir_Kind_Overload_List => 428, + Iir_Kind_Type_Declaration => 435, + Iir_Kind_Anonymous_Type_Declaration => 441, + Iir_Kind_Subtype_Declaration => 449, + Iir_Kind_Nature_Declaration => 455, + Iir_Kind_Subnature_Declaration => 461, + Iir_Kind_Package_Declaration => 476, + Iir_Kind_Package_Instantiation_Declaration => 488, + Iir_Kind_Package_Body => 496, + Iir_Kind_Configuration_Declaration => 505, + Iir_Kind_Entity_Declaration => 517, + Iir_Kind_Architecture_Body => 529, + Iir_Kind_Context_Declaration => 535, + Iir_Kind_Package_Header => 537, + Iir_Kind_Unit_Declaration => 546, + Iir_Kind_Library_Declaration => 553, + Iir_Kind_Component_Declaration => 563, + Iir_Kind_Attribute_Declaration => 570, + Iir_Kind_Group_Template_Declaration => 576, + Iir_Kind_Group_Declaration => 583, + Iir_Kind_Element_Declaration => 590, + Iir_Kind_Non_Object_Alias_Declaration => 598, + Iir_Kind_Psl_Declaration => 606, + Iir_Kind_Psl_Endpoint_Declaration => 620, + Iir_Kind_Terminal_Declaration => 626, + Iir_Kind_Free_Quantity_Declaration => 635, + Iir_Kind_Across_Quantity_Declaration => 647, + Iir_Kind_Through_Quantity_Declaration => 659, + Iir_Kind_Enumeration_Literal => 670, + Iir_Kind_Function_Declaration => 694, + Iir_Kind_Procedure_Declaration => 717, + Iir_Kind_Function_Body => 727, + Iir_Kind_Procedure_Body => 738, + Iir_Kind_Object_Alias_Declaration => 750, + Iir_Kind_File_Declaration => 765, + Iir_Kind_Guard_Signal_Declaration => 778, + Iir_Kind_Signal_Declaration => 795, + Iir_Kind_Variable_Declaration => 808, + Iir_Kind_Constant_Declaration => 822, + Iir_Kind_Iterator_Declaration => 834, + Iir_Kind_Interface_Constant_Declaration => 850, + Iir_Kind_Interface_Variable_Declaration => 866, + Iir_Kind_Interface_Signal_Declaration => 887, + Iir_Kind_Interface_File_Declaration => 903, + Iir_Kind_Interface_Type_Declaration => 913, + Iir_Kind_Interface_Package_Declaration => 923, + Iir_Kind_Interface_Function_Declaration => 939, + Iir_Kind_Interface_Procedure_Declaration => 951, + Iir_Kind_Identity_Operator => 955, + Iir_Kind_Negation_Operator => 959, + Iir_Kind_Absolute_Operator => 963, + Iir_Kind_Not_Operator => 967, + Iir_Kind_Condition_Operator => 971, + Iir_Kind_Reduction_And_Operator => 975, + Iir_Kind_Reduction_Or_Operator => 979, + Iir_Kind_Reduction_Nand_Operator => 983, + Iir_Kind_Reduction_Nor_Operator => 987, + Iir_Kind_Reduction_Xor_Operator => 991, + Iir_Kind_Reduction_Xnor_Operator => 995, + Iir_Kind_And_Operator => 1000, + Iir_Kind_Or_Operator => 1005, + Iir_Kind_Nand_Operator => 1010, + Iir_Kind_Nor_Operator => 1015, + Iir_Kind_Xor_Operator => 1020, + Iir_Kind_Xnor_Operator => 1025, + Iir_Kind_Equality_Operator => 1030, + Iir_Kind_Inequality_Operator => 1035, + Iir_Kind_Less_Than_Operator => 1040, + Iir_Kind_Less_Than_Or_Equal_Operator => 1045, + Iir_Kind_Greater_Than_Operator => 1050, + Iir_Kind_Greater_Than_Or_Equal_Operator => 1055, + Iir_Kind_Match_Equality_Operator => 1060, + Iir_Kind_Match_Inequality_Operator => 1065, + Iir_Kind_Match_Less_Than_Operator => 1070, + Iir_Kind_Match_Less_Than_Or_Equal_Operator => 1075, + Iir_Kind_Match_Greater_Than_Operator => 1080, + Iir_Kind_Match_Greater_Than_Or_Equal_Operator => 1085, + Iir_Kind_Sll_Operator => 1090, + Iir_Kind_Sla_Operator => 1095, + Iir_Kind_Srl_Operator => 1100, + Iir_Kind_Sra_Operator => 1105, + Iir_Kind_Rol_Operator => 1110, + Iir_Kind_Ror_Operator => 1115, + Iir_Kind_Addition_Operator => 1120, + Iir_Kind_Substraction_Operator => 1125, + Iir_Kind_Concatenation_Operator => 1130, + Iir_Kind_Multiplication_Operator => 1135, + Iir_Kind_Division_Operator => 1140, + Iir_Kind_Modulus_Operator => 1145, + Iir_Kind_Remainder_Operator => 1150, + Iir_Kind_Exponentiation_Operator => 1155, + Iir_Kind_Function_Call => 1163, + Iir_Kind_Aggregate => 1169, + Iir_Kind_Parenthesis_Expression => 1172, + Iir_Kind_Qualified_Expression => 1176, + Iir_Kind_Type_Conversion => 1181, + Iir_Kind_Allocator_By_Expression => 1185, + Iir_Kind_Allocator_By_Subtype => 1191, + Iir_Kind_Selected_Element => 1197, + Iir_Kind_Dereference => 1202, + Iir_Kind_Implicit_Dereference => 1207, + Iir_Kind_Slice_Name => 1214, + Iir_Kind_Indexed_Name => 1220, + Iir_Kind_Psl_Expression => 1222, + Iir_Kind_Sensitized_Process_Statement => 1242, + Iir_Kind_Process_Statement => 1262, + Iir_Kind_Concurrent_Simple_Signal_Assignment => 1273, + Iir_Kind_Concurrent_Conditional_Signal_Assignment => 1284, + Iir_Kind_Concurrent_Selected_Signal_Assignment => 1296, + Iir_Kind_Concurrent_Assertion_Statement => 1304, + Iir_Kind_Concurrent_Procedure_Call_Statement => 1311, + Iir_Kind_Psl_Assert_Statement => 1324, + Iir_Kind_Psl_Cover_Statement => 1337, + Iir_Kind_Block_Statement => 1350, + Iir_Kind_If_Generate_Statement => 1360, + Iir_Kind_Case_Generate_Statement => 1369, + Iir_Kind_For_Generate_Statement => 1378, + Iir_Kind_Component_Instantiation_Statement => 1388, + Iir_Kind_Psl_Default_Clock => 1392, + Iir_Kind_Simple_Simultaneous_Statement => 1399, + Iir_Kind_Generate_Statement_Body => 1410, + Iir_Kind_If_Generate_Else_Clause => 1415, + Iir_Kind_Simple_Signal_Assignment_Statement => 1424, + Iir_Kind_Conditional_Signal_Assignment_Statement => 1433, + Iir_Kind_Null_Statement => 1437, + Iir_Kind_Assertion_Statement => 1444, + Iir_Kind_Report_Statement => 1450, + Iir_Kind_Wait_Statement => 1457, + Iir_Kind_Variable_Assignment_Statement => 1463, + Iir_Kind_Conditional_Variable_Assignment_Statement => 1469, + Iir_Kind_Return_Statement => 1475, + Iir_Kind_For_Loop_Statement => 1484, + Iir_Kind_While_Loop_Statement => 1492, + Iir_Kind_Next_Statement => 1498, + Iir_Kind_Exit_Statement => 1504, + Iir_Kind_Case_Statement => 1512, + Iir_Kind_Procedure_Call_Statement => 1518, + Iir_Kind_If_Statement => 1527, + Iir_Kind_Elsif => 1532, + Iir_Kind_Character_Literal => 1539, + Iir_Kind_Simple_Name => 1546, + Iir_Kind_Selected_Name => 1554, + Iir_Kind_Operator_Symbol => 1559, + Iir_Kind_Selected_By_All_Name => 1564, + Iir_Kind_Parenthesis_Name => 1568, + Iir_Kind_External_Constant_Name => 1577, + Iir_Kind_External_Signal_Name => 1586, + Iir_Kind_External_Variable_Name => 1595, + Iir_Kind_Package_Pathname => 1598, + Iir_Kind_Absolute_Pathname => 1599, + Iir_Kind_Relative_Pathname => 1600, + Iir_Kind_Pathname_Element => 1604, + Iir_Kind_Base_Attribute => 1606, + Iir_Kind_Left_Type_Attribute => 1611, + Iir_Kind_Right_Type_Attribute => 1616, + Iir_Kind_High_Type_Attribute => 1621, + Iir_Kind_Low_Type_Attribute => 1626, + Iir_Kind_Ascending_Type_Attribute => 1631, + Iir_Kind_Image_Attribute => 1637, + Iir_Kind_Value_Attribute => 1643, + Iir_Kind_Pos_Attribute => 1649, + Iir_Kind_Val_Attribute => 1655, + Iir_Kind_Succ_Attribute => 1661, + Iir_Kind_Pred_Attribute => 1667, + Iir_Kind_Leftof_Attribute => 1673, + Iir_Kind_Rightof_Attribute => 1679, + Iir_Kind_Delayed_Attribute => 1687, + Iir_Kind_Stable_Attribute => 1695, + Iir_Kind_Quiet_Attribute => 1703, + Iir_Kind_Transaction_Attribute => 1711, + Iir_Kind_Event_Attribute => 1715, + Iir_Kind_Active_Attribute => 1719, + Iir_Kind_Last_Event_Attribute => 1723, + Iir_Kind_Last_Active_Attribute => 1727, + Iir_Kind_Last_Value_Attribute => 1731, + Iir_Kind_Driving_Attribute => 1735, + Iir_Kind_Driving_Value_Attribute => 1739, + Iir_Kind_Behavior_Attribute => 1739, + Iir_Kind_Structure_Attribute => 1739, + Iir_Kind_Simple_Name_Attribute => 1746, + Iir_Kind_Instance_Name_Attribute => 1751, + Iir_Kind_Path_Name_Attribute => 1756, + Iir_Kind_Left_Array_Attribute => 1763, + Iir_Kind_Right_Array_Attribute => 1770, + Iir_Kind_High_Array_Attribute => 1777, + Iir_Kind_Low_Array_Attribute => 1784, + Iir_Kind_Length_Array_Attribute => 1791, + Iir_Kind_Ascending_Array_Attribute => 1798, + Iir_Kind_Range_Array_Attribute => 1805, + Iir_Kind_Reverse_Range_Array_Attribute => 1812, + Iir_Kind_Attribute_Name => 1820 ); function Get_Fields (K : Iir_Kind) return Fields_Array @@ -7117,7 +7116,6 @@ package body Nodes_Meta is | Iir_Kind_Overflow_Literal | Iir_Kind_Attribute_Value | Iir_Kind_Record_Element_Constraint - | Iir_Kind_Attribute_Specification | Iir_Kind_Range_Expression | Iir_Kind_Type_Declaration | Iir_Kind_Subtype_Declaration diff --git a/src/vhdl/sem_specs.adb b/src/vhdl/sem_specs.adb index 7e0c608a1..2d40901fe 100644 --- a/src/vhdl/sem_specs.adb +++ b/src/vhdl/sem_specs.adb @@ -186,6 +186,8 @@ package body Sem_Specs is Check_Defined : Boolean) is use Tokens; + Attr_Expr : constant Iir := Get_Expression (Attr); + El : Iir_Attribute_Value; -- Attribute declaration corresponding to ATTR. @@ -294,18 +296,13 @@ package body Sem_Specs is Set_Name_Staticness (El, None); Set_Attribute_Specification (El, Attr); -- FIXME: create an expr_error node? - declare - Expr : Iir; - begin - Expr := Get_Expression (Attr); - if Expr = Error_Mark then - Set_Expr_Staticness (El, Locally); - else - Set_Expr_Staticness (El, Get_Expr_Staticness (Expr)); - end if; - end; + if Is_Error (Attr_Expr) then + Set_Expr_Staticness (El, Locally); + else + Set_Expr_Staticness (El, Get_Expr_Staticness (Attr_Expr)); + end if; Set_Designated_Entity (El, Decl); - Set_Type (El, Get_Type (Attr)); + Set_Type (El, Get_Type (Attr_Expr)); Set_Base_Name (El, El); -- Put the attribute value in the attribute_value_chain. @@ -313,6 +310,7 @@ package body Sem_Specs is Set_Attribute_Value_Chain (Attr_Chain_Parent, El); -- Put the attribute value in the chain of the attribute specification. + -- This is prepended, so in reverse order. Will be reversed later. Set_Spec_Chain (El, Get_Attribute_Value_Spec_Chain (Attr)); Set_Attribute_Value_Spec_Chain (Attr, El); @@ -717,7 +715,6 @@ package body Sem_Specs is -- the same as (or implicitly convertible to) the type mark in the -- corresponding attribute declaration. Attr_Type := Get_Type (Attr); - Set_Type (Spec, Attr_Type); Expr := Sem_Expression (Get_Expression (Spec), Attr_Type); if Expr /= Null_Iir then Check_Read (Expr); @@ -748,11 +745,11 @@ package body Sem_Specs is end if; -- LRM93 3.2.1.1 Index constraints and discrete ranges - -- - For an attribtue whose value is specified by an attribute + -- - For an attribute whose value is specified by an attribute -- specification, the index ranges are defined by the expression -- given in the specification, if the subtype of the attribute is -- unconstrained [...] - Sem_Decls.Sem_Object_Type_From_Value (Spec, Get_Expression (Spec)); + -- GHDL: For attribute value. -- LRM 5.1 -- The entity name list identifies those named entities, both @@ -807,6 +804,25 @@ package body Sem_Specs is end loop; end; end if; + + -- Reverse the chain of attribute value in specification, so that they + -- are in textual order. This is important if the expression is not + -- static. + declare + El : Iir; + New_El : Iir; + Tmp : Iir; + begin + El := Get_Attribute_Value_Spec_Chain (Spec); + New_El := Null_Iir; + while Is_Valid (El) loop + Tmp := Get_Spec_Chain (El); + Set_Spec_Chain (El, New_El); + New_El := El; + El := Tmp; + end loop; + Set_Attribute_Value_Spec_Chain (Spec, New_El); + end; end Sem_Attribute_Specification; procedure Check_Post_Attribute_Specification diff --git a/src/vhdl/translate/trans-chap5.adb b/src/vhdl/translate/trans-chap5.adb index f6a11be0f..7572032af 100644 --- a/src/vhdl/translate/trans-chap5.adb +++ b/src/vhdl/translate/trans-chap5.adb @@ -47,12 +47,15 @@ package body Trans.Chap5 is procedure Translate_Attribute_Specification (Spec : Iir_Attribute_Specification) is - Spec_Type : constant Iir := Get_Type (Spec); + Spec_Expr : constant Iir := Get_Expression (Spec); + Spec_Type : constant Iir := Get_Type (Spec_Expr); Attr : constant Iir_Attribute_Declaration := Get_Named_Entity (Get_Attribute_Designator (Spec)); Mark : Id_Mark_Type; Mark2 : Id_Mark_Type; Info : Object_Info_Acc; + Val : Iir; + Num : Natural; begin Push_Identifier_Prefix_Uniq (Mark); if Is_Anonymous_Type_Definition (Spec_Type) then @@ -60,19 +63,39 @@ package body Trans.Chap5 is Chap3.Translate_Type_Definition (Spec_Type, True); Pop_Identifier_Prefix (Mark2); end if; - Info := Add_Info (Spec, Kind_Object); - Info.Object_Var := Create_Var - (Create_Var_Identifier (Attr), - Chap4.Get_Object_Type (Get_Info (Spec_Type), Mode_Value), - Global_Storage); + + Num := 1; + Val := Get_Attribute_Value_Spec_Chain (Spec); + while Is_Valid (Val) loop + Info := Add_Info (Val, Kind_Object); + Info.Object_Var := Create_Var + (Create_Var_Identifier (Attr, "V", Num), + Chap4.Get_Object_Type (Get_Info (Spec_Type), Mode_Value), + Global_Storage); + + -- Create only one object if the expression is static. + exit when Get_Expr_Staticness (Spec_Expr) /= None; + + Val := Get_Spec_Chain (Val); + Num := Num + 1; + end loop; Pop_Identifier_Prefix (Mark); end Translate_Attribute_Specification; procedure Elab_Attribute_Specification - (Spec : Iir_Attribute_Specification) is + (Spec : Iir_Attribute_Specification) + is + Expr : constant Iir := Get_Expression (Spec); + Val : Iir; begin - Chap3.Elab_Object_Subtype (Get_Type (Spec)); - Chap4.Elab_Object_Value (Spec, Get_Expression (Spec)); + Chap3.Elab_Object_Subtype (Get_Type (Expr)); + + Val := Get_Attribute_Value_Spec_Chain (Spec); + while Is_Valid (Val) loop + Chap4.Elab_Object_Value (Val, Expr); + exit when Get_Expr_Staticness (Expr) /= None; + Val := Get_Spec_Chain (Val); + end loop; end Elab_Attribute_Specification; procedure Gen_Elab_Disconnect_Non_Composite (Targ : Mnode; diff --git a/src/vhdl/translate/trans-chap6.adb b/src/vhdl/translate/trans-chap6.adb index 51c1a4568..e9f2987dd 100644 --- a/src/vhdl/translate/trans-chap6.adb +++ b/src/vhdl/translate/trans-chap6.adb @@ -920,9 +920,20 @@ package body Trans.Chap6 is return Translate_Name (Get_Named_Entity (Name), Mode); when Iir_Kind_Attribute_Value => pragma Assert (Mode = Mode_Value); - return Get_Var - (Get_Info (Get_Attribute_Specification (Name)).Object_Var, - Type_Info, Mode_Value); + declare + Attr : constant Iir := Get_Attribute_Specification (Name); + Val : Iir; + begin + if Get_Expr_Staticness (Get_Expression (Attr)) = None then + Val := Name; + else + -- If the expression is static, an object is created only + -- for the first value. + Val := Get_Attribute_Value_Spec_Chain (Attr); + end if; + return Get_Var (Get_Info (Val).Object_Var, + Type_Info, Mode_Value); + end; when Iir_Kind_Object_Alias_Declaration => -- Alias_Var is not like an object variable, since it is |