From 0594a0c145e8c23500be3be298f70d6059cdb0d6 Mon Sep 17 00:00:00 2001
From: Tristan Gingold <tgingold@free.fr>
Date: Thu, 20 Sep 2018 06:38:53 +0200
Subject: Add Maybe_Ref_Chain (WIP).

---
 src/ghdldrv/ghdlxml.adb            |   6 +
 src/vhdl/disp_tree.adb             |   6 +
 src/vhdl/iirs.ads                  |  10 +-
 src/vhdl/nodes_gc.adb              |   6 +
 src/vhdl/nodes_meta.adb            | 504 +++++++++++++++++++------------------
 src/vhdl/nodes_meta.ads            |   1 +
 src/vhdl/sem_inst.adb              |  14 ++
 src/vhdl/translate/trans-chap2.adb |   4 +
 src/vhdl/translate/trans-chap9.adb |   4 +
 9 files changed, 305 insertions(+), 250 deletions(-)

diff --git a/src/ghdldrv/ghdlxml.adb b/src/ghdldrv/ghdlxml.adb
index 995706351..49a997670 100644
--- a/src/ghdldrv/ghdlxml.adb
+++ b/src/ghdldrv/ghdlxml.adb
@@ -439,6 +439,12 @@ package body Ghdlxml is
                            end if;
                         when Attr_Chain =>
                            Disp_Iir_Chain (Img, V);
+                        when Attr_Maybe_Ref_Chain =>
+                           if Get_Is_Ref (N) then
+                              Disp_Iir_Ref (Img, V);
+                           else
+                              Disp_Iir_Chain (Img, V);
+                           end if;
                         when Attr_Chain_Next =>
                            null;
                         when Attr_Of_Ref | Attr_Of_Maybe_Ref =>
diff --git a/src/vhdl/disp_tree.adb b/src/vhdl/disp_tree.adb
index 718cf6707..040512c3c 100644
--- a/src/vhdl/disp_tree.adb
+++ b/src/vhdl/disp_tree.adb
@@ -462,6 +462,12 @@ package body Disp_Tree is
                            Ndepth := Depth - 1;
                         end if;
                         Disp_Iir (Get_Iir (N, F), Sub_Indent, Ndepth);
+                     when Attr_Maybe_Ref_Chain =>
+                        if Get_Is_Ref (N) then
+                           Disp_Iir (Get_Iir (N, F), Sub_Indent, 0);
+                        else
+                           Disp_Chain (Get_Iir (N, F), Sub_Indent, Depth - 1);
+                        end if;
                      when Attr_Chain =>
                         Disp_Chain (Get_Iir (N, F), Sub_Indent, Depth - 1);
                      when Attr_Chain_Next =>
diff --git a/src/vhdl/iirs.ads b/src/vhdl/iirs.ads
index 912d4a006..b2cfeb5fa 100644
--- a/src/vhdl/iirs.ads
+++ b/src/vhdl/iirs.ads
@@ -572,6 +572,8 @@ package Iirs is
    -- Only for Iir_Kind_Choice_By_Range:
    -- Only for Iir_Kind_Choice_By_Expression:
    --   Get/Set_Choice_Staticness (State1)
+   --
+   --   Get/Set_Is_Ref (Flag12)
 
    -- Iir_Kind_Entity_Aspect_Entity (Short)
    --
@@ -6140,17 +6142,19 @@ package Iirs is
    procedure Set_Choice_Position (Choice : Iir; Pos : Int32);
 
    --  Node associated with a choice.
-   --  Field: Field3
+   --  Field: Field3 Maybe_Ref
    function Get_Associated_Expr (Target : Iir) return Iir;
    procedure Set_Associated_Expr (Target : Iir; Associated : Iir);
 
    --  Node associated with a choice.
-   --  Field: Field3
+   --  Field: Field3 Maybe_Ref
    function Get_Associated_Block (Target : Iir) return Iir;
    procedure Set_Associated_Block (Target : Iir; Associated : Iir);
 
    --  Chain associated with a choice.
-   --  Field: Field4 Chain
+   --  A Maybe_Ref_Chain is a reference to a chain if Get_Is_Ref is True,
+   --  otherwise this is a normal chain.
+   --  Field: Field4 Maybe_Ref_Chain
    function Get_Associated_Chain (Target : Iir) return Iir;
    procedure Set_Associated_Chain (Target : Iir; Associated : Iir);
 
diff --git a/src/vhdl/nodes_gc.adb b/src/vhdl/nodes_gc.adb
index b4c11149f..f3c9299b9 100644
--- a/src/vhdl/nodes_gc.adb
+++ b/src/vhdl/nodes_gc.adb
@@ -253,6 +253,12 @@ package body Nodes_GC is
                         end if;
                      when Attr_Chain =>
                         Mark_Chain (Get_Iir (N, F));
+                     when Attr_Maybe_Ref_Chain =>
+                        if Get_Is_Ref (N) then
+                           Mark_Iir_Ref_Field (N, F);
+                        else
+                           Mark_Chain (Get_Iir (N, F));
+                        end if;
                      when Attr_Of_Ref | Attr_Of_Maybe_Ref =>
                         raise Internal_Error;
                   end case;
