aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2019-12-30 06:28:26 +0100
committerTristan Gingold <tgingold@free.fr>2019-12-30 06:28:26 +0100
commita6a74017fd6b467627f23ff733218af1062d139f (patch)
tree70facbde8de4dab2ff32d5f626ca51f15198f4bf /src
parent2d835b7e171093b894aae52f54e1b3cfd373a5fe (diff)
downloadghdl-a6a74017fd6b467627f23ff733218af1062d139f.tar.gz
ghdl-a6a74017fd6b467627f23ff733218af1062d139f.tar.bz2
ghdl-a6a74017fd6b467627f23ff733218af1062d139f.zip
ams-vhdl: check nature for record natures and terminals.
Diffstat (limited to 'src')
-rw-r--r--src/vhdl/vhdl-nodes.adb16
-rw-r--r--src/vhdl/vhdl-nodes.ads16
-rw-r--r--src/vhdl/vhdl-nodes_meta.adb472
-rw-r--r--src/vhdl/vhdl-nodes_meta.ads2
-rw-r--r--src/vhdl/vhdl-sem_decls.adb68
-rw-r--r--src/vhdl/vhdl-sem_types.adb41
-rw-r--r--src/vhdl/vhdl-sem_types.ads13
7 files changed, 397 insertions, 231 deletions
diff --git a/src/vhdl/vhdl-nodes.adb b/src/vhdl/vhdl-nodes.adb
index 84b56c4f7..7d62b2104 100644
--- a/src/vhdl/vhdl-nodes.adb
+++ b/src/vhdl/vhdl-nodes.adb
@@ -3761,6 +3761,22 @@ package body Vhdl.Nodes is
Set_Field4 (Decl, Base_Type);
end Set_Base_Type;
+ function Get_Simple_Nature (Def : Iir) return Iir is
+ begin
+ pragma Assert (Def /= Null_Iir);
+ pragma Assert (Has_Simple_Nature (Get_Kind (Def)),
+ "no field Simple_Nature");
+ return Get_Field7 (Def);
+ end Get_Simple_Nature;
+
+ procedure Set_Simple_Nature (Def : Iir; Nature : Iir) is
+ begin
+ pragma Assert (Def /= Null_Iir);
+ pragma Assert (Has_Simple_Nature (Get_Kind (Def)),
+ "no field Simple_Nature");
+ Set_Field7 (Def, Nature);
+ end Set_Simple_Nature;
+
function Get_Base_Nature (Decl : Iir) return Iir is
begin
pragma Assert (Decl /= Null_Iir);
diff --git a/src/vhdl/vhdl-nodes.ads b/src/vhdl/vhdl-nodes.ads
index 4ea591e52..a2e2502eb 100644
--- a/src/vhdl/vhdl-nodes.ads
+++ b/src/vhdl/vhdl-nodes.ads
@@ -2969,6 +2969,8 @@ package Vhdl.Nodes is
--
-- Get/Set_Base_Nature (Field4)
--
+ -- Get/Set_Simple_Nature (Field7)
+ --
-- Get/Set_Nature_Staticness (State1)
--
-- Get/Set_Constraint_State (State2)
@@ -3043,6 +3045,8 @@ package Vhdl.Nodes is
--
-- Get/Set_Through_Type (Field12)
--
+ -- Get/Set_Simple_Nature (Field7)
+ --
-- Get/Set_Nature_Staticness (State1)
--
-- Get/Set_Constraint_State (State2)
@@ -3054,7 +3058,6 @@ package Vhdl.Nodes is
-- Always false for record type: elements are owned by this node.
-- Get/Set_Is_Ref (Flag12)
-
-- Iir_Kind_Nature_Element_Declaration (Short)
--
-- AMS-LRM17 5.8.3.3 Record natures
@@ -5896,6 +5899,12 @@ package Vhdl.Nodes is
Iir_Kind_Array_Subnature_Definition ..
Iir_Kind_Array_Subnature_Definition;
+ subtype Iir_Kinds_Nature_Indication is Iir_Kind range
+ Iir_Kind_Scalar_Nature_Definition ..
+ --Iir_Kind_Record_Nature_Definition
+ --Iir_Kind_Array_Nature_Definition
+ Iir_Kind_Array_Subnature_Definition;
+
subtype Iir_Kinds_Nonoverloadable_Declaration is Iir_Kind range
Iir_Kind_Type_Declaration ..
--Iir_Kind_Anonymous_Type_Declaration
@@ -7532,6 +7541,11 @@ package Vhdl.Nodes is
procedure Set_Base_Type (Decl : Iir; Base_Type : Iir);
pragma Inline (Get_Base_Type);
+ -- Only for composite base nature: the simple nature.
+ -- Field: Field7 Ref
+ function Get_Simple_Nature (Def : Iir) return Iir;
+ procedure Set_Simple_Nature (Def : Iir; Nature : Iir);
+
-- Field: Field4 Ref
function Get_Base_Nature (Decl : Iir) return Iir;
procedure Set_Base_Nature (Decl : Iir; Base_Nature : Iir);
diff --git a/src/vhdl/vhdl-nodes_meta.adb b/src/vhdl/vhdl-nodes_meta.adb
index 6ba34e060..76fa0cf84 100644
--- a/src/vhdl/vhdl-nodes_meta.adb
+++ b/src/vhdl/vhdl-nodes_meta.adb
@@ -168,6 +168,7 @@ package body Vhdl.Nodes_Meta is
Field_Left_Limit_Expr => Type_Iir,
Field_Right_Limit_Expr => Type_Iir,
Field_Base_Type => Type_Iir,
+ Field_Simple_Nature => Type_Iir,
Field_Base_Nature => Type_Iir,
Field_Resolution_Indication => Type_Iir,
Field_Record_Element_Resolution_Chain => Type_Iir,
@@ -682,6 +683,8 @@ package body Vhdl.Nodes_Meta is
return "right_limit_expr";
when Field_Base_Type =>
return "base_type";
+ when Field_Simple_Nature =>
+ return "simple_nature";
when Field_Base_Nature =>
return "base_nature";
when Field_Resolution_Indication =>
@@ -2006,6 +2009,8 @@ package body Vhdl.Nodes_Meta is
return Attr_None;
when Field_Base_Type =>
return Attr_Ref;
+ when Field_Simple_Nature =>
+ return Attr_Ref;
when Field_Base_Nature =>
return Attr_Ref;
when Field_Resolution_Indication =>
@@ -3003,6 +3008,7 @@ package body Vhdl.Nodes_Meta is
Field_Through_Type_Definition,
Field_Across_Type,
Field_Through_Type,
+ Field_Simple_Nature,
-- Iir_Kind_Array_Nature_Definition
Field_Index_Constraint_Flag,
Field_Nature_Staticness,
@@ -3013,6 +3019,7 @@ package body Vhdl.Nodes_Meta is
Field_Element_Subnature,
Field_Nature_Declarator,
Field_Base_Nature,
+ Field_Simple_Nature,
Field_Across_Type_Definition,
Field_Through_Type_Definition,
Field_Across_Type,
@@ -5045,231 +5052,231 @@ package body Vhdl.Nodes_Meta is
Iir_Kind_Wildcard_Type_Definition => 475,
Iir_Kind_Subtype_Definition => 482,
Iir_Kind_Scalar_Nature_Definition => 490,
- Iir_Kind_Record_Nature_Definition => 502,
- Iir_Kind_Array_Nature_Definition => 515,
- Iir_Kind_Array_Subnature_Definition => 530,
- Iir_Kind_Overload_List => 531,
- Iir_Kind_Entity_Declaration => 544,
- Iir_Kind_Configuration_Declaration => 553,
- Iir_Kind_Context_Declaration => 559,
- Iir_Kind_Package_Declaration => 574,
- Iir_Kind_Package_Instantiation_Declaration => 588,
- Iir_Kind_Vmode_Declaration => 599,
- Iir_Kind_Vprop_Declaration => 610,
- Iir_Kind_Vunit_Declaration => 622,
- Iir_Kind_Package_Body => 630,
- Iir_Kind_Architecture_Body => 643,
- Iir_Kind_Type_Declaration => 650,
- Iir_Kind_Anonymous_Type_Declaration => 656,
- Iir_Kind_Subtype_Declaration => 663,
- Iir_Kind_Nature_Declaration => 669,
- Iir_Kind_Subnature_Declaration => 676,
- Iir_Kind_Package_Header => 678,
- Iir_Kind_Unit_Declaration => 687,
- Iir_Kind_Library_Declaration => 694,
- Iir_Kind_Component_Declaration => 704,
- Iir_Kind_Attribute_Declaration => 711,
- Iir_Kind_Group_Template_Declaration => 717,
- Iir_Kind_Group_Declaration => 724,
- Iir_Kind_Element_Declaration => 731,
- Iir_Kind_Nature_Element_Declaration => 738,
- Iir_Kind_Non_Object_Alias_Declaration => 746,
- Iir_Kind_Psl_Declaration => 754,
- Iir_Kind_Psl_Endpoint_Declaration => 768,
- Iir_Kind_Enumeration_Literal => 779,
- Iir_Kind_Function_Declaration => 804,
- Iir_Kind_Procedure_Declaration => 828,
- Iir_Kind_Function_Body => 838,
- Iir_Kind_Procedure_Body => 849,
- Iir_Kind_Terminal_Declaration => 858,
- Iir_Kind_Object_Alias_Declaration => 869,
- Iir_Kind_Free_Quantity_Declaration => 881,
- Iir_Kind_Spectrum_Quantity_Declaration => 894,
- Iir_Kind_Noise_Quantity_Declaration => 906,
- Iir_Kind_Across_Quantity_Declaration => 922,
- Iir_Kind_Through_Quantity_Declaration => 938,
- Iir_Kind_File_Declaration => 952,
- Iir_Kind_Guard_Signal_Declaration => 965,
- Iir_Kind_Signal_Declaration => 982,
- Iir_Kind_Variable_Declaration => 995,
- Iir_Kind_Constant_Declaration => 1009,
- Iir_Kind_Iterator_Declaration => 1020,
- Iir_Kind_Interface_Constant_Declaration => 1036,
- Iir_Kind_Interface_Variable_Declaration => 1052,
- Iir_Kind_Interface_Signal_Declaration => 1073,
- Iir_Kind_Interface_File_Declaration => 1089,
- Iir_Kind_Interface_Quantity_Declaration => 1105,
- Iir_Kind_Interface_Terminal_Declaration => 1117,
- Iir_Kind_Interface_Type_Declaration => 1127,
- Iir_Kind_Interface_Package_Declaration => 1139,
- Iir_Kind_Interface_Function_Declaration => 1156,
- Iir_Kind_Interface_Procedure_Declaration => 1169,
- Iir_Kind_Anonymous_Signal_Declaration => 1178,
- Iir_Kind_Signal_Attribute_Declaration => 1181,
- Iir_Kind_Identity_Operator => 1185,
- Iir_Kind_Negation_Operator => 1189,
- Iir_Kind_Absolute_Operator => 1193,
- Iir_Kind_Not_Operator => 1197,
- Iir_Kind_Implicit_Condition_Operator => 1201,
- Iir_Kind_Condition_Operator => 1205,
- Iir_Kind_Reduction_And_Operator => 1209,
- Iir_Kind_Reduction_Or_Operator => 1213,
- Iir_Kind_Reduction_Nand_Operator => 1217,
- Iir_Kind_Reduction_Nor_Operator => 1221,
- Iir_Kind_Reduction_Xor_Operator => 1225,
- Iir_Kind_Reduction_Xnor_Operator => 1229,
- Iir_Kind_And_Operator => 1234,
- Iir_Kind_Or_Operator => 1239,
- Iir_Kind_Nand_Operator => 1244,
- Iir_Kind_Nor_Operator => 1249,
- Iir_Kind_Xor_Operator => 1254,
- Iir_Kind_Xnor_Operator => 1259,
- Iir_Kind_Equality_Operator => 1264,
- Iir_Kind_Inequality_Operator => 1269,
- Iir_Kind_Less_Than_Operator => 1274,
- Iir_Kind_Less_Than_Or_Equal_Operator => 1279,
- Iir_Kind_Greater_Than_Operator => 1284,
- Iir_Kind_Greater_Than_Or_Equal_Operator => 1289,
- Iir_Kind_Match_Equality_Operator => 1294,
- Iir_Kind_Match_Inequality_Operator => 1299,
- Iir_Kind_Match_Less_Than_Operator => 1304,
- Iir_Kind_Match_Less_Than_Or_Equal_Operator => 1309,
- Iir_Kind_Match_Greater_Than_Operator => 1314,
- Iir_Kind_Match_Greater_Than_Or_Equal_Operator => 1319,
- Iir_Kind_Sll_Operator => 1324,
- Iir_Kind_Sla_Operator => 1329,
- Iir_Kind_Srl_Operator => 1334,
- Iir_Kind_Sra_Operator => 1339,
- Iir_Kind_Rol_Operator => 1344,
- Iir_Kind_Ror_Operator => 1349,
- Iir_Kind_Addition_Operator => 1354,
- Iir_Kind_Substraction_Operator => 1359,
- Iir_Kind_Concatenation_Operator => 1364,
- Iir_Kind_Multiplication_Operator => 1369,
- Iir_Kind_Division_Operator => 1374,
- Iir_Kind_Modulus_Operator => 1379,
- Iir_Kind_Remainder_Operator => 1384,
- Iir_Kind_Exponentiation_Operator => 1389,
- Iir_Kind_Function_Call => 1397,
- Iir_Kind_Aggregate => 1404,
- Iir_Kind_Parenthesis_Expression => 1407,
- Iir_Kind_Qualified_Expression => 1411,
- Iir_Kind_Type_Conversion => 1416,
- Iir_Kind_Allocator_By_Expression => 1420,
- Iir_Kind_Allocator_By_Subtype => 1425,
- Iir_Kind_Selected_Element => 1433,
- Iir_Kind_Dereference => 1438,
- Iir_Kind_Implicit_Dereference => 1443,
- Iir_Kind_Slice_Name => 1450,
- Iir_Kind_Indexed_Name => 1456,
- Iir_Kind_Psl_Expression => 1458,
- Iir_Kind_Sensitized_Process_Statement => 1479,
- Iir_Kind_Process_Statement => 1499,
- Iir_Kind_Concurrent_Simple_Signal_Assignment => 1512,
- Iir_Kind_Concurrent_Conditional_Signal_Assignment => 1525,
- Iir_Kind_Concurrent_Selected_Signal_Assignment => 1539,
- Iir_Kind_Concurrent_Assertion_Statement => 1547,
- Iir_Kind_Concurrent_Procedure_Call_Statement => 1554,
- Iir_Kind_Concurrent_Break_Statement => 1562,
- Iir_Kind_Psl_Assert_Directive => 1575,
- Iir_Kind_Psl_Assume_Directive => 1586,
- Iir_Kind_Psl_Cover_Directive => 1598,
- Iir_Kind_Psl_Restrict_Directive => 1609,
- Iir_Kind_Block_Statement => 1623,
- Iir_Kind_If_Generate_Statement => 1634,
- Iir_Kind_Case_Generate_Statement => 1643,
- Iir_Kind_For_Generate_Statement => 1652,
- Iir_Kind_Component_Instantiation_Statement => 1663,
- Iir_Kind_Psl_Default_Clock => 1667,
- Iir_Kind_Generate_Statement_Body => 1678,
- Iir_Kind_If_Generate_Else_Clause => 1684,
- Iir_Kind_Simple_Simultaneous_Statement => 1691,
- Iir_Kind_Simultaneous_Procedural_Statement => 1699,
- Iir_Kind_Simultaneous_If_Statement => 1708,
- Iir_Kind_Simultaneous_Elsif => 1714,
- Iir_Kind_Simple_Signal_Assignment_Statement => 1725,
- Iir_Kind_Conditional_Signal_Assignment_Statement => 1736,
- Iir_Kind_Selected_Waveform_Assignment_Statement => 1748,
- Iir_Kind_Null_Statement => 1752,
- Iir_Kind_Assertion_Statement => 1759,
- Iir_Kind_Report_Statement => 1765,
- Iir_Kind_Wait_Statement => 1773,
- Iir_Kind_Variable_Assignment_Statement => 1780,
- Iir_Kind_Conditional_Variable_Assignment_Statement => 1787,
- Iir_Kind_Return_Statement => 1793,
- Iir_Kind_For_Loop_Statement => 1804,
- Iir_Kind_While_Loop_Statement => 1815,
- Iir_Kind_Next_Statement => 1822,
- Iir_Kind_Exit_Statement => 1829,
- Iir_Kind_Case_Statement => 1837,
- Iir_Kind_Procedure_Call_Statement => 1843,
- Iir_Kind_Break_Statement => 1850,
- Iir_Kind_If_Statement => 1860,
- Iir_Kind_Elsif => 1866,
- Iir_Kind_Character_Literal => 1874,
- Iir_Kind_Simple_Name => 1882,
- Iir_Kind_Selected_Name => 1891,
- Iir_Kind_Operator_Symbol => 1897,
- Iir_Kind_Reference_Name => 1902,
- Iir_Kind_External_Constant_Name => 1910,
- Iir_Kind_External_Signal_Name => 1918,
- Iir_Kind_External_Variable_Name => 1927,
- Iir_Kind_Selected_By_All_Name => 1933,
- Iir_Kind_Parenthesis_Name => 1938,
- Iir_Kind_Package_Pathname => 1942,
- Iir_Kind_Absolute_Pathname => 1943,
- Iir_Kind_Relative_Pathname => 1944,
- Iir_Kind_Pathname_Element => 1949,
- Iir_Kind_Base_Attribute => 1951,
- Iir_Kind_Subtype_Attribute => 1956,
- Iir_Kind_Element_Attribute => 1961,
- Iir_Kind_Across_Attribute => 1966,
- Iir_Kind_Through_Attribute => 1971,
- Iir_Kind_Nature_Reference_Attribute => 1975,
- Iir_Kind_Left_Type_Attribute => 1980,
- Iir_Kind_Right_Type_Attribute => 1985,
- Iir_Kind_High_Type_Attribute => 1990,
- Iir_Kind_Low_Type_Attribute => 1995,
- Iir_Kind_Ascending_Type_Attribute => 2000,
- Iir_Kind_Image_Attribute => 2006,
- Iir_Kind_Value_Attribute => 2012,
- Iir_Kind_Pos_Attribute => 2018,
- Iir_Kind_Val_Attribute => 2024,
- Iir_Kind_Succ_Attribute => 2030,
- Iir_Kind_Pred_Attribute => 2036,
- Iir_Kind_Leftof_Attribute => 2042,
- Iir_Kind_Rightof_Attribute => 2048,
- Iir_Kind_Signal_Slew_Attribute => 2056,
- Iir_Kind_Quantity_Slew_Attribute => 2064,
- Iir_Kind_Ramp_Attribute => 2072,
- Iir_Kind_Dot_Attribute => 2079,
- Iir_Kind_Integ_Attribute => 2086,
- Iir_Kind_Above_Attribute => 2094,
- Iir_Kind_Delayed_Attribute => 2103,
- Iir_Kind_Stable_Attribute => 2112,
- Iir_Kind_Quiet_Attribute => 2121,
- Iir_Kind_Transaction_Attribute => 2130,
- Iir_Kind_Event_Attribute => 2134,
- Iir_Kind_Active_Attribute => 2138,
- Iir_Kind_Last_Event_Attribute => 2142,
- Iir_Kind_Last_Active_Attribute => 2146,
- Iir_Kind_Last_Value_Attribute => 2150,
- Iir_Kind_Driving_Attribute => 2154,
- Iir_Kind_Driving_Value_Attribute => 2158,
- Iir_Kind_Behavior_Attribute => 2158,
- Iir_Kind_Structure_Attribute => 2158,
- Iir_Kind_Simple_Name_Attribute => 2165,
- Iir_Kind_Instance_Name_Attribute => 2170,
- Iir_Kind_Path_Name_Attribute => 2175,
- Iir_Kind_Left_Array_Attribute => 2182,
- Iir_Kind_Right_Array_Attribute => 2189,
- Iir_Kind_High_Array_Attribute => 2196,
- Iir_Kind_Low_Array_Attribute => 2203,
- Iir_Kind_Length_Array_Attribute => 2210,
- Iir_Kind_Ascending_Array_Attribute => 2217,
- Iir_Kind_Range_Array_Attribute => 2224,
- Iir_Kind_Reverse_Range_Array_Attribute => 2231,
- Iir_Kind_Attribute_Name => 2240
+ Iir_Kind_Record_Nature_Definition => 503,
+ Iir_Kind_Array_Nature_Definition => 517,
+ Iir_Kind_Array_Subnature_Definition => 532,
+ Iir_Kind_Overload_List => 533,
+ Iir_Kind_Entity_Declaration => 546,
+ Iir_Kind_Configuration_Declaration => 555,
+ Iir_Kind_Context_Declaration => 561,
+ Iir_Kind_Package_Declaration => 576,
+ Iir_Kind_Package_Instantiation_Declaration => 590,
+ Iir_Kind_Vmode_Declaration => 601,
+ Iir_Kind_Vprop_Declaration => 612,
+ Iir_Kind_Vunit_Declaration => 624,
+ Iir_Kind_Package_Body => 632,
+ Iir_Kind_Architecture_Body => 645,
+ Iir_Kind_Type_Declaration => 652,
+ Iir_Kind_Anonymous_Type_Declaration => 658,
+ Iir_Kind_Subtype_Declaration => 665,
+ Iir_Kind_Nature_Declaration => 671,
+ Iir_Kind_Subnature_Declaration => 678,
+ Iir_Kind_Package_Header => 680,
+ Iir_Kind_Unit_Declaration => 689,
+ Iir_Kind_Library_Declaration => 696,
+ Iir_Kind_Component_Declaration => 706,
+ Iir_Kind_Attribute_Declaration => 713,
+ Iir_Kind_Group_Template_Declaration => 719,
+ Iir_Kind_Group_Declaration => 726,
+ Iir_Kind_Element_Declaration => 733,
+ Iir_Kind_Nature_Element_Declaration => 740,
+ Iir_Kind_Non_Object_Alias_Declaration => 748,
+ Iir_Kind_Psl_Declaration => 756,
+ Iir_Kind_Psl_Endpoint_Declaration => 770,
+ Iir_Kind_Enumeration_Literal => 781,
+ Iir_Kind_Function_Declaration => 806,
+ Iir_Kind_Procedure_Declaration => 830,
+ Iir_Kind_Function_Body => 840,
+ Iir_Kind_Procedure_Body => 851,
+ Iir_Kind_Terminal_Declaration => 860,
+ Iir_Kind_Object_Alias_Declaration => 871,
+ Iir_Kind_Free_Quantity_Declaration => 883,
+ Iir_Kind_Spectrum_Quantity_Declaration => 896,
+ Iir_Kind_Noise_Quantity_Declaration => 908,
+ Iir_Kind_Across_Quantity_Declaration => 924,
+ Iir_Kind_Through_Quantity_Declaration => 940,
+ Iir_Kind_File_Declaration => 954,
+ Iir_Kind_Guard_Signal_Declaration => 967,
+ Iir_Kind_Signal_Declaration => 984,
+ Iir_Kind_Variable_Declaration => 997,
+ Iir_Kind_Constant_Declaration => 1011,
+ Iir_Kind_Iterator_Declaration => 1022,
+ Iir_Kind_Interface_Constant_Declaration => 1038,
+ Iir_Kind_Interface_Variable_Declaration => 1054,
+ Iir_Kind_Interface_Signal_Declaration => 1075,
+ Iir_Kind_Interface_File_Declaration => 1091,
+ Iir_Kind_Interface_Quantity_Declaration => 1107,
+ Iir_Kind_Interface_Terminal_Declaration => 1119,
+ Iir_Kind_Interface_Type_Declaration => 1129,
+ Iir_Kind_Interface_Package_Declaration => 1141,
+ Iir_Kind_Interface_Function_Declaration => 1158,
+ Iir_Kind_Interface_Procedure_Declaration => 1171,
+ Iir_Kind_Anonymous_Signal_Declaration => 1180,
+ Iir_Kind_Signal_Attribute_Declaration => 1183,
+ Iir_Kind_Identity_Operator => 1187,
+ Iir_Kind_Negation_Operator => 1191,
+ Iir_Kind_Absolute_Operator => 1195,
+ Iir_Kind_Not_Operator => 1199,
+ Iir_Kind_Implicit_Condition_Operator => 1203,
+ Iir_Kind_Condition_Operator => 1207,
+ Iir_Kind_Reduction_And_Operator => 1211,
+ Iir_Kind_Reduction_Or_Operator => 1215,
+ Iir_Kind_Reduction_Nand_Operator => 1219,
+ Iir_Kind_Reduction_Nor_Operator => 1223,
+ Iir_Kind_Reduction_Xor_Operator => 1227,
+ Iir_Kind_Reduction_Xnor_Operator => 1231,
+ Iir_Kind_And_Operator => 1236,
+ Iir_Kind_Or_Operator => 1241,
+ Iir_Kind_Nand_Operator => 1246,
+ Iir_Kind_Nor_Operator => 1251,
+ Iir_Kind_Xor_Operator => 1256,
+ Iir_Kind_Xnor_Operator => 1261,
+ Iir_Kind_Equality_Operator => 1266,
+ Iir_Kind_Inequality_Operator => 1271,
+ Iir_Kind_Less_Than_Operator => 1276,
+ Iir_Kind_Less_Than_Or_Equal_Operator => 1281,
+ Iir_Kind_Greater_Than_Operator => 1286,
+ Iir_Kind_Greater_Than_Or_Equal_Operator => 1291,
+ Iir_Kind_Match_Equality_Operator => 1296,
+ Iir_Kind_Match_Inequality_Operator => 1301,
+ Iir_Kind_Match_Less_Than_Operator => 1306,
+ Iir_Kind_Match_Less_Than_Or_Equal_Operator => 1311,
+ Iir_Kind_Match_Greater_Than_Operator => 1316,
+ Iir_Kind_Match_Greater_Than_Or_Equal_Operator => 1321,
+ Iir_Kind_Sll_Operator => 1326,
+ Iir_Kind_Sla_Operator => 1331,
+ Iir_Kind_Srl_Operator => 1336,
+ Iir_Kind_Sra_Operator => 1341,
+ Iir_Kind_Rol_Operator => 1346,
+ Iir_Kind_Ror_Operator => 1351,
+ Iir_Kind_Addition_Operator => 1356,
+ Iir_Kind_Substraction_Operator => 1361,
+ Iir_Kind_Concatenation_Operator => 1366,
+ Iir_Kind_Multiplication_Operator => 1371,
+ Iir_Kind_Division_Operator => 1376,
+ Iir_Kind_Modulus_Operator => 1381,
+ Iir_Kind_Remainder_Operator => 1386,
+ Iir_Kind_Exponentiation_Operator => 1391,
+ Iir_Kind_Function_Call => 1399,
+ Iir_Kind_Aggregate => 1406,
+ Iir_Kind_Parenthesis_Expression => 1409,
+ Iir_Kind_Qualified_Expression => 1413,
+ Iir_Kind_Type_Conversion => 1418,
+ Iir_Kind_Allocator_By_Expression => 1422,
+ Iir_Kind_Allocator_By_Subtype => 1427,
+ Iir_Kind_Selected_Element => 1435,
+ Iir_Kind_Dereference => 1440,
+ Iir_Kind_Implicit_Dereference => 1445,
+ Iir_Kind_Slice_Name => 1452,
+ Iir_Kind_Indexed_Name => 1458,
+ Iir_Kind_Psl_Expression => 1460,
+ Iir_Kind_Sensitized_Process_Statement => 1481,
+ Iir_Kind_Process_Statement => 1501,
+ Iir_Kind_Concurrent_Simple_Signal_Assignment => 1514,
+ Iir_Kind_Concurrent_Conditional_Signal_Assignment => 1527,
+ Iir_Kind_Concurrent_Selected_Signal_Assignment => 1541,
+ Iir_Kind_Concurrent_Assertion_Statement => 1549,
+ Iir_Kind_Concurrent_Procedure_Call_Statement => 1556,
+ Iir_Kind_Concurrent_Break_Statement => 1564,
+ Iir_Kind_Psl_Assert_Directive => 1577,
+ Iir_Kind_Psl_Assume_Directive => 1588,
+ Iir_Kind_Psl_Cover_Directive => 1600,
+ Iir_Kind_Psl_Restrict_Directive => 1611,
+ Iir_Kind_Block_Statement => 1625,
+ Iir_Kind_If_Generate_Statement => 1636,
+ Iir_Kind_Case_Generate_Statement => 1645,
+ Iir_Kind_For_Generate_Statement => 1654,
+ Iir_Kind_Component_Instantiation_Statement => 1665,
+ Iir_Kind_Psl_Default_Clock => 1669,
+ Iir_Kind_Generate_Statement_Body => 1680,
+ Iir_Kind_If_Generate_Else_Clause => 1686,
+ Iir_Kind_Simple_Simultaneous_Statement => 1693,
+ Iir_Kind_Simultaneous_Procedural_Statement => 1701,
+ Iir_Kind_Simultaneous_If_Statement => 1710,
+ Iir_Kind_Simultaneous_Elsif => 1716,
+ Iir_Kind_Simple_Signal_Assignment_Statement => 1727,
+ Iir_Kind_Conditional_Signal_Assignment_Statement => 1738,
+ Iir_Kind_Selected_Waveform_Assignment_Statement => 1750,
+ Iir_Kind_Null_Statement => 1754,
+ Iir_Kind_Assertion_Statement => 1761,
+ Iir_Kind_Report_Statement => 1767,
+ Iir_Kind_Wait_Statement => 1775,
+ Iir_Kind_Variable_Assignment_Statement => 1782,
+ Iir_Kind_Conditional_Variable_Assignment_Statement => 1789,
+ Iir_Kind_Return_Statement => 1795,
+ Iir_Kind_For_Loop_Statement => 1806,
+ Iir_Kind_While_Loop_Statement => 1817,
+ Iir_Kind_Next_Statement => 1824,
+ Iir_Kind_Exit_Statement => 1831,
+ Iir_Kind_Case_Statement => 1839,
+ Iir_Kind_Procedure_Call_Statement => 1845,
+ Iir_Kind_Break_Statement => 1852,
+ Iir_Kind_If_Statement => 1862,
+ Iir_Kind_Elsif => 1868,
+ Iir_Kind_Character_Literal => 1876,
+ Iir_Kind_Simple_Name => 1884,
+ Iir_Kind_Selected_Name => 1893,
+ Iir_Kind_Operator_Symbol => 1899,
+ Iir_Kind_Reference_Name => 1904,
+ Iir_Kind_External_Constant_Name => 1912,
+ Iir_Kind_External_Signal_Name => 1920,
+ Iir_Kind_External_Variable_Name => 1929,
+ Iir_Kind_Selected_By_All_Name => 1935,
+ Iir_Kind_Parenthesis_Name => 1940,
+ Iir_Kind_Package_Pathname => 1944,
+ Iir_Kind_Absolute_Pathname => 1945,
+ Iir_Kind_Relative_Pathname => 1946,
+ Iir_Kind_Pathname_Element => 1951,
+ Iir_Kind_Base_Attribute => 1953,
+ Iir_Kind_Subtype_Attribute => 1958,
+ Iir_Kind_Element_Attribute => 1963,
+ Iir_Kind_Across_Attribute => 1968,
+ Iir_Kind_Through_Attribute => 1973,
+ Iir_Kind_Nature_Reference_Attribute => 1977,
+ Iir_Kind_Left_Type_Attribute => 1982,
+ Iir_Kind_Right_Type_Attribute => 1987,
+ Iir_Kind_High_Type_Attribute => 1992,
+ Iir_Kind_Low_Type_Attribute => 1997,
+ Iir_Kind_Ascending_Type_Attribute => 2002,
+ Iir_Kind_Image_Attribute => 2008,
+ Iir_Kind_Value_Attribute => 2014,
+ Iir_Kind_Pos_Attribute => 2020,
+ Iir_Kind_Val_Attribute => 2026,
+ Iir_Kind_Succ_Attribute => 2032,
+ Iir_Kind_Pred_Attribute => 2038,
+ Iir_Kind_Leftof_Attribute => 2044,
+ Iir_Kind_Rightof_Attribute => 2050,
+ Iir_Kind_Signal_Slew_Attribute => 2058,
+ Iir_Kind_Quantity_Slew_Attribute => 2066,
+ Iir_Kind_Ramp_Attribute => 2074,
+ Iir_Kind_Dot_Attribute => 2081,
+ Iir_Kind_Integ_Attribute => 2088,
+ Iir_Kind_Above_Attribute => 2096,
+ Iir_Kind_Delayed_Attribute => 2105,
+ Iir_Kind_Stable_Attribute => 2114,
+ Iir_Kind_Quiet_Attribute => 2123,
+ Iir_Kind_Transaction_Attribute => 2132,
+ Iir_Kind_Event_Attribute => 2136,
+ Iir_Kind_Active_Attribute => 2140,
+ Iir_Kind_Last_Event_Attribute => 2144,
+ Iir_Kind_Last_Active_Attribute => 2148,
+ Iir_Kind_Last_Value_Attribute => 2152,
+ Iir_Kind_Driving_Attribute => 2156,
+ Iir_Kind_Driving_Value_Attribute => 2160,
+ Iir_Kind_Behavior_Attribute => 2160,
+ Iir_Kind_Structure_Attribute => 2160,
+ Iir_Kind_Simple_Name_Attribute => 2167,
+ Iir_Kind_Instance_Name_Attribute => 2172,
+ Iir_Kind_Path_Name_Attribute => 2177,
+ Iir_Kind_Left_Array_Attribute => 2184,
+ Iir_Kind_Right_Array_Attribute => 2191,
+ Iir_Kind_High_Array_Attribute => 2198,
+ Iir_Kind_Low_Array_Attribute => 2205,
+ Iir_Kind_Length_Array_Attribute => 2212,
+ Iir_Kind_Ascending_Array_Attribute => 2219,
+ Iir_Kind_Range_Array_Attribute => 2226,
+ Iir_Kind_Reverse_Range_Array_Attribute => 2233,
+ Iir_Kind_Attribute_Name => 2242
);
function Get_Fields_First (K : Iir_Kind) return Fields_Index is
@@ -5864,6 +5871,8 @@ package body Vhdl.Nodes_Meta is
return Get_Right_Limit_Expr (N);
when Field_Base_Type =>
return Get_Base_Type (N);
+ when Field_Simple_Nature =>
+ return Get_Simple_Nature (N);
when Field_Base_Nature =>
return Get_Base_Nature (N);
when Field_Resolution_Indication =>
@@ -6306,6 +6315,8 @@ package body Vhdl.Nodes_Meta is
Set_Right_Limit_Expr (N, V);
when Field_Base_Type =>
Set_Base_Type (N, V);
+ when Field_Simple_Nature =>
+ Set_Simple_Nature (N, V);
when Field_Base_Nature =>
Set_Base_Nature (N, V);
when Field_Resolution_Indication =>
@@ -9231,6 +9242,17 @@ package body Vhdl.Nodes_Meta is
end case;
end Has_Base_Type;
+ function Has_Simple_Nature (K : Iir_Kind) return Boolean is
+ begin
+ case K is
+ when Iir_Kind_Record_Nature_Definition
+ | Iir_Kind_Array_Nature_Definition =>
+ return True;
+ when others =>
+ return False;
+ end case;
+ end Has_Simple_Nature;
+
function Has_Base_Nature (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 3e1ee37b7..a3a9c66c6 100644
--- a/src/vhdl/vhdl-nodes_meta.ads
+++ b/src/vhdl/vhdl-nodes_meta.ads
@@ -210,6 +210,7 @@ package Vhdl.Nodes_Meta is
Field_Left_Limit_Expr,
Field_Right_Limit_Expr,
Field_Base_Type,
+ Field_Simple_Nature,
Field_Base_Nature,
Field_Resolution_Indication,
Field_Record_Element_Resolution_Chain,
@@ -767,6 +768,7 @@ package Vhdl.Nodes_Meta is
function Has_Left_Limit_Expr (K : Iir_Kind) return Boolean;
function Has_Right_Limit_Expr (K : Iir_Kind) return Boolean;
function Has_Base_Type (K : Iir_Kind) return Boolean;
+ function Has_Simple_Nature (K : Iir_Kind) return Boolean;
function Has_Base_Nature (K : Iir_Kind) return Boolean;
function Has_Resolution_Indication (K : Iir_Kind) return Boolean;
function Has_Record_Element_Resolution_Chain (K : Iir_Kind)
diff --git a/src/vhdl/vhdl-sem_decls.adb b/src/vhdl/vhdl-sem_decls.adb
index 0ca43ddf1..23458bd35 100644
--- a/src/vhdl/vhdl-sem_decls.adb
+++ b/src/vhdl/vhdl-sem_decls.adb
@@ -2093,11 +2093,11 @@ package body Vhdl.Sem_Decls is
procedure Sem_Branch_Quantity_Declaration (Decl : Iir; Last_Decl : Iir)
is
Plus_Name : Iir;
- Plus_Ref : Iir;
Minus_Name : Iir;
Branch_Type : Iir;
Value : Iir;
Is_Second : Boolean;
+ Nat : Iir;
begin
Sem_Scopes.Add_Name (Decl);
Xref_Decl (Decl);
@@ -2119,22 +2119,82 @@ package body Vhdl.Sem_Decls is
Minus_Name := Sem_Terminal_Name (Minus_Name);
Set_Minus_Terminal_Name (Decl, Minus_Name);
Minus_Name := Strip_Denoting_Name (Minus_Name);
+ else
+ -- AMS-LRM17 6.4.2.7 Quantity declarations
+ -- A terminal aspect that does not include an explicit minus
+ -- terminal name is equivalent to a terminal aspect with the
+ -- given plus terminal name and the name of the reference
+ -- terminal of the simple nature of its nature as the minus
+ -- terminal name.
+ --
+ -- GHDL: FIXME: isn't it self-referential with the definition of
+ -- the terminal nature ?
+ Minus_Name := Get_Reference
+ (Get_Nature_Simple_Nature (Get_Nature (Plus_Name)));
end if;
Value := Get_Default_Value (Decl);
end if;
Set_Plus_Terminal (Decl, Plus_Name);
Set_Minus_Terminal (Decl, Minus_Name);
- Plus_Ref := Get_Nature (Plus_Name);
+
+ declare
+ Plus_Nature : constant Iir := Get_Nature (Plus_Name);
+ Minus_Nature : constant Iir := Get_Nature (Minus_Name);
+ Plus_Composite : constant Boolean :=
+ Is_Composite_Nature (Plus_Nature);
+ Minus_Composite : constant Boolean :=
+ Is_Composite_Nature (Minus_Nature);
+ begin
+ -- AMS-LRM17 6.4.2.7 Quantity declarations
+ -- If the terminals denoted by the terminal names of a terminal
+ -- aspect are both of composite natures, then they shall be of the
+ -- same nature, [and for each element of the plus terminal there
+ -- shall be a matching element of the minus terminal.]
+ -- If one terminal is a terminal of a composite nature and the
+ -- other of a scalar nature, then the scalar nature nature shall be
+ -- the nature of the scalar subelements of the composite terminal.
+ if (Plus_Composite and Minus_Composite)
+ or else (not Plus_Composite and not Minus_Composite)
+ then
+ if Get_Base_Nature (Plus_Nature) /= Get_Base_Nature (Minus_Nature)
+ then
+ Error_Msg_Sem
+ (+Decl, "terminals must be of the same nature");
+ end if;
+ Nat := Plus_Nature;
+ elsif Plus_Composite then
+ pragma Assert (not Minus_Composite);
+ if (Get_Nature_Simple_Nature (Plus_Nature)
+ /= Get_Base_Nature (Minus_Nature))
+ then
+ Error_Msg_Sem
+ (+Decl, "minus terminal must be of the nature of "
+ & "plus subelements");
+ end if;
+ Nat := Plus_Nature;
+ else
+ pragma Assert (Minus_Composite and not Plus_Composite);
+ if (Get_Nature_Simple_Nature (Minus_Nature)
+ /= Get_Base_Nature (Plus_Nature))
+ then
+ Error_Msg_Sem
+ (+Decl, "plus terminal must be of the nature of "
+ & "minus subelements");
+ end if;
+ Nat := Minus_Nature;
+ end if;
+ end;
case Iir_Kinds_Branch_Quantity_Declaration (Get_Kind (Decl)) is
when Iir_Kind_Across_Quantity_Declaration =>
- Branch_Type := Get_Across_Type (Plus_Ref);
+ Branch_Type := Get_Across_Type (Nat);
when Iir_Kind_Through_Quantity_Declaration =>
- Branch_Type := Get_Through_Type (Plus_Ref);
+ Branch_Type := Get_Through_Type (Nat);
end case;
pragma Assert (Branch_Type /= Null_Iir);
Set_Type (Decl, Branch_Type);
Set_Name_Staticness (Decl, Locally);
+ Set_Expr_Staticness (Decl, None);
if not Is_Second and then Value /= Null_Iir then
Value := Sem_Expression (Value, Branch_Type);
diff --git a/src/vhdl/vhdl-sem_types.adb b/src/vhdl/vhdl-sem_types.adb
index a72a3b4ad..6e9b87928 100644
--- a/src/vhdl/vhdl-sem_types.adb
+++ b/src/vhdl/vhdl-sem_types.adb
@@ -2447,7 +2447,7 @@ package body Vhdl.Sem_Types is
St_Def := Create_Iir (Iir_Kind_Array_Subtype_Definition);
Location_Copy (St_Def, Def);
Set_Index_Subtype_List (St_Def, Get_Index_Subtype_List (Def));
- Set_Element_Subtype (St_Def, Get_Element_Subtype (St_Def));
+ Set_Element_Subtype (St_Def, Get_Element_Subtype (Br_Def));
Set_Base_Type (St_Def, Get_Base_Type (Br_Def));
Set_Type_Staticness (St_Def, Get_Nature_Staticness (Def));
Set_Constraint_State (St_Def, Get_Constraint_State (Def));
@@ -2543,6 +2543,8 @@ package body Vhdl.Sem_Types is
El_Nat := Get_Named_Entity (El_Nat);
El_Nat := Get_Nature (El_Nat);
Set_Element_Subnature (Def, El_Nat);
+
+ Set_Simple_Nature (Def, Get_Nature_Simple_Nature (El_Nat));
end if;
Set_Base_Nature (Def, Def);
@@ -2575,6 +2577,7 @@ package body Vhdl.Sem_Types is
Nature_Staticness : Iir_Staticness;
Constraint : Iir_Constraint;
Composite_Found : Boolean;
+ Simple_Nature : Iir;
begin
-- AMS-LRM17 12.1 Declarative region
-- f) A record nature declaration
@@ -2584,6 +2587,7 @@ package body Vhdl.Sem_Types is
Nature_Staticness := Locally;
Constraint := Fully_Constrained;
Composite_Found := False;
+ Simple_Nature := Null_Iir;
for I in Flist_First .. Flist_Last (El_List) loop
El := Get_Nth_Element (El_List, I);
@@ -2600,6 +2604,17 @@ package body Vhdl.Sem_Types is
if El_Nat /= Null_Iir then
Set_Nature (El, El_Nat);
+ -- AMS-LRM17 5.8.3 Composite natures
+ -- The scalar subelements of a composite nature shall all have
+ -- the same simple nature, [...]
+ if Simple_Nature = Null_Iir then
+ Simple_Nature := Get_Nature_Simple_Nature (El_Nat);
+ Set_Simple_Nature (Def, El_Nat);
+ elsif Get_Nature_Simple_Nature (El_Nat) /= Simple_Nature then
+ Error_Msg_Sem
+ (+El, "elements must have the same simple nature");
+ end if;
+
-- LRM93 3.2.1.1
-- The same requirement [must define a constrained array
-- subtype] exits for the subtype indication of an
@@ -2739,4 +2754,28 @@ package body Vhdl.Sem_Types is
end case;
end Is_Nature_Type;
+ function Get_Nature_Simple_Nature (Nat : Iir) return Iir is
+ begin
+ case Iir_Kinds_Nature_Indication (Get_Kind (Nat)) is
+ when Iir_Kind_Scalar_Nature_Definition =>
+ return Nat;
+ when Iir_Kind_Array_Nature_Definition
+ | Iir_Kind_Record_Nature_Definition =>
+ return Get_Simple_Nature (Nat);
+ when Iir_Kind_Array_Subnature_Definition =>
+ return Get_Simple_Nature (Get_Base_Nature (Nat));
+ end case;
+ end Get_Nature_Simple_Nature;
+
+ function Is_Composite_Nature (Nat : Iir) return Boolean is
+ begin
+ case Iir_Kinds_Nature_Indication (Get_Kind (Nat)) is
+ when Iir_Kind_Scalar_Nature_Definition =>
+ return False;
+ when Iir_Kind_Array_Nature_Definition
+ | Iir_Kind_Record_Nature_Definition
+ | Iir_Kind_Array_Subnature_Definition =>
+ return True;
+ end case;
+ end Is_Composite_Nature;
end Vhdl.Sem_Types;
diff --git a/src/vhdl/vhdl-sem_types.ads b/src/vhdl/vhdl-sem_types.ads
index f104f2428..996dae14f 100644
--- a/src/vhdl/vhdl-sem_types.ads
+++ b/src/vhdl/vhdl-sem_types.ads
@@ -74,4 +74,17 @@ package Vhdl.Sem_Types is
--
-- Return true iff DTYPE is a nature type.
function Is_Nature_Type (Dtype : Iir) return Boolean;
+
+ -- Return the simple nature of NAT.
+ --
+ -- AMS-LRM17 5.8.2 Scalar natures
+ -- The simple nature of a scalar nature is the nature itself.
+ --
+ -- AMS-LRM17 5.8.3 Composite natures
+ -- The scalar subelements of a composite nature shall have the same simple
+ -- nature, which is also the simple nature of the composite nature.
+ function Get_Nature_Simple_Nature (Nat : Iir) return Iir;
+
+ -- Return TRUE iff nature NAT is a composite nature.
+ function Is_Composite_Nature (Nat : Iir) return Boolean;
end Vhdl.Sem_Types;