diff options
Diffstat (limited to 'src')
38 files changed, 1935 insertions, 1129 deletions
diff --git a/src/libraries.adb b/src/libraries.adb index 3d864a6aa..36c79579e 100644 --- a/src/libraries.adb +++ b/src/libraries.adb @@ -1553,7 +1553,7 @@ package body Libraries is -- The unit must not be loaded. pragma Assert (Get_Date_State (Design_Unit) = Date_Disk); - -- Load and parse the unit. + -- Load the file in memory. Design_File := Get_Design_File (Design_Unit); Fe := Files_Map.Load_Source_File (Get_Design_File_Directory (Design_File), @@ -1564,6 +1564,7 @@ package body Libraries is end if; Set_File (Fe); + -- Check if the file has changed. if not Files_Map.Is_Eq (Files_Map.Get_File_Checksum (Get_Current_Source_File), Get_File_Checksum (Design_File)) @@ -1576,24 +1577,42 @@ package body Libraries is +Get_Library_Unit (Design_Unit)); raise Compilation_Error; end if; + + -- Set the position of the lexer Pos := Get_Design_Unit_Source_Pos (Design_Unit); Line := Natural (Get_Design_Unit_Source_Line (Design_Unit)); Off := Natural (Get_Design_Unit_Source_Col (Design_Unit)); Files_Map.File_Add_Line_Number (Get_Current_Source_File, Line, Pos); Set_Current_Position (Pos + Source_Ptr (Off)); + + -- Parse Res := Parse.Parse_Design_Unit; Close_File; if Res = Null_Iir then raise Compilation_Error; end if; + Set_Date_State (Design_Unit, Date_Parse); + -- FIXME: check the library unit read is the one expected. - -- Copy node. + + -- Move the unit in the library: keep the design_unit of the library, + -- but replace the library_unit by the one that has been parsed. Do + -- not forget to relocate parents. Iirs_Utils.Free_Recursive (Get_Library_Unit (Design_Unit)); Set_Library_Unit (Design_Unit, Get_Library_Unit (Res)); Set_Design_Unit (Get_Library_Unit (Res), Design_Unit); Set_Parent (Get_Library_Unit (Res), Design_Unit); - Set_Context_Items (Design_Unit, Get_Context_Items (Res)); + declare + Item : Iir; + begin + Item := Get_Context_Items (Res); + Set_Context_Items (Design_Unit, Item); + while Is_Valid (Item) loop + Set_Parent (Item, Design_Unit); + Item := Get_Chain (Item); + end loop; + end; Location_Copy (Design_Unit, Res); Free_Dependence_List (Design_Unit); Set_Dependence_List (Design_Unit, Get_Dependence_List (Res)); diff --git a/src/vhdl/canon.adb b/src/vhdl/canon.adb index b39caab9b..f8ed243ed 100644 --- a/src/vhdl/canon.adb +++ b/src/vhdl/canon.adb @@ -2518,8 +2518,7 @@ package body Canon is -- Return the new package declaration (if any). function Canon_Package_Instantiation_Declaration (Decl : Iir) return Iir is - Pkg : constant Iir := - Get_Named_Entity (Get_Uninstantiated_Package_Name (Decl)); + Pkg : constant Iir := Get_Uninstantiated_Package_Decl (Decl); begin -- Canon map aspect. Set_Generic_Map_Aspect_Chain diff --git a/src/vhdl/disp_tree.adb b/src/vhdl/disp_tree.adb index c408651bc..062f98d9a 100644 --- a/src/vhdl/disp_tree.adb +++ b/src/vhdl/disp_tree.adb @@ -401,7 +401,8 @@ package body Disp_Tree is when Attr_None => Disp_Iir (Get_Iir (N, F), Sub_Indent, Depth - 1); when Attr_Ref - | Attr_Forward_Ref => + | Attr_Forward_Ref + | Attr_Maybe_Forward_Ref => Disp_Iir (Get_Iir (N, F), Sub_Indent, 0); when Attr_Maybe_Ref => if Get_Is_Ref (N) then diff --git a/src/vhdl/disp_vhdl.adb b/src/vhdl/disp_vhdl.adb index b3abdcdb1..bfa044e9c 100644 --- a/src/vhdl/disp_vhdl.adb +++ b/src/vhdl/disp_vhdl.adb @@ -383,9 +383,18 @@ package body Disp_Vhdl is when Iir_Kinds_Denoting_Name => Disp_Name (Ind); when Iir_Kind_Array_Element_Resolution => - Put ("("); - Inner (Get_Resolution_Indication (Ind)); - Put (")"); + declare + Res : constant Iir := Get_Resolution_Indication (Ind); + begin + Put ("("); + if Is_Valid (Res) then + Inner (Res); + else + Disp_Name (Get_Resolution_Indication + (Get_Element_Subtype_Indication (Ind))); + end if; + Put (")"); + end; when others => Error_Kind ("disp_resolution_indication", Ind); end case; @@ -708,7 +717,9 @@ package body Disp_Vhdl is Put (";"); end Disp_Array_Type_Definition; - procedure Disp_Physical_Literal (Lit: Iir) is + procedure Disp_Physical_Literal (Lit: Iir) + is + Unit : Iir; begin case Get_Kind (Lit) is when Iir_Kind_Physical_Int_Literal => @@ -722,7 +733,12 @@ package body Disp_Vhdl is Error_Kind ("disp_physical_literal", Lit); end case; Put (' '); - Disp_Name (Get_Unit_Name (Lit)); + + Unit := Get_Unit_Name (Lit); + if Is_Valid (Unit) then + -- No unit in range_constraint of physical type declaration. + Disp_Name (Unit); + end if; end Disp_Physical_Literal; procedure Disp_Physical_Subtype_Definition @@ -1232,10 +1248,14 @@ package body Disp_Vhdl is procedure Disp_Signature (Sig : Iir) is + Prefix : constant Iir := Get_Signature_Prefix (Sig); List : Iir_List; El : Iir; begin - Disp_Name (Get_Signature_Prefix (Sig)); + if Is_Valid (Prefix) then + -- Only in alias. + Disp_Name (Prefix); + end if; Put (" ["); List := Get_Type_Marks_List (Sig); if List /= Null_Iir_List then @@ -1280,10 +1300,9 @@ package body Disp_Vhdl is Put ("alias "); Disp_Function_Name (Decl); Put (" is "); + Disp_Name (Get_Name (Decl)); if Sig /= Null_Iir then Disp_Signature (Sig); - else - Disp_Name (Get_Name (Decl)); end if; Put_Line (";"); end Disp_Non_Object_Alias_Declaration; @@ -1570,10 +1589,9 @@ package body Disp_Vhdl is is Sig : constant Iir := Get_Attribute_Signature (Attr); begin + Disp_Name (Get_Prefix (Attr)); if Sig /= Null_Iir then Disp_Signature (Sig); - else - Disp_Name (Get_Prefix (Attr)); end if; Put ("'"); Disp_Ident (Get_Identifier (Attr)); diff --git a/src/vhdl/errorout.adb b/src/vhdl/errorout.adb index 66ace9652..7f34d2689 100644 --- a/src/vhdl/errorout.adb +++ b/src/vhdl/errorout.adb @@ -792,6 +792,9 @@ package body Errorout is return ''' & Name_Table.Nam_Buffer (1 .. Name_Table.Nam_Length) & '''; + when Iir_Kind_Reference_Name => + -- Shouldn't happen. + return "name"; when Iir_Kind_External_Constant_Name => return "external constant name"; when Iir_Kind_External_Signal_Name => diff --git a/src/vhdl/evaluation.adb b/src/vhdl/evaluation.adb index 9c5f4cf3c..cdac9e5a5 100644 --- a/src/vhdl/evaluation.adb +++ b/src/vhdl/evaluation.adb @@ -40,8 +40,7 @@ package body Evaluation is when Iir_Kind_Physical_Int_Literal | Iir_Kind_Physical_Fp_Literal => -- Extract Unit. - Unit := Get_Physical_Unit_Value - (Get_Named_Entity (Get_Unit_Name (Expr))); + Unit := Get_Physical_Unit_Value (Get_Physical_Unit (Expr)); case Kind is when Iir_Kind_Physical_Int_Literal => return Get_Value (Expr) * Get_Value (Unit); @@ -110,8 +109,8 @@ package body Evaluation is begin Res := Create_Iir (Iir_Kind_Physical_Int_Literal); Location_Copy (Res, Origin); - Unit_Name := Get_Primary_Unit_Name (Get_Base_Type (Get_Type (Origin))); - Set_Unit_Name (Res, Unit_Name); + Unit_Name := Get_Primary_Unit (Get_Base_Type (Get_Type (Origin))); + Set_Physical_Unit (Res, Unit_Name); Set_Value (Res, Val); Set_Type (Res, Get_Type (Origin)); Set_Literal_Origin (Res, Origin); @@ -148,9 +147,14 @@ package body Evaluation is return Res; end Build_String; - function Build_Simple_Aggregate - (El_List : Iir_List; Origin : Iir; Stype : Iir) - return Iir_Simple_Aggregate + -- Build a simple aggregate composed of EL_LIST from ORIGIN. STYPE is the + -- type of the aggregate. DEF_TYPE should be either Null_Iir or STYPE. It + -- is set only when a new subtype has been created for the aggregate. + function Build_Simple_Aggregate (El_List : Iir_List; + Origin : Iir; + Stype : Iir; + Def_Type : Iir := Null_Iir) + return Iir_Simple_Aggregate is Res : Iir_Simple_Aggregate; begin @@ -160,7 +164,7 @@ package body Evaluation is Set_Type (Res, Stype); Set_Literal_Origin (Res, Origin); Set_Expr_Staticness (Res, Locally); - Set_Literal_Subtype (Res, Stype); + Set_Literal_Subtype (Res, Def_Type); return Res; end Build_Simple_Aggregate; @@ -203,14 +207,14 @@ package body Evaluation is when Iir_Kind_Physical_Int_Literal | Iir_Kind_Physical_Fp_Literal => Res := Create_Iir (Iir_Kind_Physical_Int_Literal); - Set_Unit_Name (Res, Get_Primary_Unit_Name - (Get_Base_Type (Get_Type (Origin)))); + Set_Physical_Unit (Res, Get_Primary_Unit + (Get_Base_Type (Get_Type (Origin)))); Set_Value (Res, Get_Physical_Value (Val)); when Iir_Kind_Unit_Declaration => Res := Create_Iir (Iir_Kind_Physical_Int_Literal); Set_Value (Res, Get_Physical_Value (Val)); - Set_Unit_Name (Res, Get_Primary_Unit_Name (Get_Type (Val))); + Set_Physical_Unit (Res, Get_Primary_Unit (Get_Type (Val))); when Iir_Kind_String_Literal8 => Res := Create_Iir (Iir_Kind_String_Literal8); @@ -220,7 +224,6 @@ package body Evaluation is when Iir_Kind_Simple_Aggregate => Res := Create_Iir (Iir_Kind_Simple_Aggregate); Set_Simple_Aggregate_List (Res, Get_Simple_Aggregate_List (Val)); - Set_Literal_Subtype (Res, Get_Type (Origin)); when Iir_Kind_Overflow_Literal => Res := Create_Iir (Iir_Kind_Overflow_Literal); @@ -235,6 +238,15 @@ package body Evaluation is return Res; end Build_Constant; + function Copy_Constant (Val : Iir) return Iir + is + Res : Iir; + begin + Res := Build_Constant (Val, Val); + Set_Literal_Origin (Res, Null_Iir); + return Res; + end Copy_Constant; + -- FIXME: origin ? function Build_Boolean (Cond : Boolean) return Iir is begin @@ -273,9 +285,7 @@ package body Evaluation is Location_Copy (Res, Origin); Set_Type (Res, Get_Type (Range_Expr)); Set_Left_Limit (Res, Get_Left_Limit (Range_Expr)); - Set_Left_Limit_Expr (Res, Get_Left_Limit_Expr (Range_Expr)); Set_Right_Limit (Res, Get_Right_Limit (Range_Expr)); - Set_Right_Limit_Expr (Res, Get_Right_Limit_Expr (Range_Expr)); Set_Direction (Res, Get_Direction (Range_Expr)); Set_Range_Origin (Res, Origin); Set_Expr_Staticness (Res, Locally); @@ -908,7 +918,7 @@ package body Evaluation is end if; -- FIXME: this is not necessarily a string, it may be an aggregate if -- element type is not a character type. - return Build_Simple_Aggregate (Res_List, Orig, Res_Type); + return Build_Simple_Aggregate (Res_List, Orig, Res_Type, Res_Type); end Eval_Concatenation; function Eval_Discrete_Compare (Left, Right : Iir) return Compare_Type @@ -1951,7 +1961,7 @@ package body Evaluation is if Get_Kind (Res) /= Iir_Kind_Overflow_Literal then Warning_Msg_Sem (Warnid_Runtime_Error, +Expr, "result of conversion out of bounds"); - Res := Build_Overflow (Res); + Res := Build_Overflow (Expr); end if; end if; return Res; @@ -1965,13 +1975,9 @@ package body Evaluation is when Iir_Kind_Physical_Fp_Literal => Val := Expr; when Iir_Kind_Physical_Int_Literal => - if Get_Named_Entity (Get_Unit_Name (Expr)) - = Get_Primary_Unit (Get_Base_Type (Get_Type (Expr))) - then - return Expr; - else - Val := Expr; - end if; + -- Create a copy even if the literal has the primary unit. This + -- is required for ownership rule. + Val := Expr; when Iir_Kind_Unit_Declaration => Val := Expr; when Iir_Kinds_Denoting_Name => @@ -2785,10 +2791,23 @@ package body Evaluation is end if; -- Normalize the range expression. - Set_Left_Limit - (Expr, Eval_Expr_Keep_Orig (Get_Left_Limit (Expr), True)); - Set_Right_Limit - (Expr, Eval_Expr_Keep_Orig (Get_Right_Limit (Expr), True)); + declare + Left : Iir; + Right : Iir; + begin + Left := Get_Left_Limit_Expr (Expr); + if Is_Valid (Left) then + Left := Eval_Expr_Keep_Orig (Left, False); + Set_Left_Limit_Expr (Expr, Left); + Set_Left_Limit (Expr, Left); + end if; + Right := Get_Right_Limit_Expr (Expr); + if Is_Valid (Right) then + Right := Eval_Expr_Keep_Orig (Right, False); + Set_Right_Limit_Expr (Expr, Right); + Set_Right_Limit (Expr, Right); + end if; + end; return Expr; when Iir_Kind_Integer_Subtype_Definition | Iir_Kind_Floating_Subtype_Definition diff --git a/src/vhdl/evaluation.ads b/src/vhdl/evaluation.ads index 29ab8e799..95eb0202f 100644 --- a/src/vhdl/evaluation.ads +++ b/src/vhdl/evaluation.ads @@ -179,4 +179,7 @@ package Evaluation is function Get_Path_Instance_Name_Suffix (Attr : Iir) return Path_Instance_Name_Type; + + -- Create a copy of VAL. + function Copy_Constant (Val : Iir) return Iir; end Evaluation; diff --git a/src/vhdl/iirs.adb b/src/vhdl/iirs.adb index 5e940d3ac..b963826df 100644 --- a/src/vhdl/iirs.adb +++ b/src/vhdl/iirs.adb @@ -423,6 +423,7 @@ package body Iirs is | Iir_Kind_Simple_Name | Iir_Kind_Selected_Name | Iir_Kind_Operator_Symbol + | Iir_Kind_Reference_Name | Iir_Kind_Selected_By_All_Name | Iir_Kind_Parenthesis_Name | Iir_Kind_External_Constant_Name @@ -1646,7 +1647,7 @@ package body Iirs is pragma Assert (Target /= Null_Iir); pragma Assert (Has_Spec_Chain (Get_Kind (Target)), "no field Spec_Chain"); - return Get_Field0 (Target); + return Get_Field2 (Target); end Get_Spec_Chain; procedure Set_Spec_Chain (Target : Iir; Chain : Iir) is @@ -1654,9 +1655,25 @@ package body Iirs is pragma Assert (Target /= Null_Iir); pragma Assert (Has_Spec_Chain (Get_Kind (Target)), "no field Spec_Chain"); - Set_Field0 (Target, Chain); + Set_Field2 (Target, Chain); end Set_Spec_Chain; + function Get_Value_Chain (Target : Iir) return Iir is + begin + pragma Assert (Target /= Null_Iir); + pragma Assert (Has_Value_Chain (Get_Kind (Target)), + "no field Value_Chain"); + return Get_Field0 (Target); + end Get_Value_Chain; + + procedure Set_Value_Chain (Target : Iir; Chain : Iir) is + begin + pragma Assert (Target /= Null_Iir); + pragma Assert (Has_Value_Chain (Get_Kind (Target)), + "no field Value_Chain"); + Set_Field0 (Target, Chain); + end Set_Value_Chain; + function Get_Attribute_Value_Spec_Chain (Target : Iir) return Iir is begin pragma Assert (Target /= Null_Iir); @@ -2399,6 +2416,22 @@ package body Iirs is Set_Field4 (Target, Iir_Index32'Pos (Pos)); end Set_Element_Position; + function Get_Base_Element_Declaration (Target : Iir) return Iir is + begin + pragma Assert (Target /= Null_Iir); + pragma Assert (Has_Base_Element_Declaration (Get_Kind (Target)), + "no field Base_Element_Declaration"); + return Get_Field2 (Target); + end Get_Base_Element_Declaration; + + procedure Set_Base_Element_Declaration (Target : Iir; El : Iir) is + begin + pragma Assert (Target /= Null_Iir); + pragma Assert (Has_Base_Element_Declaration (Get_Kind (Target)), + "no field Base_Element_Declaration"); + Set_Field2 (Target, El); + end Set_Base_Element_Declaration; + function Get_Element_Declaration (Target : Iir) return Iir is begin pragma Assert (Target /= Null_Iir); @@ -2708,7 +2741,7 @@ package body Iirs is pragma Assert (Decl /= Null_Iir); pragma Assert (Has_Left_Limit (Get_Kind (Decl)), "no field Left_Limit"); - return Get_Field2 (Decl); + return Get_Field4 (Decl); end Get_Left_Limit; procedure Set_Left_Limit (Decl : Iir_Range_Expression; Limit : Iir) is @@ -2716,7 +2749,7 @@ package body Iirs is pragma Assert (Decl /= Null_Iir); pragma Assert (Has_Left_Limit (Get_Kind (Decl)), "no field Left_Limit"); - Set_Field2 (Decl, Limit); + Set_Field4 (Decl, Limit); end Set_Left_Limit; function Get_Right_Limit (Decl : Iir_Range_Expression) return Iir is @@ -2724,7 +2757,7 @@ package body Iirs is pragma Assert (Decl /= Null_Iir); pragma Assert (Has_Right_Limit (Get_Kind (Decl)), "no field Right_Limit"); - return Get_Field3 (Decl); + return Get_Field5 (Decl); end Get_Right_Limit; procedure Set_Right_Limit (Decl : Iir_Range_Expression; Limit : Iir) is @@ -2732,7 +2765,7 @@ package body Iirs is pragma Assert (Decl /= Null_Iir); pragma Assert (Has_Right_Limit (Get_Kind (Decl)), "no field Right_Limit"); - Set_Field3 (Decl, Limit); + Set_Field5 (Decl, Limit); end Set_Right_Limit; function Get_Left_Limit_Expr (Decl : Iir_Range_Expression) return Iir is @@ -2740,7 +2773,7 @@ package body Iirs is pragma Assert (Decl /= Null_Iir); pragma Assert (Has_Left_Limit_Expr (Get_Kind (Decl)), "no field Left_Limit_Expr"); - return Get_Field4 (Decl); + return Get_Field2 (Decl); end Get_Left_Limit_Expr; procedure Set_Left_Limit_Expr (Decl : Iir_Range_Expression; Limit : Iir) is @@ -2748,7 +2781,7 @@ package body Iirs is pragma Assert (Decl /= Null_Iir); pragma Assert (Has_Left_Limit_Expr (Get_Kind (Decl)), "no field Left_Limit_Expr"); - Set_Field4 (Decl, Limit); + Set_Field2 (Decl, Limit); end Set_Left_Limit_Expr; function Get_Right_Limit_Expr (Decl : Iir_Range_Expression) return Iir is @@ -2756,7 +2789,7 @@ package body Iirs is pragma Assert (Decl /= Null_Iir); pragma Assert (Has_Right_Limit_Expr (Get_Kind (Decl)), "no field Right_Limit_Expr"); - return Get_Field5 (Decl); + return Get_Field3 (Decl); end Get_Right_Limit_Expr; procedure Set_Right_Limit_Expr (Decl : Iir_Range_Expression; Limit : Iir) @@ -2765,7 +2798,7 @@ package body Iirs is pragma Assert (Decl /= Null_Iir); pragma Assert (Has_Right_Limit_Expr (Get_Kind (Decl)), "no field Right_Limit_Expr"); - Set_Field5 (Decl, Limit); + Set_Field3 (Decl, Limit); end Set_Right_Limit_Expr; function Get_Base_Type (Decl : Iir) return Iir is @@ -4018,6 +4051,22 @@ package body Iirs is Set_Field7 (Inst, Name); end Set_Uninstantiated_Package_Name; + function Get_Uninstantiated_Package_Decl (Inst : Iir) return Iir is + begin + pragma Assert (Inst /= Null_Iir); + pragma Assert (Has_Uninstantiated_Package_Decl (Get_Kind (Inst)), + "no field Uninstantiated_Package_Decl"); + return Get_Field9 (Inst); + end Get_Uninstantiated_Package_Decl; + + procedure Set_Uninstantiated_Package_Decl (Inst : Iir; Pkg : Iir) is + begin + pragma Assert (Inst /= Null_Iir); + pragma Assert (Has_Uninstantiated_Package_Decl (Get_Kind (Inst)), + "no field Uninstantiated_Package_Decl"); + Set_Field9 (Inst, Pkg); + end Set_Uninstantiated_Package_Decl; + function Get_Generate_Block_Configuration (Target : Iir) return Iir is begin pragma Assert (Target /= Null_Iir); @@ -4308,6 +4357,22 @@ package body Iirs is Set_Field2 (Name, Val); end Set_Alias_Declaration; + function Get_Referenced_Name (N : Iir) return Iir is + begin + pragma Assert (N /= Null_Iir); + pragma Assert (Has_Referenced_Name (Get_Kind (N)), + "no field Referenced_Name"); + return Get_Field2 (N); + end Get_Referenced_Name; + + procedure Set_Referenced_Name (N : Iir; Name : Iir) is + begin + pragma Assert (N /= Null_Iir); + pragma Assert (Has_Referenced_Name (Get_Kind (N)), + "no field Referenced_Name"); + Set_Field2 (N, Name); + end Set_Referenced_Name; + function Get_Expr_Staticness (Target : Iir) return Iir_Staticness is begin pragma Assert (Target /= Null_Iir); @@ -4388,12 +4453,28 @@ package body Iirs is Set_Field4 (Target, An_Iir); end Set_Right; + function Get_Physical_Unit (Lit : Iir) return Iir is + begin + pragma Assert (Lit /= Null_Iir); + pragma Assert (Has_Physical_Unit (Get_Kind (Lit)), + "no field Physical_Unit"); + return Get_Field3 (Lit); + end Get_Physical_Unit; + + procedure Set_Physical_Unit (Lit : Iir; Name : Iir) is + begin + pragma Assert (Lit /= Null_Iir); + pragma Assert (Has_Physical_Unit (Get_Kind (Lit)), + "no field Physical_Unit"); + Set_Field3 (Lit, Name); + end Set_Physical_Unit; + function Get_Unit_Name (Target : Iir) return Iir is begin pragma Assert (Target /= Null_Iir); pragma Assert (Has_Unit_Name (Get_Kind (Target)), "no field Unit_Name"); - return Get_Field3 (Target); + return Get_Field0 (Target); end Get_Unit_Name; procedure Set_Unit_Name (Target : Iir; Name : Iir) is @@ -4401,7 +4482,7 @@ package body Iirs is pragma Assert (Target /= Null_Iir); pragma Assert (Has_Unit_Name (Get_Kind (Target)), "no field Unit_Name"); - Set_Field3 (Target, Name); + Set_Field0 (Target, Name); end Set_Unit_Name; function Get_Name (Target : Iir) return Iir is @@ -4633,7 +4714,7 @@ package body Iirs is pragma Assert (Target /= Null_Iir); pragma Assert (Has_Actual_Type (Get_Kind (Target)), "no field Actual_Type"); - return Get_Field5 (Target); + return Get_Field3 (Target); end Get_Actual_Type; procedure Set_Actual_Type (Target : Iir; Atype : Iir) is @@ -4641,9 +4722,25 @@ package body Iirs is pragma Assert (Target /= Null_Iir); pragma Assert (Has_Actual_Type (Get_Kind (Target)), "no field Actual_Type"); - Set_Field5 (Target, Atype); + Set_Field3 (Target, Atype); end Set_Actual_Type; + function Get_Actual_Type_Definition (Target : Iir) return Iir is + begin + pragma Assert (Target /= Null_Iir); + pragma Assert (Has_Actual_Type_Definition (Get_Kind (Target)), + "no field Actual_Type_Definition"); + return Get_Field5 (Target); + end Get_Actual_Type_Definition; + + procedure Set_Actual_Type_Definition (Target : Iir; Atype : Iir) is + begin + pragma Assert (Target /= Null_Iir); + pragma Assert (Has_Actual_Type_Definition (Get_Kind (Target)), + "no field Actual_Type_Definition"); + Set_Field5 (Target, Atype); + end Set_Actual_Type_Definition; + function Get_Association_Chain (Target : Iir) return Iir is begin pragma Assert (Target /= Null_Iir); @@ -5501,6 +5598,22 @@ package body Iirs is Set_Flag7 (N, Ref); end Set_Is_Ref; + function Get_Is_Forward_Ref (N : Iir) return Boolean is + begin + pragma Assert (N /= Null_Iir); + pragma Assert (Has_Is_Forward_Ref (Get_Kind (N)), + "no field Is_Forward_Ref"); + return Get_Flag1 (N); + end Get_Is_Forward_Ref; + + procedure Set_Is_Forward_Ref (N : Iir; Ref : Boolean) is + begin + pragma Assert (N /= Null_Iir); + pragma Assert (Has_Is_Forward_Ref (Get_Kind (N)), + "no field Is_Forward_Ref"); + Set_Flag1 (N, Ref); + end Set_Is_Forward_Ref; + function Get_Psl_Property (Decl : Iir) return PSL_Node is begin pragma Assert (Decl /= Null_Iir); diff --git a/src/vhdl/iirs.ads b/src/vhdl/iirs.ads index f87159185..4c3ea7296 100644 --- a/src/vhdl/iirs.ads +++ b/src/vhdl/iirs.ads @@ -62,6 +62,8 @@ package Iirs is -- have both an index_subtype_list and an index_constraint_list. -- - Maybe_Ref trick: the Is_Ref flag tells whether the Maybe_Ref are -- owner or ref. + -- - Maybe_Forward_Ref: the Is_Forward_Ref tells whether the field is + -- ref or forward_ref -- The root of a semantic tree is a library_declaration. -- All the library_declarations are kept in a private list, held by @@ -296,8 +298,6 @@ package Iirs is -- Iir_Kind_String_Literal8 (Short) -- - -- Get/Set_Type (Field1) - -- -- Used for computed literals. Literal_Origin contains the expression -- whose value was computed during analysis and replaces the expression. -- Get/Set_Literal_Origin (Field2) @@ -305,6 +305,8 @@ package Iirs is -- Same as Type, but marked as property of that node. -- Get/Set_Literal_Subtype (Field3) -- + -- Get/Set_Type (Field1) + -- -- Number of literals in the expanded string. -- Get/Set_String_Length (Field4) -- @@ -328,24 +330,24 @@ package Iirs is -- Iir_Kind_Integer_Literal (Int) -- - -- Get/Set_Type (Field1) - -- -- Get/Set the value of the integer. -- Get/Set_Value (Int64) -- -- Get/Set_Literal_Origin (Field2) -- + -- Get/Set_Type (Field1) + -- -- Get/Set_Expr_Staticness (State1) -- Iir_Kind_Floating_Point_Literal (Fp) -- - -- Get/Set_Type (Field1) - -- -- The value of the literal. -- Get/Set_Fp_Value (Fp64) -- -- Get/Set_Literal_Origin (Field2) -- + -- Get/Set_Type (Field1) + -- -- Get/Set_Expr_Staticness (State1) -- Iir_Kind_Null_Literal (Short) @@ -358,12 +360,15 @@ package Iirs is -- Iir_Kind_Physical_Int_Literal (Int) -- Iir_Kind_Physical_Fp_Literal (Fp) -- - -- Get/Set_Type (Field1) - -- -- Get/Set_Literal_Origin (Field2) -- -- The physical unit of the literal. - -- Get/Set_Unit_Name (Field3) + -- Get/Set_Physical_Unit (Field3) + -- + -- The name of the physical unit (if any). + -- Get/Set_Unit_Name (Field0) + -- + -- Get/Set_Type (Field1) -- -- Must be set to locally except for time literal, which is globally. -- Get/Set_Expr_Staticness (State1) @@ -380,26 +385,26 @@ package Iirs is -- This node can only be generated by evaluation: it is an unidimentional -- positional aggregate. -- - -- Get/Set_Type (Field1) - -- - -- Get/Set_Literal_Origin (Field2) - -- -- Same as Type, but marked as property of that node. -- Get/Set_Literal_Subtype (Field3) -- + -- Get/Set_Literal_Origin (Field2) + -- -- List of elements -- Get/Set_Simple_Aggregate_List (Field4) -- + -- Get/Set_Type (Field1) + -- -- Get/Set_Expr_Staticness (State1) -- Iir_Kind_Overflow_Literal (Short) -- This node can only be generated by evaluation to represent an error: out -- of range, division by zero... -- - -- Get/Set_Type (Field1) - -- -- Get/Set_Literal_Origin (Field2) -- + -- Get/Set_Type (Field1) + -- -- Get/Set_Expr_Staticness (State1) ------------- @@ -436,13 +441,17 @@ package Iirs is -- Only for Iir_Kind_Association_Element_Type: -- Get/Set_Subprogram_Association_Chain (Field4) -- - -- Only for Iir_Kind_Association_Element_By_Individual: - -- Get/Set_Actual_Type (Field5) - -- -- A function call or a type conversion for the formal. -- Only for Iir_Kind_Association_Element_By_Expression: -- Get/Set_Out_Conversion (Field5) -- + -- Owner of Actual_Type if needed. + -- Only for Iir_Kind_Association_Element_By_Individual: + -- Get/Set_Actual_Type_Definition (Field5) + -- + -- Only for Iir_Kind_Association_Element_By_Individual: + -- Get/Set_Actual_Type (Field3) + -- -- Get/Set the whole association flag (true if the formal is associated in -- whole and not individually, see LRM93 4.3.2.2) -- Get/Set_Whole_Association_Flag (Flag1) @@ -519,6 +528,7 @@ package Iirs is -- * a sequential statement chain for a case_statement. -- Get/Set_Associated_Chain (Field4) -- + -- Should be a simple_name. -- Only for Iir_Kind_Choice_By_Name: -- Get/Set_Choice_Name (Field5) -- @@ -619,8 +629,7 @@ package Iirs is -- -- Get/Set_Component_Name (Field4) -- - -- Must be one of designator_list, designator_by_others or - -- designator_by_all. + -- A list, list_others or list_all. -- Get/Set_Instantiation_List (Field1) -- -- Only for Iir_Kind_Component_Configuration: @@ -701,16 +710,16 @@ package Iirs is -- -- Get/Set_Entity_Class (Field3) -- - -- Get/Set_Attribute_Value_Spec_Chain (Field4) + -- Get/Set_Entity_Name_List (Field8) -- -- Get/Set_Expression (Field5) -- + -- Get/Set_Attribute_Value_Spec_Chain (Field4) + -- -- Always a simple name. -- Get/Set_Attribute_Designator (Field6) -- -- Get/Set_Attribute_Specification_Chain (Field7) - -- - -- Get/Set_Entity_Name_List (Field8) -- Iir_Kind_Attribute_Value (Short) -- An attribute value is the element of the chain of attribute of an @@ -721,11 +730,13 @@ package Iirs is -- This makes elaboration (and more precisely, expression evaluation) -- easier. -- - -- Get/Set_Spec_Chain (Field0) + -- Chain of attribute_value for the attribute specification + -- Get/Set_Spec_Chain (Field2) -- -- Get/Set_Type (Field1) -- - -- Get/Set_Chain (Field2) + -- Chain of all attribute_value for the node containing declarations + -- Get/Set_Value_Chain (Field0) -- -- Get/Set_Designated_Entity (Field3) -- @@ -768,18 +779,18 @@ package Iirs is -- Get/Set_Parent (Field0) -- Get/Set_Design_Unit (Alias Field0) -- - -- Get/Set_Declaration_Chain (Field1) - -- -- Get/Set_Identifier (Field3) -- - -- Get/Set_Attribute_Value_Chain (Field4) - -- - -- Get/Set_Concurrent_Statement_Chain (Field5) - -- -- Get/Set_Generic_Chain (Field6) -- -- Get/Set_Port_Chain (Field7) -- + -- Get/Set_Declaration_Chain (Field1) + -- + -- Get/Set_Concurrent_Statement_Chain (Field5) + -- + -- Get/Set_Attribute_Value_Chain (Field4) + -- -- Get/Set_Visible_Flag (Flag4) -- -- Get/Set_Is_Within_Flag (Flag5) @@ -795,17 +806,17 @@ package Iirs is -- Get/Set_Parent (Field0) -- Get/Set_Design_Unit (Alias Field0) -- - -- Get/Set_Declaration_Chain (Field1) - -- -- Name of the entity declaration for the architecture. -- Get/Set_Entity_Name (Field2) -- - -- Get/Set_Identifier (Field3) + -- Get/Set_Declaration_Chain (Field1) -- - -- Get/Set_Attribute_Value_Chain (Field4) + -- Get/Set_Identifier (Field3) -- -- Get/Set_Concurrent_Statement_Chain (Field5) -- + -- Get/Set_Attribute_Value_Chain (Field4) + -- -- The default configuration created by canon. This is a design unit. -- Get/Set_Default_Configuration_Declaration (Field6) -- @@ -852,19 +863,19 @@ package Iirs is -- Get/Set_Parent (Field0) -- Get/Set_Design_Unit (Alias Field0) -- + -- Get/Set_Identifier (Field3) + -- + -- Get/Set_Package_Header (Field6) + -- -- Get/Set_Declaration_Chain (Field1) -- -- For nested packages -- Get/Set_Chain (Field2) -- - -- Get/Set_Identifier (Field3) - -- -- Get/Set_Attribute_Value_Chain (Field4) -- -- Get/Set_Package_Body (Field5) -- - -- Get/Set_Package_Header (Field6) - -- -- Get/Set_Package_Origin (Field7) -- -- Chain of bodies for package instantiation. Present only in certain @@ -920,23 +931,28 @@ package Iirs is -- Get/Set_Parent (Field0) -- Get/Set_Design_Unit (Alias Field0) -- + -- Get/Set_Identifier (Field3) + -- + -- The name of the uninstantiated package as it appear in the sources. May + -- be Null_Iir. + -- Get/Set_Uninstantiated_Package_Name (Field7) + -- + -- The uninstantiated package declaration. + -- Get/Set_Uninstantiated_Package_Decl (Field9) + -- + -- Get/Set_Generic_Chain (Field6) + -- + -- Get/Set_Generic_Map_Aspect_Chain (Field8) + -- -- Get/Set_Declaration_Chain (Field1) -- -- For nested packages -- Get/Set_Chain (Field2) -- - -- Get/Set_Identifier (Field3) - -- -- Get/Set_Attribute_Value_Chain (Field4) -- -- Get/Set_Package_Body (Field5) -- - -- Get/Set_Generic_Chain (Field6) - -- - -- Get/Set_Uninstantiated_Package_Name (Field7) - -- - -- Get/Set_Generic_Map_Aspect_Chain (Field8) - -- -- Get/Set_Visible_Flag (Flag4) -- -- Get/Set_End_Has_Reserved_Id (Flag8) @@ -1019,10 +1035,6 @@ package Iirs is -- -- Get/Set_Parent (Field0) -- - -- The type can be deduced from the subtype indication, but this field is - -- present for uniformity (and speed). - -- Get/Set_Type (Field1) - -- -- Get/Set_Chain (Field2) -- -- Get/Set_Identifier (Field3) @@ -1032,6 +1044,10 @@ package Iirs is -- The subtype indication may not be present. -- Get/Set_Subtype_Indication (Field5) -- + -- The type can be deduced from the subtype indication, but this field is + -- present for uniformity (and speed). + -- Get/Set_Type (Field1) + -- -- Get/Set_Expr_Staticness (State1) -- -- Get/Set_Name_Staticness (State2) @@ -1133,14 +1149,16 @@ package Iirs is -- -- Get/Set_Parent (Field0) -- - -- Get/Set_Type (Field1) - -- -- Get/Set_Chain (Field2) -- -- Get/Set_Identifier (Field3) -- + -- For integer and real types, the subtype_indication of the implicitly + -- declared subtype for the type is the subtype definition. -- Get/Set_Subtype_Indication (Field5) -- + -- Get/Set_Type (Field1) + -- -- Get/Set_Visible_Flag (Flag4) -- -- Get/Set_Use_Flag (Flag6) @@ -1184,18 +1202,18 @@ package Iirs is -- Useful to distinguish a port and an interface. -- Get/Set_Parent (Field0) -- - -- The type can be deduced from the subtype indication, but this field is - -- present for uniformity (and speed). - -- Get/Set_Type (Field1) - -- -- Get/Set_Chain (Field2) -- -- Get/Set_Identifier (Field3) -- + -- Get/Set_Subtype_Indication (Field5) + -- -- Must always be null_iir for iir_kind_interface_file_declaration. -- Get/Set_Default_Value (Field4) -- - -- Get/Set_Subtype_Indication (Field5) + -- The type can be deduced from the subtype indication, but this field is + -- present for uniformity (and speed). + -- Get/Set_Type (Field1) -- -- Get/Set_Mode (Odigit1) -- @@ -1269,20 +1287,22 @@ package Iirs is -- -- Get/Set_Parent (Field0) -- - -- Get/Set_Declaration_Chain (Field1) - -- - -- Get/Set_Chain (Field2) - -- -- Get/Set_Identifier (Field3) -- - -- Get/Set_Attribute_Value_Chain (Field4) + -- Get/Set_Uninstantiated_Package_Name (Field7) -- - -- Get/Set_Generic_Chain (Field6) + -- Get/Set_Uninstantiated_Package_Decl (Field9) -- - -- Get/Set_Uninstantiated_Package_Name (Field7) + -- Get/Set_Generic_Chain (Field6) -- -- Get/Set_Generic_Map_Aspect_Chain (Field8) -- + -- Get/Set_Declaration_Chain (Field1) + -- + -- Get/Set_Chain (Field2) + -- + -- Get/Set_Attribute_Value_Chain (Field4) + -- -- Get/Set_Visible_Flag (Flag4) -- -- Get/Set_Is_Within_Flag (Flag5) @@ -1494,15 +1514,15 @@ package Iirs is -- -- Get/Set_Parent (Field0) -- - -- Get/Set_Type (Field1) - -- -- Get/Set_Chain (Field2) -- -- Get/Set_Identifier (Field3) -- + -- Get/Set_Subtype_Indication (Field5) + -- -- Get/Set_Default_Value (Field4) -- - -- Get/Set_Subtype_Indication (Field5) + -- Get/Set_Type (Field1) -- -- For a non-resolved signal: null_iir if the signal has no driver, or -- a process/concurrent_statement for which the signal should have a @@ -1578,17 +1598,10 @@ package Iirs is -- -- Get/Set_Parent (Field0) -- - -- Get/Set_Type (Field1) - -- -- Get/Set_Chain (Field2) -- -- Get/Set_Identifier (Field3) -- - -- Only for Iir_Kind_Constant_Declaration: - -- Default value of a deferred constant points to the full constant - -- declaration. - -- Get/Set_Default_Value (Field4) - -- -- For iterator, this is the reconstructed subtype indication. -- Get/Set_Subtype_Indication (Field5) -- @@ -1596,6 +1609,15 @@ package Iirs is -- Get/Set_Discrete_Range (Field6) -- -- Only for Iir_Kind_Constant_Declaration: + -- Default value of a deferred constant points to the full constant + -- declaration. + -- Get/Set_Default_Value (Field4) + -- + -- Note that the type may be extracted from the default_value if the subtype + -- indication is unconstrained. + -- Get/Set_Type (Field1) + -- + -- Only for Iir_Kind_Constant_Declaration: -- Summary: -- | constant C1 : integer; -- Deferred declaration (in a package) -- | constant C2 : integer := 4; -- Declaration @@ -1628,15 +1650,15 @@ package Iirs is -- -- Get/Set_Parent (Field0) -- - -- Get/Set_Type (Field1) - -- -- Get/Set_Chain (Field2) -- -- Get/Set_Identifier (Field3) -- + -- Get/Set_Subtype_Indication (Field5) + -- -- Get/Set_Default_Value (Field4) -- - -- Get/Set_Subtype_Indication (Field5) + -- Get/Set_Type (Field1) -- -- True if the variable is a shared variable. -- Get/Set_Shared_Flag (Flag2) @@ -1711,17 +1733,22 @@ package Iirs is -- -- element_subtype_definition ::= subtype_indication -- - -- The type can be deduced from the subtype indication, but this field is - -- present for uniformity (and speed). - -- Get/Set_Type (Field1) - -- -- Get/Set_Identifier (Field3) -- + -- Get/Set_Subtype_Indication (Field5) + -- -- Return the position of the element in the record, starting from 0 for -- the first record element, increasing by one for each successive element. -- Get/Set_Element_Position (Field4) -- - -- Get/Set_Subtype_Indication (Field5) + -- The type can be deduced from the subtype indication, but this field is + -- present for uniformity (and speed). + -- Get/Set_Type (Field1) + -- + -- The 'primary' element declaration, the one declared in the record type + -- definition. Other element declarations might be created for new + -- constraints in record subtypes. + -- Get/Set_Base_Element_Declaration (Field2) -- -- Get/Set_Has_Identifier_List (Flag3) -- @@ -1984,16 +2011,17 @@ package Iirs is -- Iir_Kind_Enumeration_Type_Definition (Short) -- - -- Get the range of the type (This is just an ascending range from the - -- first literal to the last declared literal). - -- Get/Set_Range_Constraint (Field1) - -- -- Return the list of literals. This list is created when the node is -- created. -- Get/Set_Enumeration_Literal_List (Field2) -- + -- Get the range of the type (This is just an ascending range from the + -- first literal to the last declared literal). + -- Get/Set_Range_Constraint (Field1) + -- -- Get/Set_Type_Declarator (Field3) -- + -- Always itself -- Get/Set_Base_Type (Field4) -- -- Get/Set_Resolved_Flag (Flag1) @@ -2004,6 +2032,8 @@ package Iirs is -- -- Get/Set_Only_Characters_Flag (Flag4) -- + -- Get/Set_Is_Ref (Flag7) + -- -- Get/Set_Type_Staticness (State1) -- Iir_Kind_Enumeration_Literal (Short) @@ -2081,14 +2111,14 @@ package Iirs is -- -- Get/Set_Identifier (Field3) -- - -- The Physical_Literal is the expression that appear in the sources, so - -- this is Null_Iir for a primary unit. - -- Get/Set_Physical_Literal (Field4) - -- -- The value of the unit, computed from the primary unit. This is always -- a physical integer literal. -- Get/Set_Physical_Unit_Value (Field5) -- + -- The Physical_Literal is the expression that appear in the sources, so + -- this is Null_Iir for a primary unit. + -- Get/Set_Physical_Literal (Field4) + -- -- Get/Set_Expr_Staticness (State1) -- -- Get/Set_Name_Staticness (State2) @@ -2132,19 +2162,19 @@ package Iirs is -- -- index_subtype_definition ::= type_mark RANGE <> -- - -- Get/Set_Element_Subtype (Field1) + -- This is a list of type marks. + -- Get/Set_Index_Subtype_Definition_List (Field6) -- -- Get/Set_Element_Subtype_Indication (Field2) -- - -- Get/Set_Type_Declarator (Field3) + -- Same as the index_subtype_definition_list. + -- Get/Set_Index_Subtype_List (Field9) -- - -- Get/Set_Base_Type (Field4) + -- Get/Set_Element_Subtype (Field1) -- - -- This is a list of type marks. - -- Get/Set_Index_Subtype_Definition_List (Field6) + -- Get/Set_Type_Declarator (Field3) -- - -- Same as the index_subtype_definition_list. - -- Get/Set_Index_Subtype_List (Field9) + -- Get/Set_Base_Type (Field4) -- -- Get/Set_Type_Staticness (State1) -- @@ -2194,18 +2224,20 @@ package Iirs is -- -- access_type_definition ::= ACCESS subtype_indication -- - -- Next access type that also referenced the same incomplete type when - -- defined. - -- Get/Set_Incomplete_Type_Ref_Chain (Field0) + -- The subtype_indication as it appears. Can designate an + -- incomplete_type_definition. + -- Get/Set_Designated_Subtype_Indication (Field5) -- + -- The resolved designated type. -- Get/Set_Designated_Type (Field1) -- -- Get/Set_Type_Declarator (Field3) -- -- Get/Set_Base_Type (Field4) -- - -- Can designate incomplete_type_definition. - -- Get/Set_Designated_Subtype_Indication (Field5) + -- Next access type that also referenced the same incomplete type when + -- defined. + -- Get/Set_Incomplete_Type_Ref_Chain (Field0) -- -- Get/Set_Resolved_Flag (Flag1) -- @@ -2419,6 +2451,8 @@ package Iirs is -- -- Get/Set_Has_Signal_Flag (Flag3) -- + -- Get/Set_Is_Ref (Flag7) + -- -- Get/Set_Type_Staticness (State1) -- Iir_Kind_Floating_Subtype_Definition (Medium) @@ -2441,6 +2475,8 @@ package Iirs is -- -- Get/Set_Has_Signal_Flag (Flag3) -- + -- Get/Set_Is_Ref (Flag7) + -- -- Get/Set_Type_Staticness (State1) -- Iir_Kind_Access_Subtype_Definition (Short) @@ -2469,7 +2505,11 @@ package Iirs is -- -- array_element_resolution ::= resolution_indication -- + -- The indication as it appears in the sources. -- Get/Set_Resolution_Indication (Field5) + -- + -- The subtype definition of the element. Owner of it. + -- Get/Set_Element_Subtype_Indication (Field2) -- Iir_Kind_Record_Resolution (Short) -- @@ -2519,28 +2559,28 @@ package Iirs is -- Iir_Kind_Array_Subtype_Definition (Medium) -- - -- Get/Set_Element_Subtype (Field1) - -- -- Get/Set_Subtype_Type_Mark (Field2) -- - -- Get/Set_Type_Declarator (Field3) - -- - -- Get/Set_Base_Type (Field4) - -- -- Get/Set_Resolution_Indication (Field5) -- -- The index_constraint list as it appears in the subtype indication (if -- present). This is a list of subtype indication. -- Get/Set_Index_Constraint_List (Field6) -- - -- Get/Set_Tolerance (Field7) - -- - -- Get/Set_Array_Element_Constraint (Field8) - -- -- The type of the index. This is either the index_constraint list or the -- index subtypes of the type_mark. -- Get/Set_Index_Subtype_List (Field9) -- + -- Get/Set_Array_Element_Constraint (Field8) + -- + -- Get/Set_Tolerance (Field7) + -- + -- Get/Set_Element_Subtype (Field1) + -- + -- Get/Set_Type_Declarator (Field3) + -- + -- Get/Set_Base_Type (Field4) + -- -- Get/Set_Type_Staticness (State1) -- -- Get/Set_Constraint_State (State2) @@ -2555,22 +2595,22 @@ package Iirs is -- Iir_Kind_Range_Expression (Short) -- - -- Get/Set_Range_Origin (Field0) - -- - -- Get/Set_Type (Field1) - -- -- There are two fields for both limits: those that own the node -- (Left_Limit_Expr and Right_Limit_Expr) and those that reference the node -- (Left_Limit and Right_Limit). Always use the reference (they cannot be -- Null_Iir, while the owner nodes can be Null_Iir. Set the owner nodes -- only for owning purpose. - -- Get/Set_Left_Limit (Field2) + -- Get/Set_Left_Limit_Expr (Field2) + -- + -- Get/Set_Right_Limit_Expr (Field3) + -- + -- Get/Set_Range_Origin (Field0) -- - -- Get/Set_Right_Limit (Field3) + -- Get/Set_Type (Field1) -- - -- Get/Set_Left_Limit_Expr (Field4) + -- Get/Set_Left_Limit (Field4) -- - -- Get/Set_Right_Limit_Expr (Field5) + -- Get/Set_Right_Limit (Field5) -- -- Get/Set_Expr_Staticness (State1) -- @@ -2587,6 +2627,8 @@ package Iirs is -- Get/Set_Resolution_Indication (Field5) -- -- Get/Set_Tolerance (Field7) + -- + -- Get/Set_Is_Ref (Flag7) ------------------------- -- Nature definitions -- @@ -2822,6 +2864,12 @@ package Iirs is -- -- Get/Set_Parent (Field0) -- + -- get/set_guard_decl is used for semantic analysis, in order to add + -- a signal declaration. + -- Get/Set_Guard_Decl (Field8) + -- + -- Get/Set_Block_Header (Field7) + -- -- Get/Set_Declaration_Chain (Field1) -- -- Get/Set_Chain (Field2) @@ -2835,12 +2883,6 @@ package Iirs is -- -- Get/Set_Block_Block_Configuration (Field6) -- - -- Get/Set_Block_Header (Field7) - -- - -- get/set_guard_decl is used for semantic analysis, in order to add - -- a signal declaration. - -- Get/Set_Guard_Decl (Field8) - -- -- Get/Set_Visible_Flag (Flag4) -- -- Get/Set_Is_Within_Flag (Flag5) @@ -3347,14 +3389,14 @@ package Iirs is -- Iir_Kind_Aggregate (Short) -- - -- Get/Set_Type (Field1) - -- - -- Get/Set_Aggregate_Info (Field2) + -- Get/Set_Association_Choices_Chain (Field4) -- -- Same as Type, but marked as property of that node. -- Get/Set_Literal_Subtype (Field3) -- - -- Get/Set_Association_Choices_Chain (Field4) + -- Get/Set_Aggregate_Info (Field2) + -- + -- Get/Set_Type (Field1) -- -- Get/Set_Expr_Staticness (State1) -- @@ -3395,10 +3437,10 @@ package Iirs is -- Iir_Kind_Parenthesis_Expression (Short) -- - -- Get/Set_Type (Field1) - -- -- Get/Set_Expression (Field5) -- + -- Get/Set_Type (Field1) + -- -- Get/Set_Expr_Staticness (State1) -- Iir_Kind_Qualified_Expression (Short) @@ -3448,15 +3490,6 @@ package Iirs is -- -- Get/Set_Type (Field1) -- - -- To ease analysis: set to the designated type (either the type of the - -- expression or the subtype) - -- Get/Set_Allocator_Designated_Type (Field2) - -- - -- Only for Iir_Kind_Allocator_By_Subtype: - -- Same as subtype indication but set when the allocator defines a new - -- subtype. - -- Get/Set_Allocator_Subtype (Field3) - -- -- Only for Iir_Kind_Allocator_By_Expression: -- Contains the expression for a by expression allocator. -- Get/Set_Expression (Field5) @@ -3465,6 +3498,15 @@ package Iirs is -- Contains the subtype indication for a by subtype allocator. -- Get/Set_Subtype_Indication (Field5) -- + -- Only for Iir_Kind_Allocator_By_Subtype: + -- Same as subtype indication but set when the allocator defines a new + -- subtype. Used to track when an anonymous subtype is created. + -- Get/Set_Allocator_Subtype (Field3) + -- + -- To ease analysis: set to the designated type (either the type of the + -- expression or the subtype) + -- Get/Set_Allocator_Designated_Type (Field2) + -- -- Get/Set_Expr_Staticness (State1) ------------ @@ -3483,6 +3525,8 @@ package Iirs is -- -- Get/Set_Base_Name (Field5) -- + -- Get/Set_Is_Forward_Ref (Flag1) + -- -- Get/Set_Expr_Staticness (State1) -- -- Get/Set_Name_Staticness (State2) @@ -3499,6 +3543,8 @@ package Iirs is -- -- Get/Set_Base_Name (Field5) -- + -- Get/Set_Is_Forward_Ref (Flag1) + -- -- Get/Set_Expr_Staticness (State1) -- -- Get/Set_Name_Staticness (State2) @@ -3514,6 +3560,19 @@ package Iirs is -- Get/Set_Named_Entity (Field4) -- -- Get/Set_Base_Name (Field5) + -- + -- Get/Set_Is_Forward_Ref (Flag1) + + -- Iir_Kind_Reference_Name (Short) + -- + -- This doesn't correspond to a name in the sources. This is an artificial + -- name in the tree which is owned and reference another name. + -- + -- Get/Set_Named_Entity (Field4) + -- + -- Get/Set_Referenced_Name (Field2) + -- + -- Get/Set_Is_Forward_Ref (Flag1) -- Iir_Kind_Selected_Name (Short) -- @@ -3529,6 +3588,8 @@ package Iirs is -- -- Get/Set_Base_Name (Field5) -- + -- Get/Set_Is_Forward_Ref (Flag1) + -- -- Get/Set_Expr_Staticness (State1) -- -- Get/Set_Name_Staticness (State2) @@ -3543,6 +3604,8 @@ package Iirs is -- -- Get/Set_Base_Name (Field5) -- + -- Get/Set_Is_Forward_Ref (Flag1) + -- -- Get/Set_Expr_Staticness (State1) -- Iir_Kind_Indexed_Name (Short) @@ -3564,12 +3627,12 @@ package Iirs is -- -- Get/Set_Prefix (Field0) -- - -- Get/Set_Type (Field1) - -- -- Get/Set_Suffix (Field2) -- -- Get/Set_Slice_Subtype (Field3) -- + -- Get/Set_Type (Field1) + -- -- Get/Set_Base_Name (Field5) -- -- Get/Set_Expr_Staticness (State1) @@ -3589,6 +3652,8 @@ package Iirs is -- Get/Set_Association_Chain (Field2) -- -- Get/Set_Named_Entity (Field4) + -- + -- Get/Set_Is_Forward_Ref (Flag1) -- Iir_Kind_Selected_Element (Short) -- A record element selection. This corresponds to a reffined selected @@ -3650,6 +3715,8 @@ package Iirs is -- Get/Set_Identifier (Field3) -- -- Get/Set_Named_Entity (Field4) + -- + -- Get/Set_Is_Forward_Ref (Flag1) -- Iir_Kind_Absolute_Pathname (Short) -- Represents only the '.'. @@ -3670,6 +3737,8 @@ package Iirs is -- Get/Set_Named_Entity (Field4) -- -- Get/Set_Pathname_Expression (Field5) + -- + -- Get/Set_Is_Forward_Ref (Flag1) ----------------- -- Attributes -- @@ -3689,6 +3758,8 @@ package Iirs is -- -- Get/Set_Base_Name (Field5) -- + -- Get/Set_Is_Forward_Ref (Flag1) + -- -- Get/Set_Expr_Staticness (State1) -- -- Get/Set_Name_Staticness (State2) @@ -3823,14 +3894,14 @@ package Iirs is -- -- Get/Set_Prefix (Field0) -- - -- Get/Set_Type (Field1) - -- -- Only for Iir_Kind_Simple_Name_Attribute: -- Get/Set_Simple_Name_Identifier (Field3) -- -- Only for Iir_Kind_Simple_Name_Attribute: -- Get/Set_Simple_Name_Subtype (Field4) -- + -- Get/Set_Type (Field1) + -- -- Get/Set_Base_Name (Field5) -- -- Get/Set_Expr_Staticness (State1) @@ -4114,6 +4185,7 @@ package Iirs is Iir_Kind_Simple_Name, -- denoting_name Iir_Kind_Selected_Name, -- denoting_name Iir_Kind_Operator_Symbol, -- denoting_name + Iir_Kind_Reference_Name, -- denoting_name Iir_Kind_Selected_By_All_Name, Iir_Kind_Parenthesis_Name, @@ -4194,6 +4266,7 @@ package Iirs is subtype Iir_In_Modes is Iir_Mode range Iir_Inout_Mode .. Iir_In_Mode; subtype Iir_Out_Modes is Iir_Mode range Iir_Out_Mode .. Iir_Inout_Mode; + subtype Iir_Parameter_Modes is Iir_Mode range Iir_Out_Mode .. Iir_In_Mode; type Iir_Delay_Mechanism is (Iir_Inertial_Delay, Iir_Transport_Delay); @@ -4931,13 +5004,15 @@ package Iirs is Iir_Kind_Character_Literal .. --Iir_Kind_Simple_Name --Iir_Kind_Selected_Name - Iir_Kind_Operator_Symbol; + --Iir_Kind_Operator_Symbol + Iir_Kind_Reference_Name; subtype Iir_Kinds_Name is Iir_Kind range Iir_Kind_Character_Literal .. --Iir_Kind_Simple_Name --Iir_Kind_Selected_Name --Iir_Kind_Operator_Symbol + --Iir_Kind_Reference_Name --Iir_Kind_Selected_By_All_Name Iir_Kind_Parenthesis_Name; @@ -5621,7 +5696,7 @@ package Iirs is -- Every design unit is put in an hash table to find quickly found by its -- name. This field is a single chain for collisions. - -- Field: Field7 Ref + -- Field: Field7 Forward_Ref function Get_Hash_Chain (Design_Unit : Iir_Design_Unit) return Iir; procedure Set_Hash_Chain (Design_Unit : Iir_Design_Unit; Chain : Iir); @@ -5652,7 +5727,7 @@ package Iirs is function Get_Enum_Pos (Lit : Iir) return Iir_Int32; procedure Set_Enum_Pos (Lit : Iir; Val : Iir_Int32); - -- Field: Field4 + -- Field: Field4 Ref function Get_Physical_Literal (Unit : Iir) return Iir; procedure Set_Physical_Literal (Unit : Iir; Lit : Iir); @@ -5667,7 +5742,7 @@ package Iirs is procedure Set_Fp_Value (Lit : Iir; Val : Iir_Fp64); -- List of elements of a simple aggregate. - -- Field: Field4 (uc) + -- Field: Field4 Ref (uc) function Get_Simple_Aggregate_List (Target : Iir) return Iir_List; procedure Set_Simple_Aggregate_List (Target : Iir; List : Iir_List); @@ -5738,7 +5813,7 @@ package Iirs is -- Chain of attribute specifications. This is used only during sem, to -- check that no named entity of a given class appear after an attr. spec. -- with the entity name list OTHERS or ALL. - -- Field: Field7 + -- Field: Field7 Ref function Get_Attribute_Specification_Chain (Target : Iir) return Iir; procedure Set_Attribute_Specification_Chain (Target : Iir; Chain : Iir); @@ -5750,7 +5825,7 @@ package Iirs is function Get_Signal_List (Target : Iir) return Iir_List; procedure Set_Signal_List (Target : Iir; List : Iir_List); - -- Field: Field3 Ref + -- Field: Field3 Forward_Ref function Get_Designated_Entity (Val : Iir_Attribute_Value) return Iir; procedure Set_Designated_Entity (Val : Iir_Attribute_Value; Entity : Iir); @@ -5865,19 +5940,26 @@ package Iirs is procedure Set_Configuration_Item_Chain (Target : Iir; Chain : Iir); -- Chain of attribute values for declared items. - -- To be used with Get/Set_Chain. + -- To be used with Get/Set_Value_Chain. -- There is no order, therefore, a new attribute value may be always -- prepended. - -- Field: Field4 Chain + -- Field: Field4 Ref function Get_Attribute_Value_Chain (Target : Iir) return Iir; procedure Set_Attribute_Value_Chain (Target : Iir; Chain : Iir); -- Next attribute value in the attribute specification chain (of attribute -- value). - -- Field: Field0 + -- FIXME: should be a Chain. + -- Field: Field2 function Get_Spec_Chain (Target : Iir) return Iir; procedure Set_Spec_Chain (Target : Iir; Chain : Iir); + -- Next attribute value in the attribute specification chain (of attribute + -- value). + -- Field: Field0 Ref + function Get_Value_Chain (Target : Iir) return Iir; + procedure Set_Value_Chain (Target : Iir; Chain : Iir); + -- Chain of attribute values for attribute specification. -- To be used with Get/Set_Spec_Chain. -- Field: Field4 @@ -5895,7 +5977,7 @@ package Iirs is procedure Set_Package (Package_Body : Iir; Decl : Iir); -- The package body corresponding to the package declaration. - -- Field: Field5 Ref + -- Field: Field5 Forward_Ref function Get_Package_Body (Pkg : Iir) return Iir; procedure Set_Package_Body (Pkg : Iir; Decl : Iir); @@ -5960,7 +6042,7 @@ package Iirs is procedure Set_Type_Definition (Decl : Iir; Atype : Iir); -- The subtype definition associated with the type declaration (if any). - -- Field: Field4 + -- Field: Field4 Forward_Ref function Get_Subtype_Definition (Target : Iir) return Iir; procedure Set_Subtype_Definition (Target : Iir; Def : Iir); @@ -6013,7 +6095,7 @@ package Iirs is function Get_Sequential_Statement_Chain (Target : Iir) return Iir; procedure Set_Sequential_Statement_Chain (Target : Iir; Chain : Iir); - -- Field: Field9 Ref + -- Field: Field9 Forward_Ref function Get_Subprogram_Body (Target : Iir) return Iir; procedure Set_Subprogram_Body (Target : Iir; A_Body : Iir); @@ -6072,7 +6154,7 @@ package Iirs is -- declaration for a full constant declaration, or is null_iir for a -- usual or deferred constant declaration. -- Set only during sem. - -- Field: Field6 Ref + -- Field: Field6 Forward_Ref function Get_Deferred_Declaration (Target : Iir) return Iir; procedure Set_Deferred_Declaration (Target : Iir; Decl : Iir); @@ -6123,6 +6205,10 @@ package Iirs is function Get_Element_Position (Target : Iir) return Iir_Index32; procedure Set_Element_Position (Target : Iir; Pos : Iir_Index32); + -- Field: Field2 Ref + function Get_Base_Element_Declaration (Target : Iir) return Iir; + procedure Set_Base_Element_Declaration (Target : Iir; El : Iir); + -- Field: Field2 function Get_Element_Declaration (Target : Iir) return Iir; procedure Set_Element_Declaration (Target : Iir; El : Iir); @@ -6207,7 +6293,7 @@ package Iirs is function Get_Visible_Flag (Target : Iir) return Boolean; procedure Set_Visible_Flag (Target : Iir; Flag : Boolean); - -- Field: Field1 + -- Field: Field1 Maybe_Ref function Get_Range_Constraint (Target : Iir) return Iir; procedure Set_Range_Constraint (Target : Iir; Constraint : Iir); @@ -6215,19 +6301,19 @@ package Iirs is function Get_Direction (Decl : Iir) return Iir_Direction; procedure Set_Direction (Decl : Iir; Dir : Iir_Direction); - -- Field: Field2 Ref + -- Field: Field4 Ref function Get_Left_Limit (Decl : Iir_Range_Expression) return Iir; procedure Set_Left_Limit (Decl : Iir_Range_Expression; Limit : Iir); - -- Field: Field3 Ref + -- Field: Field5 Ref function Get_Right_Limit (Decl : Iir_Range_Expression) return Iir; procedure Set_Right_Limit (Decl : Iir_Range_Expression; Limit : Iir); - -- Field: Field4 + -- Field: Field2 function Get_Left_Limit_Expr (Decl : Iir_Range_Expression) return Iir; procedure Set_Left_Limit_Expr (Decl : Iir_Range_Expression; Limit : Iir); - -- Field: Field5 + -- Field: Field3 function Get_Right_Limit_Expr (Decl : Iir_Range_Expression) return Iir; procedure Set_Right_Limit_Expr (Decl : Iir_Range_Expression; Limit : Iir); @@ -6355,7 +6441,7 @@ package Iirs is function Get_Waveform_Chain (Target : Iir) return Iir; procedure Set_Waveform_Chain (Target : Iir; Chain : Iir); - -- Field: Field8 + -- Field: Field8 Ref function Get_Guard (Target : Iir) return Iir; procedure Set_Guard (Target : Iir; Guard : Iir); @@ -6545,12 +6631,12 @@ package Iirs is procedure Set_Configuration_Name (Target : Iir; Conf : Iir); -- Component configuration for a component_instantiation_statement. - -- Field: Field6 + -- Field: Field6 Forward_Ref function Get_Component_Configuration (Target : Iir) return Iir; procedure Set_Component_Configuration (Target : Iir; Conf : Iir); -- Configuration specification for a component_instantiation_statement. - -- Field: Field7 + -- Field: Field7 Ref function Get_Configuration_Specification (Target : Iir) return Iir; procedure Set_Configuration_Specification (Target : Iir; Conf : Iir); @@ -6611,7 +6697,7 @@ package Iirs is procedure Set_Signal_Attribute_Chain (Decl : Iir; Chain : Iir); -- Block_Configuration that applies to this block statement. - -- Field: Field6 + -- Field: Field6 Forward_Ref function Get_Block_Block_Configuration (Block : Iir) return Iir; procedure Set_Block_Block_Configuration (Block : Iir; Conf : Iir); @@ -6627,10 +6713,14 @@ package Iirs is function Get_Uninstantiated_Package_Name (Inst : Iir) return Iir; procedure Set_Uninstantiated_Package_Name (Inst : Iir; Name : Iir); + -- Field: Field9 Ref + function Get_Uninstantiated_Package_Decl (Inst : Iir) return Iir; + procedure Set_Uninstantiated_Package_Decl (Inst : Iir; Pkg : Iir); + -- Get/Set the block_configuration (there may be several -- block_configuration through the use of prev_configuration singly linked -- list) that apply to this generate statement. - -- Field: Field2 + -- Field: Field2 Forward_Ref function Get_Generate_Block_Configuration (Target : Iir) return Iir; procedure Set_Generate_Block_Configuration (Target : Iir; Conf : Iir); @@ -6703,16 +6793,20 @@ package Iirs is procedure Set_Binding_Indication (Target : Iir; Binding : Iir); -- The named entity designated by a name. - -- Field: Field4 Ref + -- Field: Field4 Maybe_Forward_Ref function Get_Named_Entity (Name : Iir) return Iir; procedure Set_Named_Entity (Name : Iir; Val : Iir); -- If a name designate a non-object alias, the designated alias. -- Named_Entity will designate the aliased entity. - -- Field: Field2 + -- Field: Field2 Ref function Get_Alias_Declaration (Name : Iir) return Iir; procedure Set_Alias_Declaration (Name : Iir; Val : Iir); + -- Field: Field2 Ref + function Get_Referenced_Name (N : Iir) return Iir; + procedure Set_Referenced_Name (N : Iir; Name : Iir); + -- Expression staticness, defined by rules of LRM 7.4 -- Field: State1 (pos) function Get_Expr_Staticness (Target : Iir) return Iir_Staticness; @@ -6738,7 +6832,11 @@ package Iirs is function Get_Right (Target : Iir) return Iir; procedure Set_Right (Target : Iir; An_Iir : Iir); - -- Field: Field3 + -- Field: Field3 Ref + function Get_Physical_Unit (Lit : Iir) return Iir; + procedure Set_Physical_Unit (Lit : Iir; Name : Iir); + + -- Field: Field0 function Get_Unit_Name (Target : Iir) return Iir; procedure Set_Unit_Name (Target : Iir; Name : Iir); @@ -6761,7 +6859,7 @@ package Iirs is procedure Set_Prefix (Target : Iir; Prefix : Iir); -- Prefix of a name signature - -- Field: Field1 Ref + -- Field: Field1 function Get_Signature_Prefix (Sign : Iir) return Iir; procedure Set_Signature_Prefix (Sign : Iir; Prefix : Iir); @@ -6811,17 +6909,21 @@ package Iirs is -- Unless the formal is an unconstrained array type, this is the same as -- the formal type. -- Subtype indiciation for a type association. - -- Field: Field5 + -- Field: Field3 Ref function Get_Actual_Type (Target : Iir) return Iir; procedure Set_Actual_Type (Target : Iir; Atype : Iir); + -- Field: Field5 + function Get_Actual_Type_Definition (Target : Iir) return Iir; + procedure Set_Actual_Type_Definition (Target : Iir; Atype : Iir); + -- List of individual associations for association_element_by_individual. -- Associations for parenthesis_name. -- Field: Field2 Chain function Get_Association_Chain (Target : Iir) return Iir; procedure Set_Association_Chain (Target : Iir; Chain : Iir); - -- List of individual associations for association_element_by_individual. + -- List of choices for association_element_by_individual. -- Field: Field4 Chain function Get_Individual_Association_Chain (Target : Iir) return Iir; procedure Set_Individual_Association_Chain (Target : Iir; Chain : Iir); @@ -6856,12 +6958,12 @@ package Iirs is procedure Set_Aggr_Min_Length (Info : Iir_Aggregate_Info; Nbr : Iir_Int32); -- Highest index choice, if any. - -- Field: Field2 + -- Field: Field2 Ref function Get_Aggr_Low_Limit (Target : Iir_Aggregate_Info) return Iir; procedure Set_Aggr_Low_Limit (Target : Iir_Aggregate_Info; Limit : Iir); -- Highest index choice, if any. - -- Field: Field3 + -- Field: Field3 Ref function Get_Aggr_High_Limit (Target : Iir_Aggregate_Info) return Iir; procedure Set_Aggr_High_Limit (Target : Iir_Aggregate_Info; Limit : Iir); @@ -6913,7 +7015,7 @@ package Iirs is procedure Set_Parameter_Association_Chain (Target : Iir; Chain : Iir); -- Object of a method call. NULL_IIR if the subprogram is not a method. - -- Field: Field4 + -- Field: Field4 Ref function Get_Method_Object (Target : Iir) return Iir; procedure Set_Method_Object (Target : Iir; Object : Iir); @@ -6993,7 +7095,7 @@ package Iirs is procedure Set_Simple_Name_Subtype (Target : Iir; Atype : Iir); -- Body of a protected type declaration. - -- Field: Field2 Ref + -- Field: Field2 Forward_Ref function Get_Protected_Type_Body (Target : Iir) return Iir; procedure Set_Protected_Type_Body (Target : Iir; Bod : Iir); @@ -7099,6 +7201,10 @@ package Iirs is function Get_Is_Ref (N : Iir) return Boolean; procedure Set_Is_Ref (N : Iir; Ref : Boolean); + -- Field: Flag1 + function Get_Is_Forward_Ref (N : Iir) return Boolean; + procedure Set_Is_Forward_Ref (N : Iir; Ref : Boolean); + -- Field: Field1 (uc) function Get_Psl_Property (Decl : Iir) return PSL_Node; procedure Set_Psl_Property (Decl : Iir; Prop : PSL_Node); diff --git a/src/vhdl/iirs_utils.adb b/src/vhdl/iirs_utils.adb index 09ebadf0f..19966f306 100644 --- a/src/vhdl/iirs_utils.adb +++ b/src/vhdl/iirs_utils.adb @@ -800,6 +800,17 @@ package body Iirs_Utils is return Build_Simple_Name (Ref, Get_Location (Loc)); end Build_Simple_Name; + function Build_Reference_Name (Name : Iir) return Iir + is + Res : Iir; + begin + Res := Create_Iir (Iir_Kind_Reference_Name); + Location_Copy (Res, Name); + Set_Referenced_Name (Res, Name); + Set_Named_Entity (Res, Get_Named_Entity (Name)); + return Res; + end Build_Reference_Name; + function Has_Resolution_Function (Subtyp : Iir) return Iir is Ind : constant Iir := Get_Resolution_Indication (Subtyp); @@ -813,13 +824,6 @@ package body Iirs_Utils is end if; end Has_Resolution_Function; - function Get_Primary_Unit_Name (Physical_Def : Iir) return Iir - is - Unit : constant Iir := Get_Primary_Unit (Physical_Def); - begin - return Get_Unit_Name (Get_Physical_Unit_Value (Unit)); - end Get_Primary_Unit_Name; - function Is_Type_Name (Name : Iir) return Iir is Ent : Iir; diff --git a/src/vhdl/iirs_utils.ads b/src/vhdl/iirs_utils.ads index d5ea438c0..843adce7c 100644 --- a/src/vhdl/iirs_utils.ads +++ b/src/vhdl/iirs_utils.ads @@ -166,16 +166,13 @@ package Iirs_Utils is function Build_Simple_Name (Ref : Iir; Loc : Location_Type) return Iir; function Build_Simple_Name (Ref : Iir; Loc : Iir) return Iir; + -- Create a name that referenced the same named entity as NAME. + function Build_Reference_Name (Name : Iir) return Iir; + -- If SUBTYP has a resolution indication that is a function name, returns -- the function declaration (not the name). function Has_Resolution_Function (Subtyp : Iir) return Iir; - -- Return a simple name for the primary unit of physical type PHYSICAL_DEF. - -- This is the artificial unit name for the value of the primary unit, thus - -- its location is the location of the primary unit. Used mainly to build - -- evaluated literals. - function Get_Primary_Unit_Name (Physical_Def : Iir) return Iir; - -- Get the type of any node representing a subtype indication. This simply -- skip over denoting names. function Get_Type_Of_Subtype_Indication (Ind : Iir) return Iir; diff --git a/src/vhdl/nodes_gc.adb b/src/vhdl/nodes_gc.adb index c73331e3a..3ff1002a2 100644 --- a/src/vhdl/nodes_gc.adb +++ b/src/vhdl/nodes_gc.adb @@ -19,7 +19,8 @@ with Ada.Text_IO; with Types; use Types; with Nodes; -with Nodes_Meta; +with Nodes_Meta; use Nodes_Meta; +with Errorout; use Errorout; with Iirs; use Iirs; with Libraries; with Disp_Tree; @@ -30,6 +31,8 @@ package body Nodes_GC is type Marker_Array is array (Iir range <>) of Boolean; type Marker_Array_Acc is access Marker_Array; + Has_Error : Boolean := False; + Markers : Marker_Array_Acc; procedure Mark_Iir (N : Iir); @@ -66,8 +69,9 @@ package body Nodes_GC is is use Ada.Text_IO; begin + Put ("Already marked "); Disp_Tree.Disp_Tree (N, True); - return; + Has_Error := True; end Report_Already_Marked; procedure Already_Marked (N : Iir) is @@ -94,7 +98,7 @@ package body Nodes_GC is Report_Already_Marked (N); end Already_Marked; - procedure Not_Marked (N : Iir; F : Nodes_Meta.Fields_Enum) + procedure Report_Early_Reference (N : Iir; F : Nodes_Meta.Fields_Enum) is use Ada.Text_IO; begin @@ -102,7 +106,8 @@ package body Nodes_GC is Put (Nodes_Meta.Get_Field_Image (F)); Put (" in "); Disp_Tree.Disp_Tree (N, True); - end Not_Marked; + Has_Error := True; + end Report_Early_Reference; procedure Mark_Chain (Head : Iir) is @@ -118,8 +123,41 @@ package body Nodes_GC is procedure Report_Unreferenced_Node (N : Iir) is begin Disp_Tree.Disp_Tree (N, True); + -- Has_Error := True; end Report_Unreferenced_Node; + procedure Mark_Iir_Ref_Field (N : Iir; F : Fields_Enum) is + begin + case Get_Field_Type (F) is + when Type_Iir => + declare + Nf : constant Iir := Get_Iir (N, F); + begin + if Is_Valid (Nf) and then not Markers (Nf) then + Report_Early_Reference (N, F); + end if; + end; + when Type_Iir_List => + declare + Nl : constant Iir_List := Get_Iir_List (N, F); + El : Iir; + begin + if Is_Null_List (Nl) or else Nl in Iir_Lists_All_Others then + return; + end if; + for I in Natural loop + El := Get_Nth_Element (Nl, I); + exit when El = Null_Iir; + if not Markers (El) then + Report_Early_Reference (El, F); + end if; + end loop; + end; + when others => + raise Internal_Error; + end case; + end Mark_Iir_Ref_Field; + procedure Mark_Iir (N : Iir) is begin if N = Null_Iir then @@ -132,7 +170,6 @@ package body Nodes_GC is end if; declare - use Nodes_Meta; Fields : constant Fields_Array := Get_Fields (Get_Kind (N)); F : Fields_Enum; begin @@ -140,17 +177,37 @@ package body Nodes_GC is F := Fields (I); case Get_Field_Attribute (F) is when Attr_Ref => - pragma Assert (Get_Field_Type (F) = Type_Iir); - if Is_Valid (Get_Iir (N, F)) - and then not Markers (Get_Iir (N, F)) - then - Not_Marked (N, F); - end if; + Mark_Iir_Ref_Field (N, F); when Attr_Forward_Ref | Attr_Chain_Next => null; + when Attr_Maybe_Forward_Ref => + -- Only used for Named_Entity + pragma Assert (F = Field_Named_Entity); + + -- Overload_List has to be handled specially, as it that + -- case the Ref applies to the elements of the list. + declare + Nf : constant Iir := Get_Iir (N, F); + begin + if Nf /= Null_Iir then + if Get_Is_Forward_Ref (N) then + pragma Assert + (Get_Kind (Nf) /= Iir_Kind_Overload_List); + null; + else + if Get_Kind (Nf) = Iir_Kind_Overload_List then + Mark_Iir (Nf); + else + Mark_Iir_Ref_Field (N, F); + end if; + end if; + end if; + end; when Attr_Maybe_Ref => - if not Get_Is_Ref (N) then + if Get_Is_Ref (N) then + Mark_Iir_Ref_Field (N, F); + else Mark_Iir (Get_Iir (N, F)); end if; when Attr_Chain => @@ -169,12 +226,53 @@ package body Nodes_GC is null; end case; when Attr_Of_Ref => - null; + Mark_Iir_Ref_Field (N, F); end case; end loop; end; end Mark_Iir; + procedure Mark_Unit (Unit : Iir) + is + List : Iir_List; + El : Iir; + begin + pragma Assert (Get_Kind (Unit) = Iir_Kind_Design_Unit); + if Markers (Unit) then + return; + end if; + + -- First mark dependences + List := Get_Dependence_List (Unit); + if List /= Null_Iir_List then + for I in Natural loop + El := Get_Nth_Element (List, I); + exit when El = Null_Iir; + + case Get_Kind (El) is + when Iir_Kind_Design_Unit => + Mark_Unit (El); + when Iir_Kind_Entity_Aspect_Entity => + declare + Ent : constant Iir := Get_Entity_Name (El); + Arch : constant Iir := Get_Architecture (El); + begin + Mark_Unit (Get_Design_Unit (Get_Named_Entity (Ent))); + if Is_Valid (Arch) + and then Is_Valid (Get_Named_Entity (Arch)) + then + Mark_Unit (Get_Named_Entity (Arch)); + end if; + end; + when others => + Error_Kind ("mark_unit", El); + end case; + end loop; + end if; + + Mark_Iir (Unit); + end Mark_Unit; + procedure Report_Unreferenced is use Ada.Text_IO; @@ -184,18 +282,92 @@ package body Nodes_GC is begin Markers := new Marker_Array'(Null_Iir .. Iirs.Get_Last_Node => False); - if Flag_Disp_Multiref then - Put_Line ("** nodes already marked:"); - end if; + Has_Error := False; + + -- Node not owned, but used for "/" (time, time). + Markers (Convertible_Integer_Type_Definition) := True; + Markers (Convertible_Real_Type_Definition) := True; + + -- The user nodes. + declare + Lib : Iir; + File : Iir; + Unit : Iir; + begin + -- First mark all known libraries and file. + Lib := Libraries.Get_Libraries_Chain; + while Is_Valid (Lib) loop + pragma Assert (Get_Kind (Lib) = Iir_Kind_Library_Declaration); + pragma Assert (not Markers (Lib)); + Markers (Lib) := True; + File := Get_Design_File_Chain (Lib); + while Is_Valid (File) loop + pragma Assert (Get_Kind (File) = Iir_Kind_Design_File); + pragma Assert (not Markers (File)); + Markers (File) := True; + File := Get_Chain (File); + end loop; + Lib := Get_Chain (Lib); + end loop; + + -- Then mark all design units. This has to consider first the + -- dependencies. + Lib := Libraries.Get_Libraries_Chain; + while Is_Valid (Lib) loop + pragma Assert (Get_Kind (Lib) = Iir_Kind_Library_Declaration); + File := Get_Design_File_Chain (Lib); + while Is_Valid (File) loop + pragma Assert (Get_Kind (File) = Iir_Kind_Design_File); + Unit := Get_First_Design_Unit (File); + while Is_Valid (Unit) loop + Mark_Unit (Unit); + Unit := Get_Chain (Unit); + end loop; + File := Get_Chain (File); + end loop; + Lib := Get_Chain (Lib); + end loop; + end; + + -- Obsoleted units. + declare + Unit : Iir; + begin + Unit := Libraries.Obsoleted_Design_Units; + while Is_Valid (Unit) loop + pragma Assert (Get_Kind (Unit) = Iir_Kind_Design_Unit); + -- FIXME: obsoleted units may be in various state: + -- - unit created by the .cf file and replaced by the loaded one + -- (should have been free) + -- - unit directly obsoleted by a new unit in the same file + -- - unit indirectly obsoleted. + if Get_Date_State (Unit) <= Date_Disk then + -- Never loaded unit, so not referenced and removed from its + -- design file. + -- FIXME: free it early. + pragma Assert (Get_Dependence_List (Unit) = Null_Iir_List); + Mark_Iir (Unit); + else + if not Markers (Unit) then + Mark_Iir (Unit); + end if; + end if; + Unit := Get_Chain (Unit); + end loop; + end; + + -- These nodes are owned by type/subtype declarations, so unmark them + -- before marking their owner. + Markers (Convertible_Integer_Type_Definition) := False; + Markers (Convertible_Real_Type_Definition) := False; - Mark_Chain (Libraries.Get_Libraries_Chain); - Mark_Chain (Libraries.Obsoleted_Design_Units); + -- These nodes are not rooted. Mark_Iir (Convertible_Integer_Type_Declaration); Mark_Iir (Convertible_Integer_Subtype_Declaration); Mark_Iir (Convertible_Real_Type_Declaration); Mark_Iir (Universal_Integer_One); - Mark_Iir (Error_Mark); Mark_Chain (Wildcard_Type_Declaration_Chain); + Mark_Iir (Error_Mark); El := Error_Mark; Nbr_Unreferenced := 0; @@ -210,7 +382,7 @@ package body Nodes_GC is El := Iir (Nodes.Next_Node (Nodes.Node_Type (El))); end loop; - if Nbr_Unreferenced /= 0 then + if Has_Error then raise Internal_Error; end if; end Report_Unreferenced; diff --git a/src/vhdl/nodes_gc.ads b/src/vhdl/nodes_gc.ads index ef8e647c3..ad17c67b7 100644 --- a/src/vhdl/nodes_gc.ads +++ b/src/vhdl/nodes_gc.ads @@ -17,7 +17,7 @@ -- 02111-1307, USA. package Nodes_GC is - Flag_Disp_Multiref : Boolean := False; + Flag_Disp_Multiref : Boolean := True; procedure Report_Unreferenced; -- Display nodes that aren't referenced. diff --git a/src/vhdl/nodes_meta.adb b/src/vhdl/nodes_meta.adb index 0efd08967..954610a6f 100644 --- a/src/vhdl/nodes_meta.adb +++ b/src/vhdl/nodes_meta.adb @@ -89,6 +89,7 @@ package body Nodes_Meta is Field_Configuration_Item_Chain => Type_Iir, Field_Attribute_Value_Chain => Type_Iir, Field_Spec_Chain => Type_Iir, + Field_Value_Chain => Type_Iir, Field_Attribute_Value_Spec_Chain => Type_Iir, Field_Entity_Name => Type_Iir, Field_Package => Type_Iir, @@ -135,6 +136,7 @@ package body Nodes_Meta is Field_File_Logical_Name => Type_Iir, Field_File_Open_Kind => Type_Iir, Field_Element_Position => Type_Iir_Index32, + Field_Base_Element_Declaration => Type_Iir, Field_Element_Declaration => Type_Iir, Field_Selected_Element => Type_Iir, Field_Use_Clause_Chain => Type_Iir, @@ -236,6 +238,7 @@ package body Nodes_Meta is Field_Package_Header => Type_Iir, Field_Block_Header => Type_Iir, Field_Uninstantiated_Package_Name => Type_Iir, + Field_Uninstantiated_Package_Decl => Type_Iir, Field_Generate_Block_Configuration => Type_Iir, Field_Generate_Statement_Body => Type_Iir, Field_Alternative_Label => Type_Name_Id, @@ -254,11 +257,13 @@ package body Nodes_Meta is Field_Binding_Indication => Type_Iir, Field_Named_Entity => Type_Iir, Field_Alias_Declaration => Type_Iir, + Field_Referenced_Name => Type_Iir, Field_Expr_Staticness => Type_Iir_Staticness, Field_Error_Origin => Type_Iir, Field_Operand => Type_Iir, Field_Left => Type_Iir, Field_Right => Type_Iir, + Field_Physical_Unit => Type_Iir, Field_Unit_Name => Type_Iir, Field_Name => Type_Iir, Field_Group_Template_Name => Type_Iir, @@ -275,6 +280,7 @@ package body Nodes_Meta is Field_Attr_Chain => Type_Iir, Field_Signal_Attribute_Declaration => Type_Iir, Field_Actual_Type => Type_Iir, + Field_Actual_Type_Definition => Type_Iir, Field_Association_Chain => Type_Iir, Field_Individual_Association_Chain => Type_Iir, Field_Subprogram_Association_Chain => Type_Iir, @@ -328,6 +334,7 @@ package body Nodes_Meta is Field_Has_Class => Type_Boolean, Field_Suspend_Flag => Type_Boolean, Field_Is_Ref => Type_Boolean, + Field_Is_Forward_Ref => Type_Boolean, Field_Psl_Property => Type_PSL_Node, Field_Psl_Sequence => Type_PSL_Node, Field_Psl_Declaration => Type_PSL_Node, @@ -488,6 +495,8 @@ package body Nodes_Meta is return "attribute_value_chain"; when Field_Spec_Chain => return "spec_chain"; + when Field_Value_Chain => + return "value_chain"; when Field_Attribute_Value_Spec_Chain => return "attribute_value_spec_chain"; when Field_Entity_Name => @@ -580,6 +589,8 @@ package body Nodes_Meta is return "file_open_kind"; when Field_Element_Position => return "element_position"; + when Field_Base_Element_Declaration => + return "base_element_declaration"; when Field_Element_Declaration => return "element_declaration"; when Field_Selected_Element => @@ -782,6 +793,8 @@ package body Nodes_Meta is return "block_header"; when Field_Uninstantiated_Package_Name => return "uninstantiated_package_name"; + when Field_Uninstantiated_Package_Decl => + return "uninstantiated_package_decl"; when Field_Generate_Block_Configuration => return "generate_block_configuration"; when Field_Generate_Statement_Body => @@ -818,6 +831,8 @@ package body Nodes_Meta is return "named_entity"; when Field_Alias_Declaration => return "alias_declaration"; + when Field_Referenced_Name => + return "referenced_name"; when Field_Expr_Staticness => return "expr_staticness"; when Field_Error_Origin => @@ -828,6 +843,8 @@ package body Nodes_Meta is return "left"; when Field_Right => return "right"; + when Field_Physical_Unit => + return "physical_unit"; when Field_Unit_Name => return "unit_name"; when Field_Name => @@ -860,6 +877,8 @@ package body Nodes_Meta is return "signal_attribute_declaration"; when Field_Actual_Type => return "actual_type"; + when Field_Actual_Type_Definition => + return "actual_type_definition"; when Field_Association_Chain => return "association_chain"; when Field_Individual_Association_Chain => @@ -966,6 +985,8 @@ package body Nodes_Meta is return "suspend_flag"; when Field_Is_Ref => return "is_ref"; + when Field_Is_Forward_Ref => + return "is_forward_ref"; when Field_Psl_Property => return "psl_property"; when Field_Psl_Sequence => @@ -1422,6 +1443,8 @@ package body Nodes_Meta is return "selected_name"; when Iir_Kind_Operator_Symbol => return "operator_symbol"; + when Iir_Kind_Reference_Name => + return "reference_name"; when Iir_Kind_Selected_By_All_Name => return "selected_by_all_name"; when Iir_Kind_Parenthesis_Name => @@ -1563,7 +1586,7 @@ package body Nodes_Meta is when Field_Library_Unit => return Attr_None; when Field_Hash_Chain => - return Attr_Ref; + return Attr_Forward_Ref; when Field_Design_Unit_Source_Pos => return Attr_None; when Field_Design_Unit_Source_Line => @@ -1575,13 +1598,13 @@ package body Nodes_Meta is when Field_Enum_Pos => return Attr_None; when Field_Physical_Literal => - return Attr_None; + return Attr_Ref; when Field_Physical_Unit_Value => return Attr_None; when Field_Fp_Value => return Attr_None; when Field_Simple_Aggregate_List => - return Attr_None; + return Attr_Ref; when Field_String8_Id => return Attr_None; when Field_String_Length => @@ -1609,13 +1632,13 @@ package body Nodes_Meta is when Field_Attribute_Designator => return Attr_None; when Field_Attribute_Specification_Chain => - return Attr_None; + return Attr_Ref; when Field_Attribute_Specification => return Attr_Ref; when Field_Signal_List => return Attr_None; when Field_Designated_Entity => - return Attr_Ref; + return Attr_Forward_Ref; when Field_Formal => return Attr_None; when Field_Actual => @@ -1661,9 +1684,11 @@ package body Nodes_Meta is when Field_Configuration_Item_Chain => return Attr_Chain; when Field_Attribute_Value_Chain => - return Attr_Chain; + return Attr_Ref; when Field_Spec_Chain => return Attr_None; + when Field_Value_Chain => + return Attr_Ref; when Field_Attribute_Value_Spec_Chain => return Attr_None; when Field_Entity_Name => @@ -1671,7 +1696,7 @@ package body Nodes_Meta is when Field_Package => return Attr_Ref; when Field_Package_Body => - return Attr_Ref; + return Attr_Forward_Ref; when Field_Package_Instantiation_Bodies_Chain => return Attr_Chain; when Field_Need_Body => @@ -1699,7 +1724,7 @@ package body Nodes_Meta is when Field_Type_Definition => return Attr_None; when Field_Subtype_Definition => - return Attr_None; + return Attr_Forward_Ref; when Field_Incomplete_Type_Declaration => return Attr_Ref; when Field_Interface_Type_Subprograms => @@ -1721,7 +1746,7 @@ package body Nodes_Meta is when Field_Sequential_Statement_Chain => return Attr_Chain; when Field_Subprogram_Body => - return Attr_Ref; + return Attr_Forward_Ref; when Field_Overload_Number => return Attr_None; when Field_Subprogram_Depth => @@ -1737,7 +1762,7 @@ package body Nodes_Meta is when Field_Default_Value => return Attr_Maybe_Ref; when Field_Deferred_Declaration => - return Attr_Ref; + return Attr_Forward_Ref; when Field_Deferred_Declaration_Flag => return Attr_None; when Field_Shared_Flag => @@ -1756,6 +1781,8 @@ package body Nodes_Meta is return Attr_None; when Field_Element_Position => return Attr_None; + when Field_Base_Element_Declaration => + return Attr_Ref; when Field_Element_Declaration => return Attr_None; when Field_Selected_Element => @@ -1791,7 +1818,7 @@ package body Nodes_Meta is when Field_Visible_Flag => return Attr_None; when Field_Range_Constraint => - return Attr_None; + return Attr_Maybe_Ref; when Field_Direction => return Attr_None; when Field_Left_Limit => @@ -1859,7 +1886,7 @@ package body Nodes_Meta is when Field_Waveform_Chain => return Attr_Chain; when Field_Guard => - return Attr_None; + return Attr_Ref; when Field_Delay_Mechanism => return Attr_None; when Field_Reject_Time_Expression => @@ -1925,9 +1952,9 @@ package body Nodes_Meta is when Field_Configuration_Name => return Attr_None; when Field_Component_Configuration => - return Attr_None; + return Attr_Forward_Ref; when Field_Configuration_Specification => - return Attr_None; + return Attr_Ref; when Field_Default_Binding_Indication => return Attr_None; when Field_Default_Configuration_Declaration => @@ -1951,15 +1978,17 @@ package body Nodes_Meta is when Field_Signal_Attribute_Chain => return Attr_Forward_Ref; when Field_Block_Block_Configuration => - return Attr_None; + return Attr_Forward_Ref; when Field_Package_Header => return Attr_None; when Field_Block_Header => return Attr_None; when Field_Uninstantiated_Package_Name => return Attr_None; + when Field_Uninstantiated_Package_Decl => + return Attr_Ref; when Field_Generate_Block_Configuration => - return Attr_None; + return Attr_Forward_Ref; when Field_Generate_Statement_Body => return Attr_None; when Field_Alternative_Label => @@ -1991,9 +2020,11 @@ package body Nodes_Meta is when Field_Binding_Indication => return Attr_None; when Field_Named_Entity => - return Attr_Ref; + return Attr_Maybe_Forward_Ref; when Field_Alias_Declaration => - return Attr_None; + return Attr_Ref; + when Field_Referenced_Name => + return Attr_Ref; when Field_Expr_Staticness => return Attr_None; when Field_Error_Origin => @@ -2004,6 +2035,8 @@ package body Nodes_Meta is return Attr_None; when Field_Right => return Attr_None; + when Field_Physical_Unit => + return Attr_Ref; when Field_Unit_Name => return Attr_None; when Field_Name => @@ -2015,7 +2048,7 @@ package body Nodes_Meta is when Field_Prefix => return Attr_None; when Field_Signature_Prefix => - return Attr_Ref; + return Attr_None; when Field_External_Pathname => return Attr_None; when Field_Pathname_Suffix => @@ -2035,6 +2068,8 @@ package body Nodes_Meta is when Field_Signal_Attribute_Declaration => return Attr_Forward_Ref; when Field_Actual_Type => + return Attr_Ref; + when Field_Actual_Type_Definition => return Attr_None; when Field_Association_Chain => return Attr_Chain; @@ -2051,9 +2086,9 @@ package body Nodes_Meta is when Field_Aggr_Min_Length => return Attr_None; when Field_Aggr_Low_Limit => - return Attr_None; + return Attr_Ref; when Field_Aggr_High_Limit => - return Attr_None; + return Attr_Ref; when Field_Aggr_Others_Flag => return Attr_None; when Field_Aggr_Named_Flag => @@ -2073,7 +2108,7 @@ package body Nodes_Meta is when Field_Parameter_Association_Chain => return Attr_Chain; when Field_Method_Object => - return Attr_None; + return Attr_Ref; when Field_Subtype_Type_Mark => return Attr_None; when Field_Type_Conversion_Subtype => @@ -2105,7 +2140,7 @@ package body Nodes_Meta is when Field_Simple_Name_Subtype => return Attr_None; when Field_Protected_Type_Body => - return Attr_Ref; + return Attr_Forward_Ref; when Field_Protected_Type_Declaration => return Attr_Ref; when Field_End_Location => @@ -2142,6 +2177,8 @@ package body Nodes_Meta is return Attr_None; when Field_Is_Ref => return Attr_None; + when Field_Is_Forward_Ref => + return Attr_None; when Field_Psl_Property => return Attr_None; when Field_Psl_Sequence => @@ -2173,8 +2210,8 @@ package body Nodes_Meta is Field_Signal_Type_Flag, Field_Has_Signal_Flag, Field_Expr_Staticness, - Field_Error_Origin, Field_Type, + Field_Error_Origin, Field_Type_Declarator, Field_Base_Type, -- Iir_Kind_Design_File @@ -2183,10 +2220,10 @@ package body Nodes_Meta is Field_Analysis_Time_Stamp, Field_File_Checksum, Field_Elab_Flag, + Field_Library, Field_File_Dependence_List, Field_Chain, Field_First_Design_Unit, - Field_Library, Field_Last_Design_Unit, -- Iir_Kind_Design_Unit Field_Design_Unit_Source_Pos, @@ -2199,29 +2236,29 @@ package body Nodes_Meta is Field_Configuration_Mark_Flag, Field_Configuration_Done_Flag, Field_Date_State, + Field_Design_File, Field_Context_Items, Field_Chain, Field_Library_Unit, - Field_Design_File, Field_Hash_Chain, Field_Dependence_List, Field_Analysis_Checks_List, -- Iir_Kind_Library_Clause Field_Identifier, Field_Has_Identifier_List, - Field_Chain, Field_Parent, Field_Library_Declaration, + Field_Chain, -- Iir_Kind_Use_Clause + Field_Parent, Field_Selected_Name, Field_Chain, Field_Use_Clause_Chain, - Field_Parent, -- Iir_Kind_Context_Reference + Field_Parent, Field_Selected_Name, Field_Chain, Field_Context_Reference_Chain, - Field_Parent, -- Iir_Kind_Integer_Literal Field_Value, Field_Expr_Staticness, @@ -2250,18 +2287,20 @@ package body Nodes_Meta is Field_Value, Field_Expr_Staticness, Field_Literal_Origin, + Field_Physical_Unit, Field_Unit_Name, Field_Type, -- Iir_Kind_Physical_Fp_Literal Field_Fp_Value, Field_Expr_Staticness, Field_Literal_Origin, + Field_Physical_Unit, Field_Unit_Name, Field_Type, -- Iir_Kind_Simple_Aggregate Field_Expr_Staticness, - Field_Literal_Origin, Field_Literal_Subtype, + Field_Literal_Origin, Field_Simple_Aggregate_List, Field_Type, -- Iir_Kind_Overflow_Literal @@ -2270,16 +2309,16 @@ package body Nodes_Meta is Field_Type, -- Iir_Kind_Waveform_Element Field_We_Value, - Field_Chain, Field_Time, + Field_Chain, -- Iir_Kind_Conditional_Waveform Field_Condition, - Field_Chain, Field_Waveform_Chain, + Field_Chain, -- Iir_Kind_Conditional_Expression Field_Condition, - Field_Chain, Field_Expression, + Field_Chain, -- Iir_Kind_Association_Element_By_Expression Field_Whole_Association_Flag, Field_Collapse_Signal_Flag, @@ -2295,6 +2334,7 @@ package body Nodes_Meta is Field_Formal, Field_Chain, Field_Individual_Association_Chain, + Field_Actual_Type_Definition, Field_Actual_Type, -- Iir_Kind_Association_Element_Open Field_Whole_Association_Flag, @@ -2323,39 +2363,39 @@ package body Nodes_Meta is Field_Actual, -- Iir_Kind_Choice_By_Others Field_Same_Alternative_Flag, + Field_Parent, Field_Chain, Field_Associated_Expr, Field_Associated_Chain, - Field_Parent, -- Iir_Kind_Choice_By_Expression Field_Same_Alternative_Flag, Field_Choice_Staticness, + Field_Parent, Field_Chain, Field_Associated_Expr, Field_Associated_Chain, Field_Choice_Expression, - Field_Parent, -- Iir_Kind_Choice_By_Range Field_Same_Alternative_Flag, Field_Choice_Staticness, + Field_Parent, Field_Chain, Field_Associated_Expr, Field_Associated_Chain, Field_Choice_Range, - Field_Parent, -- Iir_Kind_Choice_By_None Field_Same_Alternative_Flag, + Field_Parent, Field_Chain, Field_Associated_Expr, Field_Associated_Chain, - Field_Parent, -- Iir_Kind_Choice_By_Name Field_Same_Alternative_Flag, + Field_Parent, Field_Chain, Field_Associated_Expr, Field_Associated_Chain, Field_Choice_Name, - Field_Parent, -- Iir_Kind_Entity_Aspect_Entity Field_Entity_Name, Field_Architecture, @@ -2363,24 +2403,24 @@ package body Nodes_Meta is Field_Configuration_Name, -- Iir_Kind_Entity_Aspect_Open -- Iir_Kind_Block_Configuration + Field_Parent, Field_Declaration_Chain, Field_Chain, Field_Configuration_Item_Chain, - Field_Block_Specification, - Field_Parent, Field_Prev_Block_Configuration, + Field_Block_Specification, -- Iir_Kind_Block_Header Field_Generic_Chain, Field_Port_Chain, Field_Generic_Map_Aspect_Chain, Field_Port_Map_Aspect_Chain, -- Iir_Kind_Component_Configuration - Field_Instantiation_List, - Field_Chain, - Field_Binding_Indication, + Field_Parent, Field_Component_Name, + Field_Instantiation_List, Field_Block_Configuration, - Field_Parent, + Field_Binding_Indication, + Field_Chain, -- Iir_Kind_Binding_Indication Field_Default_Entity_Aspect, Field_Entity_Aspect, @@ -2395,15 +2435,15 @@ package body Nodes_Meta is Field_Expr_Staticness, Field_Name_Staticness, Field_Spec_Chain, - Field_Chain, Field_Type, + Field_Value_Chain, Field_Designated_Entity, Field_Attribute_Specification, Field_Base_Name, -- Iir_Kind_Signature + Field_Signature_Prefix, Field_Type_Marks_List, Field_Return_Type_Mark, - Field_Signature_Prefix, -- Iir_Kind_Aggregate_Info Field_Aggr_Min_Length, Field_Aggr_Others_Flag, @@ -2415,17 +2455,18 @@ package body Nodes_Meta is -- Iir_Kind_Procedure_Call Field_Prefix, Field_Parameter_Association_Chain, - Field_Method_Object, Field_Implementation, + Field_Method_Object, -- Iir_Kind_Record_Element_Constraint Field_Identifier, Field_Element_Position, Field_Visible_Flag, - Field_Element_Declaration, Field_Parent, Field_Type, + Field_Element_Declaration, -- Iir_Kind_Array_Element_Resolution Field_Resolution_Indication, + Field_Element_Subtype_Indication, -- Iir_Kind_Record_Resolution Field_Record_Element_Resolution_Chain, -- Iir_Kind_Record_Element_Resolution @@ -2434,34 +2475,34 @@ package body Nodes_Meta is Field_Resolution_Indication, -- Iir_Kind_Attribute_Specification Field_Entity_Class, + Field_Parent, Field_Chain, - Field_Attribute_Value_Spec_Chain, + Field_Entity_Name_List, Field_Expression, + Field_Attribute_Value_Spec_Chain, Field_Attribute_Designator, Field_Attribute_Specification_Chain, - Field_Entity_Name_List, - Field_Parent, -- Iir_Kind_Disconnection_Specification + Field_Parent, Field_Chain, Field_Signal_List, Field_Type_Mark, Field_Expression, - Field_Parent, -- Iir_Kind_Configuration_Specification + Field_Parent, + Field_Component_Name, Field_Instantiation_List, - Field_Chain, Field_Binding_Indication, - Field_Component_Name, - Field_Parent, + Field_Chain, -- Iir_Kind_Access_Type_Definition Field_Resolved_Flag, Field_Signal_Type_Flag, Field_Type_Staticness, Field_Designated_Subtype_Indication, - Field_Incomplete_Type_Ref_Chain, Field_Designated_Type, Field_Type_Declarator, Field_Base_Type, + Field_Incomplete_Type_Ref_Chain, -- Iir_Kind_Incomplete_Type_Definition Field_Resolved_Flag, Field_Signal_Type_Flag, @@ -2515,12 +2556,12 @@ package body Nodes_Meta is Field_Index_Constraint_Flag, Field_Type_Staticness, Field_Constraint_State, - Field_Element_Subtype_Indication, Field_Index_Subtype_Definition_List, + Field_Element_Subtype_Indication, + Field_Index_Subtype_List, Field_Element_Subtype, Field_Type_Declarator, Field_Base_Type, - Field_Index_Subtype_List, -- Iir_Kind_Array_Subtype_Definition Field_Resolved_Flag, Field_Signal_Type_Flag, @@ -2531,12 +2572,12 @@ package body Nodes_Meta is Field_Subtype_Type_Mark, Field_Resolution_Indication, Field_Index_Constraint_List, - Field_Tolerance, + Field_Index_Subtype_List, Field_Array_Element_Constraint, + Field_Tolerance, Field_Element_Subtype, Field_Type_Declarator, Field_Base_Type, - Field_Index_Subtype_List, -- Iir_Kind_Record_Subtype_Definition Field_Resolved_Flag, Field_Signal_Type_Flag, @@ -2545,68 +2586,73 @@ package body Nodes_Meta is Field_Constraint_State, Field_Elements_Declaration_List, Field_Subtype_Type_Mark, - Field_Resolution_Indication, - Field_Tolerance, Field_Type_Declarator, Field_Base_Type, + Field_Resolution_Indication, + Field_Tolerance, -- Iir_Kind_Access_Subtype_Definition Field_Resolved_Flag, Field_Signal_Type_Flag, Field_Type_Staticness, - Field_Subtype_Type_Mark, - Field_Designated_Subtype_Indication, Field_Designated_Type, + Field_Subtype_Type_Mark, Field_Type_Declarator, Field_Base_Type, + Field_Designated_Subtype_Indication, -- Iir_Kind_Physical_Subtype_Definition Field_Resolved_Flag, Field_Signal_Type_Flag, Field_Has_Signal_Flag, + Field_Is_Ref, Field_Type_Staticness, Field_Range_Constraint, Field_Subtype_Type_Mark, - Field_Resolution_Indication, Field_Type_Declarator, Field_Base_Type, + Field_Resolution_Indication, -- Iir_Kind_Floating_Subtype_Definition Field_Resolved_Flag, Field_Signal_Type_Flag, Field_Has_Signal_Flag, + Field_Is_Ref, Field_Type_Staticness, Field_Range_Constraint, Field_Subtype_Type_Mark, - Field_Resolution_Indication, - Field_Tolerance, Field_Type_Declarator, Field_Base_Type, + Field_Resolution_Indication, + Field_Tolerance, -- Iir_Kind_Integer_Subtype_Definition Field_Resolved_Flag, Field_Signal_Type_Flag, Field_Has_Signal_Flag, + Field_Is_Ref, Field_Type_Staticness, Field_Range_Constraint, Field_Subtype_Type_Mark, - Field_Resolution_Indication, Field_Type_Declarator, Field_Base_Type, + Field_Resolution_Indication, -- Iir_Kind_Enumeration_Subtype_Definition Field_Resolved_Flag, Field_Signal_Type_Flag, Field_Has_Signal_Flag, + Field_Is_Ref, Field_Type_Staticness, Field_Range_Constraint, Field_Subtype_Type_Mark, - Field_Resolution_Indication, Field_Type_Declarator, Field_Base_Type, + Field_Resolution_Indication, -- Iir_Kind_Enumeration_Type_Definition Field_Resolved_Flag, Field_Signal_Type_Flag, Field_Has_Signal_Flag, Field_Only_Characters_Flag, + Field_Is_Ref, Field_Type_Staticness, - Field_Range_Constraint, Field_Enumeration_Literal_List, + Field_Range_Constraint, Field_Type_Declarator, Field_Base_Type, -- Iir_Kind_Integer_Type_Definition @@ -2636,9 +2682,9 @@ package body Nodes_Meta is -- Iir_Kind_Range_Expression Field_Expr_Staticness, Field_Direction, - Field_Range_Origin, Field_Left_Limit_Expr, Field_Right_Limit_Expr, + Field_Range_Origin, Field_Type, Field_Left_Limit, Field_Right_Limit, @@ -2646,9 +2692,9 @@ package body Nodes_Meta is Field_Identifier, Field_End_Has_Reserved_Id, Field_End_Has_Identifier, + Field_Parent, Field_Declaration_Chain, Field_Chain, - Field_Parent, Field_Protected_Type_Declaration, -- Iir_Kind_Wildcard_Type_Definition Field_Resolved_Flag, @@ -2657,6 +2703,7 @@ package body Nodes_Meta is Field_Type_Declarator, Field_Base_Type, -- Iir_Kind_Subtype_Definition + Field_Is_Ref, Field_Range_Constraint, Field_Subtype_Type_Mark, Field_Resolution_Indication, @@ -2672,39 +2719,39 @@ package body Nodes_Meta is Field_Identifier, Field_Visible_Flag, Field_Use_Flag, + Field_Parent, Field_Type_Definition, Field_Chain, - Field_Parent, Field_Incomplete_Type_Declaration, -- Iir_Kind_Anonymous_Type_Declaration Field_Identifier, + Field_Parent, Field_Type_Definition, Field_Chain, Field_Subtype_Definition, - Field_Parent, Field_Incomplete_Type_Declaration, -- Iir_Kind_Subtype_Declaration Field_Identifier, Field_Visible_Flag, Field_Use_Flag, + Field_Parent, Field_Chain, Field_Subtype_Indication, - Field_Parent, Field_Type, -- Iir_Kind_Nature_Declaration Field_Identifier, Field_Visible_Flag, Field_Use_Flag, + Field_Parent, Field_Nature, Field_Chain, - Field_Parent, -- Iir_Kind_Subnature_Declaration Field_Identifier, Field_Visible_Flag, Field_Use_Flag, + Field_Parent, Field_Nature, Field_Chain, - Field_Parent, -- Iir_Kind_Package_Declaration Field_Identifier, Field_Need_Body, @@ -2713,46 +2760,47 @@ package body Nodes_Meta is Field_Visible_Flag, Field_End_Has_Reserved_Id, Field_End_Has_Identifier, + Field_Parent, + Field_Package_Header, Field_Declaration_Chain, Field_Chain, Field_Attribute_Value_Chain, - Field_Package_Header, + Field_Package_Body, Field_Package_Origin, Field_Package_Instantiation_Bodies_Chain, - Field_Parent, - Field_Package_Body, -- Iir_Kind_Package_Instantiation_Declaration Field_Identifier, Field_Visible_Flag, Field_End_Has_Reserved_Id, Field_End_Has_Identifier, + Field_Parent, + Field_Uninstantiated_Package_Name, + Field_Uninstantiated_Package_Decl, + Field_Generic_Chain, + Field_Generic_Map_Aspect_Chain, Field_Declaration_Chain, Field_Chain, Field_Attribute_Value_Chain, - Field_Generic_Chain, - Field_Uninstantiated_Package_Name, - Field_Generic_Map_Aspect_Chain, - Field_Parent, Field_Package_Body, -- Iir_Kind_Package_Body Field_Identifier, Field_End_Has_Reserved_Id, Field_End_Has_Identifier, + Field_Parent, Field_Declaration_Chain, Field_Chain, Field_Attribute_Value_Chain, - Field_Parent, Field_Package, -- Iir_Kind_Configuration_Declaration Field_Identifier, Field_Visible_Flag, Field_End_Has_Reserved_Id, Field_End_Has_Identifier, + Field_Parent, Field_Declaration_Chain, Field_Entity_Name, Field_Attribute_Value_Chain, Field_Block_Configuration, - Field_Parent, -- Iir_Kind_Entity_Declaration Field_Identifier, Field_Has_Begin, @@ -2760,12 +2808,12 @@ package body Nodes_Meta is Field_Is_Within_Flag, Field_End_Has_Reserved_Id, Field_End_Has_Identifier, - Field_Declaration_Chain, - Field_Attribute_Value_Chain, - Field_Concurrent_Statement_Chain, + Field_Parent, Field_Generic_Chain, Field_Port_Chain, - Field_Parent, + Field_Declaration_Chain, + Field_Concurrent_Statement_Chain, + Field_Attribute_Value_Chain, -- Iir_Kind_Architecture_Body Field_Identifier, Field_Foreign_Flag, @@ -2773,19 +2821,19 @@ package body Nodes_Meta is Field_Is_Within_Flag, Field_End_Has_Reserved_Id, Field_End_Has_Identifier, - Field_Declaration_Chain, + Field_Parent, Field_Entity_Name, - Field_Attribute_Value_Chain, + Field_Declaration_Chain, Field_Concurrent_Statement_Chain, + Field_Attribute_Value_Chain, Field_Default_Configuration_Declaration, - Field_Parent, -- Iir_Kind_Context_Declaration Field_Identifier, Field_Visible_Flag, Field_End_Has_Reserved_Id, Field_End_Has_Identifier, - Field_Context_Items, Field_Parent, + Field_Context_Items, -- Iir_Kind_Package_Header Field_Generic_Chain, Field_Generic_Map_Aspect_Chain, @@ -2794,11 +2842,11 @@ package body Nodes_Meta is Field_Visible_Flag, Field_Expr_Staticness, Field_Name_Staticness, - Field_Chain, - Field_Physical_Literal, - Field_Physical_Unit_Value, Field_Parent, Field_Type, + Field_Chain, + Field_Physical_Unit_Value, + Field_Physical_Literal, -- Iir_Kind_Library_Declaration Field_Identifier, Field_Date, @@ -2814,33 +2862,33 @@ package body Nodes_Meta is Field_Has_Is, Field_End_Has_Reserved_Id, Field_End_Has_Identifier, + Field_Parent, Field_Chain, Field_Generic_Chain, Field_Port_Chain, - Field_Parent, -- Iir_Kind_Attribute_Declaration Field_Identifier, Field_Visible_Flag, Field_Use_Flag, - Field_Chain, - Field_Type_Mark, Field_Parent, Field_Type, + Field_Chain, + Field_Type_Mark, -- Iir_Kind_Group_Template_Declaration Field_Identifier, Field_Visible_Flag, Field_Use_Flag, + Field_Parent, Field_Entity_Class_Entry_Chain, Field_Chain, - Field_Parent, -- Iir_Kind_Group_Declaration Field_Identifier, Field_Visible_Flag, Field_Use_Flag, + Field_Parent, Field_Group_Constituent_List, Field_Chain, Field_Group_Template_Name, - Field_Parent, -- Iir_Kind_Element_Declaration Field_Identifier, Field_Element_Position, @@ -2848,15 +2896,16 @@ package body Nodes_Meta is Field_Visible_Flag, Field_Subtype_Indication, Field_Type, + Field_Base_Element_Declaration, -- Iir_Kind_Non_Object_Alias_Declaration Field_Identifier, Field_Implicit_Alias_Flag, Field_Visible_Flag, Field_Use_Flag, + Field_Parent, Field_Chain, Field_Name, Field_Alias_Signature, - Field_Parent, -- Iir_Kind_Psl_Declaration Field_Identifier, Field_Psl_Declaration, @@ -2864,8 +2913,8 @@ package body Nodes_Meta is Field_PSL_NFA, Field_Visible_Flag, Field_Use_Flag, - Field_Chain, Field_Parent, + Field_Chain, -- Iir_Kind_Psl_Endpoint_Declaration Field_Identifier, Field_Psl_Declaration, @@ -2877,53 +2926,53 @@ package body Nodes_Meta is Field_Use_Flag, Field_Expr_Staticness, Field_Name_Staticness, - Field_PSL_Clock_Sensitivity, - Field_Chain, Field_Parent, Field_Type, + Field_Chain, + Field_PSL_Clock_Sensitivity, -- Iir_Kind_Terminal_Declaration Field_Identifier, Field_Visible_Flag, Field_Use_Flag, + Field_Parent, Field_Nature, Field_Chain, - Field_Parent, -- Iir_Kind_Free_Quantity_Declaration Field_Identifier, Field_Visible_Flag, Field_Use_Flag, Field_Expr_Staticness, Field_Name_Staticness, - Field_Chain, - Field_Default_Value, Field_Parent, Field_Type, + Field_Chain, + Field_Default_Value, -- Iir_Kind_Across_Quantity_Declaration Field_Identifier, Field_Visible_Flag, Field_Use_Flag, Field_Expr_Staticness, Field_Name_Staticness, + Field_Parent, + Field_Type, Field_Chain, + Field_Default_Value, Field_Tolerance, Field_Plus_Terminal, Field_Minus_Terminal, - Field_Default_Value, - Field_Parent, - Field_Type, -- Iir_Kind_Through_Quantity_Declaration Field_Identifier, Field_Visible_Flag, Field_Use_Flag, Field_Expr_Staticness, Field_Name_Staticness, + Field_Parent, + Field_Type, Field_Chain, + Field_Default_Value, Field_Tolerance, Field_Plus_Terminal, Field_Minus_Terminal, - Field_Default_Value, - Field_Parent, - Field_Type, -- Iir_Kind_Enumeration_Literal Field_Identifier, Field_Subprogram_Hash, @@ -2933,9 +2982,9 @@ package body Nodes_Meta is Field_Is_Within_Flag, Field_Expr_Staticness, Field_Name_Staticness, - Field_Literal_Origin, Field_Parent, Field_Type, + Field_Literal_Origin, -- Iir_Kind_Function_Declaration Field_Subprogram_Depth, Field_Overload_Number, @@ -2955,12 +3004,12 @@ package body Nodes_Meta is Field_Has_Body, Field_Wait_State, Field_All_Sensitized_State, + Field_Parent, + Field_Return_Type, Field_Chain, Field_Interface_Declaration_Chain, Field_Generic_Chain, Field_Return_Type_Mark, - Field_Parent, - Field_Return_Type, Field_Subprogram_Body, -- Iir_Kind_Procedure_Declaration Field_Subprogram_Depth, @@ -2981,21 +3030,21 @@ package body Nodes_Meta is Field_Wait_State, Field_Purity_State, Field_All_Sensitized_State, + Field_Parent, Field_Chain, Field_Interface_Declaration_Chain, Field_Generic_Chain, Field_Return_Type_Mark, - Field_Parent, Field_Subprogram_Body, -- Iir_Kind_Function_Body Field_Impure_Depth, Field_End_Has_Reserved_Id, Field_End_Has_Identifier, + Field_Parent, Field_Declaration_Chain, Field_Chain, Field_Attribute_Value_Chain, Field_Sequential_Statement_Chain, - Field_Parent, Field_Subprogram_Specification, Field_Callees_List, -- Iir_Kind_Procedure_Body @@ -3003,11 +3052,11 @@ package body Nodes_Meta is Field_Suspend_Flag, Field_End_Has_Reserved_Id, Field_End_Has_Identifier, + Field_Parent, Field_Declaration_Chain, Field_Chain, Field_Attribute_Value_Chain, Field_Sequential_Statement_Chain, - Field_Parent, Field_Subprogram_Specification, Field_Callees_List, -- Iir_Kind_Object_Alias_Declaration @@ -3017,10 +3066,10 @@ package body Nodes_Meta is Field_Use_Flag, Field_Expr_Staticness, Field_Name_Staticness, + Field_Parent, Field_Chain, Field_Name, Field_Subtype_Indication, - Field_Parent, Field_Type, -- Iir_Kind_File_Declaration Field_Identifier, @@ -3031,12 +3080,12 @@ package body Nodes_Meta is Field_Mode, Field_Expr_Staticness, Field_Name_Staticness, + Field_Parent, + Field_Type, Field_Chain, Field_Subtype_Indication, Field_File_Logical_Name, Field_File_Open_Kind, - Field_Parent, - Field_Type, -- Iir_Kind_Guard_Signal_Declaration Field_Identifier, Field_Has_Active_Flag, @@ -3046,10 +3095,10 @@ package body Nodes_Meta is Field_Signal_Kind, Field_Expr_Staticness, Field_Name_Staticness, - Field_Guard_Expression, - Field_Guard_Sensitivity_List, Field_Parent, Field_Type, + Field_Guard_Expression, + Field_Guard_Sensitivity_List, Field_Block_Statement, -- Iir_Kind_Signal_Declaration Field_Identifier, @@ -3064,10 +3113,10 @@ package body Nodes_Meta is Field_Signal_Kind, Field_Expr_Staticness, Field_Name_Staticness, + Field_Parent, Field_Chain, Field_Subtype_Indication, Field_Default_Value, - Field_Parent, Field_Type, -- Iir_Kind_Variable_Declaration Field_Identifier, @@ -3078,10 +3127,10 @@ package body Nodes_Meta is Field_Is_Ref, Field_Expr_Staticness, Field_Name_Staticness, + Field_Parent, Field_Chain, Field_Subtype_Indication, Field_Default_Value, - Field_Parent, Field_Type, -- Iir_Kind_Constant_Declaration Field_Identifier, @@ -3092,10 +3141,10 @@ package body Nodes_Meta is Field_Is_Ref, Field_Expr_Staticness, Field_Name_Staticness, + Field_Parent, Field_Chain, Field_Subtype_Indication, Field_Default_Value, - Field_Parent, Field_Type, Field_Deferred_Declaration, -- Iir_Kind_Iterator_Declaration @@ -3105,11 +3154,11 @@ package body Nodes_Meta is Field_Use_Flag, Field_Expr_Staticness, Field_Name_Staticness, + Field_Parent, Field_Chain, Field_Subtype_Indication, - Field_Parent, - Field_Type, Field_Discrete_Range, + Field_Type, -- Iir_Kind_Interface_Constant_Declaration Field_Identifier, Field_Has_Mode, @@ -3122,10 +3171,10 @@ package body Nodes_Meta is Field_Mode, Field_Expr_Staticness, Field_Name_Staticness, + Field_Parent, Field_Chain, Field_Subtype_Indication, Field_Default_Value, - Field_Parent, Field_Type, -- Iir_Kind_Interface_Variable_Declaration Field_Identifier, @@ -3139,10 +3188,10 @@ package body Nodes_Meta is Field_Mode, Field_Expr_Staticness, Field_Name_Staticness, + Field_Parent, Field_Chain, Field_Subtype_Indication, Field_Default_Value, - Field_Parent, Field_Type, -- Iir_Kind_Interface_Signal_Declaration Field_Identifier, @@ -3161,10 +3210,10 @@ package body Nodes_Meta is Field_Mode, Field_Expr_Staticness, Field_Name_Staticness, + Field_Parent, Field_Chain, Field_Subtype_Indication, Field_Default_Value, - Field_Parent, Field_Type, -- Iir_Kind_Interface_File_Declaration Field_Identifier, @@ -3178,10 +3227,10 @@ package body Nodes_Meta is Field_Mode, Field_Expr_Staticness, Field_Name_Staticness, + Field_Parent, Field_Chain, Field_Subtype_Indication, Field_Default_Value, - Field_Parent, Field_Type, -- Iir_Kind_Interface_Type_Declaration Field_Identifier, @@ -3190,21 +3239,22 @@ package body Nodes_Meta is Field_Use_Flag, Field_Is_Ref, Field_Name_Staticness, - Field_Chain, - Field_Interface_Type_Subprograms, Field_Parent, Field_Type, + Field_Chain, + Field_Interface_Type_Subprograms, -- Iir_Kind_Interface_Package_Declaration Field_Identifier, Field_Visible_Flag, Field_Is_Within_Flag, + Field_Parent, + Field_Uninstantiated_Package_Name, + Field_Uninstantiated_Package_Decl, + Field_Generic_Chain, + Field_Generic_Map_Aspect_Chain, Field_Declaration_Chain, Field_Chain, Field_Attribute_Value_Chain, - Field_Generic_Chain, - Field_Uninstantiated_Package_Name, - Field_Generic_Map_Aspect_Chain, - Field_Parent, -- Iir_Kind_Interface_Function_Declaration Field_Subprogram_Depth, Field_Identifier, @@ -3218,11 +3268,11 @@ package body Nodes_Meta is Field_Resolution_Function_Flag, Field_Has_Pure, Field_All_Sensitized_State, + Field_Parent, + Field_Return_Type, Field_Chain, Field_Interface_Declaration_Chain, Field_Return_Type_Mark, - Field_Parent, - Field_Return_Type, -- Iir_Kind_Interface_Procedure_Declaration Field_Subprogram_Depth, Field_Identifier, @@ -3233,276 +3283,276 @@ package body Nodes_Meta is Field_Visible_Flag, Field_Use_Flag, Field_All_Sensitized_State, + Field_Parent, Field_Chain, Field_Interface_Declaration_Chain, Field_Return_Type_Mark, - Field_Parent, -- Iir_Kind_Signal_Attribute_Declaration - Field_Chain, Field_Parent, + Field_Chain, Field_Signal_Attribute_Chain, -- Iir_Kind_Identity_Operator Field_Expr_Staticness, - Field_Operand, Field_Type, + Field_Operand, Field_Implementation, -- Iir_Kind_Negation_Operator Field_Expr_Staticness, - Field_Operand, Field_Type, + Field_Operand, Field_Implementation, -- Iir_Kind_Absolute_Operator Field_Expr_Staticness, - Field_Operand, Field_Type, + Field_Operand, Field_Implementation, -- Iir_Kind_Not_Operator Field_Expr_Staticness, - Field_Operand, Field_Type, + Field_Operand, Field_Implementation, -- Iir_Kind_Condition_Operator Field_Expr_Staticness, - Field_Operand, Field_Type, + Field_Operand, Field_Implementation, -- Iir_Kind_Reduction_And_Operator Field_Expr_Staticness, - Field_Operand, Field_Type, + Field_Operand, Field_Implementation, -- Iir_Kind_Reduction_Or_Operator Field_Expr_Staticness, - Field_Operand, Field_Type, + Field_Operand, Field_Implementation, -- Iir_Kind_Reduction_Nand_Operator Field_Expr_Staticness, - Field_Operand, Field_Type, + Field_Operand, Field_Implementation, -- Iir_Kind_Reduction_Nor_Operator Field_Expr_Staticness, - Field_Operand, Field_Type, + Field_Operand, Field_Implementation, -- Iir_Kind_Reduction_Xor_Operator Field_Expr_Staticness, - Field_Operand, Field_Type, + Field_Operand, Field_Implementation, -- Iir_Kind_Reduction_Xnor_Operator Field_Expr_Staticness, - Field_Operand, Field_Type, + Field_Operand, Field_Implementation, -- Iir_Kind_And_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Or_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Nand_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Nor_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Xor_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Xnor_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Equality_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Inequality_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Less_Than_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Less_Than_Or_Equal_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Greater_Than_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Greater_Than_Or_Equal_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Match_Equality_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Match_Inequality_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Match_Less_Than_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Match_Less_Than_Or_Equal_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Match_Greater_Than_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Match_Greater_Than_Or_Equal_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Sll_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Sla_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Srl_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Sra_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Rol_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Ror_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Addition_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Substraction_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Concatenation_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Multiplication_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Division_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Modulus_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Remainder_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Exponentiation_Operator Field_Expr_Staticness, - Field_Left, - Field_Right, Field_Type, + Field_Left, Field_Implementation, + Field_Right, -- Iir_Kind_Function_Call Field_Expr_Staticness, Field_Name_Staticness, Field_Prefix, - Field_Parameter_Association_Chain, - Field_Method_Object, Field_Type, + Field_Parameter_Association_Chain, Field_Implementation, + Field_Method_Object, Field_Base_Name, -- Iir_Kind_Aggregate Field_Expr_Staticness, Field_Value_Staticness, - Field_Aggregate_Info, - Field_Literal_Subtype, Field_Association_Choices_Chain, + Field_Literal_Subtype, + Field_Aggregate_Info, Field_Type, -- Iir_Kind_Parenthesis_Expression Field_Expr_Staticness, @@ -3510,26 +3560,26 @@ package body Nodes_Meta is Field_Type, -- Iir_Kind_Qualified_Expression Field_Expr_Staticness, + Field_Type, Field_Type_Mark, Field_Expression, - Field_Type, -- Iir_Kind_Type_Conversion Field_Expr_Staticness, + Field_Type, Field_Type_Conversion_Subtype, Field_Type_Mark, Field_Expression, - Field_Type, -- Iir_Kind_Allocator_By_Expression Field_Expr_Staticness, - Field_Expression, Field_Type, + Field_Expression, Field_Allocator_Designated_Type, -- Iir_Kind_Allocator_By_Subtype Field_Expr_Staticness, - Field_Subtype_Indication, Field_Type, - Field_Allocator_Designated_Type, + Field_Subtype_Indication, Field_Allocator_Subtype, + Field_Allocator_Designated_Type, -- Iir_Kind_Selected_Element Field_Expr_Staticness, Field_Name_Staticness, @@ -3561,8 +3611,8 @@ package body Nodes_Meta is Field_Expr_Staticness, Field_Name_Staticness, Field_Prefix, - Field_Index_List, Field_Type, + Field_Index_List, Field_Base_Name, -- Iir_Kind_Psl_Expression Field_Psl_Expression, @@ -3580,14 +3630,14 @@ package body Nodes_Meta is Field_End_Has_Reserved_Id, Field_End_Has_Identifier, Field_Wait_State, + Field_Parent, Field_Declaration_Chain, Field_Chain, Field_Attribute_Value_Chain, Field_Sequential_Statement_Chain, Field_Sensitivity_List, - Field_Process_Origin, - Field_Parent, Field_Callees_List, + Field_Process_Origin, -- Iir_Kind_Process_Statement Field_Label, Field_Seen_Flag, @@ -3602,67 +3652,67 @@ package body Nodes_Meta is Field_End_Has_Reserved_Id, Field_End_Has_Identifier, Field_Wait_State, + Field_Parent, Field_Declaration_Chain, Field_Chain, Field_Attribute_Value_Chain, Field_Sequential_Statement_Chain, - Field_Process_Origin, - Field_Parent, Field_Callees_List, + Field_Process_Origin, -- Iir_Kind_Concurrent_Simple_Signal_Assignment Field_Label, Field_Delay_Mechanism, Field_Postponed_Flag, Field_Visible_Flag, Field_Guarded_Target_State, + Field_Parent, Field_Target, Field_Chain, Field_Reject_Time_Expression, Field_Waveform_Chain, Field_Guard, - Field_Parent, -- Iir_Kind_Concurrent_Conditional_Signal_Assignment Field_Label, Field_Delay_Mechanism, Field_Postponed_Flag, Field_Visible_Flag, Field_Guarded_Target_State, + Field_Parent, Field_Target, Field_Chain, Field_Reject_Time_Expression, Field_Conditional_Waveform_Chain, Field_Guard, - Field_Parent, -- Iir_Kind_Concurrent_Selected_Signal_Assignment Field_Label, Field_Delay_Mechanism, Field_Postponed_Flag, Field_Visible_Flag, Field_Guarded_Target_State, + Field_Parent, Field_Target, Field_Chain, Field_Reject_Time_Expression, Field_Expression, Field_Selected_Waveform_Chain, Field_Guard, - Field_Parent, -- Iir_Kind_Concurrent_Assertion_Statement Field_Label, Field_Postponed_Flag, Field_Visible_Flag, + Field_Parent, Field_Assertion_Condition, Field_Chain, Field_Severity_Expression, Field_Report_Expression, - Field_Parent, -- Iir_Kind_Concurrent_Procedure_Call_Statement Field_Label, Field_Suspend_Flag, Field_Postponed_Flag, Field_Visible_Flag, + Field_Parent, Field_Procedure_Call, Field_Chain, - Field_Parent, -- Iir_Kind_Psl_Assert_Statement Field_Psl_Property, Field_Label, @@ -3672,11 +3722,11 @@ package body Nodes_Meta is Field_PSL_EOS_Flag, Field_Postponed_Flag, Field_Visible_Flag, - Field_PSL_Clock_Sensitivity, + Field_Parent, Field_Chain, Field_Severity_Expression, Field_Report_Expression, - Field_Parent, + Field_PSL_Clock_Sensitivity, -- Iir_Kind_Psl_Cover_Statement Field_Psl_Sequence, Field_Label, @@ -3686,80 +3736,80 @@ package body Nodes_Meta is Field_PSL_EOS_Flag, Field_Postponed_Flag, Field_Visible_Flag, - Field_PSL_Clock_Sensitivity, + Field_Parent, Field_Chain, Field_Severity_Expression, Field_Report_Expression, - Field_Parent, + Field_PSL_Clock_Sensitivity, -- Iir_Kind_Block_Statement Field_Label, Field_Visible_Flag, Field_Is_Within_Flag, Field_End_Has_Reserved_Id, Field_End_Has_Identifier, + Field_Parent, + Field_Guard_Decl, + Field_Block_Header, Field_Declaration_Chain, Field_Chain, Field_Attribute_Value_Chain, Field_Concurrent_Statement_Chain, Field_Block_Block_Configuration, - Field_Block_Header, - Field_Guard_Decl, - Field_Parent, -- Iir_Kind_If_Generate_Statement Field_Label, Field_Visible_Flag, Field_Is_Within_Flag, Field_End_Has_Reserved_Id, Field_End_Has_Identifier, + Field_Parent, Field_Condition, Field_Chain, Field_Generate_Statement_Body, Field_Generate_Else_Clause, - Field_Parent, -- Iir_Kind_Case_Generate_Statement Field_Label, Field_Visible_Flag, Field_Is_Within_Flag, Field_End_Has_Reserved_Id, Field_End_Has_Identifier, + Field_Parent, Field_Case_Statement_Alternative_Chain, Field_Chain, Field_Expression, - Field_Parent, -- Iir_Kind_For_Generate_Statement Field_Label, Field_Visible_Flag, Field_Is_Within_Flag, Field_End_Has_Reserved_Id, Field_End_Has_Identifier, + Field_Parent, Field_Parameter_Specification, Field_Chain, Field_Generate_Statement_Body, - Field_Parent, -- Iir_Kind_Component_Instantiation_Statement Field_Label, Field_Visible_Flag, + Field_Parent, Field_Instantiated_Unit, Field_Chain, Field_Default_Binding_Indication, - Field_Component_Configuration, - Field_Configuration_Specification, Field_Generic_Map_Aspect_Chain, Field_Port_Map_Aspect_Chain, - Field_Parent, + Field_Configuration_Specification, + Field_Component_Configuration, -- Iir_Kind_Psl_Default_Clock Field_Psl_Boolean, Field_Label, - Field_Chain, Field_Parent, + Field_Chain, -- Iir_Kind_Simple_Simultaneous_Statement Field_Label, Field_Visible_Flag, + Field_Parent, Field_Chain, Field_Simultaneous_Left, Field_Simultaneous_Right, Field_Tolerance, - Field_Parent, -- Iir_Kind_Generate_Statement_Body Field_Alternative_Label, Field_Has_Begin, @@ -3767,222 +3817,233 @@ package body Nodes_Meta is Field_Is_Within_Flag, Field_Has_Label, Field_End_Has_Identifier, + Field_Parent, Field_Declaration_Chain, Field_Generate_Block_Configuration, Field_Attribute_Value_Chain, Field_Concurrent_Statement_Chain, - Field_Parent, -- Iir_Kind_If_Generate_Else_Clause Field_Visible_Flag, + Field_Parent, Field_Condition, Field_Generate_Statement_Body, Field_Generate_Else_Clause, - Field_Parent, -- Iir_Kind_Simple_Signal_Assignment_Statement Field_Label, Field_Delay_Mechanism, Field_Visible_Flag, Field_Guarded_Target_State, + Field_Parent, Field_Target, Field_Chain, Field_Reject_Time_Expression, Field_Waveform_Chain, - Field_Parent, -- Iir_Kind_Conditional_Signal_Assignment_Statement Field_Label, Field_Delay_Mechanism, Field_Visible_Flag, Field_Guarded_Target_State, + Field_Parent, Field_Target, Field_Chain, Field_Reject_Time_Expression, Field_Conditional_Waveform_Chain, - Field_Parent, -- Iir_Kind_Null_Statement Field_Label, Field_Visible_Flag, - Field_Chain, Field_Parent, + Field_Chain, -- Iir_Kind_Assertion_Statement Field_Label, Field_Visible_Flag, + Field_Parent, Field_Assertion_Condition, Field_Chain, Field_Severity_Expression, Field_Report_Expression, - Field_Parent, -- Iir_Kind_Report_Statement Field_Label, Field_Visible_Flag, + Field_Parent, Field_Chain, Field_Severity_Expression, Field_Report_Expression, - Field_Parent, -- Iir_Kind_Wait_Statement Field_Label, Field_Visible_Flag, + Field_Parent, Field_Timeout_Clause, Field_Chain, Field_Condition_Clause, Field_Sensitivity_List, - Field_Parent, -- Iir_Kind_Variable_Assignment_Statement Field_Label, Field_Visible_Flag, + Field_Parent, Field_Target, Field_Chain, Field_Expression, - Field_Parent, -- Iir_Kind_Conditional_Variable_Assignment_Statement Field_Label, Field_Visible_Flag, + Field_Parent, Field_Target, Field_Chain, Field_Conditional_Expression, - Field_Parent, -- Iir_Kind_Return_Statement Field_Label, Field_Visible_Flag, - Field_Chain, - Field_Expression, Field_Parent, Field_Type, + Field_Chain, + Field_Expression, -- Iir_Kind_For_Loop_Statement Field_Label, Field_Suspend_Flag, Field_Visible_Flag, Field_Is_Within_Flag, Field_End_Has_Identifier, + Field_Parent, Field_Parameter_Specification, Field_Chain, Field_Sequential_Statement_Chain, - Field_Parent, -- Iir_Kind_While_Loop_Statement Field_Label, Field_Suspend_Flag, Field_Visible_Flag, Field_End_Has_Identifier, + Field_Parent, Field_Condition, Field_Chain, Field_Sequential_Statement_Chain, - Field_Parent, -- Iir_Kind_Next_Statement Field_Label, Field_Visible_Flag, + Field_Parent, Field_Condition, Field_Chain, Field_Loop_Label, - Field_Parent, -- Iir_Kind_Exit_Statement Field_Label, Field_Visible_Flag, + Field_Parent, Field_Condition, Field_Chain, Field_Loop_Label, - Field_Parent, -- Iir_Kind_Case_Statement Field_Label, Field_Suspend_Flag, Field_Visible_Flag, Field_End_Has_Identifier, + Field_Parent, Field_Case_Statement_Alternative_Chain, Field_Chain, Field_Expression, - Field_Parent, -- Iir_Kind_Procedure_Call_Statement Field_Label, Field_Suspend_Flag, Field_Visible_Flag, + Field_Parent, Field_Procedure_Call, Field_Chain, - Field_Parent, -- Iir_Kind_If_Statement Field_Label, Field_Suspend_Flag, Field_Visible_Flag, Field_End_Has_Identifier, + Field_Parent, Field_Condition, Field_Chain, Field_Else_Clause, Field_Sequential_Statement_Chain, - Field_Parent, -- Iir_Kind_Elsif Field_End_Has_Identifier, + Field_Parent, Field_Condition, Field_Else_Clause, Field_Sequential_Statement_Chain, - Field_Parent, -- Iir_Kind_Character_Literal Field_Identifier, + Field_Is_Forward_Ref, Field_Expr_Staticness, Field_Name_Staticness, - Field_Alias_Declaration, Field_Type, + Field_Alias_Declaration, Field_Named_Entity, Field_Base_Name, -- Iir_Kind_Simple_Name Field_Identifier, + Field_Is_Forward_Ref, Field_Expr_Staticness, Field_Name_Staticness, - Field_Alias_Declaration, Field_Type, + Field_Alias_Declaration, Field_Named_Entity, Field_Base_Name, -- Iir_Kind_Selected_Name Field_Identifier, + Field_Is_Forward_Ref, Field_Expr_Staticness, Field_Name_Staticness, Field_Prefix, - Field_Alias_Declaration, Field_Type, + Field_Alias_Declaration, Field_Named_Entity, Field_Base_Name, -- Iir_Kind_Operator_Symbol Field_Identifier, - Field_Alias_Declaration, + Field_Is_Forward_Ref, Field_Type, + Field_Alias_Declaration, Field_Named_Entity, Field_Base_Name, + -- Iir_Kind_Reference_Name + Field_Is_Forward_Ref, + Field_Named_Entity, + Field_Referenced_Name, -- Iir_Kind_Selected_By_All_Name + Field_Is_Forward_Ref, Field_Expr_Staticness, Field_Prefix, Field_Type, Field_Named_Entity, Field_Base_Name, -- Iir_Kind_Parenthesis_Name + Field_Is_Forward_Ref, Field_Prefix, - Field_Association_Chain, Field_Type, + Field_Association_Chain, Field_Named_Entity, -- Iir_Kind_External_Constant_Name Field_Shared_Flag, Field_Expr_Staticness, Field_Name_Staticness, + Field_Parent, + Field_Type, Field_Chain, Field_External_Pathname, Field_Subtype_Indication, - Field_Parent, - Field_Type, -- Iir_Kind_External_Signal_Name Field_Shared_Flag, Field_Expr_Staticness, Field_Name_Staticness, + Field_Parent, + Field_Type, Field_Chain, Field_External_Pathname, Field_Subtype_Indication, - Field_Parent, - Field_Type, -- Iir_Kind_External_Variable_Name Field_Shared_Flag, Field_Expr_Staticness, Field_Name_Staticness, + Field_Parent, + Field_Type, Field_Chain, Field_External_Pathname, Field_Subtype_Indication, - Field_Parent, - Field_Type, -- Iir_Kind_Package_Pathname Field_Identifier, + Field_Is_Forward_Ref, Field_Pathname_Suffix, Field_Named_Entity, -- Iir_Kind_Absolute_Pathname @@ -3991,9 +4052,10 @@ package body Nodes_Meta is Field_Pathname_Suffix, -- Iir_Kind_Pathname_Element Field_Identifier, + Field_Is_Forward_Ref, Field_Pathname_Suffix, - Field_Pathname_Expression, Field_Named_Entity, + Field_Pathname_Expression, -- Iir_Kind_Base_Attribute Field_Prefix, Field_Type, @@ -4031,57 +4093,57 @@ package body Nodes_Meta is Field_Expr_Staticness, Field_Name_Staticness, Field_Prefix, - Field_Parameter, Field_Type, + Field_Parameter, Field_Base_Name, -- Iir_Kind_Value_Attribute Field_Expr_Staticness, Field_Name_Staticness, Field_Prefix, - Field_Parameter, Field_Type, + Field_Parameter, Field_Base_Name, -- Iir_Kind_Pos_Attribute Field_Expr_Staticness, Field_Name_Staticness, Field_Prefix, - Field_Parameter, Field_Type, + Field_Parameter, Field_Base_Name, -- Iir_Kind_Val_Attribute Field_Expr_Staticness, Field_Name_Staticness, Field_Prefix, - Field_Parameter, Field_Type, + Field_Parameter, Field_Base_Name, -- Iir_Kind_Succ_Attribute Field_Expr_Staticness, Field_Name_Staticness, Field_Prefix, - Field_Parameter, Field_Type, + Field_Parameter, Field_Base_Name, -- Iir_Kind_Pred_Attribute Field_Expr_Staticness, Field_Name_Staticness, Field_Prefix, - Field_Parameter, Field_Type, + Field_Parameter, Field_Base_Name, -- Iir_Kind_Leftof_Attribute Field_Expr_Staticness, Field_Name_Staticness, Field_Prefix, - Field_Parameter, Field_Type, + Field_Parameter, Field_Base_Name, -- Iir_Kind_Rightof_Attribute Field_Expr_Staticness, Field_Name_Staticness, Field_Prefix, - Field_Parameter, Field_Type, + Field_Parameter, Field_Base_Name, -- Iir_Kind_Delayed_Attribute Field_Has_Active_Flag, @@ -4184,73 +4246,74 @@ package body Nodes_Meta is Field_Expr_Staticness, Field_Name_Staticness, Field_Prefix, - Field_Parameter, Field_Type, Field_Index_Subtype, + Field_Parameter, Field_Base_Name, -- Iir_Kind_Right_Array_Attribute Field_Expr_Staticness, Field_Name_Staticness, Field_Prefix, - Field_Parameter, Field_Type, Field_Index_Subtype, + Field_Parameter, Field_Base_Name, -- Iir_Kind_High_Array_Attribute Field_Expr_Staticness, Field_Name_Staticness, Field_Prefix, - Field_Parameter, Field_Type, Field_Index_Subtype, + Field_Parameter, Field_Base_Name, -- Iir_Kind_Low_Array_Attribute Field_Expr_Staticness, Field_Name_Staticness, Field_Prefix, - Field_Parameter, Field_Type, Field_Index_Subtype, + Field_Parameter, Field_Base_Name, -- Iir_Kind_Length_Array_Attribute Field_Expr_Staticness, Field_Name_Staticness, Field_Prefix, - Field_Parameter, Field_Type, Field_Index_Subtype, + Field_Parameter, Field_Base_Name, -- Iir_Kind_Ascending_Array_Attribute Field_Expr_Staticness, Field_Name_Staticness, Field_Prefix, - Field_Parameter, Field_Type, Field_Index_Subtype, + Field_Parameter, Field_Base_Name, -- Iir_Kind_Range_Array_Attribute Field_Expr_Staticness, Field_Name_Staticness, Field_Prefix, - Field_Parameter, Field_Type, Field_Index_Subtype, + Field_Parameter, Field_Base_Name, -- Iir_Kind_Reverse_Range_Array_Attribute Field_Expr_Staticness, Field_Name_Staticness, Field_Prefix, - Field_Parameter, Field_Type, Field_Index_Subtype, + Field_Parameter, Field_Base_Name, -- Iir_Kind_Attribute_Name Field_Identifier, + Field_Is_Forward_Ref, Field_Expr_Staticness, Field_Name_Staticness, Field_Prefix, - Field_Attribute_Signature, Field_Type, + Field_Attribute_Signature, Field_Named_Entity, Field_Base_Name ); @@ -4268,258 +4331,259 @@ package body Nodes_Meta is Iir_Kind_Floating_Point_Literal => 55, Iir_Kind_Null_Literal => 57, Iir_Kind_String_Literal8 => 67, - Iir_Kind_Physical_Int_Literal => 72, - Iir_Kind_Physical_Fp_Literal => 77, - Iir_Kind_Simple_Aggregate => 82, - Iir_Kind_Overflow_Literal => 85, - Iir_Kind_Waveform_Element => 88, - Iir_Kind_Conditional_Waveform => 91, - Iir_Kind_Conditional_Expression => 94, - Iir_Kind_Association_Element_By_Expression => 101, - Iir_Kind_Association_Element_By_Individual => 108, - Iir_Kind_Association_Element_Open => 113, - Iir_Kind_Association_Element_Package => 118, - Iir_Kind_Association_Element_Type => 124, - Iir_Kind_Association_Element_Subprogram => 129, - Iir_Kind_Choice_By_Others => 134, - Iir_Kind_Choice_By_Expression => 141, - Iir_Kind_Choice_By_Range => 148, - Iir_Kind_Choice_By_None => 153, - Iir_Kind_Choice_By_Name => 159, - Iir_Kind_Entity_Aspect_Entity => 161, - Iir_Kind_Entity_Aspect_Configuration => 162, - Iir_Kind_Entity_Aspect_Open => 162, - Iir_Kind_Block_Configuration => 168, - Iir_Kind_Block_Header => 172, - Iir_Kind_Component_Configuration => 178, - Iir_Kind_Binding_Indication => 184, - Iir_Kind_Entity_Class => 186, - Iir_Kind_Attribute_Value => 194, - Iir_Kind_Signature => 197, - Iir_Kind_Aggregate_Info => 204, - Iir_Kind_Procedure_Call => 208, - Iir_Kind_Record_Element_Constraint => 214, - Iir_Kind_Array_Element_Resolution => 215, - Iir_Kind_Record_Resolution => 216, - Iir_Kind_Record_Element_Resolution => 219, - Iir_Kind_Attribute_Specification => 227, - Iir_Kind_Disconnection_Specification => 232, - Iir_Kind_Configuration_Specification => 237, - Iir_Kind_Access_Type_Definition => 245, - Iir_Kind_Incomplete_Type_Definition => 253, - Iir_Kind_Interface_Type_Definition => 260, - Iir_Kind_File_Type_Definition => 267, - Iir_Kind_Protected_Type_Declaration => 276, - Iir_Kind_Record_Type_Definition => 286, - Iir_Kind_Array_Type_Definition => 298, - Iir_Kind_Array_Subtype_Definition => 313, - Iir_Kind_Record_Subtype_Definition => 324, - Iir_Kind_Access_Subtype_Definition => 332, - Iir_Kind_Physical_Subtype_Definition => 341, - Iir_Kind_Floating_Subtype_Definition => 351, - Iir_Kind_Integer_Subtype_Definition => 360, - Iir_Kind_Enumeration_Subtype_Definition => 369, - Iir_Kind_Enumeration_Type_Definition => 378, - Iir_Kind_Integer_Type_Definition => 384, - Iir_Kind_Floating_Type_Definition => 390, - Iir_Kind_Physical_Type_Definition => 399, - Iir_Kind_Range_Expression => 407, - Iir_Kind_Protected_Type_Body => 414, - Iir_Kind_Wildcard_Type_Definition => 419, - Iir_Kind_Subtype_Definition => 423, - Iir_Kind_Scalar_Nature_Definition => 427, - Iir_Kind_Overload_List => 428, - Iir_Kind_Type_Declaration => 435, - Iir_Kind_Anonymous_Type_Declaration => 441, - Iir_Kind_Subtype_Declaration => 448, - Iir_Kind_Nature_Declaration => 454, - Iir_Kind_Subnature_Declaration => 460, - Iir_Kind_Package_Declaration => 475, - Iir_Kind_Package_Instantiation_Declaration => 487, - Iir_Kind_Package_Body => 495, - Iir_Kind_Configuration_Declaration => 504, - Iir_Kind_Entity_Declaration => 516, - Iir_Kind_Architecture_Body => 528, - Iir_Kind_Context_Declaration => 534, - Iir_Kind_Package_Header => 536, - Iir_Kind_Unit_Declaration => 545, - Iir_Kind_Library_Declaration => 552, - Iir_Kind_Component_Declaration => 562, - Iir_Kind_Attribute_Declaration => 569, - Iir_Kind_Group_Template_Declaration => 575, - Iir_Kind_Group_Declaration => 582, - Iir_Kind_Element_Declaration => 588, - Iir_Kind_Non_Object_Alias_Declaration => 596, - Iir_Kind_Psl_Declaration => 604, - Iir_Kind_Psl_Endpoint_Declaration => 618, - Iir_Kind_Terminal_Declaration => 624, - Iir_Kind_Free_Quantity_Declaration => 633, - Iir_Kind_Across_Quantity_Declaration => 645, - Iir_Kind_Through_Quantity_Declaration => 657, - Iir_Kind_Enumeration_Literal => 668, - Iir_Kind_Function_Declaration => 693, - Iir_Kind_Procedure_Declaration => 717, - Iir_Kind_Function_Body => 727, - Iir_Kind_Procedure_Body => 738, - Iir_Kind_Object_Alias_Declaration => 749, - Iir_Kind_File_Declaration => 763, - Iir_Kind_Guard_Signal_Declaration => 776, - Iir_Kind_Signal_Declaration => 793, - Iir_Kind_Variable_Declaration => 806, - Iir_Kind_Constant_Declaration => 820, - Iir_Kind_Iterator_Declaration => 831, - Iir_Kind_Interface_Constant_Declaration => 847, - Iir_Kind_Interface_Variable_Declaration => 863, - Iir_Kind_Interface_Signal_Declaration => 884, - Iir_Kind_Interface_File_Declaration => 900, - Iir_Kind_Interface_Type_Declaration => 910, - Iir_Kind_Interface_Package_Declaration => 920, - Iir_Kind_Interface_Function_Declaration => 937, - Iir_Kind_Interface_Procedure_Declaration => 950, - Iir_Kind_Signal_Attribute_Declaration => 953, - Iir_Kind_Identity_Operator => 957, - Iir_Kind_Negation_Operator => 961, - Iir_Kind_Absolute_Operator => 965, - Iir_Kind_Not_Operator => 969, - Iir_Kind_Condition_Operator => 973, - Iir_Kind_Reduction_And_Operator => 977, - Iir_Kind_Reduction_Or_Operator => 981, - Iir_Kind_Reduction_Nand_Operator => 985, - Iir_Kind_Reduction_Nor_Operator => 989, - Iir_Kind_Reduction_Xor_Operator => 993, - Iir_Kind_Reduction_Xnor_Operator => 997, - Iir_Kind_And_Operator => 1002, - Iir_Kind_Or_Operator => 1007, - Iir_Kind_Nand_Operator => 1012, - Iir_Kind_Nor_Operator => 1017, - Iir_Kind_Xor_Operator => 1022, - Iir_Kind_Xnor_Operator => 1027, - Iir_Kind_Equality_Operator => 1032, - Iir_Kind_Inequality_Operator => 1037, - Iir_Kind_Less_Than_Operator => 1042, - Iir_Kind_Less_Than_Or_Equal_Operator => 1047, - Iir_Kind_Greater_Than_Operator => 1052, - Iir_Kind_Greater_Than_Or_Equal_Operator => 1057, - Iir_Kind_Match_Equality_Operator => 1062, - Iir_Kind_Match_Inequality_Operator => 1067, - Iir_Kind_Match_Less_Than_Operator => 1072, - Iir_Kind_Match_Less_Than_Or_Equal_Operator => 1077, - Iir_Kind_Match_Greater_Than_Operator => 1082, - Iir_Kind_Match_Greater_Than_Or_Equal_Operator => 1087, - Iir_Kind_Sll_Operator => 1092, - Iir_Kind_Sla_Operator => 1097, - Iir_Kind_Srl_Operator => 1102, - Iir_Kind_Sra_Operator => 1107, - Iir_Kind_Rol_Operator => 1112, - Iir_Kind_Ror_Operator => 1117, - Iir_Kind_Addition_Operator => 1122, - Iir_Kind_Substraction_Operator => 1127, - Iir_Kind_Concatenation_Operator => 1132, - Iir_Kind_Multiplication_Operator => 1137, - Iir_Kind_Division_Operator => 1142, - Iir_Kind_Modulus_Operator => 1147, - Iir_Kind_Remainder_Operator => 1152, - Iir_Kind_Exponentiation_Operator => 1157, - Iir_Kind_Function_Call => 1165, - Iir_Kind_Aggregate => 1171, - Iir_Kind_Parenthesis_Expression => 1174, - Iir_Kind_Qualified_Expression => 1178, - Iir_Kind_Type_Conversion => 1183, - Iir_Kind_Allocator_By_Expression => 1187, - Iir_Kind_Allocator_By_Subtype => 1192, - Iir_Kind_Selected_Element => 1198, - Iir_Kind_Dereference => 1203, - Iir_Kind_Implicit_Dereference => 1208, - Iir_Kind_Slice_Name => 1215, - Iir_Kind_Indexed_Name => 1221, - Iir_Kind_Psl_Expression => 1223, - Iir_Kind_Sensitized_Process_Statement => 1243, - Iir_Kind_Process_Statement => 1263, - Iir_Kind_Concurrent_Simple_Signal_Assignment => 1274, - Iir_Kind_Concurrent_Conditional_Signal_Assignment => 1285, - Iir_Kind_Concurrent_Selected_Signal_Assignment => 1297, - Iir_Kind_Concurrent_Assertion_Statement => 1305, - Iir_Kind_Concurrent_Procedure_Call_Statement => 1312, - Iir_Kind_Psl_Assert_Statement => 1325, - Iir_Kind_Psl_Cover_Statement => 1338, - Iir_Kind_Block_Statement => 1351, - Iir_Kind_If_Generate_Statement => 1361, - Iir_Kind_Case_Generate_Statement => 1370, - Iir_Kind_For_Generate_Statement => 1379, - Iir_Kind_Component_Instantiation_Statement => 1389, - Iir_Kind_Psl_Default_Clock => 1393, - Iir_Kind_Simple_Simultaneous_Statement => 1400, - Iir_Kind_Generate_Statement_Body => 1411, - Iir_Kind_If_Generate_Else_Clause => 1416, - Iir_Kind_Simple_Signal_Assignment_Statement => 1425, - Iir_Kind_Conditional_Signal_Assignment_Statement => 1434, - Iir_Kind_Null_Statement => 1438, - Iir_Kind_Assertion_Statement => 1445, - Iir_Kind_Report_Statement => 1451, - Iir_Kind_Wait_Statement => 1458, - Iir_Kind_Variable_Assignment_Statement => 1464, - Iir_Kind_Conditional_Variable_Assignment_Statement => 1470, - Iir_Kind_Return_Statement => 1476, - Iir_Kind_For_Loop_Statement => 1485, - Iir_Kind_While_Loop_Statement => 1493, - Iir_Kind_Next_Statement => 1499, - Iir_Kind_Exit_Statement => 1505, - Iir_Kind_Case_Statement => 1513, - Iir_Kind_Procedure_Call_Statement => 1519, - Iir_Kind_If_Statement => 1528, - Iir_Kind_Elsif => 1533, - Iir_Kind_Character_Literal => 1540, - Iir_Kind_Simple_Name => 1547, - Iir_Kind_Selected_Name => 1555, - Iir_Kind_Operator_Symbol => 1560, - Iir_Kind_Selected_By_All_Name => 1565, - Iir_Kind_Parenthesis_Name => 1569, - Iir_Kind_External_Constant_Name => 1577, - Iir_Kind_External_Signal_Name => 1585, - Iir_Kind_External_Variable_Name => 1593, - Iir_Kind_Package_Pathname => 1596, - Iir_Kind_Absolute_Pathname => 1597, - Iir_Kind_Relative_Pathname => 1598, - Iir_Kind_Pathname_Element => 1602, - Iir_Kind_Base_Attribute => 1604, - Iir_Kind_Left_Type_Attribute => 1609, - Iir_Kind_Right_Type_Attribute => 1614, - Iir_Kind_High_Type_Attribute => 1619, - Iir_Kind_Low_Type_Attribute => 1624, - Iir_Kind_Ascending_Type_Attribute => 1629, - Iir_Kind_Image_Attribute => 1635, - Iir_Kind_Value_Attribute => 1641, - Iir_Kind_Pos_Attribute => 1647, - Iir_Kind_Val_Attribute => 1653, - Iir_Kind_Succ_Attribute => 1659, - Iir_Kind_Pred_Attribute => 1665, - Iir_Kind_Leftof_Attribute => 1671, - Iir_Kind_Rightof_Attribute => 1677, - Iir_Kind_Delayed_Attribute => 1686, - Iir_Kind_Stable_Attribute => 1695, - Iir_Kind_Quiet_Attribute => 1704, - Iir_Kind_Transaction_Attribute => 1713, - Iir_Kind_Event_Attribute => 1717, - Iir_Kind_Active_Attribute => 1721, - Iir_Kind_Last_Event_Attribute => 1725, - Iir_Kind_Last_Active_Attribute => 1729, - Iir_Kind_Last_Value_Attribute => 1733, - Iir_Kind_Driving_Attribute => 1737, - Iir_Kind_Driving_Value_Attribute => 1741, - Iir_Kind_Behavior_Attribute => 1741, - Iir_Kind_Structure_Attribute => 1741, - Iir_Kind_Simple_Name_Attribute => 1748, - Iir_Kind_Instance_Name_Attribute => 1753, - Iir_Kind_Path_Name_Attribute => 1758, - Iir_Kind_Left_Array_Attribute => 1765, - Iir_Kind_Right_Array_Attribute => 1772, - Iir_Kind_High_Array_Attribute => 1779, - Iir_Kind_Low_Array_Attribute => 1786, - Iir_Kind_Length_Array_Attribute => 1793, - Iir_Kind_Ascending_Array_Attribute => 1800, - Iir_Kind_Range_Array_Attribute => 1807, - Iir_Kind_Reverse_Range_Array_Attribute => 1814, - Iir_Kind_Attribute_Name => 1822 + Iir_Kind_Physical_Int_Literal => 73, + Iir_Kind_Physical_Fp_Literal => 79, + Iir_Kind_Simple_Aggregate => 84, + Iir_Kind_Overflow_Literal => 87, + Iir_Kind_Waveform_Element => 90, + Iir_Kind_Conditional_Waveform => 93, + Iir_Kind_Conditional_Expression => 96, + Iir_Kind_Association_Element_By_Expression => 103, + Iir_Kind_Association_Element_By_Individual => 111, + Iir_Kind_Association_Element_Open => 116, + Iir_Kind_Association_Element_Package => 121, + Iir_Kind_Association_Element_Type => 127, + Iir_Kind_Association_Element_Subprogram => 132, + Iir_Kind_Choice_By_Others => 137, + Iir_Kind_Choice_By_Expression => 144, + Iir_Kind_Choice_By_Range => 151, + Iir_Kind_Choice_By_None => 156, + Iir_Kind_Choice_By_Name => 162, + Iir_Kind_Entity_Aspect_Entity => 164, + Iir_Kind_Entity_Aspect_Configuration => 165, + Iir_Kind_Entity_Aspect_Open => 165, + Iir_Kind_Block_Configuration => 171, + Iir_Kind_Block_Header => 175, + Iir_Kind_Component_Configuration => 181, + Iir_Kind_Binding_Indication => 187, + Iir_Kind_Entity_Class => 189, + Iir_Kind_Attribute_Value => 197, + Iir_Kind_Signature => 200, + Iir_Kind_Aggregate_Info => 207, + Iir_Kind_Procedure_Call => 211, + Iir_Kind_Record_Element_Constraint => 217, + Iir_Kind_Array_Element_Resolution => 219, + Iir_Kind_Record_Resolution => 220, + Iir_Kind_Record_Element_Resolution => 223, + Iir_Kind_Attribute_Specification => 231, + Iir_Kind_Disconnection_Specification => 236, + Iir_Kind_Configuration_Specification => 241, + Iir_Kind_Access_Type_Definition => 249, + Iir_Kind_Incomplete_Type_Definition => 257, + Iir_Kind_Interface_Type_Definition => 264, + Iir_Kind_File_Type_Definition => 271, + Iir_Kind_Protected_Type_Declaration => 280, + Iir_Kind_Record_Type_Definition => 290, + Iir_Kind_Array_Type_Definition => 302, + Iir_Kind_Array_Subtype_Definition => 317, + Iir_Kind_Record_Subtype_Definition => 328, + Iir_Kind_Access_Subtype_Definition => 336, + Iir_Kind_Physical_Subtype_Definition => 346, + Iir_Kind_Floating_Subtype_Definition => 357, + Iir_Kind_Integer_Subtype_Definition => 367, + Iir_Kind_Enumeration_Subtype_Definition => 377, + Iir_Kind_Enumeration_Type_Definition => 387, + Iir_Kind_Integer_Type_Definition => 393, + Iir_Kind_Floating_Type_Definition => 399, + Iir_Kind_Physical_Type_Definition => 408, + Iir_Kind_Range_Expression => 416, + Iir_Kind_Protected_Type_Body => 423, + Iir_Kind_Wildcard_Type_Definition => 428, + Iir_Kind_Subtype_Definition => 433, + Iir_Kind_Scalar_Nature_Definition => 437, + Iir_Kind_Overload_List => 438, + Iir_Kind_Type_Declaration => 445, + Iir_Kind_Anonymous_Type_Declaration => 451, + Iir_Kind_Subtype_Declaration => 458, + Iir_Kind_Nature_Declaration => 464, + Iir_Kind_Subnature_Declaration => 470, + Iir_Kind_Package_Declaration => 485, + Iir_Kind_Package_Instantiation_Declaration => 498, + Iir_Kind_Package_Body => 506, + Iir_Kind_Configuration_Declaration => 515, + Iir_Kind_Entity_Declaration => 527, + Iir_Kind_Architecture_Body => 539, + Iir_Kind_Context_Declaration => 545, + Iir_Kind_Package_Header => 547, + Iir_Kind_Unit_Declaration => 556, + Iir_Kind_Library_Declaration => 563, + Iir_Kind_Component_Declaration => 573, + Iir_Kind_Attribute_Declaration => 580, + Iir_Kind_Group_Template_Declaration => 586, + Iir_Kind_Group_Declaration => 593, + Iir_Kind_Element_Declaration => 600, + Iir_Kind_Non_Object_Alias_Declaration => 608, + Iir_Kind_Psl_Declaration => 616, + Iir_Kind_Psl_Endpoint_Declaration => 630, + Iir_Kind_Terminal_Declaration => 636, + Iir_Kind_Free_Quantity_Declaration => 645, + Iir_Kind_Across_Quantity_Declaration => 657, + Iir_Kind_Through_Quantity_Declaration => 669, + Iir_Kind_Enumeration_Literal => 680, + Iir_Kind_Function_Declaration => 705, + Iir_Kind_Procedure_Declaration => 729, + Iir_Kind_Function_Body => 739, + Iir_Kind_Procedure_Body => 750, + Iir_Kind_Object_Alias_Declaration => 761, + Iir_Kind_File_Declaration => 775, + Iir_Kind_Guard_Signal_Declaration => 788, + Iir_Kind_Signal_Declaration => 805, + Iir_Kind_Variable_Declaration => 818, + Iir_Kind_Constant_Declaration => 832, + Iir_Kind_Iterator_Declaration => 843, + Iir_Kind_Interface_Constant_Declaration => 859, + Iir_Kind_Interface_Variable_Declaration => 875, + Iir_Kind_Interface_Signal_Declaration => 896, + Iir_Kind_Interface_File_Declaration => 912, + Iir_Kind_Interface_Type_Declaration => 922, + Iir_Kind_Interface_Package_Declaration => 933, + Iir_Kind_Interface_Function_Declaration => 950, + Iir_Kind_Interface_Procedure_Declaration => 963, + Iir_Kind_Signal_Attribute_Declaration => 966, + Iir_Kind_Identity_Operator => 970, + Iir_Kind_Negation_Operator => 974, + Iir_Kind_Absolute_Operator => 978, + Iir_Kind_Not_Operator => 982, + Iir_Kind_Condition_Operator => 986, + Iir_Kind_Reduction_And_Operator => 990, + Iir_Kind_Reduction_Or_Operator => 994, + Iir_Kind_Reduction_Nand_Operator => 998, + Iir_Kind_Reduction_Nor_Operator => 1002, + Iir_Kind_Reduction_Xor_Operator => 1006, + Iir_Kind_Reduction_Xnor_Operator => 1010, + Iir_Kind_And_Operator => 1015, + Iir_Kind_Or_Operator => 1020, + Iir_Kind_Nand_Operator => 1025, + Iir_Kind_Nor_Operator => 1030, + Iir_Kind_Xor_Operator => 1035, + Iir_Kind_Xnor_Operator => 1040, + Iir_Kind_Equality_Operator => 1045, + Iir_Kind_Inequality_Operator => 1050, + Iir_Kind_Less_Than_Operator => 1055, + Iir_Kind_Less_Than_Or_Equal_Operator => 1060, + Iir_Kind_Greater_Than_Operator => 1065, + Iir_Kind_Greater_Than_Or_Equal_Operator => 1070, + Iir_Kind_Match_Equality_Operator => 1075, + Iir_Kind_Match_Inequality_Operator => 1080, + Iir_Kind_Match_Less_Than_Operator => 1085, + Iir_Kind_Match_Less_Than_Or_Equal_Operator => 1090, + Iir_Kind_Match_Greater_Than_Operator => 1095, + Iir_Kind_Match_Greater_Than_Or_Equal_Operator => 1100, + Iir_Kind_Sll_Operator => 1105, + Iir_Kind_Sla_Operator => 1110, + Iir_Kind_Srl_Operator => 1115, + Iir_Kind_Sra_Operator => 1120, + Iir_Kind_Rol_Operator => 1125, + Iir_Kind_Ror_Operator => 1130, + Iir_Kind_Addition_Operator => 1135, + Iir_Kind_Substraction_Operator => 1140, + Iir_Kind_Concatenation_Operator => 1145, + Iir_Kind_Multiplication_Operator => 1150, + Iir_Kind_Division_Operator => 1155, + Iir_Kind_Modulus_Operator => 1160, + Iir_Kind_Remainder_Operator => 1165, + Iir_Kind_Exponentiation_Operator => 1170, + Iir_Kind_Function_Call => 1178, + Iir_Kind_Aggregate => 1184, + Iir_Kind_Parenthesis_Expression => 1187, + Iir_Kind_Qualified_Expression => 1191, + Iir_Kind_Type_Conversion => 1196, + Iir_Kind_Allocator_By_Expression => 1200, + Iir_Kind_Allocator_By_Subtype => 1205, + Iir_Kind_Selected_Element => 1211, + Iir_Kind_Dereference => 1216, + Iir_Kind_Implicit_Dereference => 1221, + Iir_Kind_Slice_Name => 1228, + Iir_Kind_Indexed_Name => 1234, + Iir_Kind_Psl_Expression => 1236, + Iir_Kind_Sensitized_Process_Statement => 1256, + Iir_Kind_Process_Statement => 1276, + Iir_Kind_Concurrent_Simple_Signal_Assignment => 1287, + Iir_Kind_Concurrent_Conditional_Signal_Assignment => 1298, + Iir_Kind_Concurrent_Selected_Signal_Assignment => 1310, + Iir_Kind_Concurrent_Assertion_Statement => 1318, + Iir_Kind_Concurrent_Procedure_Call_Statement => 1325, + Iir_Kind_Psl_Assert_Statement => 1338, + Iir_Kind_Psl_Cover_Statement => 1351, + Iir_Kind_Block_Statement => 1364, + Iir_Kind_If_Generate_Statement => 1374, + Iir_Kind_Case_Generate_Statement => 1383, + Iir_Kind_For_Generate_Statement => 1392, + Iir_Kind_Component_Instantiation_Statement => 1402, + Iir_Kind_Psl_Default_Clock => 1406, + Iir_Kind_Simple_Simultaneous_Statement => 1413, + Iir_Kind_Generate_Statement_Body => 1424, + Iir_Kind_If_Generate_Else_Clause => 1429, + Iir_Kind_Simple_Signal_Assignment_Statement => 1438, + Iir_Kind_Conditional_Signal_Assignment_Statement => 1447, + Iir_Kind_Null_Statement => 1451, + Iir_Kind_Assertion_Statement => 1458, + Iir_Kind_Report_Statement => 1464, + Iir_Kind_Wait_Statement => 1471, + Iir_Kind_Variable_Assignment_Statement => 1477, + Iir_Kind_Conditional_Variable_Assignment_Statement => 1483, + Iir_Kind_Return_Statement => 1489, + Iir_Kind_For_Loop_Statement => 1498, + Iir_Kind_While_Loop_Statement => 1506, + Iir_Kind_Next_Statement => 1512, + Iir_Kind_Exit_Statement => 1518, + Iir_Kind_Case_Statement => 1526, + Iir_Kind_Procedure_Call_Statement => 1532, + Iir_Kind_If_Statement => 1541, + Iir_Kind_Elsif => 1546, + Iir_Kind_Character_Literal => 1554, + Iir_Kind_Simple_Name => 1562, + Iir_Kind_Selected_Name => 1571, + Iir_Kind_Operator_Symbol => 1577, + Iir_Kind_Reference_Name => 1580, + Iir_Kind_Selected_By_All_Name => 1586, + Iir_Kind_Parenthesis_Name => 1591, + Iir_Kind_External_Constant_Name => 1599, + Iir_Kind_External_Signal_Name => 1607, + Iir_Kind_External_Variable_Name => 1615, + Iir_Kind_Package_Pathname => 1619, + Iir_Kind_Absolute_Pathname => 1620, + Iir_Kind_Relative_Pathname => 1621, + Iir_Kind_Pathname_Element => 1626, + Iir_Kind_Base_Attribute => 1628, + Iir_Kind_Left_Type_Attribute => 1633, + Iir_Kind_Right_Type_Attribute => 1638, + Iir_Kind_High_Type_Attribute => 1643, + Iir_Kind_Low_Type_Attribute => 1648, + Iir_Kind_Ascending_Type_Attribute => 1653, + Iir_Kind_Image_Attribute => 1659, + Iir_Kind_Value_Attribute => 1665, + Iir_Kind_Pos_Attribute => 1671, + Iir_Kind_Val_Attribute => 1677, + Iir_Kind_Succ_Attribute => 1683, + Iir_Kind_Pred_Attribute => 1689, + Iir_Kind_Leftof_Attribute => 1695, + Iir_Kind_Rightof_Attribute => 1701, + Iir_Kind_Delayed_Attribute => 1710, + Iir_Kind_Stable_Attribute => 1719, + Iir_Kind_Quiet_Attribute => 1728, + Iir_Kind_Transaction_Attribute => 1737, + Iir_Kind_Event_Attribute => 1741, + Iir_Kind_Active_Attribute => 1745, + Iir_Kind_Last_Event_Attribute => 1749, + Iir_Kind_Last_Active_Attribute => 1753, + Iir_Kind_Last_Value_Attribute => 1757, + Iir_Kind_Driving_Attribute => 1761, + Iir_Kind_Driving_Value_Attribute => 1765, + Iir_Kind_Behavior_Attribute => 1765, + Iir_Kind_Structure_Attribute => 1765, + Iir_Kind_Simple_Name_Attribute => 1772, + Iir_Kind_Instance_Name_Attribute => 1777, + Iir_Kind_Path_Name_Attribute => 1782, + Iir_Kind_Left_Array_Attribute => 1789, + Iir_Kind_Right_Array_Attribute => 1796, + Iir_Kind_High_Array_Attribute => 1803, + Iir_Kind_Low_Array_Attribute => 1810, + Iir_Kind_Length_Array_Attribute => 1817, + Iir_Kind_Ascending_Array_Attribute => 1824, + Iir_Kind_Range_Array_Attribute => 1831, + Iir_Kind_Reverse_Range_Array_Attribute => 1838, + Iir_Kind_Attribute_Name => 1847 ); function Get_Fields (K : Iir_Kind) return Fields_Array @@ -4675,6 +4739,8 @@ package body Nodes_Meta is return Get_Suspend_Flag (N); when Field_Is_Ref => return Get_Is_Ref (N); + when Field_Is_Forward_Ref => + return Get_Is_Forward_Ref (N); when Field_PSL_EOS_Flag => return Get_PSL_EOS_Flag (N); when others => @@ -4797,6 +4863,8 @@ package body Nodes_Meta is Set_Suspend_Flag (N, V); when Field_Is_Ref => Set_Is_Ref (N, V); + when Field_Is_Forward_Ref => + Set_Is_Forward_Ref (N, V); when Field_PSL_EOS_Flag => Set_PSL_EOS_Flag (N, V); when others => @@ -4955,6 +5023,8 @@ package body Nodes_Meta is return Get_Attribute_Value_Chain (N); when Field_Spec_Chain => return Get_Spec_Chain (N); + when Field_Value_Chain => + return Get_Value_Chain (N); when Field_Attribute_Value_Spec_Chain => return Get_Attribute_Value_Spec_Chain (N); when Field_Entity_Name => @@ -5019,6 +5089,8 @@ package body Nodes_Meta is return Get_File_Logical_Name (N); when Field_File_Open_Kind => return Get_File_Open_Kind (N); + when Field_Base_Element_Declaration => + return Get_Base_Element_Declaration (N); when Field_Element_Declaration => return Get_Element_Declaration (N); when Field_Selected_Element => @@ -5149,6 +5221,8 @@ package body Nodes_Meta is return Get_Block_Header (N); when Field_Uninstantiated_Package_Name => return Get_Uninstantiated_Package_Name (N); + when Field_Uninstantiated_Package_Decl => + return Get_Uninstantiated_Package_Decl (N); when Field_Generate_Block_Configuration => return Get_Generate_Block_Configuration (N); when Field_Generate_Statement_Body => @@ -5181,6 +5255,8 @@ package body Nodes_Meta is return Get_Named_Entity (N); when Field_Alias_Declaration => return Get_Alias_Declaration (N); + when Field_Referenced_Name => + return Get_Referenced_Name (N); when Field_Error_Origin => return Get_Error_Origin (N); when Field_Operand => @@ -5189,6 +5265,8 @@ package body Nodes_Meta is return Get_Left (N); when Field_Right => return Get_Right (N); + when Field_Physical_Unit => + return Get_Physical_Unit (N); when Field_Unit_Name => return Get_Unit_Name (N); when Field_Name => @@ -5219,6 +5297,8 @@ package body Nodes_Meta is return Get_Signal_Attribute_Declaration (N); when Field_Actual_Type => return Get_Actual_Type (N); + when Field_Actual_Type_Definition => + return Get_Actual_Type_Definition (N); when Field_Association_Chain => return Get_Association_Chain (N); when Field_Individual_Association_Chain => @@ -5349,6 +5429,8 @@ package body Nodes_Meta is Set_Attribute_Value_Chain (N, V); when Field_Spec_Chain => Set_Spec_Chain (N, V); + when Field_Value_Chain => + Set_Value_Chain (N, V); when Field_Attribute_Value_Spec_Chain => Set_Attribute_Value_Spec_Chain (N, V); when Field_Entity_Name => @@ -5413,6 +5495,8 @@ package body Nodes_Meta is Set_File_Logical_Name (N, V); when Field_File_Open_Kind => Set_File_Open_Kind (N, V); + when Field_Base_Element_Declaration => + Set_Base_Element_Declaration (N, V); when Field_Element_Declaration => Set_Element_Declaration (N, V); when Field_Selected_Element => @@ -5543,6 +5627,8 @@ package body Nodes_Meta is Set_Block_Header (N, V); when Field_Uninstantiated_Package_Name => Set_Uninstantiated_Package_Name (N, V); + when Field_Uninstantiated_Package_Decl => + Set_Uninstantiated_Package_Decl (N, V); when Field_Generate_Block_Configuration => Set_Generate_Block_Configuration (N, V); when Field_Generate_Statement_Body => @@ -5575,6 +5661,8 @@ package body Nodes_Meta is Set_Named_Entity (N, V); when Field_Alias_Declaration => Set_Alias_Declaration (N, V); + when Field_Referenced_Name => + Set_Referenced_Name (N, V); when Field_Error_Origin => Set_Error_Origin (N, V); when Field_Operand => @@ -5583,6 +5671,8 @@ package body Nodes_Meta is Set_Left (N, V); when Field_Right => Set_Right (N, V); + when Field_Physical_Unit => + Set_Physical_Unit (N, V); when Field_Unit_Name => Set_Unit_Name (N, V); when Field_Name => @@ -5613,6 +5703,8 @@ package body Nodes_Meta is Set_Signal_Attribute_Declaration (N, V); when Field_Actual_Type => Set_Actual_Type (N, V); + when Field_Actual_Type_Definition => + Set_Actual_Type_Definition (N, V); when Field_Association_Chain => Set_Association_Chain (N, V); when Field_Individual_Association_Chain => @@ -6922,6 +7014,11 @@ package body Nodes_Meta is return K = Iir_Kind_Attribute_Value; end Has_Spec_Chain; + function Has_Value_Chain (K : Iir_Kind) return Boolean is + begin + return K = Iir_Kind_Attribute_Value; + end Has_Value_Chain; + function Has_Attribute_Value_Spec_Chain (K : Iir_Kind) return Boolean is begin return K = Iir_Kind_Attribute_Specification; @@ -7025,7 +7122,6 @@ package body Nodes_Meta is | Iir_Kind_Block_Configuration | Iir_Kind_Component_Configuration | Iir_Kind_Entity_Class - | Iir_Kind_Attribute_Value | Iir_Kind_Record_Element_Resolution | Iir_Kind_Attribute_Specification | Iir_Kind_Disconnection_Specification @@ -7690,6 +7786,11 @@ package body Nodes_Meta is end case; end Has_Element_Position; + function Has_Base_Element_Declaration (K : Iir_Kind) return Boolean is + begin + return K = Iir_Kind_Element_Declaration; + end Has_Base_Element_Declaration; + function Has_Element_Declaration (K : Iir_Kind) return Boolean is begin return K = Iir_Kind_Record_Element_Constraint; @@ -8231,7 +8332,13 @@ package body Nodes_Meta is function Has_Element_Subtype_Indication (K : Iir_Kind) return Boolean is begin - return K = Iir_Kind_Array_Type_Definition; + case K is + when Iir_Kind_Array_Element_Resolution + | Iir_Kind_Array_Type_Definition => + return True; + when others => + return False; + end case; end Has_Element_Subtype_Indication; function Has_Element_Subtype (K : Iir_Kind) return Boolean is @@ -8867,6 +8974,17 @@ package body Nodes_Meta is end case; end Has_Uninstantiated_Package_Name; + function Has_Uninstantiated_Package_Decl (K : Iir_Kind) return Boolean is + begin + case K is + when Iir_Kind_Package_Instantiation_Declaration + | Iir_Kind_Interface_Package_Declaration => + return True; + when others => + return False; + end case; + end Has_Uninstantiated_Package_Decl; + function Has_Generate_Block_Configuration (K : Iir_Kind) return Boolean is begin return K = Iir_Kind_Generate_Statement_Body; @@ -9122,6 +9240,7 @@ package body Nodes_Meta is | Iir_Kind_Simple_Name | Iir_Kind_Selected_Name | Iir_Kind_Operator_Symbol + | Iir_Kind_Reference_Name | Iir_Kind_Selected_By_All_Name | Iir_Kind_Parenthesis_Name | Iir_Kind_Package_Pathname @@ -9146,6 +9265,11 @@ package body Nodes_Meta is end case; end Has_Alias_Declaration; + function Has_Referenced_Name (K : Iir_Kind) return Boolean is + begin + return K = Iir_Kind_Reference_Name; + end Has_Referenced_Name; + function Has_Expr_Staticness (K : Iir_Kind) return Boolean is begin case K is @@ -9388,6 +9512,17 @@ package body Nodes_Meta is end case; end Has_Right; + function Has_Physical_Unit (K : Iir_Kind) return Boolean is + begin + case K is + when Iir_Kind_Physical_Int_Literal + | Iir_Kind_Physical_Fp_Literal => + return True; + when others => + return False; + end case; + end Has_Physical_Unit; + function Has_Unit_Name (K : Iir_Kind) return Boolean is begin case K is @@ -9669,6 +9804,11 @@ package body Nodes_Meta is return K = Iir_Kind_Association_Element_By_Individual; end Has_Actual_Type; + function Has_Actual_Type_Definition (K : Iir_Kind) return Boolean is + begin + return K = Iir_Kind_Association_Element_By_Individual; + end Has_Actual_Type_Definition; + function Has_Association_Chain (K : Iir_Kind) return Boolean is begin return K = Iir_Kind_Parenthesis_Name; @@ -10258,7 +10398,13 @@ package body Nodes_Meta is function Has_Is_Ref (K : Iir_Kind) return Boolean is begin case K is - when Iir_Kind_Signal_Declaration + when Iir_Kind_Physical_Subtype_Definition + | Iir_Kind_Floating_Subtype_Definition + | Iir_Kind_Integer_Subtype_Definition + | Iir_Kind_Enumeration_Subtype_Definition + | Iir_Kind_Enumeration_Type_Definition + | Iir_Kind_Subtype_Definition + | Iir_Kind_Signal_Declaration | Iir_Kind_Variable_Declaration | Iir_Kind_Constant_Declaration | Iir_Kind_Interface_Constant_Declaration @@ -10272,6 +10418,25 @@ package body Nodes_Meta is end case; end Has_Is_Ref; + function Has_Is_Forward_Ref (K : Iir_Kind) return Boolean is + begin + case K is + when Iir_Kind_Character_Literal + | Iir_Kind_Simple_Name + | Iir_Kind_Selected_Name + | Iir_Kind_Operator_Symbol + | Iir_Kind_Reference_Name + | Iir_Kind_Selected_By_All_Name + | Iir_Kind_Parenthesis_Name + | Iir_Kind_Package_Pathname + | Iir_Kind_Pathname_Element + | Iir_Kind_Attribute_Name => + return True; + when others => + return False; + end case; + end Has_Is_Forward_Ref; + function Has_Psl_Property (K : Iir_Kind) return Boolean is begin return K = Iir_Kind_Psl_Assert_Statement; diff --git a/src/vhdl/nodes_meta.ads b/src/vhdl/nodes_meta.ads index 49ae2c698..0904c0c63 100644 --- a/src/vhdl/nodes_meta.ads +++ b/src/vhdl/nodes_meta.ads @@ -129,6 +129,7 @@ package Nodes_Meta is Field_Configuration_Item_Chain, Field_Attribute_Value_Chain, Field_Spec_Chain, + Field_Value_Chain, Field_Attribute_Value_Spec_Chain, Field_Entity_Name, Field_Package, @@ -175,6 +176,7 @@ package Nodes_Meta is Field_File_Logical_Name, Field_File_Open_Kind, Field_Element_Position, + Field_Base_Element_Declaration, Field_Element_Declaration, Field_Selected_Element, Field_Use_Clause_Chain, @@ -276,6 +278,7 @@ package Nodes_Meta is Field_Package_Header, Field_Block_Header, Field_Uninstantiated_Package_Name, + Field_Uninstantiated_Package_Decl, Field_Generate_Block_Configuration, Field_Generate_Statement_Body, Field_Alternative_Label, @@ -294,11 +297,13 @@ package Nodes_Meta is Field_Binding_Indication, Field_Named_Entity, Field_Alias_Declaration, + Field_Referenced_Name, Field_Expr_Staticness, Field_Error_Origin, Field_Operand, Field_Left, Field_Right, + Field_Physical_Unit, Field_Unit_Name, Field_Name, Field_Group_Template_Name, @@ -315,6 +320,7 @@ package Nodes_Meta is Field_Attr_Chain, Field_Signal_Attribute_Declaration, Field_Actual_Type, + Field_Actual_Type_Definition, Field_Association_Chain, Field_Individual_Association_Chain, Field_Subprogram_Association_Chain, @@ -368,6 +374,7 @@ package Nodes_Meta is Field_Has_Class, Field_Suspend_Flag, Field_Is_Ref, + Field_Is_Forward_Ref, Field_Psl_Property, Field_Psl_Sequence, Field_Psl_Declaration, @@ -394,7 +401,8 @@ package Nodes_Meta is type Field_Attribute is ( Attr_None, - Attr_Ref, Attr_Maybe_Ref, Attr_Of_Ref, Attr_Forward_Ref, + Attr_Ref, Attr_Maybe_Ref, Attr_Of_Ref, + Attr_Forward_Ref, Attr_Maybe_Forward_Ref, Attr_Chain, Attr_Chain_Next ); @@ -630,6 +638,7 @@ package Nodes_Meta is function Has_Configuration_Item_Chain (K : Iir_Kind) return Boolean; function Has_Attribute_Value_Chain (K : Iir_Kind) return Boolean; function Has_Spec_Chain (K : Iir_Kind) return Boolean; + function Has_Value_Chain (K : Iir_Kind) return Boolean; function Has_Attribute_Value_Spec_Chain (K : Iir_Kind) return Boolean; function Has_Entity_Name (K : Iir_Kind) return Boolean; function Has_Package (K : Iir_Kind) return Boolean; @@ -677,6 +686,7 @@ package Nodes_Meta is function Has_File_Logical_Name (K : Iir_Kind) return Boolean; function Has_File_Open_Kind (K : Iir_Kind) return Boolean; function Has_Element_Position (K : Iir_Kind) return Boolean; + function Has_Base_Element_Declaration (K : Iir_Kind) return Boolean; function Has_Element_Declaration (K : Iir_Kind) return Boolean; function Has_Selected_Element (K : Iir_Kind) return Boolean; function Has_Use_Clause_Chain (K : Iir_Kind) return Boolean; @@ -782,6 +792,7 @@ package Nodes_Meta is function Has_Package_Header (K : Iir_Kind) return Boolean; function Has_Block_Header (K : Iir_Kind) return Boolean; function Has_Uninstantiated_Package_Name (K : Iir_Kind) return Boolean; + function Has_Uninstantiated_Package_Decl (K : Iir_Kind) return Boolean; function Has_Generate_Block_Configuration (K : Iir_Kind) return Boolean; function Has_Generate_Statement_Body (K : Iir_Kind) return Boolean; function Has_Alternative_Label (K : Iir_Kind) return Boolean; @@ -802,11 +813,13 @@ package Nodes_Meta is function Has_Binding_Indication (K : Iir_Kind) return Boolean; function Has_Named_Entity (K : Iir_Kind) return Boolean; function Has_Alias_Declaration (K : Iir_Kind) return Boolean; + function Has_Referenced_Name (K : Iir_Kind) return Boolean; function Has_Expr_Staticness (K : Iir_Kind) return Boolean; function Has_Error_Origin (K : Iir_Kind) return Boolean; function Has_Operand (K : Iir_Kind) return Boolean; function Has_Left (K : Iir_Kind) return Boolean; function Has_Right (K : Iir_Kind) return Boolean; + function Has_Physical_Unit (K : Iir_Kind) return Boolean; function Has_Unit_Name (K : Iir_Kind) return Boolean; function Has_Name (K : Iir_Kind) return Boolean; function Has_Group_Template_Name (K : Iir_Kind) return Boolean; @@ -823,6 +836,7 @@ package Nodes_Meta is function Has_Attr_Chain (K : Iir_Kind) return Boolean; function Has_Signal_Attribute_Declaration (K : Iir_Kind) return Boolean; function Has_Actual_Type (K : Iir_Kind) return Boolean; + function Has_Actual_Type_Definition (K : Iir_Kind) return Boolean; function Has_Association_Chain (K : Iir_Kind) return Boolean; function Has_Individual_Association_Chain (K : Iir_Kind) return Boolean; function Has_Subprogram_Association_Chain (K : Iir_Kind) return Boolean; @@ -877,6 +891,7 @@ package Nodes_Meta is function Has_Has_Class (K : Iir_Kind) return Boolean; function Has_Suspend_Flag (K : Iir_Kind) return Boolean; function Has_Is_Ref (K : Iir_Kind) return Boolean; + function Has_Is_Forward_Ref (K : Iir_Kind) return Boolean; function Has_Psl_Property (K : Iir_Kind) return Boolean; function Has_Psl_Sequence (K : Iir_Kind) return Boolean; function Has_Psl_Declaration (K : Iir_Kind) return Boolean; diff --git a/src/vhdl/nodes_meta.ads.in b/src/vhdl/nodes_meta.ads.in index 8eeaef321..fe54242b1 100644 --- a/src/vhdl/nodes_meta.ads.in +++ b/src/vhdl/nodes_meta.ads.in @@ -47,7 +47,8 @@ package Nodes_Meta is type Field_Attribute is ( Attr_None, - Attr_Ref, Attr_Maybe_Ref, Attr_Of_Ref, Attr_Forward_Ref, + Attr_Ref, Attr_Maybe_Ref, Attr_Of_Ref, + Attr_Forward_Ref, Attr_Maybe_Forward_Ref, Attr_Chain, Attr_Chain_Next ); diff --git a/src/vhdl/parse.adb b/src/vhdl/parse.adb index ee377792b..72ae0ea0f 100644 --- a/src/vhdl/parse.adb +++ b/src/vhdl/parse.adb @@ -756,7 +756,10 @@ package body Parse is Set_Location (Res); if Get_Kind (Prefix) = Iir_Kind_Signature then Set_Attribute_Signature (Res, Prefix); + + -- Transfer the prefix from the signature to the attribute. Set_Prefix (Res, Get_Signature_Prefix (Prefix)); + Set_Signature_Prefix (Prefix, Null_Iir); else Set_Prefix (Res, Prefix); end if; diff --git a/src/vhdl/post_sems.adb b/src/vhdl/post_sems.adb index 145d50a14..2a45879c0 100644 --- a/src/vhdl/post_sems.adb +++ b/src/vhdl/post_sems.adb @@ -69,7 +69,7 @@ package body Post_Sems is Ieee.Vital_Timing.Check_Vital_Level1 (Unit); end if; - Value := Get_Chain (Value); + Value := Get_Value_Chain (Value); end loop; end if; end Post_Sem_Checks; diff --git a/src/vhdl/sem.adb b/src/vhdl/sem.adb index 9e57ec0e2..39e642722 100644 --- a/src/vhdl/sem.adb +++ b/src/vhdl/sem.adb @@ -2599,8 +2599,7 @@ package body Sem is case Get_Kind (El) is when Iir_Kind_Package_Instantiation_Declaration => declare - Pkg : constant Iir := - Get_Named_Entity (Get_Uninstantiated_Package_Name (El)); + Pkg : constant Iir := Get_Uninstantiated_Package_Decl (El); begin if not Is_Error (Pkg) and then Get_Need_Body (Pkg) @@ -2633,8 +2632,8 @@ package body Sem is return True; when Iir_Kind_Interface_Package_Declaration => declare - Pkg : constant Iir := Get_Named_Entity - (Get_Uninstantiated_Package_Name (Inter)); + Pkg : constant Iir := + Get_Uninstantiated_Package_Decl (Inter); begin if Get_Macro_Expanded_Flag (Pkg) then return True; @@ -2836,6 +2835,8 @@ package body Sem is return Null_Iir; end if; + Set_Uninstantiated_Package_Decl (Decl, Pkg); + return Pkg; end Sem_Uninstantiated_Package_Name; diff --git a/src/vhdl/sem_assocs.adb b/src/vhdl/sem_assocs.adb index adae8b6b4..e33775921 100644 --- a/src/vhdl/sem_assocs.adb +++ b/src/vhdl/sem_assocs.adb @@ -166,7 +166,7 @@ package body Sem_Assocs is procedure Check_Parameter_Association_Restriction (Inter : Iir; Base_Actual : Iir; Loc : Iir) is begin - case Get_Mode (Inter) is + case Iir_Parameter_Modes (Get_Mode (Inter)) is when Iir_In_Mode => if Can_Interface_Be_Read (Base_Actual) then return; @@ -181,8 +181,6 @@ package body Sem_Assocs is then return; end if; - when others => - Error_Kind ("check_parameter_association_restriction", Inter); end case; Error_Msg_Sem (+Loc, "cannot associate an " & Get_Mode_Name (Get_Mode (Base_Actual)) @@ -556,16 +554,14 @@ package body Sem_Assocs is (Sub_Assoc : in out Iir; Formal : Iir) is Base_Assoc : constant Iir := Sub_Assoc; + Index_List : constant Iir_List := Get_Index_List (Formal); + Nbr : constant Natural := Get_Nbr_Elements (Index_List); Choice : Iir; Last_Choice : Iir; - Index_List : Iir_List; Index : Iir; - Nbr : Natural; Staticness : Iir_Staticness; begin -- Find element. - Index_List := Get_Index_List (Formal); - Nbr := Get_Nbr_Elements (Index_List); for I in 0 .. Nbr - 1 loop Index := Get_Nth_Element (Index_List, I); @@ -683,6 +679,8 @@ package body Sem_Assocs is Sub_Assoc := Choice; end Add_Individual_Assoc_Selected_Name; + -- Subroutine of Add_Individual_Association. + -- Search/build the tree of choices for FORMAL, starting for IASSOC. procedure Add_Individual_Association_1 (Iassoc : in out Iir; Formal : Iir) is Base_Assoc : constant Iir := Iassoc; @@ -847,13 +845,23 @@ package body Sem_Assocs is Set_Direction (Index_Subtype_Constraint, Get_Direction (Index_Constraint)); + -- For ownership purpose, the bounds must be copied otherwise + -- they would be referenced before being defined. This is non + -- optimal but it doesn't happen often. + Low := Copy_Constant (Low); + High := Copy_Constant (High); + case Get_Direction (Index_Constraint) is when Iir_To => Set_Left_Limit (Index_Subtype_Constraint, Low); + Set_Left_Limit_Expr (Index_Subtype_Constraint, Low); Set_Right_Limit (Index_Subtype_Constraint, High); + Set_Right_Limit_Expr (Index_Subtype_Constraint, High); when Iir_Downto => Set_Left_Limit (Index_Subtype_Constraint, High); + Set_Left_Limit_Expr (Index_Subtype_Constraint, High); Set_Right_Limit (Index_Subtype_Constraint, Low); + Set_Right_Limit_Expr (Index_Subtype_Constraint, Low); end case; Set_Expr_Staticness (Index_Subtype_Constraint, Locally); Append_Element (Get_Index_Subtype_List (Actual_Type), @@ -906,6 +914,30 @@ package body Sem_Assocs is Set_Actual_Type (Assoc, Atype); end Finish_Individual_Assoc_Record; + -- Free recursively all the choices of ASSOC. + procedure Clean_Individual_Association (Assoc : Iir) + is + El, N_El : Iir; + Expr : Iir; + begin + El := Get_Individual_Association_Chain (Assoc); + Set_Individual_Association_Chain (Assoc, Null_Iir); + + while Is_Valid (El) loop + N_El := Get_Chain (El); + + pragma Assert (Get_Kind (El) in Iir_Kinds_Choice); + Expr := Get_Associated_Expr (El); + if Get_Kind (Expr) = Iir_Kind_Association_Element_By_Individual then + Clean_Individual_Association (Expr); + Free_Iir (Expr); + end if; + + Free_Iir (El); + El := N_El; + end loop; + end Clean_Individual_Association; + -- Called by sem_individual_association to finish the analyze of -- individual association ASSOC: compute bounds, detect missing elements. procedure Finish_Individual_Association (Assoc : Iir) @@ -933,6 +965,7 @@ package body Sem_Assocs is Set_Index_Constraint_Flag (Atype, True); Set_Constraint_State (Atype, Fully_Constrained); Set_Actual_Type (Assoc, Atype); + Set_Actual_Type_Definition (Assoc, Atype); Finish_Individual_Assoc_Array (Assoc, Assoc, 1); end if; when Iir_Kind_Record_Type_Definition @@ -941,12 +974,29 @@ package body Sem_Assocs is when others => Error_Kind ("finish_individual_association", Atype); end case; + + -- Free the hierarchy, keep only the top individual association. + Clean_Individual_Association (Assoc); end Finish_Individual_Association; -- Sem individual associations of ASSOCS: -- Add an Iir_Kind_Association_Element_By_Individual before each -- group of individual association for the same formal, and call -- Finish_Individual_Association with each of these added nodes. + -- + -- The purpose of By_Individual association is to have the type of the + -- actual (might be an array subtype), and also to be sure that all + -- sub-elements are associated. For that a tree is created. The tree is + -- rooted by the top Association_Element_By_Individual, which contains a + -- chain of choices (like the aggregate). The child of a choice is either + -- an Association_Element written by the user, or a new subtree rooted + -- by another Association_Element_By_Individual. The tree doesn't + -- follow all the ownership rules: the formal of sub association_element + -- are directly set to the association, and the associated_expr of the + -- choices are directly set to formals. + -- + -- This tree is temporary (used only during analysis of the individual + -- association) and removed once the check is done. procedure Sem_Individual_Association (Assoc_Chain : in out Iir) is Assoc : Iir; @@ -978,7 +1028,7 @@ package body Sem_Assocs is Location_Copy (Iassoc, Assoc); Set_Choice_Staticness (Iassoc, Locally); pragma Assert (Cur_Iface /= Null_Iir); - Set_Formal (Iassoc, Cur_Iface); + Set_Formal (Iassoc, Build_Simple_Name (Cur_Iface, Iassoc)); -- Insert IASSOC. if Prev_Assoc = Null_Iir then Assoc_Chain := Iassoc; @@ -1362,6 +1412,7 @@ package body Sem_Assocs is (Conv : Iir; Res_Type : Iir; Param_Type : Iir) return Iir is Func : Iir; + Assoc : Iir; begin if Conv = Null_Iir then return Null_Iir; @@ -1371,8 +1422,12 @@ package body Sem_Assocs is return Null_Iir; end if; case Get_Kind (Func) is - when Iir_Kind_Function_Call - | Iir_Kind_Type_Conversion => + when Iir_Kind_Function_Call => + Assoc := Get_Parameter_Association_Chain (Func); + Free_Iir (Assoc); + Set_Parameter_Association_Chain (Func, Null_Iir); + return Func; + when Iir_Kind_Type_Conversion => return Func; when others => Error_Kind ("extract_in_conversion", Func); @@ -1537,11 +1592,8 @@ package body Sem_Assocs is return; end if; - Package_Inter := - Get_Named_Entity (Get_Uninstantiated_Package_Name (Inter)); - if Get_Named_Entity (Get_Uninstantiated_Package_Name (Actual)) - /= Package_Inter - then + Package_Inter := Get_Uninstantiated_Package_Decl (Inter); + if Get_Uninstantiated_Package_Decl (Actual) /= Package_Inter then Error_Msg_Sem (+Assoc, "actual package name is not an instance of interface package"); diff --git a/src/vhdl/sem_decls.adb b/src/vhdl/sem_decls.adb index d8f4c7543..20ce9aae6 100644 --- a/src/vhdl/sem_decls.adb +++ b/src/vhdl/sem_decls.adb @@ -646,8 +646,9 @@ package body Sem_Decls is Set_Identifier (Inter, Std_Names.Name_Open_Kind); Set_Type (Inter, Std_Package.File_Open_Kind_Type_Definition); Set_Mode (Inter, Iir_In_Mode); - Set_Default_Value (Inter, - Std_Package.File_Open_Kind_Read_Mode); + Set_Default_Value + (Inter, + Build_Simple_Name (Std_Package.File_Open_Kind_Read_Mode, Loc)); Append (Last_Interface, Proc, Inter); Compute_Subprogram_Hash (Proc); -- Add it to the list. @@ -697,7 +698,7 @@ package body Sem_Decls is Inter := Create_Iir (Iir_Kind_Interface_Variable_Declaration); Set_Identifier (Inter, Std_Names.Name_Value); Set_Location (Inter, Loc); - Set_Subtype_Indication (Inter, Type_Mark); + Set_Subtype_Indication (Inter, Build_Simple_Name (Decl, Loc)); Set_Type (Inter, Type_Mark_Type); Set_Mode (Inter, Iir_Out_Mode); Append (Last_Interface, Proc, Inter); @@ -737,7 +738,7 @@ package body Sem_Decls is Inter := Create_Iir (Iir_Kind_Interface_Constant_Declaration); Set_Identifier (Inter, Std_Names.Name_Value); Set_Location (Inter, Loc); - Set_Subtype_Indication (Inter, Type_Mark); + Set_Subtype_Indication (Inter, Build_Simple_Name (Decl, Loc)); Set_Type (Inter, Type_Mark_Type); Set_Mode (Inter, Iir_In_Mode); Append (Last_Interface, Proc, Inter); @@ -1596,6 +1597,7 @@ package body Sem_Decls is Set_Identifier (St_Decl, Get_Identifier (Decl)); Set_Parent (St_Decl, Get_Parent (Decl)); Set_Type (St_Decl, Def); + Set_Subtype_Indication (St_Decl, Def); Set_Type_Declarator (Def, St_Decl); Set_Chain (St_Decl, Get_Chain (Decl)); Set_Chain (Decl, St_Decl); @@ -2664,6 +2666,11 @@ package body Sem_Decls is Set_Name (Res, Get_Name (Alias)); Set_Alias_Signature (Res, Sig); + if Is_Valid (Sig) then + -- The prefix is owned by the non_object_alias_declaration. + Set_Signature_Prefix (Sig, Null_Iir); + end if; + Sem_Scopes.Add_Name (Res); Name_Visible (Res); @@ -2757,6 +2764,14 @@ package body Sem_Decls is Replace_Nth_Element (Constituent_List, I, El); El_Name := Get_Named_Entity (El); + -- Statements are textually afer the group declaration. To avoid + -- adding a flag on each node with a base_name, this field is + -- cleared, as we don't care about base name. + if Class = Tok_Label then + Set_Is_Forward_Ref (El, True); + end if; + Set_Base_Name (El, Null_Iir); + -- LRM93 4.7 -- It is an error if the class of any group constituent in the -- group constituent list is not the same as the class specified diff --git a/src/vhdl/sem_expr.adb b/src/vhdl/sem_expr.adb index 0e13a1936..636c23188 100644 --- a/src/vhdl/sem_expr.adb +++ b/src/vhdl/sem_expr.adb @@ -2592,14 +2592,13 @@ package body Sem_Expr is Free (Arr); end Sem_Check_Continuous_Choices; - procedure Sem_Choices_Range - (Choice_Chain : in out Iir; - Sub_Type : Iir; - Is_Sub_Range : Boolean; - Is_Case_Stmt : Boolean; - Loc : Location_Type; - Low : out Iir; - High : out Iir) + procedure Sem_Choices_Range (Choice_Chain : in out Iir; + Sub_Type : Iir; + Is_Sub_Range : Boolean; + Is_Case_Stmt : Boolean; + Loc : Location_Type; + Low : out Iir; + High : out Iir) is -- Number of positionnal choice. Nbr_Pos : Iir_Int64; @@ -2826,83 +2825,6 @@ package body Sem_Expr is (Choice_Chain, Sub_Type, Is_Sub_Range, Loc, Low, High); end Sem_Choices_Range; --- -- Find out the MIN and the MAX of an all named association choice list. --- -- It also returns the number of elements associed (counting range). --- procedure Sem_Find_Min_Max_Association_Choice_List --- (List: Iir_Association_Choices_List; --- Min: out Iir; --- Max: out Iir; --- Length: out natural) --- is --- Min_Res: Iir := null; --- Max_Res: Iir := null; --- procedure Update_With_Value (Val: Iir) is --- begin --- if Min_Res = null then --- Min_Res := Val; --- Max_Res := Val; --- elsif Get_Value (Val) < Get_Value (Min_Res) then --- Min_Res := Val; --- elsif Get_Value (Val) > Get_Value (Max_Res) then --- Max_Res := Val; --- end if; --- end Update_With_Value; - --- Number_Elements: Natural; - --- procedure Update (Choice: Iir) is --- Left, Right: Iir; --- Expr: Iir; --- begin --- case Get_Kind (Choice) is --- when Iir_Kind_Choice_By_Expression => --- Update_With_Value (Get_Expression (Choice)); --- Number_Elements := Number_Elements + 1; --- when Iir_Kind_Choice_By_Range => --- Expr := Get_Expression (Choice); --- Left := Get_Left_Limit (Expr); --- Right := Get_Right_Limit (Expr); --- Update_With_Value (Left); --- Update_With_Value (Right); --- -- There can't be null range. --- case Get_Direction (Expr) is --- when Iir_To => --- Number_Elements := Number_Elements + --- Natural (Get_Value (Right) - Get_Value (Left) + 1); --- when Iir_Downto => --- Number_Elements := Number_Elements + --- Natural (Get_Value (Left) - Get_Value (Right) + 1); --- end case; --- when others => --- Error_Kind ("sem_find_min_max_association_choice_list", Choice); --- end case; --- end Update; - --- El: Iir; --- Sub_List: Iir_Association_Choices_List; --- Sub_El: Iir; --- begin --- Number_Elements := 0; --- for I in Natural loop --- El := Get_Nth_Element (List, I); --- exit when El = null; --- case Get_Kind (El) is --- when Iir_Kind_Choice_By_List => --- Sub_List := Get_Choice_List (El); --- for J in Natural loop --- Sub_El := Get_Nth_Element (Sub_List, J); --- exit when Sub_El = null; --- Update (Sub_El); --- end loop; --- when others => --- Update (El); --- end case; --- end loop; --- Min := Min_Res; --- Max := Max_Res; --- Length := Number_Elements; --- end Sem_Find_Min_Max_Association_Choice_List; - -- Perform semantisation on a (sub)aggregate AGGR, which is of type -- A_TYPE. -- return FALSE is case of failure @@ -2950,35 +2872,33 @@ package body Sem_Expr is -- FIXME: should mutate the node. function Sem_Simple_Choice (Ass : Iir) return Iir is + Expr : constant Iir := Get_Choice_Expression (Ass); N_El : Iir; - Expr : Iir; Aggr_El : Iir_Element_Declaration; begin - Expr := Get_Choice_Expression (Ass); if Get_Kind (Expr) /= Iir_Kind_Simple_Name then Error_Msg_Sem (+Ass, "element association must be a simple name"); Ok := False; return Ass; end if; - Aggr_El := Find_Name_In_List - (Get_Elements_Declaration_List (Base_Type), Get_Identifier (Expr)); + Aggr_El := Find_Name_In_List (El_List, Get_Identifier (Expr)); if Aggr_El = Null_Iir then Error_Msg_Sem (+Ass, "record has no such element %n", +Ass); Ok := False; return Ass; end if; + Set_Named_Entity (Expr, Aggr_El); + Xref_Ref (Expr, Aggr_El); N_El := Create_Iir (Iir_Kind_Choice_By_Name); Location_Copy (N_El, Ass); - Set_Choice_Name (N_El, Aggr_El); + Set_Choice_Name (N_El, Expr); Set_Associated_Expr (N_El, Get_Associated_Expr (Ass)); Set_Associated_Chain (N_El, Get_Associated_Chain (Ass)); Set_Chain (N_El, Get_Chain (Ass)); Set_Same_Alternative_Flag (N_El, Get_Same_Alternative_Flag (Ass)); - Xref_Ref (Expr, Aggr_El); Free_Iir (Ass); - Free_Iir (Expr); Add_Match (N_El, Aggr_El); return N_El; end Sem_Simple_Choice; @@ -3369,6 +3289,7 @@ package body Sem_Expr is when Iir_Kind_Choice_By_Range => Expr := Get_Choice_Range (Choice); Set_Range_Constraint (Info.Index_Subtype, Expr); + Set_Is_Ref (Info.Index_Subtype, True); -- FIXME: avoid allocation-free. Free_Iir (Index_Subtype_Constraint); when others => @@ -3636,16 +3557,11 @@ package body Sem_Expr is | Iir_Kind_Physical_Fp_Literal => Unit_Name := Get_Unit_Name (Lit); Res := Lit; - when Iir_Kind_Unit_Declaration => - Res := Create_Iir (Iir_Kind_Physical_Int_Literal); - Location_Copy (Res, Lit); - Set_Value (Res, 1); - Unit_Name := Null_Iir; - raise Program_Error; when Iir_Kinds_Denoting_Name => Res := Create_Iir (Iir_Kind_Physical_Int_Literal); Location_Copy (Res, Lit); Set_Value (Res, 1); + Set_Literal_Origin (Res, Lit); Unit_Name := Lit; when others => Error_Kind ("sem_physical_literal", Lit); @@ -3657,6 +3573,7 @@ package body Sem_Expr is Set_Named_Entity (Unit_Name, Create_Error_Name (Unit_Name)); 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); diff --git a/src/vhdl/sem_inst.adb b/src/vhdl/sem_inst.adb index 0b0b76467..15bfc214b 100644 --- a/src/vhdl/sem_inst.adb +++ b/src/vhdl/sem_inst.adb @@ -220,6 +220,12 @@ package body Sem_Inst is -- Must be explicitely handled in Instantiate_Iir, as it -- requires special handling. raise Internal_Error; + when Attr_Maybe_Forward_Ref => + if Get_Is_Forward_Ref (N) then + raise Internal_Error; + else + R := Instantiate_Iir (S, True); + end if; when Attr_Chain => R := Instantiate_Iir_Chain (S); when Attr_Chain_Next => @@ -430,6 +436,7 @@ package body Sem_Inst is -- incomplete type definition Set_Designated_Type (Res, Get_Type (Get_Designated_Subtype_Indication (Res))); + when Field_Complete_Type_Definition => -- Will be set by the declaration of the complete type null; @@ -466,6 +473,33 @@ package body Sem_Inst is end if; end; + when Field_Deferred_Declaration => + if not Get_Deferred_Declaration_Flag (N) + and then Is_Valid (Get_Deferred_Declaration (N)) + then + -- This is the completion. + declare + Incomplete_Decl_N : constant Iir := + Get_Deferred_Declaration (N); + Incomplete_Decl_Res : constant Iir := + Get_Instance (Incomplete_Decl_N); + begin + pragma Assert (Is_Valid (Incomplete_Decl_Res)); + Set_Deferred_Declaration (Res, Incomplete_Decl_Res); + Set_Deferred_Declaration (Incomplete_Decl_Res, Res); + end; + end if; + + when Field_Protected_Type_Body => + null; + when Field_Protected_Type_Declaration => + Instantiate_Iir_Field (Res, N, F); + Set_Protected_Type_Body + (Get_Protected_Type_Declaration (Res), Res); + + when Field_Subtype_Definition => + -- TODO + null; when others => -- Common case. @@ -511,7 +545,7 @@ package body Sem_Inst is case Get_Kind (Res) is when Iir_Kind_Interface_Constant_Declaration => Set_Type (Res, Get_Type (Inter)); - Set_Subtype_Indication (Res, Get_Subtype_Indication (Inter)); + Set_Subtype_Indication (Res, Null_Iir); -- Not owner Set_Mode (Res, Get_Mode (Inter)); Set_Has_Mode (Res, Get_Has_Mode (Inter)); Set_Has_Class (Res, Get_Has_Class (Inter)); @@ -521,8 +555,8 @@ package body Sem_Inst is Set_Default_Value (Res, Get_Default_Value (Inter)); Set_Is_Ref (Res, True); when Iir_Kind_Interface_Package_Declaration => - Set_Uninstantiated_Package_Name - (Res, Get_Uninstantiated_Package_Name (Inter)); + Set_Uninstantiated_Package_Decl + (Res, Get_Uninstantiated_Package_Decl (Inter)); when Iir_Kind_Interface_Type_Declaration => Set_Type (Res, Get_Type (Inter)); when Iir_Kinds_Interface_Subprogram_Declaration => @@ -587,7 +621,9 @@ package body Sem_Inst is case Get_Field_Attribute (F) is when Attr_None => Set_Instance_On_Iir (S, S_Inst); - when Attr_Ref | Attr_Forward_Ref => + when Attr_Ref + | Attr_Forward_Ref + | Attr_Maybe_Forward_Ref => null; when Attr_Maybe_Ref => if not Get_Is_Ref (N) then @@ -789,8 +825,7 @@ package body Sem_Inst is function Instantiate_Package_Body (Inst : Iir) return Iir is Inst_Decl : constant Iir := Get_Package_Origin (Inst); - Pkg : constant Iir := - Get_Named_Entity (Get_Uninstantiated_Package_Name (Inst_Decl)); + Pkg : constant Iir := Get_Uninstantiated_Package_Decl (Inst_Decl); Prev_Instance_File : constant Source_File_Entry := Instance_File; Mark : constant Instance_Index_Type := Prev_Instance_Table.Last; Res : Iir; @@ -912,7 +947,9 @@ package body Sem_Inst is case Get_Field_Attribute (F) is when Attr_None => Substitute_On_Iir (S, E, Rep); - when Attr_Ref | Attr_Forward_Ref => + when Attr_Ref + | Attr_Forward_Ref + | Attr_Maybe_Forward_Ref => null; when Attr_Maybe_Ref => if not Get_Is_Ref (N) then diff --git a/src/vhdl/sem_names.adb b/src/vhdl/sem_names.adb index 58945b594..06b4cd7c6 100644 --- a/src/vhdl/sem_names.adb +++ b/src/vhdl/sem_names.adb @@ -696,7 +696,8 @@ package body Sem_Names is -- one-dimensionnal array object. Index_List := Get_Index_Subtype_List (Prefix_Type); if Get_Nbr_Elements (Index_List) /= 1 then - Error_Msg_Sem (+Name, "slice prefix must be an unidimensional array"); + Error_Msg_Sem + (+Name, "slice prefix must be an one-dimensional array"); return; end if; @@ -777,6 +778,7 @@ package body Sem_Names is Error_Kind ("sem_expr: slice_name", Get_Base_Type (Index_Type)); end case; Set_Range_Constraint (Slice_Type, Suffix); + Set_Is_Ref (Slice_Type, True); Set_Type_Staticness (Slice_Type, Staticness); Set_Base_Type (Slice_Type, Get_Base_Type (Index_Type)); Set_Location (Slice_Type, Get_Location (Suffix)); @@ -785,6 +787,8 @@ package body Sem_Names is Expr_Type := Create_Iir (Iir_Kind_Array_Subtype_Definition); Set_Location (Expr_Type, Get_Location (Suffix)); Set_Index_Subtype_List (Expr_Type, Create_Iir_List); + Set_Index_Constraint_List (Expr_Type, + Get_Index_Subtype_List (Expr_Type)); Prefix_Base_Type := Get_Base_Type (Prefix_Type); Set_Base_Type (Expr_Type, Prefix_Base_Type); Set_Signal_Type_Flag (Expr_Type, @@ -793,7 +797,7 @@ package body Sem_Names is Set_Element_Subtype (Expr_Type, Get_Element_Subtype (Prefix_Type)); if Get_Kind (Prefix_Type) = Iir_Kind_Array_Subtype_Definition then Set_Resolution_Indication - (Expr_Type, Get_Resolution_Indication (Prefix_Type)); + (Expr_Type, Sem_Types.Copy_Resolution_Indication (Prefix_Type)); else Set_Resolution_Indication (Expr_Type, Null_Iir); end if; @@ -1503,42 +1507,69 @@ package body Sem_Names is end if; end Sem_Check_All_Sensitized; - function Finish_Sem_Denoting_Name (Name : Iir; Res : Iir) return Iir + -- Free overload list of NAME but keep RES interpretation. + procedure Free_Old_Entity_Name (Name : Iir; Res : Iir) is - Prefix : Iir; + Old_Res : constant Iir := Get_Named_Entity (Name); + begin + if Old_Res /= Null_Iir and then Old_Res /= Res then + pragma Assert (Is_Overload_List (Old_Res)); + Sem_Name_Free_Result (Old_Res, Res); + end if; + Set_Named_Entity (Name, Res); + end Free_Old_Entity_Name; + + function Finish_Sem_Denoting_Name (Name : Iir; Res : Iir) return Iir is begin case Iir_Kinds_Denoting_Name (Get_Kind (Name)) is when Iir_Kind_Simple_Name | Iir_Kind_Character_Literal | Iir_Kind_Operator_Symbol => + Set_Base_Name (Name, Res); Xref_Ref (Name, Res); return Name; when Iir_Kind_Selected_Name => - Xref_Ref (Name, Res); - Prefix := Get_Prefix (Name); - loop - pragma Assert (Get_Kind (Prefix) in Iir_Kinds_Denoting_Name); - Xref_Ref (Prefix, Get_Named_Entity (Prefix)); - exit when Get_Kind (Prefix) /= Iir_Kind_Selected_Name; - Prefix := Get_Prefix (Prefix); - end loop; + declare + Prefix, Res_Prefix : Iir; + Old_Res : Iir; + begin + Xref_Ref (Name, Res); + Prefix := Name; + Res_Prefix := Res; + loop + Prefix := Get_Prefix (Prefix); + Res_Prefix := Get_Parent (Res_Prefix); + + -- Get the parent for expanded_name, may skip some parents. + case Get_Kind (Res_Prefix) is + when Iir_Kind_Design_Unit => + Res_Prefix := + Get_Library (Get_Design_File (Res_Prefix)); + when others => + null; + end case; + + pragma Assert (Get_Kind (Prefix) in Iir_Kinds_Denoting_Name); + Xref_Ref (Prefix, Res_Prefix); + + -- Cannot use Free_Old_Entity_Name as a prefix may not be + -- the parent (for protected subprogram calls). + Old_Res := Get_Named_Entity (Prefix); + if Is_Overload_List (Old_Res) then + Free_Iir (Old_Res); + Set_Named_Entity (Prefix, Res_Prefix); + end if; + + exit when Get_Kind (Prefix) /= Iir_Kind_Selected_Name; + end loop; + end; return Name; + when Iir_Kind_Reference_Name => + -- Not in the sources. + raise Internal_Error; end case; end Finish_Sem_Denoting_Name; - - -- Free overload list of NAME but keep RES interpretation. - procedure Free_Old_Entity_Name (Name : Iir; Res : Iir) - is - Old_Res : constant Iir := Get_Named_Entity (Name); - begin - if Old_Res /= Null_Iir and then Old_Res /= Res then - pragma Assert (Is_Overload_List (Old_Res)); - Sem_Name_Free_Result (Old_Res, Res); - end if; - Set_Named_Entity (Name, Res); - end Free_Old_Entity_Name; - function Finish_Sem_Name_1 (Name : Iir; Res : Iir) return Iir is Prefix : Iir; @@ -1570,6 +1601,9 @@ package body Sem_Names is pragma Assert (Get_Kind (Name) = Iir_Kind_Attribute_Name); Prefix := Finish_Sem_Name (Get_Prefix (Name)); Set_Prefix (Name, Prefix); + if Get_Is_Forward_Ref (Prefix) then + Set_Base_Name (Prefix, Null_Iir); + end if; Set_Base_Name (Name, Res); Set_Type (Name, Get_Type (Res)); Set_Name_Staticness (Name, Get_Name_Staticness (Res)); @@ -1821,7 +1855,6 @@ package body Sem_Names is Res := Create_Overload_List (Res_List); end if; - Set_Base_Name (Name, Res); Set_Named_Entity (Name, Res); end Sem_Simple_Name; @@ -2735,11 +2768,12 @@ package body Sem_Names is function Sem_User_Attribute (Attr : Iir_Attribute_Name) return Iir is + Prefix_Name : constant Iir := Get_Prefix (Attr); Prefix : Iir; Value : Iir; Attr_Id : Name_Id; begin - Prefix := Get_Named_Entity (Get_Prefix (Attr)); + Prefix := Get_Named_Entity (Prefix_Name); -- LRM93 6.6 -- If the attribute name denotes an alias, then the attribute name @@ -2773,12 +2807,14 @@ package body Sem_Names is | Iir_Kind_Procedure_Declaration | Iir_Kind_Enumeration_Literal | Iir_Kind_Unit_Declaration - | Iir_Kinds_Sequential_Statement - | Iir_Kinds_Concurrent_Statement | Iir_Kind_Component_Declaration | Iir_Kinds_Library_Unit_Declaration => -- FIXME: to complete null; + when Iir_Kinds_Sequential_Statement + | Iir_Kinds_Concurrent_Statement => + -- May appear textually before the statement. + Set_Is_Forward_Ref (Prefix_Name, True); when others => Error_Kind ("sem_user_attribute", Prefix); end case; @@ -3575,7 +3611,7 @@ package body Sem_Names is when Iir_Kind_Simple_Name | Iir_Kind_Character_Literal | Iir_Kind_Operator_Symbol => - -- String_Literal may be a symbol_operator. + -- String_Literal may be a operator_symbol. Sem_Simple_Name (Name, Keep_Alias, Soft => False); when Iir_Kind_Selected_Name => Sem_Selected_Name (Name, Keep_Alias); @@ -3601,7 +3637,7 @@ package body Sem_Names is case Get_Kind (Name) is when Iir_Kind_Simple_Name | Iir_Kind_Operator_Symbol => - -- String_Literal may be a symbol_operator. + -- String_Literal may be a operator_symbol. Sem_Simple_Name (Name, False, Soft => True); when others => Error_Kind ("sem_name_soft", Name); diff --git a/src/vhdl/sem_specs.adb b/src/vhdl/sem_specs.adb index 2d40901fe..802f5aed7 100644 --- a/src/vhdl/sem_specs.adb +++ b/src/vhdl/sem_specs.adb @@ -170,7 +170,7 @@ package body Sem_Specs is return Value; end if; end if; - Value := Get_Chain (Value); + Value := Get_Value_Chain (Value); end loop; return Null_Iir; end Find_Attribute_Value; @@ -288,7 +288,7 @@ package body Sem_Specs is end if; end; end if; - El := Get_Chain (El); + El := Get_Value_Chain (El); end loop; El := Create_Iir (Iir_Kind_Attribute_Value); @@ -306,7 +306,7 @@ package body Sem_Specs is Set_Base_Name (El, El); -- Put the attribute value in the attribute_value_chain. - Set_Chain (El, Get_Attribute_Value_Chain (Attr_Chain_Parent)); + Set_Value_Chain (El, Get_Attribute_Value_Chain (Attr_Chain_Parent)); Set_Attribute_Value_Chain (Attr_Chain_Parent, El); -- Put the attribute value in the chain of the attribute specification. @@ -1415,6 +1415,7 @@ package body Sem_Specs is (Inst, Spec, Primary_Entity_Aspect); Xref_Ref (El, Inst); Set_Named_Entity (El, Inst); + Set_Is_Forward_Ref (El, True); end if; end if; end if; @@ -1578,6 +1579,7 @@ package body Sem_Specs is Res, Last : Iir; Comp_El, Ent_El : Iir; Assoc : Iir; + Name : Iir; Found : Natural; Comp_Chain : Iir; Ent_Chain : Iir; @@ -1642,7 +1644,9 @@ package body Sem_Specs is end if; Assoc := Create_Iir (Iir_Kind_Association_Element_By_Expression); Location_Copy (Assoc, Parent); - Set_Actual (Assoc, Comp_El); + Name := Build_Simple_Name (Comp_El, Parent); + Set_Type (Name, Get_Type (Comp_El)); + Set_Actual (Assoc, Name); if Kind = Map_Port then Check_Port_Association_Bounds_Restrictions (Ent_El, Comp_El, Assoc); @@ -1650,7 +1654,9 @@ package body Sem_Specs is Found := Found + 1; end if; Set_Whole_Association_Flag (Assoc, True); - Set_Formal (Assoc, Ent_El); + Name := Build_Simple_Name (Ent_El, Parent); + Set_Type (Name, Get_Type (Ent_El)); + Set_Formal (Assoc, Name); if Kind = Map_Port and then not Error and then Comp_El /= Null_Iir diff --git a/src/vhdl/sem_stmts.adb b/src/vhdl/sem_stmts.adb index 638e9ada3..9abe1b92f 100644 --- a/src/vhdl/sem_stmts.adb +++ b/src/vhdl/sem_stmts.adb @@ -432,7 +432,7 @@ package body Sem_Stmts is Expr: Iir; begin Target := Get_Target (Stmt); - Target := Sem_Expression_Wildcard (Target, Sig_Type); + Target := Sem_Expression_Wildcard (Target, Get_Base_Type (Sig_Type)); if Target /= Null_Iir then Set_Target (Stmt, Target); diff --git a/src/vhdl/sem_types.adb b/src/vhdl/sem_types.adb index edb18d16e..4e5baa373 100644 --- a/src/vhdl/sem_types.adb +++ b/src/vhdl/sem_types.adb @@ -295,7 +295,7 @@ package body Sem_Types is begin Lit := Create_Iir (Iir_Kind_Physical_Int_Literal); Set_Value (Lit, Val); - Set_Unit_Name (Lit, Unit); + Set_Physical_Unit (Lit, Unit); Set_Expr_Staticness (Lit, Locally); Set_Type (Lit, Get_Type (Unit)); Location_Copy (Lit, Unit); @@ -307,7 +307,6 @@ package body Sem_Types is return Iir_Physical_Subtype_Definition is Unit: Iir_Unit_Declaration; - Unit_Name : Iir; Def : Iir_Physical_Type_Definition; Sub_Type: Iir_Physical_Subtype_Definition; Range_Expr1: Iir; @@ -368,8 +367,7 @@ package body Sem_Types is -- Analyze the primary unit. Unit := Get_Unit_Chain (Def); - Unit_Name := Build_Simple_Name (Unit, Unit); - Lit := Create_Physical_Literal (1, Unit_Name); + Lit := Create_Physical_Literal (1, Unit); Set_Physical_Unit_Value (Unit, Lit); Sem_Scopes.Add_Name (Unit); @@ -391,7 +389,7 @@ package body Sem_Types is Location_Copy (Res, Lim); Set_Type (Res, Def); Set_Value (Res, Get_Value (Lim)); - Set_Unit_Name (Res, Get_Primary_Unit_Name (Def)); + Set_Physical_Unit (Res, Get_Primary_Unit (Def)); Set_Expr_Staticness (Res, Locally); Set_Literal_Origin (Res, Lim); return Res; @@ -429,7 +427,6 @@ package body Sem_Types is Sem_Scopes.Add_Name (Unit); Val := Sem_Expression (Get_Physical_Literal (Unit), Def); if Val /= Null_Iir then - Set_Physical_Literal (Unit, Val); Val := Eval_Physical_Literal (Val); Set_Physical_Unit_Value (Unit, Val); @@ -861,6 +858,7 @@ package body Sem_Types is else Staticness := None; end if; + Set_Base_Element_Declaration (El, El); Sem_Scopes.Add_Name (El); Name_Visible (El); Xref_Decl (El); @@ -982,6 +980,7 @@ package body Sem_Types is Index_Name := Sem_Discrete_Range_Integer (Index_Type); if Index_Name /= Null_Iir then Index_Name := Range_To_Subtype_Indication (Index_Name); + -- Index_Name is a subtype_indication, which can be a type_mark. else -- Avoid errors. Index_Name := @@ -996,7 +995,7 @@ package body Sem_Types is -- Set the index subtype definition for the array base type. if Get_Kind (Index_Name) in Iir_Kinds_Denoting_Name then - Index_Type := Index_Name; + Index_Type := Get_Named_Entity (Index_Name); else pragma Assert (Get_Kind (Index_Name) in Iir_Kinds_Subtype_Definition); @@ -1004,16 +1003,18 @@ package body Sem_Types is if Index_Type = Null_Iir then -- From a range expression like '1 to 4' or from an attribute -- name. - declare - Subtype_Decl : constant Iir := - Get_First_Subtype_Declaration (Index_Name); - begin - Index_Type := Build_Simple_Name (Subtype_Decl, Index_Name); - Set_Type (Index_Type, Get_Type (Subtype_Decl)); - end; + Index_Type := Get_First_Subtype_Declaration (Index_Name); + else + Index_Type := Get_Named_Entity (Index_Type); end if; end if; - Append_Element (Base_Index_List, Index_Type); + + -- Create a new simple_name, as the type_mark is owned by the + -- index constraint of the array subtype. + Index_Name := Build_Simple_Name (Index_Type, Index_Name); + Set_Type (Index_Name, Get_Type (Index_Type)); + + Append_Element (Base_Index_List, Index_Name); end loop; Set_Index_Subtype_List (Def, Index_List); @@ -1340,11 +1341,113 @@ package body Sem_Types is (Def : Iir; Type_Mark : Iir; Resolution : Iir) return Iir; + -- Create a copy of elements_declaration_list of SRC and set it to DST. + procedure Copy_Record_Elements_Declaration_List (Dst : Iir; Src : Iir) + is + El_List, New_El_List : Iir_List; + El, New_El : Iir; + begin + New_El_List := Create_Iir_List; + Set_Elements_Declaration_List (Dst, New_El_List); + El_List := Get_Elements_Declaration_List (Src); + for I in Natural loop + El := Get_Nth_Element (El_List, I); + exit when El = Null_Iir; + + New_El := Create_Iir (Iir_Kind_Element_Declaration); + Location_Copy (New_El, El); + Set_Identifier (New_El, Get_Identifier (El)); + Set_Type (New_El, Get_Type (El)); + Set_Base_Element_Declaration (New_El, El); + Append_Element (New_El_List, New_El); + end loop; + end Copy_Record_Elements_Declaration_List; + + function Copy_Resolution_Indication (Subdef : Iir) return Iir + is + Ind : constant Iir := Get_Resolution_Indication (Subdef); + begin + if Is_Null (Ind) + or else Get_Kind (Ind) = Iir_Kind_Array_Element_Resolution + then + -- No need to copy array_element_resolution, it is part of the + -- element_subtype. + return Null_Iir; + else + return Build_Reference_Name (Ind); + end if; + end Copy_Resolution_Indication; + + function Copy_Subtype_Indication (Def : Iir) return Iir + is + Res : Iir; + begin + case Get_Kind (Def) is + when Iir_Kind_Integer_Subtype_Definition + | Iir_Kind_Floating_Subtype_Definition + | Iir_Kind_Enumeration_Subtype_Definition + | Iir_Kind_Physical_Subtype_Definition => + Res := Create_Iir (Get_Kind (Def)); + Set_Range_Constraint (Res, Get_Range_Constraint (Def)); + Set_Is_Ref (Res, True); + Set_Resolution_Indication + (Res, Copy_Resolution_Indication (Def)); + when Iir_Kind_Enumeration_Type_Definition => + Res := Create_Iir (Iir_Kind_Enumeration_Subtype_Definition); + Set_Range_Constraint (Res, Get_Range_Constraint (Def)); + Set_Is_Ref (Res, True); + + when Iir_Kind_Access_Subtype_Definition + | Iir_Kind_Access_Type_Definition => + Res := Create_Iir (Iir_Kind_Access_Subtype_Definition); + Set_Designated_Type (Res, Get_Designated_Type (Def)); + + when Iir_Kind_Array_Type_Definition => + Res := Create_Iir (Iir_Kind_Array_Subtype_Definition); + Set_Type_Staticness (Res, Get_Type_Staticness (Def)); + Set_Resolved_Flag (Res, Get_Resolved_Flag (Def)); + Set_Index_Constraint_List (Res, Null_Iir_List); + Set_Index_Subtype_List + (Res, Get_Index_Subtype_Definition_List (Def)); + Set_Element_Subtype (Res, Get_Element_Subtype (Def)); + Set_Index_Constraint_Flag (Res, False); + Set_Constraint_State (Res, Get_Constraint_State (Def)); + when Iir_Kind_Array_Subtype_Definition => + Res := Create_Iir (Iir_Kind_Array_Subtype_Definition); + Set_Resolution_Indication (Res, Copy_Resolution_Indication (Def)); + Set_Resolved_Flag (Res, Get_Resolved_Flag (Def)); + Set_Index_Subtype_List (Res, Get_Index_Subtype_List (Def)); + Set_Element_Subtype (Res, Get_Element_Subtype (Def)); + Set_Index_Constraint_Flag + (Res, Get_Index_Constraint_Flag (Def)); + Set_Constraint_State (Res, Get_Constraint_State (Def)); + + when Iir_Kind_Record_Type_Definition + | Iir_Kind_Record_Subtype_Definition => + Res := Create_Iir (Iir_Kind_Record_Subtype_Definition); + Set_Type_Staticness (Res, Get_Type_Staticness (Def)); + if Get_Kind (Def) = Iir_Kind_Record_Subtype_Definition then + Set_Resolution_Indication + (Res, Copy_Resolution_Indication (Def)); + end if; + Set_Resolved_Flag (Res, Get_Resolved_Flag (Def)); + Set_Constraint_State (Res, Get_Constraint_State (Def)); + Copy_Record_Elements_Declaration_List (Res, Def); + when others => + -- FIXME: todo (protected type ?) + Error_Kind ("copy_subtype_indication", Def); + end case; + Location_Copy (Res, Def); + Set_Base_Type (Res, Get_Base_Type (Def)); + Set_Type_Staticness (Res, Get_Type_Staticness (Def)); + Set_Signal_Type_Flag (Res, Get_Signal_Type_Flag (Def)); + return Res; + end Copy_Subtype_Indication; + -- DEF is an incomplete subtype_indication or array_constraint, -- TYPE_MARK is the base type of the subtype_indication. function Sem_Array_Constraint - (Def : Iir; Type_Mark : Iir; Resolution : Iir) - return Iir + (Def : Iir; Type_Mark : Iir; Resolution : Iir) return Iir is El_Type : constant Iir := Get_Element_Subtype (Type_Mark); Res : Iir; @@ -1516,6 +1619,11 @@ package body Sem_Types is -- Element subtype. if Resolv_El /= Null_Iir or else El_Def /= Null_Iir then El_Def := Sem_Subtype_Constraint (El_Def, El_Type, Resolv_El); + if Resolv_El /= Null_Iir then + -- Save EL_DEF so that it is owned. + Set_Element_Subtype_Indication (Resolution, El_Def); + Set_Resolution_Indication (Resolution, Null_Iir); + end if; end if; if El_Def = Null_Iir then El_Def := Get_Element_Subtype (Type_Mark); @@ -1708,9 +1816,7 @@ package body Sem_Types is when Iir_Kind_Array_Subtype_Definition => -- Record constraints are parsed as array constraints. - if Get_Kind (Def) /= Iir_Kind_Array_Subtype_Definition then - raise Internal_Error; - end if; + pragma Assert (Get_Kind (Def) = Iir_Kind_Array_Subtype_Definition); Index_List := Get_Index_Constraint_List (Def); El_List := Create_Iir_List; Set_Elements_Declaration_List (Res, El_List); @@ -1786,8 +1892,8 @@ package body Sem_Types is (El_Type, Tm_El_Type); when Iir_Kind_Record_Type_Definition | Iir_Kind_Record_Subtype_Definition => - El_Type := Reparse_As_Record_Constraint - (El_Type); + El_Type := + Reparse_As_Record_Constraint (El_Type); when others => Error_Msg_Sem (+El_Type, @@ -1855,7 +1961,7 @@ package body Sem_Types is Set_Constraint_State (Res, Constraint); end; else - Set_Elements_Declaration_List (Res, Tm_El_List); + Copy_Record_Elements_Declaration_List (Res, Type_Mark); Set_Constraint_State (Res, Get_Constraint_State (Type_Mark)); end if; @@ -1915,11 +2021,13 @@ package body Sem_Types is A_Range := Get_Range_Constraint (Def); if A_Range = Null_Iir then A_Range := Get_Range_Constraint (Type_Mark); + Set_Is_Ref (Res, True); else A_Range := Sem_Range_Expression (A_Range, Type_Mark, True); if A_Range = Null_Iir then -- Avoid error propagation. A_Range := Get_Range_Constraint (Type_Mark); + Set_Is_Ref (Res, True); end if; end if; Set_Range_Constraint (Res, A_Range); @@ -2000,11 +2108,11 @@ package body Sem_Types is -- of an access type in a subtype indication is an index -- constraint. declare + Base_Type : constant Iir := + Get_Designated_Type (Type_Mark); Sub_Type : Iir; - Base_Type : Iir; Res : Iir; begin - Base_Type := Get_Designated_Type (Type_Mark); Sub_Type := Sem_Array_Constraint (Def, Base_Type, Null_Iir); Res := Create_Iir (Iir_Kind_Access_Subtype_Definition); @@ -2012,6 +2120,12 @@ package body Sem_Types is Set_Base_Type (Res, Type_Mark); Set_Designated_Subtype_Indication (Res, Sub_Type); Set_Signal_Type_Flag (Res, False); + + -- The type_mark is a type_mark of the access subtype, + -- not of the array subtype. + Set_Subtype_Type_Mark + (Res, Get_Subtype_Type_Mark (Sub_Type)); + Set_Subtype_Type_Mark (Sub_Type, Null_Iir); return Res; end; when others => @@ -2104,71 +2218,6 @@ package body Sem_Types is return Res; end Sem_Subtype_Indication; - function Copy_Subtype_Indication (Def : Iir) return Iir - is - Res : Iir; - begin - case Get_Kind (Def) is - when Iir_Kind_Integer_Subtype_Definition - | Iir_Kind_Floating_Subtype_Definition - | Iir_Kind_Enumeration_Subtype_Definition - | Iir_Kind_Physical_Subtype_Definition => - Res := Create_Iir (Get_Kind (Def)); - Set_Range_Constraint (Res, Get_Range_Constraint (Def)); - Set_Resolution_Indication - (Res, Get_Resolution_Indication (Def)); - when Iir_Kind_Enumeration_Type_Definition => - Res := Create_Iir (Iir_Kind_Enumeration_Subtype_Definition); - Set_Range_Constraint (Res, Get_Range_Constraint (Def)); - - when Iir_Kind_Access_Subtype_Definition - | Iir_Kind_Access_Type_Definition => - Res := Create_Iir (Iir_Kind_Access_Subtype_Definition); - Set_Designated_Type (Res, Get_Designated_Type (Def)); - - when Iir_Kind_Array_Type_Definition => - Res := Create_Iir (Iir_Kind_Array_Subtype_Definition); - Set_Type_Staticness (Res, Get_Type_Staticness (Def)); - Set_Resolved_Flag (Res, Get_Resolved_Flag (Def)); - Set_Index_Constraint_List (Res, Null_Iir_List); - Set_Index_Subtype_List - (Res, Get_Index_Subtype_Definition_List (Def)); - Set_Element_Subtype (Res, Get_Element_Subtype (Def)); - Set_Index_Constraint_Flag (Res, False); - Set_Constraint_State (Res, Get_Constraint_State (Def)); - when Iir_Kind_Array_Subtype_Definition => - Res := Create_Iir (Iir_Kind_Array_Subtype_Definition); - Set_Resolution_Indication (Res, Get_Resolution_Indication (Def)); - Set_Resolved_Flag (Res, Get_Resolved_Flag (Def)); - Set_Index_Subtype_List (Res, Get_Index_Subtype_List (Def)); - Set_Element_Subtype (Res, Get_Element_Subtype (Def)); - Set_Index_Constraint_Flag - (Res, Get_Index_Constraint_Flag (Def)); - Set_Constraint_State (Res, Get_Constraint_State (Def)); - - when Iir_Kind_Record_Type_Definition - | Iir_Kind_Record_Subtype_Definition => - Res := Create_Iir (Iir_Kind_Record_Subtype_Definition); - Set_Type_Staticness (Res, Get_Type_Staticness (Def)); - if Get_Kind (Def) = Iir_Kind_Record_Subtype_Definition then - Set_Resolution_Indication - (Res, Get_Resolution_Indication (Def)); - end if; - Set_Resolved_Flag (Res, Get_Resolved_Flag (Def)); - Set_Constraint_State (Res, Get_Constraint_State (Def)); - Set_Elements_Declaration_List - (Res, Get_Elements_Declaration_List (Def)); - when others => - -- FIXME: todo (protected type ?) - Error_Kind ("copy_subtype_indication", Def); - end case; - Location_Copy (Res, Def); - Set_Base_Type (Res, Get_Base_Type (Def)); - Set_Type_Staticness (Res, Get_Type_Staticness (Def)); - Set_Signal_Type_Flag (Res, Get_Signal_Type_Flag (Def)); - return Res; - end Copy_Subtype_Indication; - function Sem_Subnature_Indication (Def: Iir) return Iir is Nature_Mark: Iir; diff --git a/src/vhdl/sem_types.ads b/src/vhdl/sem_types.ads index d701d5a81..5ba50dd79 100644 --- a/src/vhdl/sem_types.ads +++ b/src/vhdl/sem_types.ads @@ -52,6 +52,10 @@ package Sem_Types is -- This is used when an alias of DEF is required (eg: subtype a is b). function Copy_Subtype_Indication (Def : Iir) return Iir; + -- Return a copy of the resolution_indication in SUBDEF, or null_iir if + -- none. + function Copy_Resolution_Indication (Subdef : Iir) return Iir; + -- Although a nature is not a type, it is patterned like a type. function Sem_Subnature_Indication (Def: Iir) return Iir; end Sem_Types; diff --git a/src/vhdl/simulate/annotations.adb b/src/vhdl/simulate/annotations.adb index 4b6270afd..4758b5bed 100644 --- a/src/vhdl/simulate/annotations.adb +++ b/src/vhdl/simulate/annotations.adb @@ -1078,8 +1078,7 @@ package body Annotations is if Get_Kind (Decl) = Iir_Kind_Package_Instantiation_Declaration then declare - Uninst : constant Iir := - Get_Named_Entity (Get_Uninstantiated_Package_Name (Decl)); + Uninst : constant Iir := Get_Uninstantiated_Package_Decl (Decl); Uninst_Info : constant Sim_Info_Acc := Get_Info (Uninst); begin -- There is not corresponding body for an instantiation, so diff --git a/src/vhdl/simulate/elaboration.adb b/src/vhdl/simulate/elaboration.adb index 7ca7063cf..bc3fe1896 100644 --- a/src/vhdl/simulate/elaboration.adb +++ b/src/vhdl/simulate/elaboration.adb @@ -390,8 +390,7 @@ package body Elaboration is if Get_Kind (Decl) = Iir_Kind_Package_Instantiation_Declaration then -- Elaborate the body now. declare - Uninst : constant Iir := - Get_Named_Entity (Get_Uninstantiated_Package_Name (Decl)); + Uninst : constant Iir := Get_Uninstantiated_Package_Decl (Decl); begin Elaborate_Declarative_Part (Instance, Get_Declaration_Chain (Get_Package_Body (Uninst))); diff --git a/src/vhdl/std_package.adb b/src/vhdl/std_package.adb index 93cee8045..598bdc533 100644 --- a/src/vhdl/std_package.adb +++ b/src/vhdl/std_package.adb @@ -188,6 +188,8 @@ package body Std_Package is Nxt : Iir; begin Sem_Decls.Create_Implicit_Operations (Decl, True); + + -- Update Last_Decl loop Nxt := Get_Chain (Last_Decl); exit when Nxt = Null_Iir; @@ -195,6 +197,37 @@ package body Std_Package is end loop; end Add_Implicit_Operations; + -- Find implicit declaration of "**" for type declaration TYPE_DECL + -- and append it at the current end of std_package. + procedure Relocate_Exp_At_End (Type_Decl : Iir) + is + Prev_El, El : Iir; + begin + pragma Assert + (Get_Kind (Type_Decl) = Iir_Kind_Anonymous_Type_Declaration); + El := Type_Decl; + loop + Prev_El := El; + El := Get_Chain (El); + pragma Assert (Get_Kind (El) = Iir_Kind_Function_Declaration); + exit when + Get_Implicit_Definition (El) = Iir_Predefined_Integer_Exp; + exit when + Get_Implicit_Definition (El) = Iir_Predefined_Floating_Exp; + end loop; + + -- EL must not be the last element, otherwise Add_Decl will break + -- the chain. + pragma Assert (Is_Valid (Get_Chain (El))); + + -- Remove from the chain. + Set_Chain (Prev_El, Get_Chain (El)); + Set_Chain (El, Null_Iir); + + -- Append. + Add_Decl (El); + end Relocate_Exp_At_End; + procedure Create_Std_Type (Decl : out Iir; Def : Iir; Name : Name_Id) is begin Decl := Create_Std_Decl (Iir_Kind_Type_Declaration); @@ -249,6 +282,7 @@ package body Std_Package is Subtype_Decl := Create_Std_Decl (Iir_Kind_Subtype_Declaration); Set_Std_Identifier (Subtype_Decl, Get_Identifier (Type_Decl)); Set_Type (Subtype_Decl, Subtype_Definition); + Set_Subtype_Indication (Subtype_Decl, Subtype_Definition); Set_Type_Declarator (Subtype_Definition, Subtype_Decl); Set_Subtype_Definition (Type_Decl, Subtype_Definition); end Create_Integer_Subtype; @@ -579,6 +613,7 @@ package body Std_Package is Set_Signal_Type_Flag (Universal_Real_Type_Definition, True); Set_Has_Signal_Flag (Universal_Real_Type_Definition, False); + -- type universal_real is ... Universal_Real_Type_Declaration := Create_Std_Decl (Iir_Kind_Anonymous_Type_Declaration); Set_Identifier (Universal_Real_Type_Declaration, Name_Universal_Real); @@ -601,13 +636,15 @@ package body Std_Package is Set_Signal_Type_Flag (Universal_Real_Subtype_Definition, True); Set_Has_Signal_Flag (Universal_Real_Subtype_Definition, False); - -- type is + -- subtype universal_real is ... Universal_Real_Subtype_Declaration := Create_Std_Decl (Iir_Kind_Subtype_Declaration); Set_Identifier (Universal_Real_Subtype_Declaration, Name_Universal_Real); Set_Type (Universal_Real_Subtype_Declaration, Universal_Real_Subtype_Definition); + Set_Subtype_Indication (Universal_Real_Subtype_Declaration, + Universal_Real_Subtype_Definition); Set_Type_Declarator (Universal_Real_Subtype_Definition, Universal_Real_Subtype_Declaration); Set_Subtype_Definition (Universal_Real_Type_Declaration, @@ -659,10 +696,19 @@ package body Std_Package is Name_Integer); Add_Decl (Integer_Type_Declaration); - Add_Implicit_Operations (Integer_Type_Declaration); + -- Now that Integer is declared, create operations for universal + -- types. They will be inserted just after the type declaration, + -- but cannot be done before as "**" relies on Integer. Add_Implicit_Operations (Universal_Integer_Type_Declaration); Add_Implicit_Operations (Universal_Real_Type_Declaration); + -- Don't define "**" for universal types before the declaration of + -- Integer, so move them. + Relocate_Exp_At_End (Universal_Integer_Type_Declaration); + Relocate_Exp_At_End (Universal_Real_Type_Declaration); + + Add_Implicit_Operations (Integer_Type_Declaration); + Create_Integer_Subtype (Integer_Type_Definition, Integer_Type_Declaration, Integer_Subtype_Definition, @@ -709,6 +755,8 @@ package body Std_Package is Create_Std_Decl (Iir_Kind_Subtype_Declaration); Set_Std_Identifier (Real_Subtype_Declaration, Name_Real); Set_Type (Real_Subtype_Declaration, Real_Subtype_Definition); + Set_Subtype_Indication (Real_Subtype_Declaration, + Real_Subtype_Definition); Set_Type_Declarator (Real_Subtype_Definition, Real_Subtype_Declaration); Add_Decl (Real_Subtype_Declaration); @@ -731,8 +779,8 @@ package body Std_Package is begin Lit := Create_Std_Iir (Iir_Kind_Physical_Int_Literal); Set_Value (Lit, Value); - pragma Assert (Get_Kind (Unit) = Iir_Kind_Simple_Name); - Set_Unit_Name (Lit, Unit); + pragma Assert (Get_Kind (Unit) = Iir_Kind_Unit_Declaration); + Set_Physical_Unit (Lit, Unit); Set_Type (Lit, Time_Type_Definition); Set_Expr_Staticness (Lit, Time_Staticness); return Lit; @@ -743,21 +791,19 @@ package body Std_Package is Multiplier : in Iir_Unit_Declaration; Name : Name_Id) is - Lit: Iir_Physical_Int_Literal; - Mul_Name : Iir; + Lit, Lit1 : Iir_Physical_Int_Literal; begin Unit := Create_Std_Decl (Iir_Kind_Unit_Declaration); Set_Std_Identifier (Unit, Name); Set_Type (Unit, Time_Type_Definition); - Mul_Name := Iirs_Utils.Build_Simple_Name - (Multiplier, Std_Location); - Lit := Create_Std_Phys_Lit (Multiplier_Value, Mul_Name); - Set_Physical_Literal (Unit, Lit); + Lit1 := Create_Std_Phys_Lit (Multiplier_Value, Multiplier); + Set_Physical_Literal (Unit, Lit1); Lit := Create_Std_Phys_Lit (Multiplier_Value * Get_Value (Get_Physical_Unit_Value (Multiplier)), - Get_Unit_Name (Get_Physical_Unit_Value (Multiplier))); + Get_Physical_Unit (Get_Physical_Unit_Value (Multiplier))); + Set_Literal_Origin (Lit, Lit1); Set_Physical_Unit_Value (Unit, Lit); Set_Expr_Staticness (Unit, Time_Staticness); @@ -765,7 +811,6 @@ package body Std_Package is Append (Last_Unit, Time_Type_Definition, Unit); end Create_Unit; - Time_Fs_Name : Iir; Time_Fs_Unit: Iir_Unit_Declaration; Time_Ps_Unit: Iir_Unit_Declaration; Time_Ns_Unit: Iir_Unit_Declaration; @@ -798,10 +843,8 @@ package body Std_Package is Set_Type (Time_Fs_Unit, Time_Type_Definition); Set_Expr_Staticness (Time_Fs_Unit, Time_Staticness); Set_Name_Staticness (Time_Fs_Unit, Locally); - Time_Fs_Name := Iirs_Utils.Build_Simple_Name - (Time_Fs_Unit, Std_Location); Set_Physical_Unit_Value - (Time_Fs_Unit, Create_Std_Phys_Lit (1, Time_Fs_Name)); + (Time_Fs_Unit, Create_Std_Phys_Lit (1, Time_Fs_Unit)); Append (Last_Unit, Time_Type_Definition, Time_Fs_Unit); Create_Unit (Time_Ps_Unit, 1000, Time_Fs_Unit, Name_Ps); @@ -826,9 +869,9 @@ package body Std_Package is Create_Std_Iir (Iir_Kind_Physical_Subtype_Definition); Constraint := Create_Std_Range_Expr (Create_Std_Phys_Lit (Low_Bound (Flags.Flag_Time_64), - Time_Fs_Name), + Time_Fs_Unit), Create_Std_Phys_Lit (High_Bound (Flags.Flag_Time_64), - Time_Fs_Name), + Time_Fs_Unit), Time_Type_Definition); Set_Range_Constraint (Time_Subtype_Definition, Constraint); Set_Base_Type (Time_Subtype_Definition, Time_Type_Definition); @@ -844,6 +887,8 @@ package body Std_Package is Create_Std_Decl (Iir_Kind_Subtype_Declaration); Set_Std_Identifier (Time_Subtype_Declaration, Name_Time); Set_Type (Time_Subtype_Declaration, Time_Subtype_Definition); + Set_Subtype_Indication (Time_Subtype_Declaration, + Time_Subtype_Definition); Set_Type_Declarator (Time_Subtype_Definition, Time_Subtype_Declaration); Add_Decl (Time_Subtype_Declaration); @@ -881,9 +926,9 @@ package body Std_Package is (Delay_Length_Subtype_Definition, Create_Std_Type_Mark (Time_Subtype_Declaration)); Constraint := Create_Std_Range_Expr - (Create_Std_Phys_Lit (0, Time_Fs_Name), + (Create_Std_Phys_Lit (0, Time_Fs_Unit), Create_Std_Phys_Lit (High_Bound (Flags.Flag_Time_64), - Time_Fs_Name), + Time_Fs_Unit), Time_Type_Definition); Set_Range_Constraint (Delay_Length_Subtype_Definition, Constraint); Set_Base_Type @@ -1219,6 +1264,7 @@ package body Std_Package is Create_Wildcard_Type (Wildcard_Any_Access_Type, "any access type"); Error_Type := Iirs_Utils.Create_Error_Type (Wildcard_Any_Type); + Set_Error_Origin (Error_Type, Null_Iir); Create_Wildcard_Type (Error_Type, "unknown type"); end Create_Std_Standard_Package; end Std_Package; diff --git a/src/vhdl/translate/trans-chap2.adb b/src/vhdl/translate/trans-chap2.adb index 7222f2974..54c844aea 100644 --- a/src/vhdl/translate/trans-chap2.adb +++ b/src/vhdl/translate/trans-chap2.adb @@ -1212,7 +1212,8 @@ package body Trans.Chap2 is when Attr_None => Instantiate_Iir_Info (Get_Iir (N, F)); when Attr_Ref - | Attr_Forward_Ref => + | Attr_Forward_Ref + | Attr_Maybe_Forward_Ref => null; when Attr_Maybe_Ref => if not Get_Is_Ref (N) then @@ -1313,8 +1314,7 @@ package body Trans.Chap2 is -- package_instantiation_declaration procedure Instantiate_Info_Package (Inst : Iir) is - Spec : constant Iir := - Get_Named_Entity (Get_Uninstantiated_Package_Name (Inst)); + Spec : constant Iir := Get_Uninstantiated_Package_Decl (Inst); Pkg_Info : constant Ortho_Info_Acc := Get_Info (Spec); Info : Ortho_Info_Acc; begin @@ -1337,8 +1337,7 @@ package body Trans.Chap2 is procedure Translate_Package_Instantiation_Declaration (Inst : Iir) is - Spec : constant Iir := - Get_Named_Entity (Get_Uninstantiated_Package_Name (Inst)); + Spec : constant Iir := Get_Uninstantiated_Package_Decl (Inst); Pkg_Info : constant Ortho_Info_Acc := Get_Info (Spec); Info : Ortho_Info_Acc; Interface_List : O_Inter_List; @@ -1395,8 +1394,7 @@ package body Trans.Chap2 is procedure Elab_Package_Instantiation_Declaration (Inst : Iir) is - Spec : constant Iir := - Get_Named_Entity (Get_Uninstantiated_Package_Name (Inst)); + Spec : constant Iir := Get_Uninstantiated_Package_Decl (Inst); Pkg_Info : constant Ortho_Info_Acc := Get_Info (Spec); Info : constant Ortho_Info_Acc := Get_Info (Inst); Constr : O_Assoc_List; diff --git a/src/vhdl/translate/trans-chap4.adb b/src/vhdl/translate/trans-chap4.adb index 3fa188df4..e59e7945c 100644 --- a/src/vhdl/translate/trans-chap4.adb +++ b/src/vhdl/translate/trans-chap4.adb @@ -269,8 +269,7 @@ package body Trans.Chap4 is procedure Create_Package_Interface (Inter : Iir) is - Pkg : constant Iir := Get_Named_Entity - (Get_Uninstantiated_Package_Name (Inter)); + Pkg : constant Iir := Get_Uninstantiated_Package_Decl (Inter); Pkg_Info : constant Ortho_Info_Acc := Get_Info (Pkg); Info : Ortho_Info_Acc; begin diff --git a/src/vhdl/translate/trans-chap5.adb b/src/vhdl/translate/trans-chap5.adb index 7572032af..7a6bb0cfb 100644 --- a/src/vhdl/translate/trans-chap5.adb +++ b/src/vhdl/translate/trans-chap5.adb @@ -802,8 +802,8 @@ package body Trans.Chap5 is pragma Assert (Get_Kind (Formal) = Iir_Kind_Interface_Package_Declaration); declare - Uninst_Pkg : constant Iir := Get_Named_Entity - (Get_Uninstantiated_Package_Name (Formal)); + Uninst_Pkg : constant Iir := + Get_Uninstantiated_Package_Decl (Formal); Uninst_Info : constant Ortho_Info_Acc := Get_Info (Uninst_Pkg); Formal_Info : constant Ortho_Info_Acc := diff --git a/src/vhdl/translate/trans-chap7.adb b/src/vhdl/translate/trans-chap7.adb index 451dfcba6..c216e199d 100644 --- a/src/vhdl/translate/trans-chap7.adb +++ b/src/vhdl/translate/trans-chap7.adb @@ -3050,7 +3050,7 @@ package body Trans.Chap7 is Set_El (Get_Nth_Element (El_List, El_Index)); El_Index := El_Index + 1; when Iir_Kind_Choice_By_Name => - Set_El (Get_Choice_Name (Assoc)); + Set_El (Get_Named_Entity (Get_Choice_Name (Assoc))); El_Index := Natural'Last; when Iir_Kind_Choice_By_Others => for J in Set_Array'Range loop diff --git a/src/vhdl/translate/trans-chap8.adb b/src/vhdl/translate/trans-chap8.adb index c8f270174..296f4de7f 100644 --- a/src/vhdl/translate/trans-chap8.adb +++ b/src/vhdl/translate/trans-chap8.adb @@ -919,7 +919,7 @@ package body Trans.Chap8 is Elem := Get_Nth_Element (El_List, El_Index); El_Index := El_Index + 1; when Iir_Kind_Choice_By_Name => - Elem := Get_Choice_Name (Aggr_El); + Elem := Get_Named_Entity (Get_Choice_Name (Aggr_El)); when others => Error_Kind ("translate_variable_rec_aggr", Aggr_El); end case; @@ -3158,7 +3158,7 @@ package body Trans.Chap8 is and then (Get_Kind (Base_Formal) = Iir_Kind_Interface_Variable_Declaration) then - Formal_Type := Get_Type (Get_Formal (El)); + Formal_Type := Get_Type (Get_Named_Entity (Get_Formal (El))); Ftype_Info := Get_Info (Formal_Type); pragma Assert (Get_Interface_Kind (Base_Formal) = Mode_Value); @@ -3817,7 +3817,7 @@ package body Trans.Chap8 is Element := Get_Nth_Element (El_List, El_Index); El_Index := El_Index + 1; when Iir_Kind_Choice_By_Name => - Element := Get_Choice_Name (Aggr_El); + Element := Get_Named_Entity (Get_Choice_Name (Aggr_El)); El_Index := Natural'Last; when others => Error_Kind ("translate_signal_target_record_aggr", Aggr_El); diff --git a/src/vhdl/translate/trans-chap9.adb b/src/vhdl/translate/trans-chap9.adb index e3aad5f45..1dadfba4d 100644 --- a/src/vhdl/translate/trans-chap9.adb +++ b/src/vhdl/translate/trans-chap9.adb @@ -1154,7 +1154,8 @@ package body Trans.Chap9 is when Attr_None => Destroy_Types (Get_Iir (N, F)); when Attr_Ref - | Attr_Forward_Ref => + | Attr_Forward_Ref + | Attr_Maybe_Forward_Ref => null; when Attr_Maybe_Ref => if not Get_Is_Ref (N) then diff --git a/src/xtools/pnodes.py b/src/xtools/pnodes.py index fad0922be..ce37556ea 100755 --- a/src/xtools/pnodes.py +++ b/src/xtools/pnodes.py @@ -21,7 +21,7 @@ class FuncDesc: self.field = field self.conv = conv self.acc = acc # access: Chain, Chain_Next, Ref, Of_Ref, Maybe_Ref, - # Forward_Ref + # Forward_Ref, Maybe_Forward_Ref self.pname = pname # Parameter mame self.ptype = ptype # Parameter type self.rname = rname # value name (for procedure) @@ -231,7 +231,7 @@ def read_kinds(filename): funcs = [] pat_field = re.compile( ' -- Field: (\w+)' - + '( Of_Ref| Ref| Maybe_Ref| Forward_Ref| Chain_Next| Chain)?( .*)?\n') + + '( Of_Ref| Ref| Maybe_Ref| Forward_Ref| Maybe_Forward_Ref| Chain_Next| Chain)?( .*)?\n') pat_conv = re.compile('^ \((\w+)\)$') pat_func = \ re.compile(' function Get_(\w+) \((\w+) : (\w+)\) return (\w+);\n') @@ -666,7 +666,8 @@ elif args.action == 'meta_body': elif l == ' -- FIELDS_ARRAY': last = None nodes_types = [node_type, node_type + '_List'] - ref_names = ['Ref', 'Of_Ref', 'Maybe_Ref', 'Forward_Ref'] + ref_names = ['Ref', 'Of_Ref', 'Maybe_Ref', 'Forward_Ref', + 'Maybe_Forward_Ref'] for k in kinds: v = nodes[k] if last: @@ -675,6 +676,13 @@ elif args.action == 'meta_body': print ' -- ' + prefix_name + k if flag_keep_order: flds = v.order + elif True: + # first non Iir and no Iir_List + flds = sorted([fk for fk, fv in v.fields.items() \ + if fv and fv.rtype not in nodes_types]) + # Then Iir and Iir_List in order of appearance + flds += (fv for fv in v.order + if v.fields[fv].rtype in nodes_types) else: # Sort fields: first non Iir and non Iir_List, # then Iir and Iir_List that aren't references @@ -691,7 +699,8 @@ elif args.action == 'meta_body': flds += sorted([fk for fk, fv in v.fields.items() \ if fv and fv.rtype in nodes_types\ and fv.acc in ['Ref', 'Of_Ref', - 'Forward_Ref']]) + 'Forward_Ref', + 'Maybe_Forward_Ref']]) for fk in flds: if last: print last + ',' |