diff --git a/src/vhdl/nodes_meta.adb b/src/vhdl/nodes_meta.adb
index 69e1a4ef6..d2b199dde 100644
--- a/src/vhdl/nodes_meta.adb
+++ b/src/vhdl/nodes_meta.adb
@@ -1675,11 +1675,11 @@ package body Nodes_Meta is
          when Field_Choice_Position =>
             return Attr_None;
          when Field_Associated_Expr =>
-            return Attr_None;
+            return Attr_Maybe_Ref;
          when Field_Associated_Block =>
-            return Attr_None;
+            return Attr_Maybe_Ref;
          when Field_Associated_Chain =>
-            return Attr_Chain;
+            return Attr_Maybe_Ref_Chain;
          when Field_Choice_Name =>
             return Attr_None;
          when Field_Choice_Expression =>
@@ -2389,6 +2389,7 @@ package body Nodes_Meta is
       --  Iir_Kind_Choice_By_Range
       Field_Choice_Position,
       Field_Same_Alternative_Flag,
+      Field_Is_Ref,
       Field_Element_Type_Flag,
       Field_Choice_Staticness,
       Field_Parent,
@@ -2399,6 +2400,7 @@ package body Nodes_Meta is
       --  Iir_Kind_Choice_By_Expression
       Field_Choice_Position,
       Field_Same_Alternative_Flag,
+      Field_Is_Ref,
       Field_Element_Type_Flag,
       Field_Choice_Staticness,
       Field_Parent,
@@ -2409,6 +2411,7 @@ package body Nodes_Meta is
       --  Iir_Kind_Choice_By_Others
       Field_Choice_Position,
       Field_Same_Alternative_Flag,
+      Field_Is_Ref,
       Field_Element_Type_Flag,
       Field_Parent,
       Field_Chain,
@@ -2417,6 +2420,7 @@ package body Nodes_Meta is
       --  Iir_Kind_Choice_By_None
       Field_Choice_Position,
       Field_Same_Alternative_Flag,
+      Field_Is_Ref,
       Field_Element_Type_Flag,
       Field_Parent,
       Field_Chain,
@@ -2425,6 +2429,7 @@ package body Nodes_Meta is
       --  Iir_Kind_Choice_By_Name
       Field_Choice_Position,
       Field_Same_Alternative_Flag,
+      Field_Is_Ref,
       Field_Element_Type_Flag,
       Field_Parent,
       Field_Chain,
@@ -4442,250 +4447,250 @@ package body Nodes_Meta is
       Iir_Kind_Association_Element_Package => 127,
       Iir_Kind_Association_Element_Type => 135,
       Iir_Kind_Association_Element_Subprogram => 141,
