aboutsummaryrefslogtreecommitdiffstats
path: root/src/vhdl
diff options
context:
space:
mode:
Diffstat (limited to 'src/vhdl')
-rw-r--r--src/vhdl/iirs.ads7
-rw-r--r--src/vhdl/nodes_meta.adb368
-rw-r--r--src/vhdl/sem_expr.adb45
-rw-r--r--src/vhdl/simulate/simul-execution.adb4
-rw-r--r--src/vhdl/std_package.adb130
-rw-r--r--src/vhdl/std_package.ads8
-rw-r--r--src/vhdl/translate/ortho_front.adb16
-rw-r--r--src/vhdl/translate/trans-chap12.adb8
-rw-r--r--src/vhdl/translate/trans-chap12.ads6
-rw-r--r--src/vhdl/translate/translation.adb3
-rw-r--r--src/vhdl/translate/translation.ads7
11 files changed, 352 insertions, 250 deletions
diff --git a/src/vhdl/iirs.ads b/src/vhdl/iirs.ads
index f7985f6d4..33ac760f0 100644
--- a/src/vhdl/iirs.ads
+++ b/src/vhdl/iirs.ads
@@ -2162,6 +2162,9 @@ package Iirs is
-- Get/Set_Name_Staticness (State2)
--
-- Get/Set_Visible_Flag (Flag4)
+ --
+ -- Used for time literals, to compute minimal resolution.
+ -- Get/Set_Use_Flag (Flag6)
-- LRM08 5.2 Scalar types
--
@@ -4966,6 +4969,10 @@ package Iirs is
--Iir_Kind_Physical_Int_Literal
Iir_Kind_Physical_Fp_Literal;
+ subtype Iir_Kinds_Physical_Literal is Iir_Kind range
+ Iir_Kind_Physical_Int_Literal ..
+ Iir_Kind_Physical_Fp_Literal;
+
subtype Iir_Kinds_Array_Type_Definition is Iir_Kind range
Iir_Kind_Array_Type_Definition ..
Iir_Kind_Array_Subtype_Definition;
diff --git a/src/vhdl/nodes_meta.adb b/src/vhdl/nodes_meta.adb
index fe1b2353b..b14c47b93 100644
--- a/src/vhdl/nodes_meta.adb
+++ b/src/vhdl/nodes_meta.adb
@@ -2864,6 +2864,7 @@ package body Nodes_Meta is
-- Iir_Kind_Unit_Declaration
Field_Identifier,
Field_Visible_Flag,
+ Field_Use_Flag,
Field_Expr_Staticness,
Field_Name_Staticness,
Field_Parent,
@@ -4482,189 +4483,189 @@ package body Nodes_Meta is
Iir_Kind_Package_Body => 551,
Iir_Kind_Architecture_Body => 563,
Iir_Kind_Package_Header => 565,
- Iir_Kind_Unit_Declaration => 573,
- Iir_Kind_Library_Declaration => 580,
- Iir_Kind_Component_Declaration => 590,
- Iir_Kind_Attribute_Declaration => 597,
- Iir_Kind_Group_Template_Declaration => 603,
- Iir_Kind_Group_Declaration => 610,
- Iir_Kind_Element_Declaration => 618,
- Iir_Kind_Non_Object_Alias_Declaration => 626,
- Iir_Kind_Psl_Declaration => 634,
- Iir_Kind_Psl_Endpoint_Declaration => 648,
- Iir_Kind_Terminal_Declaration => 654,
- Iir_Kind_Free_Quantity_Declaration => 663,
- Iir_Kind_Across_Quantity_Declaration => 675,
- Iir_Kind_Through_Quantity_Declaration => 687,
- Iir_Kind_Enumeration_Literal => 698,
- Iir_Kind_Function_Declaration => 723,
- Iir_Kind_Procedure_Declaration => 747,
- Iir_Kind_Function_Body => 757,
- Iir_Kind_Procedure_Body => 768,
- Iir_Kind_Object_Alias_Declaration => 779,
- Iir_Kind_File_Declaration => 793,
- Iir_Kind_Guard_Signal_Declaration => 806,
- Iir_Kind_Signal_Declaration => 823,
- Iir_Kind_Variable_Declaration => 836,
- Iir_Kind_Constant_Declaration => 850,
- Iir_Kind_Iterator_Declaration => 861,
- Iir_Kind_Interface_Constant_Declaration => 877,
- Iir_Kind_Interface_Variable_Declaration => 893,
- Iir_Kind_Interface_Signal_Declaration => 914,
- Iir_Kind_Interface_File_Declaration => 930,
- Iir_Kind_Interface_Type_Declaration => 940,
- Iir_Kind_Interface_Package_Declaration => 952,
- Iir_Kind_Interface_Function_Declaration => 969,
- Iir_Kind_Interface_Procedure_Declaration => 982,
- Iir_Kind_Signal_Attribute_Declaration => 985,
- Iir_Kind_Identity_Operator => 989,
- Iir_Kind_Negation_Operator => 993,
- Iir_Kind_Absolute_Operator => 997,
- Iir_Kind_Not_Operator => 1001,
- Iir_Kind_Implicit_Condition_Operator => 1005,
- Iir_Kind_Condition_Operator => 1009,
- Iir_Kind_Reduction_And_Operator => 1013,
- Iir_Kind_Reduction_Or_Operator => 1017,
- Iir_Kind_Reduction_Nand_Operator => 1021,
- Iir_Kind_Reduction_Nor_Operator => 1025,
- Iir_Kind_Reduction_Xor_Operator => 1029,
- Iir_Kind_Reduction_Xnor_Operator => 1033,
- Iir_Kind_And_Operator => 1038,
- Iir_Kind_Or_Operator => 1043,
- Iir_Kind_Nand_Operator => 1048,
- Iir_Kind_Nor_Operator => 1053,
- Iir_Kind_Xor_Operator => 1058,
- Iir_Kind_Xnor_Operator => 1063,
- Iir_Kind_Equality_Operator => 1068,
- Iir_Kind_Inequality_Operator => 1073,
- Iir_Kind_Less_Than_Operator => 1078,
- Iir_Kind_Less_Than_Or_Equal_Operator => 1083,
- Iir_Kind_Greater_Than_Operator => 1088,
- Iir_Kind_Greater_Than_Or_Equal_Operator => 1093,
- Iir_Kind_Match_Equality_Operator => 1098,
- Iir_Kind_Match_Inequality_Operator => 1103,
- Iir_Kind_Match_Less_Than_Operator => 1108,
- Iir_Kind_Match_Less_Than_Or_Equal_Operator => 1113,
- Iir_Kind_Match_Greater_Than_Operator => 1118,
- Iir_Kind_Match_Greater_Than_Or_Equal_Operator => 1123,
- Iir_Kind_Sll_Operator => 1128,
- Iir_Kind_Sla_Operator => 1133,
- Iir_Kind_Srl_Operator => 1138,
- Iir_Kind_Sra_Operator => 1143,
- Iir_Kind_Rol_Operator => 1148,
- Iir_Kind_Ror_Operator => 1153,
- Iir_Kind_Addition_Operator => 1158,
- Iir_Kind_Substraction_Operator => 1163,
- Iir_Kind_Concatenation_Operator => 1168,
- Iir_Kind_Multiplication_Operator => 1173,
- Iir_Kind_Division_Operator => 1178,
- Iir_Kind_Modulus_Operator => 1183,
- Iir_Kind_Remainder_Operator => 1188,
- Iir_Kind_Exponentiation_Operator => 1193,
- Iir_Kind_Function_Call => 1201,
- Iir_Kind_Aggregate => 1208,
- Iir_Kind_Parenthesis_Expression => 1211,
- Iir_Kind_Qualified_Expression => 1215,
- Iir_Kind_Type_Conversion => 1220,
- Iir_Kind_Allocator_By_Expression => 1224,
- Iir_Kind_Allocator_By_Subtype => 1229,
- Iir_Kind_Selected_Element => 1236,
- Iir_Kind_Dereference => 1241,
- Iir_Kind_Implicit_Dereference => 1246,
- Iir_Kind_Slice_Name => 1253,
- Iir_Kind_Indexed_Name => 1259,
- Iir_Kind_Psl_Expression => 1261,
- Iir_Kind_Sensitized_Process_Statement => 1282,
- Iir_Kind_Process_Statement => 1302,
- Iir_Kind_Concurrent_Simple_Signal_Assignment => 1314,
- Iir_Kind_Concurrent_Conditional_Signal_Assignment => 1326,
- Iir_Kind_Concurrent_Selected_Signal_Assignment => 1339,
- Iir_Kind_Concurrent_Assertion_Statement => 1347,
- Iir_Kind_Concurrent_Procedure_Call_Statement => 1354,
- Iir_Kind_Psl_Assert_Statement => 1367,
- Iir_Kind_Psl_Cover_Statement => 1380,
- Iir_Kind_Block_Statement => 1393,
- Iir_Kind_If_Generate_Statement => 1404,
- Iir_Kind_Case_Generate_Statement => 1413,
- Iir_Kind_For_Generate_Statement => 1422,
- Iir_Kind_Component_Instantiation_Statement => 1433,
- Iir_Kind_Psl_Default_Clock => 1437,
- Iir_Kind_Simple_Simultaneous_Statement => 1444,
- Iir_Kind_Generate_Statement_Body => 1455,
- Iir_Kind_If_Generate_Else_Clause => 1461,
- Iir_Kind_Simple_Signal_Assignment_Statement => 1471,
- Iir_Kind_Conditional_Signal_Assignment_Statement => 1481,
- Iir_Kind_Selected_Waveform_Assignment_Statement => 1492,
- Iir_Kind_Null_Statement => 1496,
- Iir_Kind_Assertion_Statement => 1503,
- Iir_Kind_Report_Statement => 1509,
- Iir_Kind_Wait_Statement => 1517,
- Iir_Kind_Variable_Assignment_Statement => 1524,
- Iir_Kind_Conditional_Variable_Assignment_Statement => 1531,
- Iir_Kind_Return_Statement => 1537,
- Iir_Kind_For_Loop_Statement => 1546,
- Iir_Kind_While_Loop_Statement => 1555,
- Iir_Kind_Next_Statement => 1562,
- Iir_Kind_Exit_Statement => 1569,
- Iir_Kind_Case_Statement => 1577,
- Iir_Kind_Procedure_Call_Statement => 1583,
- Iir_Kind_If_Statement => 1593,
- Iir_Kind_Elsif => 1599,
- Iir_Kind_Character_Literal => 1607,
- Iir_Kind_Simple_Name => 1615,
- Iir_Kind_Selected_Name => 1624,
- Iir_Kind_Operator_Symbol => 1630,
- Iir_Kind_Reference_Name => 1633,
- Iir_Kind_External_Constant_Name => 1642,
- Iir_Kind_External_Signal_Name => 1651,
- Iir_Kind_External_Variable_Name => 1660,
- Iir_Kind_Selected_By_All_Name => 1666,
- Iir_Kind_Parenthesis_Name => 1671,
- Iir_Kind_Package_Pathname => 1675,
- Iir_Kind_Absolute_Pathname => 1676,
- Iir_Kind_Relative_Pathname => 1677,
- Iir_Kind_Pathname_Element => 1682,
- Iir_Kind_Base_Attribute => 1684,
- Iir_Kind_Subtype_Attribute => 1689,
- Iir_Kind_Element_Attribute => 1694,
- Iir_Kind_Left_Type_Attribute => 1699,
- Iir_Kind_Right_Type_Attribute => 1704,
- Iir_Kind_High_Type_Attribute => 1709,
- Iir_Kind_Low_Type_Attribute => 1714,
- Iir_Kind_Ascending_Type_Attribute => 1719,
- Iir_Kind_Image_Attribute => 1725,
- Iir_Kind_Value_Attribute => 1731,
- Iir_Kind_Pos_Attribute => 1737,
- Iir_Kind_Val_Attribute => 1743,
- Iir_Kind_Succ_Attribute => 1749,
- Iir_Kind_Pred_Attribute => 1755,
- Iir_Kind_Leftof_Attribute => 1761,
- Iir_Kind_Rightof_Attribute => 1767,
- Iir_Kind_Delayed_Attribute => 1776,
- Iir_Kind_Stable_Attribute => 1785,
- Iir_Kind_Quiet_Attribute => 1794,
- Iir_Kind_Transaction_Attribute => 1803,
- Iir_Kind_Event_Attribute => 1807,
- Iir_Kind_Active_Attribute => 1811,
- Iir_Kind_Last_Event_Attribute => 1815,
- Iir_Kind_Last_Active_Attribute => 1819,
- Iir_Kind_Last_Value_Attribute => 1823,
- Iir_Kind_Driving_Attribute => 1827,
- Iir_Kind_Driving_Value_Attribute => 1831,
- Iir_Kind_Behavior_Attribute => 1831,
- Iir_Kind_Structure_Attribute => 1831,
- Iir_Kind_Simple_Name_Attribute => 1838,
- Iir_Kind_Instance_Name_Attribute => 1843,
- Iir_Kind_Path_Name_Attribute => 1848,
- Iir_Kind_Left_Array_Attribute => 1855,
- Iir_Kind_Right_Array_Attribute => 1862,
- Iir_Kind_High_Array_Attribute => 1869,
- Iir_Kind_Low_Array_Attribute => 1876,
- Iir_Kind_Length_Array_Attribute => 1883,
- Iir_Kind_Ascending_Array_Attribute => 1890,
- Iir_Kind_Range_Array_Attribute => 1897,
- Iir_Kind_Reverse_Range_Array_Attribute => 1904,
- Iir_Kind_Attribute_Name => 1913
+ Iir_Kind_Unit_Declaration => 574,
+ Iir_Kind_Library_Declaration => 581,
+ Iir_Kind_Component_Declaration => 591,
+ Iir_Kind_Attribute_Declaration => 598,
+ Iir_Kind_Group_Template_Declaration => 604,
+ Iir_Kind_Group_Declaration => 611,
+ Iir_Kind_Element_Declaration => 619,
+ Iir_Kind_Non_Object_Alias_Declaration => 627,
+ Iir_Kind_Psl_Declaration => 635,
+ Iir_Kind_Psl_Endpoint_Declaration => 649,
+ Iir_Kind_Terminal_Declaration => 655,
+ Iir_Kind_Free_Quantity_Declaration => 664,
+ Iir_Kind_Across_Quantity_Declaration => 676,
+ Iir_Kind_Through_Quantity_Declaration => 688,
+ Iir_Kind_Enumeration_Literal => 699,
+ Iir_Kind_Function_Declaration => 724,
+ Iir_Kind_Procedure_Declaration => 748,
+ Iir_Kind_Function_Body => 758,
+ Iir_Kind_Procedure_Body => 769,
+ Iir_Kind_Object_Alias_Declaration => 780,
+ Iir_Kind_File_Declaration => 794,
+ Iir_Kind_Guard_Signal_Declaration => 807,
+ Iir_Kind_Signal_Declaration => 824,
+ Iir_Kind_Variable_Declaration => 837,
+ Iir_Kind_Constant_Declaration => 851,
+ Iir_Kind_Iterator_Declaration => 862,
+ Iir_Kind_Interface_Constant_Declaration => 878,
+ Iir_Kind_Interface_Variable_Declaration => 894,
+ Iir_Kind_Interface_Signal_Declaration => 915,
+ Iir_Kind_Interface_File_Declaration => 931,
+ Iir_Kind_Interface_Type_Declaration => 941,
+ Iir_Kind_Interface_Package_Declaration => 953,
+ Iir_Kind_Interface_Function_Declaration => 970,
+ Iir_Kind_Interface_Procedure_Declaration => 983,
+ Iir_Kind_Signal_Attribute_Declaration => 986,
+ Iir_Kind_Identity_Operator => 990,
+ Iir_Kind_Negation_Operator => 994,
+ Iir_Kind_Absolute_Operator => 998,
+ Iir_Kind_Not_Operator => 1002,
+ Iir_Kind_Implicit_Condition_Operator => 1006,
+ Iir_Kind_Condition_Operator => 1010,
+ Iir_Kind_Reduction_And_Operator => 1014,
+ Iir_Kind_Reduction_Or_Operator => 1018,
+ Iir_Kind_Reduction_Nand_Operator => 1022,
+ Iir_Kind_Reduction_Nor_Operator => 1026,
+ Iir_Kind_Reduction_Xor_Operator => 1030,
+ Iir_Kind_Reduction_Xnor_Operator => 1034,
+ Iir_Kind_And_Operator => 1039,
+ Iir_Kind_Or_Operator => 1044,
+ Iir_Kind_Nand_Operator => 1049,
+ Iir_Kind_Nor_Operator => 1054,
+ Iir_Kind_Xor_Operator => 1059,
+ Iir_Kind_Xnor_Operator => 1064,
+ Iir_Kind_Equality_Operator => 1069,
+ Iir_Kind_Inequality_Operator => 1074,
+ Iir_Kind_Less_Than_Operator => 1079,
+ Iir_Kind_Less_Than_Or_Equal_Operator => 1084,
+ Iir_Kind_Greater_Than_Operator => 1089,
+ Iir_Kind_Greater_Than_Or_Equal_Operator => 1094,
+ Iir_Kind_Match_Equality_Operator => 1099,
+ Iir_Kind_Match_Inequality_Operator => 1104,
+ Iir_Kind_Match_Less_Than_Operator => 1109,
+ Iir_Kind_Match_Less_Than_Or_Equal_Operator => 1114,
+ Iir_Kind_Match_Greater_Than_Operator => 1119,
+ Iir_Kind_Match_Greater_Than_Or_Equal_Operator => 1124,
+ Iir_Kind_Sll_Operator => 1129,
+ Iir_Kind_Sla_Operator => 1134,
+ Iir_Kind_Srl_Operator => 1139,
+ Iir_Kind_Sra_Operator => 1144,
+ Iir_Kind_Rol_Operator => 1149,
+ Iir_Kind_Ror_Operator => 1154,
+ Iir_Kind_Addition_Operator => 1159,
+ Iir_Kind_Substraction_Operator => 1164,
+ Iir_Kind_Concatenation_Operator => 1169,
+ Iir_Kind_Multiplication_Operator => 1174,
+ Iir_Kind_Division_Operator => 1179,
+ Iir_Kind_Modulus_Operator => 1184,
+ Iir_Kind_Remainder_Operator => 1189,
+ Iir_Kind_Exponentiation_Operator => 1194,
+ Iir_Kind_Function_Call => 1202,
+ Iir_Kind_Aggregate => 1209,
+ Iir_Kind_Parenthesis_Expression => 1212,
+ Iir_Kind_Qualified_Expression => 1216,
+ Iir_Kind_Type_Conversion => 1221,
+ Iir_Kind_Allocator_By_Expression => 1225,
+ Iir_Kind_Allocator_By_Subtype => 1230,
+ Iir_Kind_Selected_Element => 1237,
+ Iir_Kind_Dereference => 1242,
+ Iir_Kind_Implicit_Dereference => 1247,
+ Iir_Kind_Slice_Name => 1254,
+ Iir_Kind_Indexed_Name => 1260,
+ Iir_Kind_Psl_Expression => 1262,
+ Iir_Kind_Sensitized_Process_Statement => 1283,
+ Iir_Kind_Process_Statement => 1303,
+ Iir_Kind_Concurrent_Simple_Signal_Assignment => 1315,
+ Iir_Kind_Concurrent_Conditional_Signal_Assignment => 1327,
+ Iir_Kind_Concurrent_Selected_Signal_Assignment => 1340,
+ Iir_Kind_Concurrent_Assertion_Statement => 1348,
+ Iir_Kind_Concurrent_Procedure_Call_Statement => 1355,
+ Iir_Kind_Psl_Assert_Statement => 1368,
+ Iir_Kind_Psl_Cover_Statement => 1381,
+ Iir_Kind_Block_Statement => 1394,
+ Iir_Kind_If_Generate_Statement => 1405,
+ Iir_Kind_Case_Generate_Statement => 1414,
+ Iir_Kind_For_Generate_Statement => 1423,
+ Iir_Kind_Component_Instantiation_Statement => 1434,
+ Iir_Kind_Psl_Default_Clock => 1438,
+ Iir_Kind_Simple_Simultaneous_Statement => 1445,
+ Iir_Kind_Generate_Statement_Body => 1456,
+ Iir_Kind_If_Generate_Else_Clause => 1462,
+ Iir_Kind_Simple_Signal_Assignment_Statement => 1472,
+ Iir_Kind_Conditional_Signal_Assignment_Statement => 1482,
+ Iir_Kind_Selected_Waveform_Assignment_Statement => 1493,
+ Iir_Kind_Null_Statement => 1497,
+ Iir_Kind_Assertion_Statement => 1504,
+ Iir_Kind_Report_Statement => 1510,
+ Iir_Kind_Wait_Statement => 1518,
+ Iir_Kind_Variable_Assignment_Statement => 1525,
+ Iir_Kind_Conditional_Variable_Assignment_Statement => 1532,
+ Iir_Kind_Return_Statement => 1538,
+ Iir_Kind_For_Loop_Statement => 1547,
+ Iir_Kind_While_Loop_Statement => 1556,
+ Iir_Kind_Next_Statement => 1563,
+ Iir_Kind_Exit_Statement => 1570,
+ Iir_Kind_Case_Statement => 1578,
+ Iir_Kind_Procedure_Call_Statement => 1584,
+ Iir_Kind_If_Statement => 1594,
+ Iir_Kind_Elsif => 1600,
+ Iir_Kind_Character_Literal => 1608,
+ Iir_Kind_Simple_Name => 1616,
+ Iir_Kind_Selected_Name => 1625,
+ Iir_Kind_Operator_Symbol => 1631,
+ Iir_Kind_Reference_Name => 1634,
+ Iir_Kind_External_Constant_Name => 1643,
+ Iir_Kind_External_Signal_Name => 1652,
+ Iir_Kind_External_Variable_Name => 1661,
+ Iir_Kind_Selected_By_All_Name => 1667,
+ Iir_Kind_Parenthesis_Name => 1672,
+ Iir_Kind_Package_Pathname => 1676,
+ Iir_Kind_Absolute_Pathname => 1677,
+ Iir_Kind_Relative_Pathname => 1678,
+ Iir_Kind_Pathname_Element => 1683,
+ Iir_Kind_Base_Attribute => 1685,
+ Iir_Kind_Subtype_Attribute => 1690,
+ Iir_Kind_Element_Attribute => 1695,
+ Iir_Kind_Left_Type_Attribute => 1700,
+ Iir_Kind_Right_Type_Attribute => 1705,
+ Iir_Kind_High_Type_Attribute => 1710,
+ Iir_Kind_Low_Type_Attribute => 1715,
+ Iir_Kind_Ascending_Type_Attribute => 1720,
+ Iir_Kind_Image_Attribute => 1726,
+ Iir_Kind_Value_Attribute => 1732,
+ Iir_Kind_Pos_Attribute => 1738,
+ Iir_Kind_Val_Attribute => 1744,
+ Iir_Kind_Succ_Attribute => 1750,
+ Iir_Kind_Pred_Attribute => 1756,
+ Iir_Kind_Leftof_Attribute => 1762,
+ Iir_Kind_Rightof_Attribute => 1768,
+ Iir_Kind_Delayed_Attribute => 1777,
+ Iir_Kind_Stable_Attribute => 1786,
+ Iir_Kind_Quiet_Attribute => 1795,
+ Iir_Kind_Transaction_Attribute => 1804,
+ Iir_Kind_Event_Attribute => 1808,
+ Iir_Kind_Active_Attribute => 1812,
+ Iir_Kind_Last_Event_Attribute => 1816,
+ Iir_Kind_Last_Active_Attribute => 1820,
+ Iir_Kind_Last_Value_Attribute => 1824,
+ Iir_Kind_Driving_Attribute => 1828,
+ Iir_Kind_Driving_Value_Attribute => 1832,
+ Iir_Kind_Behavior_Attribute => 1832,
+ Iir_Kind_Structure_Attribute => 1832,
+ Iir_Kind_Simple_Name_Attribute => 1839,
+ Iir_Kind_Instance_Name_Attribute => 1844,
+ Iir_Kind_Path_Name_Attribute => 1849,
+ Iir_Kind_Left_Array_Attribute => 1856,
+ Iir_Kind_Right_Array_Attribute => 1863,
+ Iir_Kind_High_Array_Attribute => 1870,
+ Iir_Kind_Low_Array_Attribute => 1877,
+ Iir_Kind_Length_Array_Attribute => 1884,
+ Iir_Kind_Ascending_Array_Attribute => 1891,
+ Iir_Kind_Range_Array_Attribute => 1898,
+ Iir_Kind_Reverse_Range_Array_Attribute => 1905,
+ Iir_Kind_Attribute_Name => 1914
);
function Get_Fields_First (K : Iir_Kind) return Fields_Index is
@@ -10311,6 +10312,7 @@ package body Nodes_Meta is
| Iir_Kind_Subtype_Declaration
| Iir_Kind_Nature_Declaration
| Iir_Kind_Subnature_Declaration
+ | Iir_Kind_Unit_Declaration
| Iir_Kind_Component_Declaration
| Iir_Kind_Attribute_Declaration
| Iir_Kind_Group_Template_Declaration
diff --git a/src/vhdl/sem_expr.adb b/src/vhdl/sem_expr.adb
index 92dcc408a..5fa1e91c3 100644
--- a/src/vhdl/sem_expr.adb
+++ b/src/vhdl/sem_expr.adb
@@ -3593,10 +3593,20 @@ package body Sem_Expr is
end case;
end Sem_Aggregate;
- -- Transform LIT into a physical_literal.
- -- LIT can be either a not analyzed physical literal or
- -- a simple name that is a physical unit. In the later case, a physical
- -- literal is created.
+ function Is_Physical_Literal_Zero (Lit : Iir) return Boolean is
+ begin
+ case Iir_Kinds_Physical_Literal (Get_Kind (Lit)) is
+ when Iir_Kind_Physical_Int_Literal =>
+ return Get_Value (Lit) = 0;
+ when Iir_Kind_Physical_Fp_Literal =>
+ return Get_Fp_Value (Lit) = 0.0;
+ end case;
+ end Is_Physical_Literal_Zero;
+
+ -- Transform LIT into a physical_literal.
+ -- LIT can be either a not analyzed physical literal or
+ -- a simple name that is a physical unit. In the later case, a physical
+ -- literal is created.
function Sem_Physical_Literal (Lit: Iir) return Iir
is
Unit_Name : Iir;
@@ -3625,17 +3635,36 @@ package body Sem_Expr is
Error_Class_Match (Unit_Name, "unit");
end if;
Set_Named_Entity (Unit_Name, Create_Error_Name (Unit_Name));
+ else
+ -- Physical unit is used.
+ Set_Use_Flag (Unit, True);
+
+ if Get_Type (Unit) = Time_Type_Definition
+ and then Get_Value (Get_Physical_Literal (Unit)) = 0
+ and then not Is_Physical_Literal_Zero (Res)
+ then
+ -- LRM08 5.2.4.2 Predefined physical types
+ -- It is an error if a given unit of type TIME appears anywhere
+ -- within the design hierarchy defining a model to be elaborated,
+ -- and if the position number of that unit is less than that of
+ -- the secondary unit selected as the resolution limit for type
+ -- TIME during the elaboration of the model, unless that unit is
+ -- part of a physical literal whose abstract literal is either
+ -- the integer value zero or the floating-point value zero.
+ Error_Msg_Sem
+ (+Res, "physical unit %i is below the time resolution", +Unit);
+ end if;
end if;
Set_Unit_Name (Res, Unit_Name);
Set_Physical_Unit (Res, Get_Named_Entity (Unit_Name));
Unit_Type := Get_Type (Unit_Name);
Set_Type (Res, Unit_Type);
- -- LRM93 7.4.2
- -- 1. a literal of type TIME.
+ -- LRM93 7.4.2
+ -- 1. a literal of type TIME.
--
- -- LRM93 7.4.1
- -- 1. a literal of any type other than type TIME;
+ -- LRM93 7.4.1
+ -- 1. a literal of any type other than type TIME;
Set_Expr_Staticness (Res, Get_Expr_Staticness (Unit_Name));
--Eval_Check_Constraints (Res);
return Res;
diff --git a/src/vhdl/simulate/simul-execution.adb b/src/vhdl/simulate/simul-execution.adb
index 0958462a5..451889bc9 100644
--- a/src/vhdl/simulate/simul-execution.adb
+++ b/src/vhdl/simulate/simul-execution.adb
@@ -3831,9 +3831,7 @@ package body Simul.Execution is
begin
case Get_Identifier (Imp) is
when Std_Names.Name_Get_Resolution_Limit =>
- Res := Create_I64_Value
- (Ghdl_I64
- (Evaluation.Get_Physical_Value (Std_Package.Time_Base)));
+ Res := Create_I64_Value (1);
when Std_Names.Name_Textio_Read_Real =>
Res := Create_F64_Value
(File_Operation.Textio_Read_Real (Block.Objects (1)));
diff --git a/src/vhdl/std_package.adb b/src/vhdl/std_package.adb
index 6d1456b7d..04c17ce22 100644
--- a/src/vhdl/std_package.adb
+++ b/src/vhdl/std_package.adb
@@ -36,6 +36,16 @@ package body Std_Package is
Std_Location: Location_Type := Location_Nil;
Std_Filename : Name_Id := Null_Identifier;
+ -- Could be public.
+ Time_Fs_Unit: Iir_Unit_Declaration;
+ Time_Ps_Unit: Iir_Unit_Declaration;
+ Time_Ns_Unit: Iir_Unit_Declaration;
+ Time_Us_Unit: Iir_Unit_Declaration;
+ Time_Ms_Unit: Iir_Unit_Declaration;
+ Time_Sec_Unit: Iir_Unit_Declaration;
+ Time_Min_Unit: Iir_Unit_Declaration;
+ Time_Hr_Unit: Iir_Unit_Declaration;
+
function Create_Std_Iir (Kind : Iir_Kind) return Iir
is
Res : Iir;
@@ -824,14 +834,6 @@ package body Std_Package is
Append (Last_Unit, Time_Type_Definition, Unit);
end Create_Unit;
- Time_Fs_Unit: Iir_Unit_Declaration;
- Time_Ps_Unit: Iir_Unit_Declaration;
- Time_Ns_Unit: Iir_Unit_Declaration;
- Time_Us_Unit: Iir_Unit_Declaration;
- Time_Ms_Unit: Iir_Unit_Declaration;
- Time_Sec_Unit: Iir_Unit_Declaration;
- Time_Min_Unit: Iir_Unit_Declaration;
- Time_Hr_Unit: Iir_Unit_Declaration;
Constraint : Iir_Range_Expression;
begin
if Vhdl_Std >= Vhdl_93c then
@@ -908,28 +910,6 @@ package body Std_Package is
Set_Subtype_Definition
(Time_Type_Declaration, Time_Subtype_Definition);
- -- The default time base.
- case Flags.Time_Resolution is
- when 'f' =>
- Time_Base := Time_Fs_Unit;
- when 'p' =>
- Time_Base := Time_Ps_Unit;
- when 'n' =>
- Time_Base := Time_Ns_Unit;
- when 'u' =>
- Time_Base := Time_Us_Unit;
- when 'm' =>
- Time_Base := Time_Ms_Unit;
- when 's' =>
- Time_Base := Time_Sec_Unit;
- when 'M' =>
- Time_Base := Time_Min_Unit;
- when 'h' =>
- Time_Base := Time_Hr_Unit;
- when others =>
- raise Internal_Error;
- end case;
-
-- VHDL93
-- subtype DELAY_LENGTH is TIME range 0 to TIME'HIGH
if Vhdl_Std >= Vhdl_93c then
@@ -1280,4 +1260,94 @@ package body Std_Package is
Set_Error_Origin (Error_Type, Null_Iir);
Create_Wildcard_Type (Error_Type, "unknown type");
end Create_Std_Standard_Package;
+
+ procedure Set_Time_Resolution (Resolution : Character)
+ is
+ Unit : Iir;
+ Prim : Iir;
+ Rng : Iir;
+ begin
+ case Resolution is
+ when 'f' =>
+ Prim := Time_Fs_Unit;
+ when 'p' =>
+ Prim := Time_Ps_Unit;
+ when 'n' =>
+ Prim := Time_Ns_Unit;
+ when 'u' =>
+ Prim := Time_Us_Unit;
+ when 'm' =>
+ Prim := Time_Ms_Unit;
+ when 's' =>
+ Prim := Time_Sec_Unit;
+ when 'M' =>
+ Prim := Time_Min_Unit;
+ when 'h' =>
+ Prim := Time_Hr_Unit;
+ when others =>
+ raise Internal_Error;
+ end case;
+
+ -- Adjust range of TIME subtype.
+ Rng := Get_Range_Constraint (Time_Subtype_Definition);
+ Set_Physical_Unit (Get_Left_Limit (Rng), Prim);
+ Set_Physical_Unit (Get_Right_Limit (Rng), Prim);
+
+ -- Adjust range of DELAY_LENGTH.
+ if Vhdl_Std >= Vhdl_93c then
+ Rng := Get_Range_Constraint (Delay_Length_Subtype_Definition);
+ Set_Physical_Unit (Get_Left_Limit (Rng), Prim);
+ Set_Physical_Unit (Get_Right_Limit (Rng), Prim);
+ end if;
+
+ Unit := Get_Unit_Chain (Time_Type_Definition);
+ while Unit /= Null_Iir loop
+ declare
+ Lit : constant Iir := Get_Physical_Literal (Unit);
+ Orig : constant Iir := Get_Literal_Origin (Lit);
+ Lit_Unit : Iir;
+ begin
+ if Prim = Null_Iir then
+ -- Primary already set, just recompute values.
+ Lit_Unit := Get_Physical_Literal (Get_Physical_Unit (Orig));
+ Set_Value (Lit, Get_Value (Orig) * Get_Value (Lit_Unit));
+ elsif Unit = Prim then
+ Set_Value (Lit, 1);
+ Prim := Null_Iir;
+ else
+ Set_Value (Lit, 0);
+ end if;
+ end;
+ Unit := Get_Chain (Unit);
+ end loop;
+ end Set_Time_Resolution;
+
+ function Get_Minimal_Time_Resolution return Character is
+ begin
+ if Get_Use_Flag (Time_Fs_Unit) then
+ return 'f';
+ end if;
+ if Get_Use_Flag (Time_Ps_Unit) then
+ return 'p';
+ end if;
+ if Get_Use_Flag (Time_Ns_Unit) then
+ return 'n';
+ end if;
+ if Get_Use_Flag (Time_Us_Unit) then
+ return 'u';
+ end if;
+ if Get_Use_Flag (Time_Ms_Unit) then
+ return 'm';
+ end if;
+ if Get_Use_Flag (Time_Sec_Unit) then
+ return 's';
+ end if;
+ if Get_Use_Flag (Time_Min_Unit) then
+ return 'M';
+ end if;
+ if Get_Use_Flag (Time_Hr_Unit) then
+ return 'h';
+ end if;
+ return '?';
+ end Get_Minimal_Time_Resolution;
end Std_Package;
diff --git a/src/vhdl/std_package.ads b/src/vhdl/std_package.ads
index e655cb181..1c714b95c 100644
--- a/src/vhdl/std_package.ads
+++ b/src/vhdl/std_package.ads
@@ -27,10 +27,6 @@ package Std_Package is
-- Some well know values declared in the STANDARD package.
-- These values (except time_base) *must* not be modified, and are set by
-- create_std_standard_package.
- -- Time_base is the base unit of time. It is set during the creation of
- -- all these nodes, and can be modified only *immediatly* after.
-
- Time_Base: Iir_Unit_Declaration := Null_Iir;
Std_Standard_File: Iir_Design_File := Null_Iir;
Std_Standard_Unit : Iir_Design_Unit := Null_Iir;
@@ -181,6 +177,10 @@ package Std_Package is
-- Create the node for the standard package.
procedure Create_Std_Standard_Package (Parent : Iir_Library_Declaration);
+ procedure Set_Time_Resolution (Resolution : Character);
+
+ -- Return the minimal time resolution according to use of time units.
+ function Get_Minimal_Time_Resolution return Character;
private
-- For speed reasons, some often used nodes are hard-coded.
Error_Mark : constant Iir := 2;
diff --git a/src/vhdl/translate/ortho_front.adb b/src/vhdl/translate/ortho_front.adb
index 236c94906..143a6f6f1 100644
--- a/src/vhdl/translate/ortho_front.adb
+++ b/src/vhdl/translate/ortho_front.adb
@@ -393,6 +393,7 @@ package body Ortho_Front is
Res : Iir_Design_File;
Design : Iir_Design_Unit;
Next_Design : Iir_Design_Unit;
+ Config : Iir;
begin
if Nbr_Parse = 0 then
-- Initialize only once...
@@ -417,9 +418,13 @@ package body Ortho_Front is
Error_Msg_Option ("missing -l for --elab");
raise Option_Error;
end if;
- Translation.Elaborate
- (Elab_Entity.all, Elab_Architecture.all,
- Elab_Filelist.all, False);
+ Config := Configuration.Configure
+ (Elab_Entity.all, Elab_Architecture.all);
+ if Errorout.Nbr_Errors > 0 then
+ -- This may happen (bad entity for example).
+ raise Compilation_Error;
+ end if;
+ Translation.Elaborate (Config, Elab_Filelist.all, False);
if Errorout.Nbr_Errors > 0 then
-- This may happen (bad entity for example).
@@ -464,8 +469,9 @@ package body Ortho_Front is
Flags.Flag_Elaborate := True;
Flags.Flag_Only_Elab_Warnings := False;
- Translation.Elaborate
- (Elab_Entity.all, Elab_Architecture.all, "", True);
+ Config := Configuration.Configure
+ (Elab_Entity.all, Elab_Architecture.all);
+ Translation.Elaborate (Config, "", True);
if Errorout.Nbr_Errors > 0 then
-- This may happen (bad entity for example).
diff --git a/src/vhdl/translate/trans-chap12.adb b/src/vhdl/translate/trans-chap12.adb
index b0e096565..9a2d7022e 100644
--- a/src/vhdl/translate/trans-chap12.adb
+++ b/src/vhdl/translate/trans-chap12.adb
@@ -587,8 +587,7 @@ package body Trans.Chap12 is
R := fclose (F);
end Write_File_List;
- procedure Elaborate (Primary : String;
- Secondary : String;
+ procedure Elaborate (Config : Iir_Design_Unit;
Filelist : String;
Whole : Boolean)
is
@@ -596,17 +595,12 @@ package body Trans.Chap12 is
Unit : Iir_Design_Unit;
Lib_Unit : Iir;
- Config : Iir_Design_Unit;
Config_Lib : Iir_Configuration_Declaration;
Entity : Iir_Entity_Declaration;
Arch : Iir_Architecture_Body;
Conf_Info : Config_Info_Acc;
Last_Design_Unit : Natural;
begin
- Config := Configure (Primary, Secondary);
- if Config = Null_Iir then
- return;
- end if;
Config_Lib := Get_Library_Unit (Config);
Entity := Get_Entity (Config_Lib);
Arch := Strip_Denoting_Name
diff --git a/src/vhdl/translate/trans-chap12.ads b/src/vhdl/translate/trans-chap12.ads
index 23abea998..a0db62399 100644
--- a/src/vhdl/translate/trans-chap12.ads
+++ b/src/vhdl/translate/trans-chap12.ads
@@ -26,10 +26,8 @@ package Trans.Chap12 is
-- Write to file FILELIST all the files that are needed to link the design.
procedure Write_File_List (Filelist : String);
- -- Primary unit + secondary unit (architecture name which may be null)
- -- to elaborate.
- procedure Elaborate (Primary : String;
- Secondary : String;
+ -- Generate elaboration code for CONFIG.
+ procedure Elaborate (Config : Iir_Design_Unit;
Filelist : String;
Whole : Boolean);
end Trans.Chap12;
diff --git a/src/vhdl/translate/translation.adb b/src/vhdl/translate/translation.adb
index 5c39283e3..a7ec6e7da 100644
--- a/src/vhdl/translate/translation.adb
+++ b/src/vhdl/translate/translation.adb
@@ -2085,8 +2085,7 @@ package body Translation is
Free_Old_Temp;
end Finalize;
- procedure Elaborate (Primary : String;
- Secondary : String;
+ procedure Elaborate (Config : Iir;
Filelist : String;
Whole : Boolean) renames Trans.Chap12.Elaborate;
diff --git a/src/vhdl/translate/translation.ads b/src/vhdl/translate/translation.ads
index 2228f8973..4c9b2ff27 100644
--- a/src/vhdl/translate/translation.ads
+++ b/src/vhdl/translate/translation.ads
@@ -40,10 +40,9 @@ package Translation is
procedure Gen_Filename (Design_File : Iir);
- -- Primary unit + secondary unit (architecture name which may be null)
- -- to elaborate.
- procedure Elaborate (Primary : String;
- Secondary : String;
+ -- Generate elaboration code for CONFIG. Also use units from Configure
+ -- package.
+ procedure Elaborate (Config : Iir;
Filelist : String;
Whole : Boolean);