--  Extended locations for iir nodes
--  Copyright (C) 2017 Tristan Gingold
--
--  GHDL is free software; you can redistribute it and/or modify it under
--  the terms of the GNU General Public License as published by the Free
--  Software Foundation; either version 2, or (at your option) any later
--  version.
--
--  GHDL is distributed in the hope that it will be useful, but WITHOUT ANY
--  WARRANTY; without even the implied warranty of MERCHANTABILITY or
--  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
--  for more details.
--
--  You should have received a copy of the GNU General Public License
--  along with GHDL; see the file COPYING.  If not, write to the Free
--  Software Foundation, 59 Temple Place - Suite 330, Boston, MA
--  02111-1307, USA.

with Types; use Types;
with Iirs; use Iirs;

package Elocations is

   -- Start of Iir_Kind.

   -- Iir_Kind_Design_File (None)

   -- Iir_Kind_Design_Unit (None)

   -- Iir_Kind_Library_Clause (L1)
   --
   --   Get/Set_Start_Location (Field1)

   -- Iir_Kind_String_Literal8 (None)

   -- Iir_Kind_Integer_Literal (None)

   -- Iir_Kind_Floating_Point_Literal (None)

   -- Iir_Kind_Null_Literal (None)

   -- Iir_Kind_Physical_Int_Literal (None)
   -- Iir_Kind_Physical_Fp_Literal (None)

   -- Iir_Kind_Simple_Aggregate (None)

   -- Iir_Kind_Overflow_Literal (None)

   -- Iir_Kind_Unaffected_Waveform (None)

   -------------
   --  Tuples --
   -------------

   -- Iir_Kind_Association_Element_By_Expression (None)
   -- Iir_Kind_Association_Element_Open (None)
   -- Iir_Kind_Association_Element_By_Individual (None)
   -- Iir_Kind_Association_Element_Package (None)
   -- Iir_Kind_Association_Element_Type (None)
   -- Iir_Kind_Association_Element_Subprogram (None)

   -- Iir_Kind_Waveform_Element (None)

   -- Iir_Kind_Conditional_Waveform (None)

   -- Iir_Kind_Conditional_Expression (None)

   -- Iir_Kind_Choice_By_Others (None)
   -- Iir_Kind_Choice_By_None (None)
   -- Iir_Kind_Choice_By_Range (None)
   -- Iir_Kind_Choice_By_Name (None)
   -- Iir_Kind_Choice_By_Expression (None)

   -- Iir_Kind_Entity_Aspect_Entity (None)

   -- Iir_Kind_Entity_Aspect_Open (None)

   -- Iir_Kind_Entity_Aspect_Configuration (None)

   -- Iir_Kind_Block_Configuration (None)

   -- Iir_Kind_Binding_Indication (None)

   -- Iir_Kind_Component_Configuration (None)
   -- Iir_Kind_Configuration_Specification (None)

   -- Iir_Kind_Disconnection_Specification (None)

   -- Iir_Kind_Block_Header (L5)
   --
   --   Get/Set_Generic_Location (Field4)
   --
   --   Get/Set_Port_Location (Field5)
   --
   --   Get/Set_Generic_Map_Location (Field3)
   --
   --   Get/Set_Port_Map_Location (Field2)

   -- Iir_Kind_Entity_Class (None)

   -- Iir_Kind_Attribute_Specification (L1)
   --
   --   Get/Set_Start_Location (Field1)

   -- Iir_Kind_Attribute_Value (None)

   -- Iir_Kind_Psl_Expression (None)

   -- Iir_Kind_Signature (None)

   -- Iir_Kind_Overload_List (None)

   -------------------
   --  Declarations --
   -------------------

   -- Iir_Kind_Entity_Declaration (L5)
   --
   --   Get/Set_Start_Location (Field1)
   --
   --   Get/Set_End_Location (Field2)
   --
   --   Get/Set_Generic_Location (Field4)
   --
   --   Get/Set_Port_Location (Field5)
   --
   --   Get/Set_Begin_Location (Field3)

   -- Iir_Kind_Architecture_Body (L3)
   --   Get/Set_Start_Location (Field1)
   --
   --   Get/Set_End_Location (Field2)
   --
   --   Get/Set_Begin_Location (Field3)

   -- Iir_Kind_Configuration_Declaration (L2)
   --   Get/Set_Start_Location (Field1)
   --
   --   Get/Set_End_Location (Field2)

   -- Iir_Kind_Package_Header (L5)
   --
   --   Get/Set_Generic_Location (Field4)
   --
   --   Get/Set_Generic_Map_Location (Field3)

   -- Iir_Kind_Package_Declaration (L2)
   --
   --   Get/Set_Start_Location (Field1)
   --
   --   Get/Set_End_Location (Field2)

   -- Iir_Kind_Package_Body (L2)
   --
   --   Get/Set_Start_Location (Field1)
   --
   --   Get/Set_End_Location (Field2)

   -- Iir_Kind_Package_Instantiation_Declaration (L3)
   --
   --   Get/Set_Start_Location (Field1)
   --
   --  Correspond to the final ';'.
   --   Get/Set_End_Location (Field2)
   --
   --   Get/Set_Generic_Map_Location (Field3)

   -- Iir_Kind_Context_Declaration (L2)
   --
   --   Get/Set_Start_Location (Field1)
   --
   --   Get/Set_End_Location (Field2)

   -- Iir_Kind_Library_Declaration (None)

   -- Iir_Kind_Component_Declaration (L5)
   --
   --   Get/Set_Start_Location (Field1)
   --
   --   Get/Set_End_Location (Field2)
   --
   --   Get/Set_Generic_Location (Field4)
   --
   --   Get/Set_Port_Location (Field5)

   -- Iir_Kind_Object_Alias_Declaration (L1)
   --
   --   Get/Set_Start_Location (Field1)

   -- Iir_Kind_Non_Object_Alias_Declaration (None)

   -- Iir_Kind_Anonymous_Type_Declaration (L1)
   --
   --   Get/Set_Start_Location (Field1)

   -- Iir_Kind_Type_Declaration (L2)
   --
   --   Get/Set_Start_Location (Field1)
   --
   --   Get/Set_Is_Location (Field2)

   -- Iir_Kind_Subtype_Declaration (L2)
   --
   --   Get/Set_Start_Location (Field1)
   --
   --   Get/Set_Is_Location (Field2)

   -- Iir_Kind_Nature_Declaration (None)

   -- Iir_Kind_Subnature_Declaration (None)

   -- Iir_Kind_Interface_Signal_Declaration (L1)
   -- Iir_Kind_Interface_Constant_Declaration (L1)
   -- Iir_Kind_Interface_Variable_Declaration (L1)
   -- Iir_Kind_Interface_File_Declaration (L1)
   --
   --   Get/Set_Start_Location (Field1)

   -- Iir_Kind_Interface_Type_Declaration (L1)
   --
   --   Get/Set_Start_Location (Field1)

   -- Iir_Kind_Interface_Package_Declaration (L1)
   --
   --   Get/Set_Start_Location (Field1)

   -- Iir_Kind_Function_Declaration (L1)
   -- Iir_Kind_Procedure_Declaration (L1)
   --
   --   Get/Set_Start_Location (Field1)

   -- Iir_Kind_Function_Body (L3)
   -- Iir_Kind_Procedure_Body (L3)
   --
   --   Get/Set_Start_Location (Field1)
   --
   --   Get/Set_End_Location (Field2)
   --
   --   Get/Set_Begin_Location (Field3)

   -- Iir_Kind_Interface_Function_Declaration (None)
   -- Iir_Kind_Interface_Procedure_Declaration (None)

   -- Iir_Kind_Signal_Declaration (L1)
   --
   --   Get/Set_Start_Location (Field1)

   -- Iir_Kind_Guard_Signal_Declaration (None)

   -- Iir_Kind_Signal_Attribute_Declaration (None)

   -- Iir_Kind_Constant_Declaration (L1)
   -- Iir_Kind_Iterator_Declaration (L1)
   -- Iir_Kind_Variable_Declaration (L1)
   --
   --   Get/Set_Start_Location (Field1)

   -- Iir_Kind_File_Declaration (L1)
   --
   --   Get/Set_Start_Location (Field1)

   -- Iir_Kind_Element_Declaration (None)

   -- Iir_Kind_Record_Resolution (None)

   -- Iir_Kind_Record_Element_Constraint (None)

   -- Iir_Kind_Attribute_Declaration (L1)
   --
   --   Get/Set_Start_Location (Field1)

   -- Iir_Kind_Group_Template_Declaration (L1)
   --
   --   Get/Set_Start_Location (Field1)

   -- Iir_Kind_Group_Declaration (L1)
   --
   --   Get/Set_Start_Location (Field1)

   -- Iir_Kind_Psl_Endpoint_Declaration (None)

   -- Iir_Kind_Psl_Declaration (None)

   -- Iir_Kind_Terminal_Declaration (None)

   -- Iir_Kind_Free_Quantity_Declaration (None)

   -- Iir_Kind_Across_Quantity_Declaration (None)
   -- Iir_Kind_Through_Quantity_Declaration (None)

   -- Iir_Kind_Use_Clause (None)

   -- Iir_Kind_Context_Reference (None)

   -----------------------
   --  type definitions --
   -----------------------

   -- Iir_Kind_Enumeration_Type_Definition (None)

   -- Iir_Kind_Enumeration_Literal (None)

   -- Iir_Kind_Physical_Type_Definition (None)

   -- Iir_Kind_Unit_Declaration (None)

   -- Iir_Kind_Integer_Type_Definition (None)
   -- Iir_Kind_Floating_Type_Definition (None)

   -- Iir_Kind_Array_Type_Definition (None)

   -- Iir_Kind_Record_Type_Definition (L2)
   --
   --   Get/Set_Start_Location (Field1)
   --
   --   Get/Set_End_Location (Field2)

   -- Iir_Kind_Access_Type_Definition (None)

   -- Iir_Kind_File_Type_Definition (None)

   -- Iir_Kind_Incomplete_Type_Definition (None)

   -- Iir_Kind_Interface_Type_Definition (None)

   -- Iir_Kind_Protected_Type_Declaration (L2)
   --
   --   Get/Set_Start_Location (Field1)
   --
   --   Get/Set_End_Location (Field2)

   -- Iir_Kind_Protected_Type_Body (L2)
   --
   --   Get/Set_Start_Location (Field1)
   --
   --   Get/Set_End_Location (Field2)

   -- Iir_Kind_Wildcard_Type_Definition (None)

   --------------------------
   --  subtype definitions --
   --------------------------

   -- Iir_Kind_Enumeration_Subtype_Definition (None)
   -- Iir_Kind_Integer_Subtype_Definition (None)
   -- Iir_Kind_Physical_Subtype_Definition (None)

   -- Iir_Kind_Floating_Subtype_Definition (None)

   -- Iir_Kind_Access_Subtype_Definition (None)

   -- Iir_Kind_Array_Element_Resolution (None)

   -- Iir_Kind_Record_Element_Resolution (None)

   -- Iir_Kind_Record_Subtype_Definition (None)

   -- Iir_Kind_Array_Subtype_Definition (None)

   -- Iir_Kind_Range_Expression (None)

   -- Iir_Kind_Subtype_Definition (None)

   -------------------------
   --  Nature definitions --
   -------------------------

   -- Iir_Kind_Scalar_Nature_Definition (None)

   ----------------------------
   --  concurrent statements --
   ----------------------------

   -- Iir_Kind_Concurrent_Conditional_Signal_Assignment (L1)
   -- Iir_Kind_Concurrent_Selected_Signal_Assignment (L1)
   -- Iir_Kind_Concurrent_Simple_Signal_Assignment (L1)
   --
   --   Get/Set_Start_Location (Field1)

   -- Iir_Kind_Sensitized_Process_Statement (L3)
   -- Iir_Kind_Process_Statement (L3)
   --
   --   Get/Set_Start_Location (Field1)
   --
   --   Get/Set_End_Location (Field2)
   --
   --   Get/Set_Begin_Location (Field3)

   -- Iir_Kind_Concurrent_Assertion_Statement (None)

   -- Iir_Kind_Psl_Default_Clock (None)

   -- Iir_Kind_Psl_Assert_Statement (None)
   -- Iir_Kind_Psl_Cover_Statement (None)

   -- Iir_Kind_Component_Instantiation_Statement (L3)
   --
   --   Get/Set_Generic_Map_Location (Field3)
   --
   --   Get/Set_Port_Map_Location (Field2)

   -- Iir_Kind_Block_Statement (L3)
   --
   --   Get/Set_End_Location (Field2)
   --
   --   Get/Set_Begin_Location (Field3)

   -- Iir_Kind_Generate_Statement_Body (L3)
   --
   --   Get/Set_Start_Location (Field1)
   --
   --   Get/Set_End_Location (Field2)
   --
   --   Get/Set_Begin_Location (Field3)

   -- Iir_Kind_For_Generate_Statement (L3)
   --
   --   Get/Set_Start_Location (Field1)
   --
   --   Get/Set_End_Location (Field2)
   --
   --   Get/Set_Generate_Location (Field3)

   -- Iir_Kind_If_Generate_Else_Clause (L3)
   -- Iir_Kind_If_Generate_Statement (L3)
   --
   --   Get/Set_Start_Location (Field1)
   --
   --   Get/Set_End_Location (Field2)
   --
   --   Get/Set_Generate_Location (Field3)

   -- Iir_Kind_Case_Generate_Statement (None)

   -- Iir_Kind_Simple_Simultaneous_Statement (None)

   ----------------------------
   --  sequential statements --
   ----------------------------

   -- Iir_Kind_If_Statement (L3)
   -- Iir_Kind_Elsif (L3)
   --
   --  Location of 'if', 'else' or 'elsif'.
   --   Get/Set_Start_Location (Field1)
   --
   --  Location of the next 'elsif', 'else' or 'end if'.
   --   Get/Set_End_Location (Field2)
   --
   --   Get/Set_Then_Location (Field3)

   -- Iir_Kind_For_Loop_Statement (L3)
   -- Iir_Kind_While_Loop_Statement (L3)
   --
   --   Get/Set_Start_Location (Field1)
   --
   --   Get/Set_End_Location (Field2)
   --
   --   Get/Set_Loop_Location (Field3)

   -- Iir_Kind_Exit_Statement (None)
   -- Iir_Kind_Next_Statement (None)

   -- Iir_Kind_Simple_Signal_Assignment_Statement (None)
   -- Iir_Kind_Conditional_Signal_Assignment_Statement (None)
   -- Iir_Kind_Selected_Waveform_Assignment_Statement (None)

   -- Iir_Kind_Variable_Assignment_Statement (None)

   -- Iir_Kind_Conditional_Variable_Assignment_Statement (None)

   -- Iir_Kind_Assertion_Statement (None)

   -- Iir_Kind_Report_Statement (None)

   -- Iir_Kind_Wait_Statement (None)

   -- Iir_Kind_Return_Statement (None)

   -- Iir_Kind_Case_Statement (L2)
   --
   --   Get/Set_End_Location (Field2)

   -- Iir_Kind_Procedure_Call_Statement (None)
   -- Iir_Kind_Concurrent_Procedure_Call_Statement (None)

   -- Iir_Kind_Procedure_Call (None)

   -- Iir_Kind_Null_Statement (None)

   ----------------
   --  operators --
   ----------------

   -- Iir_Kinds_Monadic_Operator (None)

   -- Iir_Kinds_Dyadic_Operator (None)

   -- Iir_Kind_Function_Call (None)

   -- Iir_Kind_Aggregate (None)

   -- Iir_Kind_Aggregate_Info (None)

   -- Iir_Kind_Parenthesis_Expression (L1)
   --
   --   Get/Set_Right_Paren_Location (Field1)

   -- Iir_Kind_Qualified_Expression (None)

   -- Iir_Kind_Type_Conversion (None)

   -- Iir_Kind_Allocator_By_Expression (None)
   -- Iir_Kind_Allocator_By_Subtype (None)

   ------------
   --  Names --
   ------------

   -- Iir_Kind_Simple_Name (None)
   -- Iir_Kind_Character_Literal (None)

   -- Iir_Kind_Operator_Symbol (None)

   -- Iir_Kind_Reference_Name (None)

   -- Iir_Kind_Selected_Name (None)

   -- Iir_Kind_Selected_By_All_Name (None)

   -- Iir_Kind_Indexed_Name (None)

   -- Iir_Kind_Slice_Name (None)

   -- Iir_Kind_Parenthesis_Name (None)

   -- Iir_Kind_Selected_Element (None)

   -- Iir_Kind_Implicit_Dereference (None)
   -- Iir_Kind_Dereference (None)

   -- Iir_Kind_External_Constant_Name (None)
   -- Iir_Kind_External_Signal_Name (None)
   -- Iir_Kind_External_Variable_Name (None)

   -- Iir_Kind_Package_Pathname (None)

   -- Iir_Kind_Absolute_Pathname (None)

   -- Iir_Kind_Relative_Pathname (None)

   -- Iir_Kind_Pathname_Element (None)

   -----------------
   --  Attributes --
   -----------------

   -- Iir_Kind_Attribute_Name (None)

   -- Iir_Kind_Base_Attribute (None)
   -- Iir_Kind_Left_Type_Attribute (None)
   -- Iir_Kind_Right_Type_Attribute (None)
   -- Iir_Kind_High_Type_Attribute (None)
   -- Iir_Kind_Low_Type_Attribute (None)
   -- Iir_Kind_Ascending_Type_Attribute (None)

   -- Iir_Kind_Range_Array_Attribute (None)
   -- Iir_Kind_Reverse_Range_Array_Attribute (None)
   -- Iir_Kind_Left_Array_Attribute (None)
   -- Iir_Kind_Right_Array_Attribute (None)
   -- Iir_Kind_High_Array_Attribute (None)
   -- Iir_Kind_Low_Array_Attribute (None)
   -- Iir_Kind_Ascending_Array_Attribute (None)
   -- Iir_Kind_Length_Array_Attribute (None)

   -- Iir_Kind_Subtype_Attribute (None)
   -- Iir_Kind_Element_Attribute (None)

   -- Iir_Kind_Stable_Attribute (None)
   -- Iir_Kind_Delayed_Attribute (None)
   -- Iir_Kind_Quiet_Attribute (None)
   -- Iir_Kind_Transaction_Attribute (None)
   --  (Iir_Kinds_Signal_Attribute)

   -- Iir_Kind_Event_Attribute (None)
   -- Iir_Kind_Last_Event_Attribute (None)
   -- Iir_Kind_Last_Value_Attribute (None)
   -- Iir_Kind_Active_Attribute (None)
   -- Iir_Kind_Last_Active_Attribute (None)
   -- Iir_Kind_Driving_Attribute (None)
   -- Iir_Kind_Driving_Value_Attribute (None)

   -- Iir_Kind_Pos_Attribute (None)
   -- Iir_Kind_Val_Attribute (None)
   -- Iir_Kind_Succ_Attribute (None)
   -- Iir_Kind_Pred_Attribute (None)
   -- Iir_Kind_Leftof_Attribute (None)
   -- Iir_Kind_Rightof_Attribute (None)

   -- Iir_Kind_Image_Attribute (None)
   -- Iir_Kind_Value_Attribute (None)

   -- Iir_Kind_Simple_Name_Attribute (None)
   -- Iir_Kind_Instance_Name_Attribute (None)
   -- Iir_Kind_Path_Name_Attribute (None)

   -- Iir_Kind_Behavior_Attribute (None)
   -- Iir_Kind_Structure_Attribute (None)
   --  FIXME: to describe (None)

   -- Iir_Kind_Error (None)

   -- Iir_Kind_Unused (None)

   -- End of Iir_Kind.

   --  Allocate memory to store elocations for node N.  Must be called once.
   procedure Create_Elocations (N : Iir);

   -- General methods.

   --  Field: Field1
   function Get_Start_Location (N : Iir) return Location_Type;
   procedure Set_Start_Location (N : Iir; Loc : Location_Type);

   --  Field: Field1
   function Get_Right_Paren_Location (N : Iir) return Location_Type;
   procedure Set_Right_Paren_Location (N : Iir; Loc : Location_Type);

   --  Field: Field2
   function Get_End_Location (N : Iir) return Location_Type;
   procedure Set_End_Location (N : Iir; Loc : Location_Type);

   --  Field: Field2
   function Get_Is_Location (N : Iir) return Location_Type;
   procedure Set_Is_Location (N : Iir; Loc : Location_Type);

   --  Field: Field3
   function Get_Begin_Location (N : Iir) return Location_Type;
   procedure Set_Begin_Location (N : Iir; Loc : Location_Type);

   --  Field: Field3
   function Get_Then_Location (N : Iir) return Location_Type;
   procedure Set_Then_Location (N : Iir; Loc : Location_Type);

   --  Field: Field3
   function Get_Loop_Location (N : Iir) return Location_Type;
   procedure Set_Loop_Location (N : Iir; Loc : Location_Type);

   --  Field: Field3
   function Get_Generate_Location (N : Iir) return Location_Type;
   procedure Set_Generate_Location (N : Iir; Loc : Location_Type);

   --  Field: Field4
   function Get_Generic_Location (N : Iir) return Location_Type;
   procedure Set_Generic_Location (N : Iir; Loc : Location_Type);

   --  Field: Field5
   function Get_Port_Location (N : Iir) return Location_Type;
   procedure Set_Port_Location (N : Iir; Loc : Location_Type);

   --  Field: Field3
   function Get_Generic_Map_Location (N : Iir) return Location_Type;
   procedure Set_Generic_Map_Location (N : Iir; Loc : Location_Type);

   --  Field: Field2
   function Get_Port_Map_Location (N : Iir) return Location_Type;
   procedure Set_Port_Map_Location (N : Iir; Loc : Location_Type);
end Elocations;