-      Iir_Kind_Choice_By_Range => 150,
-      Iir_Kind_Choice_By_Expression => 159,
-      Iir_Kind_Choice_By_Others => 166,
-      Iir_Kind_Choice_By_None => 173,
-      Iir_Kind_Choice_By_Name => 181,
-      Iir_Kind_Entity_Aspect_Entity => 183,
-      Iir_Kind_Entity_Aspect_Configuration => 184,
-      Iir_Kind_Entity_Aspect_Open => 184,
-      Iir_Kind_Block_Configuration => 190,
-      Iir_Kind_Block_Header => 194,
-      Iir_Kind_Component_Configuration => 201,
-      Iir_Kind_Binding_Indication => 205,
-      Iir_Kind_Entity_Class => 207,
-      Iir_Kind_Attribute_Value => 215,
-      Iir_Kind_Signature => 218,
-      Iir_Kind_Aggregate_Info => 225,
-      Iir_Kind_Procedure_Call => 229,
-      Iir_Kind_Record_Element_Constraint => 236,
-      Iir_Kind_Array_Element_Resolution => 238,
-      Iir_Kind_Record_Resolution => 239,
-      Iir_Kind_Record_Element_Resolution => 242,
-      Iir_Kind_Attribute_Specification => 250,
-      Iir_Kind_Disconnection_Specification => 256,
-      Iir_Kind_Configuration_Specification => 262,
-      Iir_Kind_Access_Type_Definition => 270,
-      Iir_Kind_Incomplete_Type_Definition => 278,
-      Iir_Kind_Interface_Type_Definition => 285,
-      Iir_Kind_File_Type_Definition => 292,
-      Iir_Kind_Protected_Type_Declaration => 301,
-      Iir_Kind_Record_Type_Definition => 311,
-      Iir_Kind_Array_Type_Definition => 323,
-      Iir_Kind_Array_Subtype_Definition => 338,
-      Iir_Kind_Record_Subtype_Definition => 349,
-      Iir_Kind_Access_Subtype_Definition => 357,
-      Iir_Kind_Physical_Subtype_Definition => 367,
-      Iir_Kind_Floating_Subtype_Definition => 378,
-      Iir_Kind_Integer_Subtype_Definition => 388,
-      Iir_Kind_Enumeration_Subtype_Definition => 398,
-      Iir_Kind_Enumeration_Type_Definition => 409,
-      Iir_Kind_Integer_Type_Definition => 417,
-      Iir_Kind_Floating_Type_Definition => 425,
-      Iir_Kind_Physical_Type_Definition => 436,
-      Iir_Kind_Range_Expression => 444,
-      Iir_Kind_Protected_Type_Body => 451,
-      Iir_Kind_Wildcard_Type_Definition => 456,
-      Iir_Kind_Subtype_Definition => 461,
-      Iir_Kind_Scalar_Nature_Definition => 465,
-      Iir_Kind_Overload_List => 466,
-      Iir_Kind_Type_Declaration => 473,
-      Iir_Kind_Anonymous_Type_Declaration => 479,
-      Iir_Kind_Subtype_Declaration => 486,
-      Iir_Kind_Nature_Declaration => 492,
-      Iir_Kind_Subnature_Declaration => 498,
-      Iir_Kind_Entity_Declaration => 510,
-      Iir_Kind_Configuration_Declaration => 519,
-      Iir_Kind_Context_Declaration => 525,
-      Iir_Kind_Package_Declaration => 539,
-      Iir_Kind_Package_Instantiation_Declaration => 553,
-      Iir_Kind_Package_Body => 561,
-      Iir_Kind_Architecture_Body => 573,
-      Iir_Kind_Package_Header => 575,
-      Iir_Kind_Unit_Declaration => 584,
-      Iir_Kind_Library_Declaration => 591,
-      Iir_Kind_Component_Declaration => 601,
-      Iir_Kind_Attribute_Declaration => 608,
-      Iir_Kind_Group_Template_Declaration => 614,
-      Iir_Kind_Group_Declaration => 621,
-      Iir_Kind_Element_Declaration => 629,
-      Iir_Kind_Non_Object_Alias_Declaration => 637,
-      Iir_Kind_Psl_Declaration => 645,
-      Iir_Kind_Psl_Endpoint_Declaration => 659,
-      Iir_Kind_Terminal_Declaration => 665,
-      Iir_Kind_Free_Quantity_Declaration => 674,
-      Iir_Kind_Across_Quantity_Declaration => 686,
-      Iir_Kind_Through_Quantity_Declaration => 698,
-      Iir_Kind_Enumeration_Literal => 709,
-      Iir_Kind_Function_Declaration => 734,
-      Iir_Kind_Procedure_Declaration => 758,
-      Iir_Kind_Function_Body => 768,
-      Iir_Kind_Procedure_Body => 779,
-      Iir_Kind_Object_Alias_Declaration => 790,
-      Iir_Kind_File_Declaration => 804,
-      Iir_Kind_Guard_Signal_Declaration => 817,
-      Iir_Kind_Signal_Declaration => 834,
-      Iir_Kind_Variable_Declaration => 847,
-      Iir_Kind_Constant_Declaration => 861,
-      Iir_Kind_Iterator_Declaration => 872,
-      Iir_Kind_Interface_Constant_Declaration => 888,
-      Iir_Kind_Interface_Variable_Declaration => 904,
-      Iir_Kind_Interface_Signal_Declaration => 925,
-      Iir_Kind_Interface_File_Declaration => 941,
-      Iir_Kind_Interface_Type_Declaration => 951,
-      Iir_Kind_Interface_Package_Declaration => 963,
-      Iir_Kind_Interface_Function_Declaration => 980,
-      Iir_Kind_Interface_Procedure_Declaration => 993,
-      Iir_Kind_Signal_Attribute_Declaration => 996,
-      Iir_Kind_Identity_Operator => 1000,
-      Iir_Kind_Negation_Operator => 1004,
-      Iir_Kind_Absolute_Operator => 1008,
-      Iir_Kind_Not_Operator => 1012,
-      Iir_Kind_Implicit_Condition_Operator => 1016,
-      Iir_Kind_Condition_Operator => 1020,
-      Iir_Kind_Reduction_And_Operator => 1024,
-      Iir_Kind_Reduction_Or_Operator => 1028,
-      Iir_Kind_Reduction_Nand_Operator => 1032,
-      Iir_Kind_Reduction_Nor_Operator => 1036,
-      Iir_Kind_Reduction_Xor_Operator => 1040,
-      Iir_Kind_Reduction_Xnor_Operator => 1044,
-      Iir_Kind_And_Operator => 1049,
-      Iir_Kind_Or_Operator => 1054,
-      Iir_Kind_Nand_Operator => 1059,
-      Iir_Kind_Nor_Operator => 1064,
-      Iir_Kind_Xor_Operator => 1069,
-      Iir_Kind_Xnor_Operator => 1074,
-      Iir_Kind_Equality_Operator => 1079,
-      Iir_Kind_Inequality_Operator => 1084,
-      Iir_Kind_Less_Than_Operator => 1089,
-      Iir_Kind_Less_Than_Or_Equal_Operator => 1094,
-      Iir_Kind_Greater_Than_Operator => 1099,
-      Iir_Kind_Greater_Than_Or_Equal_Operator => 1104,
-      Iir_Kind_Match_Equality_Operator => 1109,
-      Iir_Kind_Match_Inequality_Operator => 1114,
-      Iir_Kind_Match_Less_Than_Operator => 1119,
-      Iir_Kind_Match_Less_Than_Or_Equal_Operator => 1124,
-      Iir_Kind_Match_Greater_Than_Operator => 1129,
-      Iir_Kind_Match_Greater_Than_Or_Equal_Operator => 1134,
-      Iir_Kind_Sll_Operator => 1139,
-      Iir_Kind_Sla_Operator => 1144,
-      Iir_Kind_Srl_Operator => 1149,
-      Iir_Kind_Sra_Operator => 1154,
-      Iir_Kind_Rol_Operator => 1159,
-      Iir_Kind_Ror_Operator => 1164,
-      Iir_Kind_Addition_Operator => 1169,
-      Iir_Kind_Substraction_Operator => 1174,
-      Iir_Kind_Concatenation_Operator => 1179,
-      Iir_Kind_Multiplication_Operator => 1184,
-      Iir_Kind_Division_Operator => 1189,
-      Iir_Kind_Modulus_Operator => 1194,
-      Iir_Kind_Remainder_Operator => 1199,
-      Iir_Kind_Exponentiation_Operator => 1204,
-      Iir_Kind_Function_Call => 1212,
-      Iir_Kind_Aggregate => 1219,
-      Iir_Kind_Parenthesis_Expression => 1222,
-      Iir_Kind_Qualified_Expression => 1226,
-      Iir_Kind_Type_Conversion => 1231,
-      Iir_Kind_Allocator_By_Expression => 1235,
-      Iir_Kind_Allocator_By_Subtype => 1240,
-      Iir_Kind_Selected_Element => 1247,
-      Iir_Kind_Dereference => 1252,
-      Iir_Kind_Implicit_Dereference => 1257,
-      Iir_Kind_Slice_Name => 1264,
-      Iir_Kind_Indexed_Name => 1270,
-      Iir_Kind_Psl_Expression => 1272,
-      Iir_Kind_Sensitized_Process_Statement => 1293,
-      Iir_Kind_Process_Statement => 1313,
-      Iir_Kind_Concurrent_Simple_Signal_Assignment => 1325,
-      Iir_Kind_Concurrent_Conditional_Signal_Assignment => 1337,
-      Iir_Kind_Concurrent_Selected_Signal_Assignment => 1350,
-      Iir_Kind_Concurrent_Assertion_Statement => 1358,
-      Iir_Kind_Concurrent_Procedure_Call_Statement => 1365,
-      Iir_Kind_Psl_Assert_Statement => 1378,
-      Iir_Kind_Psl_Cover_Statement => 1391,
-      Iir_Kind_Block_Statement => 1404,
-      Iir_Kind_If_Generate_Statement => 1415,
-      Iir_Kind_Case_Generate_Statement => 1424,
-      Iir_Kind_For_Generate_Statement => 1433,
-      Iir_Kind_Component_Instantiation_Statement => 1444,
-      Iir_Kind_Psl_Default_Clock => 1448,
-      Iir_Kind_Simple_Simultaneous_Statement => 1455,
-      Iir_Kind_Generate_Statement_Body => 1466,
-      Iir_Kind_If_Generate_Else_Clause => 1472,
-      Iir_Kind_Simple_Signal_Assignment_Statement => 1482,
-      Iir_Kind_Conditional_Signal_Assignment_Statement => 1492,
-      Iir_Kind_Selected_Waveform_Assignment_Statement => 1503,
-      Iir_Kind_Null_Statement => 1507,
-      Iir_Kind_Assertion_Statement => 1514,
-      Iir_Kind_Report_Statement => 1520,
-      Iir_Kind_Wait_Statement => 1528,
-      Iir_Kind_Variable_Assignment_Statement => 1535,
-      Iir_Kind_Conditional_Variable_Assignment_Statement => 1542,
-      Iir_Kind_Return_Statement => 1548,
-      Iir_Kind_For_Loop_Statement => 1557,
-      Iir_Kind_While_Loop_Statement => 1566,
-      Iir_Kind_Next_Statement => 1573,
-      Iir_Kind_Exit_Statement => 1580,
-      Iir_Kind_Case_Statement => 1588,
-      Iir_Kind_Procedure_Call_Statement => 1594,
-      Iir_Kind_If_Statement => 1604,
-      Iir_Kind_Elsif => 1610,
-      Iir_Kind_Character_Literal => 1618,
-      Iir_Kind_Simple_Name => 1626,
-      Iir_Kind_Selected_Name => 1635,
-      Iir_Kind_Operator_Symbol => 1641,
-      Iir_Kind_Reference_Name => 1644,
-      Iir_Kind_External_Constant_Name => 1653,
-      Iir_Kind_External_Signal_Name => 1662,
-      Iir_Kind_External_Variable_Name => 1671,
-      Iir_Kind_Selected_By_All_Name => 1677,
-      Iir_Kind_Parenthesis_Name => 1682,
-      Iir_Kind_Package_Pathname => 1686,
-      Iir_Kind_Absolute_Pathname => 1687,
-      Iir_Kind_Relative_Pathname => 1688,
-      Iir_Kind_Pathname_Element => 1693,
-      Iir_Kind_Base_Attribute => 1695,
-      Iir_Kind_Subtype_Attribute => 1700,
-      Iir_Kind_Element_Attribute => 1705,
-      Iir_Kind_Left_Type_Attribute => 1710,
-      Iir_Kind_Right_Type_Attribute => 1715,
-      Iir_Kind_High_Type_Attribute => 1720,
-      Iir_Kind_Low_Type_Attribute => 1725,
-      Iir_Kind_Ascending_Type_Attribute => 1730,
-      Iir_Kind_Image_Attribute => 1736,
-      Iir_Kind_Value_Attribute => 1742,
-      Iir_Kind_Pos_Attribute => 1748,
-      Iir_Kind_Val_Attribute => 1754,
-      Iir_Kind_Succ_Attribute => 1760,
-      Iir_Kind_Pred_Attribute => 1766,
-      Iir_Kind_Leftof_Attribute => 1772,
-      Iir_Kind_Rightof_Attribute => 1778,
-      Iir_Kind_Delayed_Attribute => 1787,
-      Iir_Kind_Stable_Attribute => 1796,
-      Iir_Kind_Quiet_Attribute => 1805,
-      Iir_Kind_Transaction_Attribute => 1814,
-      Iir_Kind_Event_Attribute => 1818,
-      Iir_Kind_Active_Attribute => 1822,
-      Iir_Kind_Last_Event_Attribute => 1826,
-      Iir_Kind_Last_Active_Attribute => 1830,
-      Iir_Kind_Last_Value_Attribute => 1834,
-      Iir_Kind_Driving_Attribute => 1838,
-      Iir_Kind_Driving_Value_Attribute => 1842,
-      Iir_Kind_Behavior_Attribute => 1842,
-      Iir_Kind_Structure_Attribute => 1842,
-      Iir_Kind_Simple_Name_Attribute => 1849,
-      Iir_Kind_Instance_Name_Attribute => 1854,
-      Iir_Kind_Path_Name_Attribute => 1859,
-      Iir_Kind_Left_Array_Attribute => 1866,
-      Iir_Kind_Right_Array_Attribute => 1873,
-      Iir_Kind_High_Array_Attribute => 1880,
-      Iir_Kind_Low_Array_Attribute => 1887,
-      Iir_Kind_Length_Array_Attribute => 1894,
-      Iir_Kind_Ascending_Array_Attribute => 1901,
-      Iir_Kind_Range_Array_Attribute => 1908,
-      Iir_Kind_Reverse_Range_Array_Attribute => 1915,
-      Iir_Kind_Attribute_Name => 1924
+      Iir_Kind_Choice_By_Range => 151,
+      Iir_Kind_Choice_By_Expression => 161,
+      Iir_Kind_Choice_By_Others => 169,
+      Iir_Kind_Choice_By_None => 177,
+      Iir_Kind_Choice_By_Name => 186,
+      Iir_Kind_Entity_Aspect_Entity => 188,
+      Iir_Kind_Entity_Aspect_Configuration => 189,
+      Iir_Kind_Entity_Aspect_Open => 189,
+      Iir_Kind_Block_Configuration => 195,
+      Iir_Kind_Block_Header => 199,
+      Iir_Kind_Component_Configuration => 206,
+      Iir_Kind_Binding_Indication => 210,
+      Iir_Kind_Entity_Class => 212,
+      Iir_Kind_Attribute_Value => 220,
+      Iir_Kind_Signature => 223,
+      Iir_Kind_Aggregate_Info => 230,
+      Iir_Kind_Procedure_Call => 234,
+      Iir_Kind_Record_Element_Constraint => 241,
+      Iir_Kind_Array_Element_Resolution => 243,
+      Iir_Kind_Record_Resolution => 244,
+      Iir_Kind_Record_Element_Resolution => 247,
+      Iir_Kind_Attribute_Specification => 255,
+      Iir_Kind_Disconnection_Specification => 261,
+      Iir_Kind_Configuration_Specification => 267,
+      Iir_Kind_Access_Type_Definition => 275,
+      Iir_Kind_Incomplete_Type_Definition => 283,
+      Iir_Kind_Interface_Type_Definition => 290,
+      Iir_Kind_File_Type_Definition => 297,
+      Iir_Kind_Protected_Type_Declaration => 306,
+      Iir_Kind_Record_Type_Definition => 316,
+      Iir_Kind_Array_Type_Definition => 328,
+      Iir_Kind_Array_Subtype_Definition => 343,
+      Iir_Kind_Record_Subtype_Definition => 354,
+      Iir_Kind_Access_Subtype_Definition => 362,
+      Iir_Kind_Physical_Subtype_Definition => 372,
+      Iir_Kind_Floating_Subtype_Definition => 383,
+      Iir_Kind_Integer_Subtype_Definition => 393,
+      Iir_Kind_Enumeration_Subtype_Definition => 403,
+      Iir_Kind_Enumeration_Type_Definition => 414,
+      Iir_Kind_Integer_Type_Definition => 422,
+      Iir_Kind_Floating_Type_Definition => 430,
+      Iir_Kind_Physical_Type_Definition => 441,
+      Iir_Kind_Range_Expression => 449,
+      Iir_Kind_Protected_Type_Body => 456,
+      Iir_Kind_Wildcard_Type_Definition => 461,
+      Iir_Kind_Subtype_Definition => 466,
+      Iir_Kind_Scalar_Nature_Definition => 470,
+      Iir_Kind_Overload_List => 471,
+      Iir_Kind_Type_Declaration => 478,
+      Iir_Kind_Anonymous_Type_Declaration => 484,
+      Iir_Kind_Subtype_Declaration => 491,
+      Iir_Kind_Nature_Declaration => 497,
+      Iir_Kind_Subnature_Declaration => 503,
+      Iir_Kind_Entity_Declaration => 515,
+      Iir_Kind_Configuration_Declaration => 524,
+      Iir_Kind_Context_Declaration => 530,
+      Iir_Kind_Package_Declaration => 544,
+      Iir_Kind_Package_Instantiation_Declaration => 558,
+      Iir_Kind_Package_Body => 566,
+      Iir_Kind_Architecture_Body => 578,
+      Iir_Kind_Package_Header => 580,
+      Iir_Kind_Unit_Declaration => 589,
+      Iir_Kind_Library_Declaration => 596,
+      Iir_Kind_Component_Declaration => 606,
+      Iir_Kind_Attribute_Declaration => 613,
+      Iir_Kind_Group_Template_Declaration => 619,
+      Iir_Kind_Group_Declaration => 626,
+      Iir_Kind_Element_Declaration => 634,
+      Iir_Kind_Non_Object_Alias_Declaration => 642,
+      Iir_Kind_Psl_Declaration => 650,
+      Iir_Kind_Psl_Endpoint_Declaration => 664,
+      Iir_Kind_Terminal_Declaration => 670,
+      Iir_Kind_Free_Quantity_Declaration => 679,
+      Iir_Kind_Across_Quantity_Declaration => 691,
+      Iir_Kind_Through_Quantity_Declaration => 703,
+      Iir_Kind_Enumeration_Literal => 714,
+      Iir_Kind_Function_Declaration => 739,
+      Iir_Kind_Procedure_Declaration => 763,
+      Iir_Kind_Function_Body => 773,
+      Iir_Kind_Procedure_Body => 784,
+      Iir_Kind_Object_Alias_Declaration => 795,
+      Iir_Kind_File_Declaration => 809,
+      Iir_Kind_Guard_Signal_Declaration => 822,
+      Iir_Kind_Signal_Declaration => 839,
+      Iir_Kind_Variable_Declaration => 852,
+      Iir_Kind_Constant_Declaration => 866,
+      Iir_Kind_Iterator_Declaration => 877,
+      Iir_Kind_Interface_Constant_Declaration => 893,
+      Iir_Kind_Interface_Variable_Declaration => 909,
+      Iir_Kind_Interface_Signal_Declaration => 930,
+      Iir_Kind_Interface_File_Declaration => 946,
+      Iir_Kind_Interface_Type_Declaration => 956,
+      Iir_Kind_Interface_Package_Declaration => 968,
+      Iir_Kind_Interface_Function_Declaration => 985,
+      Iir_Kind_Interface_Procedure_Declaration => 998,
+      Iir_Kind_Signal_Attribute_Declaration => 1001,
+      Iir_Kind_Identity_Operator => 1005,
+      Iir_Kind_Negation_Operator => 1009,
+      Iir_Kind_Absolute_Operator => 1013,
+      Iir_Kind_Not_Operator => 1017,
+      Iir_Kind_Implicit_Condition_Operator => 1021,
+      Iir_Kind_Condition_Operator => 1025,
+      Iir_Kind_Reduction_And_Operator => 1029,
+      Iir_Kind_Reduction_Or_Operator => 1033,
+      Iir_Kind_Reduction_Nand_Operator => 1037,
+      Iir_Kind_Reduction_Nor_Operator => 1041,
+      Iir_Kind_Reduction_Xor_Operator => 1045,
+      Iir_Kind_Reduction_Xnor_Operator => 1049,
+      Iir_Kind_And_Operator => 1054,
+      Iir_Kind_Or_Operator => 1059,
+      Iir_Kind_Nand_Operator => 1064,
+      Iir_Kind_Nor_Operator => 1069,
+      Iir_Kind_Xor_Operator => 1074,
+      Iir_Kind_Xnor_Operator => 1079,
+      Iir_Kind_Equality_Operator => 1084,
+      Iir_Kind_Inequality_Operator => 1089,
+      Iir_Kind_Less_Than_Operator => 1094,
+      Iir_Kind_Less_Than_Or_Equal_Operator => 1099,
+      Iir_Kind_Greater_Than_Operator => 1104,
+      Iir_Kind_Greater_Than_Or_Equal_Operator => 1109,
+      Iir_Kind_Match_Equality_Operator => 1114,
+      Iir_Kind_Match_Inequality_Operator => 1119,
+      Iir_Kind_Match_Less_Than_Operator => 1124,
+      Iir_Kind_Match_Less_Than_Or_Equal_Operator => 1129,
+      Iir_Kind_Match_Greater_Than_Operator => 1134,
+      Iir_Kind_Match_Greater_Than_Or_Equal_Operator => 1139,
+      Iir_Kind_Sll_Operator => 1144,
+      Iir_Kind_Sla_Operator => 1149,
+      Iir_Kind_Srl_Operator => 1154,
+      Iir_Kind_Sra_Operator => 1159,
+      Iir_Kind_Rol_Operator => 1164,
+      Iir_Kind_Ror_Operator => 1169,
+      Iir_Kind_Addition_Operator => 1174,
+      Iir_Kind_Substraction_Operator => 1179,
+      Iir_Kind_Concatenation_Operator => 1184,
+      Iir_Kind_Multiplication_Operator => 1189,
+      Iir_Kind_Division_Operator => 1194,
+      Iir_Kind_Modulus_Operator => 1199,
+      Iir_Kind_Remainder_Operator => 1204,
+      Iir_Kind_Exponentiation_Operator => 1209,
+      Iir_Kind_Function_Call => 1217,
+      Iir_Kind_Aggregate => 1224,
+      Iir_Kind_Parenthesis_Expression => 1227,
+      Iir_Kind_Qualified_Expression => 1231,
+      Iir_Kind_Type_Conversion => 1236,
+      Iir_Kind_Allocator_By_Expression => 1240,
+      Iir_Kind_Allocator_By_Subtype => 1245,
+      Iir_Kind_Selected_Element => 1252,
+      Iir_Kind_Dereference => 1257,
+      Iir_Kind_Implicit_Dereference => 1262,
+      Iir_Kind_Slice_Name => 1269,
+      Iir_Kind_Indexed_Name => 1275,
+      Iir_Kind_Psl_Expression => 1277,
+      Iir_Kind_Sensitized_Process_Statement => 1298,
+      Iir_Kind_Process_Statement => 1318,
+      Iir_Kind_Concurrent_Simple_Signal_Assignment => 1330,
+      Iir_Kind_Concurrent_Conditional_Signal_Assignment => 1342,
+      Iir_Kind_Concurrent_Selected_Signal_Assignment => 1355,
+      Iir_Kind_Concurrent_Assertion_Statement => 1363,
+      Iir_Kind_Concurrent_Procedure_Call_Statement => 1370,
+      Iir_Kind_Psl_Assert_Statement => 1383,
+      Iir_Kind_Psl_Cover_Statement => 1396,
+      Iir_Kind_Block_Statement => 1409,
+      Iir_Kind_If_Generate_Statement => 1420,
+      Iir_Kind_Case_Generate_Statement => 1429,
+      Iir_Kind_For_Generate_Statement => 1438,
+      Iir_Kind_Component_Instantiation_Statement => 1449,
+      Iir_Kind_Psl_Default_Clock => 1453,
+      Iir_Kind_Simple_Simultaneous_Statement => 1460,
+      Iir_Kind_Generate_Statement_Body => 1471,
+      Iir_Kind_If_Generate_Else_Clause => 1477,
+      Iir_Kind_Simple_Signal_Assignment_Statement => 1487,
+      Iir_Kind_Conditional_Signal_Assignment_Statement => 1497,
+      Iir_Kind_Selected_Waveform_Assignment_Statement => 1508,
+      Iir_Kind_Null_Statement => 1512,
+      Iir_Kind_Assertion_Statement => 1519,
+      Iir_Kind_Report_Statement => 1525,
+      Iir_Kind_Wait_Statement => 1533,
+      Iir_Kind_Variable_Assignment_Statement => 1540,
+      Iir_Kind_Conditional_Variable_Assignment_Statement => 1547,
+      Iir_Kind_Return_Statement => 1553,
+      Iir_Kind_For_Loop_Statement => 1562,
+      Iir_Kind_While_Loop_Statement => 1571,
+      Iir_Kind_Next_Statement => 1578,
+      Iir_Kind_Exit_Statement => 1585,
+      Iir_Kind_Case_Statement => 1593,
+      Iir_Kind_Procedure_Call_Statement => 1599,
+      Iir_Kind_If_Statement => 1609,
+      Iir_Kind_Elsif => 1615,
+      Iir_Kind_Character_Literal => 1623,
+      Iir_Kind_Simple_Name => 1631,
+      Iir_Kind_Selected_Name => 1640,
+      Iir_Kind_Operator_Symbol => 1646,
+      Iir_Kind_Reference_Name => 1649,
+      Iir_Kind_External_Constant_Name => 1658,
+      Iir_Kind_External_Signal_Name => 1667,
+      Iir_Kind_External_Variable_Name => 1676,
+      Iir_Kind_Selected_By_All_Name => 1682,
+      Iir_Kind_Parenthesis_Name => 1687,
+      Iir_Kind_Package_Pathname => 1691,
+      Iir_Kind_Absolute_Pathname => 1692,
+      Iir_Kind_Relative_Pathname => 1693,
+      Iir_Kind_Pathname_Element => 1698,
+      Iir_Kind_Base_Attribute => 1700,
+      Iir_Kind_Subtype_Attribute => 1705,
+      Iir_Kind_Element_Attribute => 1710,
+      Iir_Kind_Left_Type_Attribute => 1715,
+      Iir_Kind_Right_Type_Attribute => 1720,
+      Iir_Kind_High_Type_Attribute => 1725,
+      Iir_Kind_Low_Type_Attribute => 1730,
+      Iir_Kind_Ascending_Type_Attribute => 1735,
+      Iir_Kind_Image_Attribute => 1741,
+      Iir_Kind_Value_Attribute => 1747,
+      Iir_Kind_Pos_Attribute => 1753,
+      Iir_Kind_Val_Attribute => 1759,
+      Iir_Kind_Succ_Attribute => 1765,
+      Iir_Kind_Pred_Attribute => 1771,
+      Iir_Kind_Leftof_Attribute => 1777,
+      Iir_Kind_Rightof_Attribute => 1783,
+      Iir_Kind_Delayed_Attribute => 1792,
+      Iir_Kind_Stable_Attribute => 1801,
+      Iir_Kind_Quiet_Attribute => 1810,
+      Iir_Kind_Transaction_Attribute => 1819,
+      Iir_Kind_Event_Attribute => 1823,
+      Iir_Kind_Active_Attribute => 1827,
+      Iir_Kind_Last_Event_Attribute => 1831,
+      Iir_Kind_Last_Active_Attribute => 1835,
+      Iir_Kind_Last_Value_Attribute => 1839,
+      Iir_Kind_Driving_Attribute => 1843,
+      Iir_Kind_Driving_Value_Attribute => 1847,
+      Iir_Kind_Behavior_Attribute => 1847,
+      Iir_Kind_Structure_Attribute => 1847,
+      Iir_Kind_Simple_Name_Attribute => 1854,
+      Iir_Kind_Instance_Name_Attribute => 1859,
+      Iir_Kind_Path_Name_Attribute => 1864,
+      Iir_Kind_Left_Array_Attribute => 1871,
+      Iir_Kind_Right_Array_Attribute => 1878,
+      Iir_Kind_High_Array_Attribute => 1885,
+      Iir_Kind_Low_Array_Attribute => 1892,
+      Iir_Kind_Length_Array_Attribute => 1899,
+      Iir_Kind_Ascending_Array_Attribute => 1906,
+      Iir_Kind_Range_Array_Attribute => 1913,
+      Iir_Kind_Reverse_Range_Array_Attribute => 1920,
+      Iir_Kind_Attribute_Name => 1929
      );
 
    function Get_Fields_First (K : Iir_Kind) return Fields_Index is
@@ -10628,6 +10633,11 @@ package body Nodes_Meta is
       case K is
          when Iir_Kind_Conditional_Waveform
            | Iir_Kind_Conditional_Expression
+           | Iir_Kind_Choice_By_Range
+           | Iir_Kind_Choice_By_Expression
+           | Iir_Kind_Choice_By_Others
+           | Iir_Kind_Choice_By_None
+           | Iir_Kind_Choice_By_Name
            | Iir_Kind_Component_Configuration
            | Iir_Kind_Disconnection_Specification
            | Iir_Kind_Configuration_Specification
diff --git a/src/vhdl/nodes_meta.ads b/src/vhdl/nodes_meta.ads
index 4181b1661..25faea793 100644
--- a/src/vhdl/nodes_meta.ads
+++ b/src/vhdl/nodes_meta.ads
@@ -408,6 +408,7 @@ package Nodes_Meta is
       Attr_Forward_Ref,
       Attr_Maybe_Forward_Ref,
       Attr_Maybe_Ref,
+      Attr_Maybe_Ref_Chain,
       Attr_Of_Maybe_Ref,
       Attr_Of_Ref,
       Attr_Ref
diff --git a/src/vhdl/sem_inst.adb b/src/vhdl/sem_inst.adb
index 029ec235d..e22f8e1d4 100644
--- a/src/vhdl/sem_inst.adb
+++ b/src/vhdl/sem_inst.adb
@@ -275,6 +275,12 @@ package body Sem_Inst is
                      end if;
                   when Attr_Chain =>
                      R := Instantiate_Iir_Chain (S);
+                  when Attr_Maybe_Ref_Chain =>
+                     if Get_Is_Ref (N) then
+                        R := Instantiate_Iir (S, True);
+                     else
+                        R := Instantiate_Iir_Chain (S);
+                     end if;
                   when Attr_Chain_Next =>
                      R := Null_Iir;
                   when Attr_Of_Ref | Attr_Of_Maybe_Ref =>
@@ -733,6 +739,10 @@ package body Sem_Inst is
                            end if;
                         when Attr_Chain =>
                            Set_Instance_On_Chain (S, S_Inst);
+                        when Attr_Maybe_Ref_Chain =>
+                           if not Get_Is_Ref (N) then
+                              Set_Instance_On_Chain (S, S_Inst);
+                           end if;
                         when Attr_Chain_Next =>
                            null;
                         when Attr_Of_Ref | Attr_Of_Maybe_Ref =>
@@ -1120,6 +1130,10 @@ package body Sem_Inst is
                               end if;
                            when Attr_Chain =>
                               Substitute_On_Chain (S, E, Rep);
+                           when Attr_Maybe_Ref_Chain =>
+                              if not Get_Is_Ref (N) then
+                                 Substitute_On_Chain (S, E, Rep);
+                              end if;
                            when Attr_Chain_Next =>
                               null;
                            when Attr_Of_Ref | Attr_Of_Maybe_Ref =>
diff --git a/src/vhdl/translate/trans-chap2.adb b/src/vhdl/translate/trans-chap2.adb
index 81f4fa7a3..60040ea2e 100644
--- a/src/vhdl/translate/trans-chap2.adb
+++ b/src/vhdl/translate/trans-chap2.adb
@@ -1433,6 +1433,10 @@ package body Trans.Chap2 is
                         end if;
                      when Attr_Chain =>
                         Instantiate_Iir_Chain_Info (Get_Iir (N, F));
+                     when Attr_Maybe_Ref_Chain =>
+                        if not Get_Is_Ref (N) then
+                           Instantiate_Iir_Chain_Info (Get_Iir (N, F));
+                        end if;
                      when Attr_Chain_Next =>
                         null;
                      when Attr_Of_Ref | Attr_Of_Maybe_Ref =>
diff --git a/src/vhdl/translate/trans-chap9.adb b/src/vhdl/translate/trans-chap9.adb
index b1001a4ed..10bd3233f 100644
--- a/src/vhdl/translate/trans-chap9.adb
+++ b/src/vhdl/translate/trans-chap9.adb
@@ -1213,6 +1213,10 @@ package body Trans.Chap9 is
                         end if;
                      when Attr_Chain =>
                         Destroy_Types_In_Chain (Get_Iir (N, F));
+                     when Attr_Maybe_Ref_Chain =>
+                        if not Get_Is_Ref (N) then
+                           Destroy_Types_In_Chain (Get_Iir (N, F));
+                        end if;
                      when Attr_Chain_Next =>
                         null;
                      when Attr_Of_Ref | Attr_Of_Maybe_Ref =>
-- 
cgit v1.2.3