--  Tree node definitions.
--  Copyright (C) 2002, 2003, 2004, 2005 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 Ada.Unchecked_Deallocation;
with Types; use Types;
with Tokens; use Tokens;
with Nodes;
with Lists;

package Iirs is
   --  This package defines the semantic tree and functions to handle it.
   --  The tree is roughly based on IIR (Internal Intermediate Representation),
   --  [AIRE/CE Advanced Intermediate Representation with Extensibility,
   --   Common Environment.  http://www.vhdl.org/aire/index.html [DEAD LINK] ]
   --  but oriented object features are not used, and sometimes, functions
   --  or fields have changed.

   --  Note: this tree is also used during syntaxic analysis, but with
   --  a little bit different meanings for the fields.
   --  The parser (parse package) build the tree.
   --  The semantic pass (sem, sem_expr, sem_name) transforms it into a
   --  semantic tree.

   --  Documentation:
   --  Only the semantic aspect is to be fully documented.
   --  The syntaxic aspect is only used between parse and sem.

   --  Each node of the tree is a record of type iir.  The record has only
   --  one discriminent, which contains the kind of the node.  There is
   --  currenlty no variant (but this can change, this is not public).

   --  The root of a semantic tree is a library_declaration.
   --  All the library_declarations are kept in a private list, held by
   --  package libraries.
   --  Exemple of a tree:
   --   library_declaration
   --   +-- design_file
   --       +-- design_unit
   --       |   +-- entity_declaration
   --       +-- design_unit
   --           +-- architecture_body
   --  ...

   --  Since the tree can represent all the libraries and their contents, it
   --  is not always loaded into memory.
   --  When a library is loaded, only library_declaration, design_file,
   --  design_unit and library_unit nodes are created.  When a design_unit is
   --  really loaded, the design_unit node is not replaced but modified (ie,
   --  access to this node are still valid).

   --  To add a new kind of node:
   --   the name should be of the form iir_kind_NAME
   --   add iir_kind_NAME in the definition of type iir_kind_type
   --   document the node below: grammar, methods.
   --   for each methods, add the name if the case statement in the body
   --     (this enables the methods)
   --   add an entry in disp_tree (debugging)
   --   handle this node in Errorout.Disp_Node

   --  Meta-grammar
   --  This file is processed by a tool to automatically generate the body, so
   --  it must follow a meta-grammar.
   --
   --  The low level representation is described in nodes.ads.
   --
   --  The literals for the nodes must be declared in this file like this:
   --   type Iir_Kind is
   --      (
   --       Iir_Kind_AAA,
   --   ...
   --       Iir_Kind_ZZZ
   --      );
   --  The tool doesn't check for uniqness as this is done by the compiler.
   --
   --  It is possible to declare ranges of kinds like this:
   --   subtype Iir_Kinds_RANGE is Iir_Kind range
   --     Iir_Kind_FIRST ..
   --   --Iir_Kind_MID
   --     Iir_Kind_LAST;
   --  Literals Iir_Kind_MID are optionnal (FIXME: make them required ?), but
   --  if present all the values between FIRST and LAST must be present.
   --
   --  The methods appear after the comment: '   -- General methods.'
   --  They have the following format:
   --    --  Field: FIELD ATTR (CONV)
   --   function Get_NAME (PNAME : PTYPE) return RTYPE;
   --   procedure Set_NAME (PNAME : PTYPE; RNAME : RTYPE);
   --  'FIELD' indicate which field of the node is used to store the value.
   --  ATTR is optional and if present must be one of:
   --     Ref: the field is a reference to an existing node
   --     Chain: the field contains a chain of nodes
   --     Chain_Next: the field contains the next element of a chain (present
   --      only on one field: Set/Get_Chain).
   --  ' (CONV)' is present if the type of the value (indicated by RTYPE) is
   --  different from the type of the field.  CONV can be either 'uc' or 'pos'.
   --  'uc' indicates an unchecked conversion while 'pos' a pos/val conversion.
   --
   --  Nodes content is described between '   -- Start of Iir_Kind.' and
   --  '   -- End of Iir_Kind.' like this:
   --   -- Iir_Kind_NODE1 (FORMAT1)
   --   -- Iir_Kind_NODE2 (FORMAT2)
   --   --
   --   --   Get/Set_NAME1 (FIELD1)
   --   --
   --   --   Get/Set_NAME2 (FIELD2)
   --   --   Get/Set_NAME3 (Alias FIELD2)
   --   --
   --   -- Only for Iir_Kind_NODE1:
   --   --   Get/Set_NAME4 (FIELD3)
   --  Severals nodes can be described at once; at least one must be described.
   --  Fields FIELD1, FIELD2, FIELD3 must be different, unless 'Alias ' is
   --  present.  The number of spaces is significant.  The 'Only for ' lines
   --  are optionnal and there may be severals of them.

   -------------------------------------------------
   -- General methods (can be used on all nodes): --
   -------------------------------------------------

   --  Create a node of kind KIND.
   --    function Create_Iir (Kind: Iir_Kind) return Iir;
   --
   --  Deallocate a node.  Deallocate fields that where allocated by
   --  create_iir.
   --   procedure Free_Iir (Target: in out Iir);
   --
   --  Get the kind of the iir.
   --  See below for the (public) list of kinds.
   --   function Get_Kind (An_Iir: Iir) return Iir_Kind;

   --  Get the location of the node: ie the current position in the source
   --  file when the node was created.  This is a little bit fuzzy.
   --
   --   procedure Set_Location (Target: in out Iir; Location: Location_Type);
   --   function Get_Location (Target: in out Iir) return Location_Type;
   --
   --  Copy a location from a node to another one.
   --   procedure Location_Copy (Target: in out Iir; Src: in Iir);

   --  The next line marks the start of the node description.
   -- Start of Iir_Kind.

   --------------------------------------------------
   --  A set of methods are associed with a kind.  --
   --------------------------------------------------

   -- Iir_Kind_Design_File (Medium)
   --  LRM93 11
   --  design_file ::= design_unit { design_unit }
   --
   --  The library containing this design file.
   --   Get/Set_Library (Field0)
   --   Get/Set_Parent (Alias Field0)
   --
   --   Get/Set_File_Dependence_List (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --  Time when the whole file has been analyzed.  This allows ordering
   --  analysis and detecting obsolete units across libraries.
   --   Get/Set_Analysis_Time_Stamp (Field3)
   --
   --   Get/Set_File_Checksum (Field4)
   --
   --  Get the chain of unit contained in the file.  This is a simply linked
   --  chain, but the tail is kept to speed-up appending operation.
   --   Get/Set_First_Design_Unit (Field5)
   --
   --   Get/Set_Last_Design_Unit (Field6)
   --
   --  Identifier for the design file file name and dirname.
   --   Get/Set_Design_File_Filename (Field12)
   --   Get/Set_Design_File_Directory (Field11)
   --
   --  Flag used during elaboration.  Set when the file was already seen.
   --   Get/Set_Elab_Flag (Flag3)

   -- Iir_Kind_Design_Unit (Medium)
   --  LRM93 11
   --  design_unit ::= context_clause library_unit
   --
   --  The design_file containing this design unit.
   --   Get/Set_Design_File (Field0)
   --   Get/Set_Parent (Alias Field0)
   --
   --  Get the chain of context clause.
   --   Get/Set_Context_Items (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --  This is a symbolic date, only used as a order of analysis of design
   --  units.
   --   Get/Set_Date (Field4)
   --
   --  Get/Set the library unit, which can be an entity, an architecture,
   --  a package, a package body or a configuration.
   --   Get/Set_Library_Unit (Field5)
   --
   --   Get/Set_End_Location (Field6)
   --
   --  Collision chain for units.
   --   Get/Set_Hash_Chain (Field7)
   --
   --  Get the list of design units that must be analysed before this unit.
   --  See LRM93 11.4 for the rules defining the order of analysis.
   --   Get/Set_Dependence_List (Field8)
   --
   --  FIXME: this field can be put in the library_unit, since it is only used
   --  when the units have been analyzed.
   --   Get/Set_Analysis_Checks_List (Field9)
   --
   --  Set the line and the offset in the line, only for the library manager.
   --  This is valid until the file is really loaded in memory.  On loading,
   --  location will contain all this informations.
   --   Get/Set_Design_Unit_Source_Pos (Field10)
   --
   --   Get/Set_Design_Unit_Source_Line (Field11)
   --
   --   Get/Set_Design_Unit_Source_Col (Field12)
   --
   --  Get/Set the date state, which indicates whether this design unit is in
   --  memory or not.
   --   Get/Set_Date_State (State1)
   --
   --  Flag used during elaboration.  Set when the file was already seen.
   --   Get/Set_Elab_Flag (Flag3)
   --
   --  Flags used during configuration
   --   Get/Set_Configuration_Mark_Flag (Flag4)
   --   Get/Set_Configuration_Done_Flag (Flag5)

   -- Iir_Kind_Library_Clause (Short)
   --
   --  LRM08 13.2 Design libraries
   --
   --  library_clause ::= LIBRARY logical_name_list ;
   --
   --  logical_name_list ::= logical_name { , logical_name }
   --
   --  logical_name ::= identifier
   --
   --  Note: a library_clause node is created for every logical_name.
   --  As a consequence, the scope of the library starts after the logical_name
   --  and not after the library_clause.  However, since an identifier
   --  can only be used as a logical_name, and since the second occurence has
   --  no effect, this is correct.
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Library_Declaration (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Has_Identifier_List (Flag3)

   ---------------
   --  Literals --
   ---------------

   -- 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)
   --
   --  Same as Type, but marked as property of that node.
   --   Get/Set_Literal_Subtype (Field3)
   --
   --  Number of literals in the expanded string.
   --   Get/Set_String_Length (Field4)
   --
   --   Get/Set_String8_Id (Field5)
   --
   --  Base of the bit_string (corresponds to letters 'b', 'o', 'd' or 'x' in
   --  the base specifier).
   --   Get/Set_Bit_String_Base (Odigit1)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --  True if the bit string is signed, (ie letter 's' is present in the base
   --  specifier).
   --   Get/Set_Has_Signed (Flag1)
   --
   --  True if the letter 'u' is present in the base specifier.
   --   Get/Set_Has_Sign (Flag2)
   --
   --  True if the integer specifying the length is present.
   --   Get/Set_Has_Length (Flag3)

   -- 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_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_Expr_Staticness (State1)

   -- Iir_Kind_Null_Literal (Short)
   --  The null literal, which can be a disconnection or a null access.
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Expr_Staticness (State1)

   -- 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)
   --
   --  Must be set to locally except for time literal, which is globally.
   --   Get/Set_Expr_Staticness (State1)
   --
   -- Only for Iir_Kind_Physical_Int_Literal:
   --  The multiplicand.
   --   Get/Set_Value (Int64)
   --
   -- Only for Iir_Kind_Physical_Fp_Literal:
   --  The multiplicand.
   --   Get/Set_Fp_Value (Fp64)

   -- Iir_Kind_Simple_Aggregate (Short)
   --  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)
   --
   --  List of elements
   --   Get/Set_Simple_Aggregate_List (Field4)
   --
   --   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_Expr_Staticness (State1)

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

   -- Iir_Kind_Association_Element_By_Expression (Short)
   -- Iir_Kind_Association_Element_Open (Short)
   -- Iir_Kind_Association_Element_By_Individual (Short)
   -- Iir_Kind_Association_Element_Package (Short)
   --  These are used for association element of an association list with
   --  an interface (ie subprogram call, port map, generic map).
   --
   --   Get/Set_Formal (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   -- Only for Iir_Kind_Association_Element_By_Expression:
   -- Only for Iir_Kind_Association_Element_Package:
   --   Get/Set_Actual (Field3)
   --
   -- Only for Iir_Kind_Association_Element_By_Individual:
   --   Get/Set_Actual_Type (Field3)
   --
   -- Only for Iir_Kind_Association_Element_By_Individual:
   --  Must be Locally unless there is an error on one choice.
   --   Get/Set_Choice_Staticness (State2)
   --
   -- Only for Iir_Kind_Association_Element_By_Individual:
   --   Get/Set_Individual_Association_Chain (Field4)
   --
   -- Only for Iir_Kind_Association_Element_Package:
   --   Get/Set_Associated_Interface (Field4)
   --
   --  A function call or a type conversion for the association.
   --  FIXME: should be a name ?
   -- Only for Iir_Kind_Association_Element_By_Expression:
   --   Get/Set_In_Conversion (Field4)
   --
   -- Only for Iir_Kind_Association_Element_By_Expression:
   --   Get/Set_Out_Conversion (Field5)
   --
   --  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)
   --
   --   Get/Set_Collapse_Signal_Flag (Flag2)
   --
   -- Only for Iir_Kind_Association_Element_Open:
   --   Get/Set_Artificial_Flag (Flag3)

   -- Iir_Kind_Waveform_Element (Short)
   --
   --   Get/Set_We_Value (Field1)
   --
   --   Get/Set_Time (Field3)
   --
   --   Get/Set_Chain (Field2)

   -- Iir_Kind_Conditional_Waveform (Short)
   --
   --   Get/Set_Condition (Field1)
   --
   --   Get/Set_Waveform_Chain (Field5)
   --
   --   Get/Set_Chain (Field2)

   -- Iir_Kind_Conditional_Expression (Short)
   --  LRM08 10.5.3
   --  conditional_expressions ::=
   --      expression WHEN condition
   --    { ELSE expression WHEN condition }
   --    [ ELSE expression ]
   --
   --   Get/Set_Condition (Field1)
   --
   --   Get/Set_Expression (Field5)
   --
   --   Get/Set_Chain (Field2)

   -- Iir_Kind_Choice_By_Others (Short)
   -- Iir_Kind_Choice_By_None (Short)
   -- Iir_Kind_Choice_By_Range (Short)
   -- Iir_Kind_Choice_By_Name (Short)
   -- Iir_Kind_Choice_By_Expression (Short)
   --  (Iir_Kinds_Choice)
   --
   --   Get/Set_Parent (Field0)
   --
   --  For a list of choices, only the first one is associated, the following
   --  associations have the same_alternative_flag set.
   --   Get/Set_Chain (Field2)
   --
   --  These are elements of an choice chain, which is used for
   --  case_statement, concurrent_select_signal_assignment, aggregates.
   --
   --  Get/Set what is associated with the choice.  There are two different
   --  nodes, one for simple association and the other for chain association.
   --  They don't have the same properties (normal vs chain), so the right
   --  field must be selected according to the property to have working
   --  walkers. Both fields are never used at the same time.
   --
   --  For:
   --  * an expression for an aggregate
   --  * an individual association
   --  * a generate_statement_body chain for a case_generate_statement
   --   Get/Set_Associated_Expr (Field3)
   --   Get/Set_Associated_Block (Alias Field3)
   --
   --  For
   --  * a waveform_chain for a concurrent_select_signal_assignment,
   --  * a sequential statement chain for a case_statement.
   --   Get/Set_Associated_Chain (Field4)
   --
   -- Only for Iir_Kind_Choice_By_Name:
   --   Get/Set_Choice_Name (Field5)
   --
   -- Only for Iir_Kind_Choice_By_Expression:
   --   Get/Set_Choice_Expression (Field5)
   --
   -- Only for Iir_Kind_Choice_By_Range:
   --   Get/Set_Choice_Range (Field5)
   --
   --   Get/Set_Same_Alternative_Flag (Flag1)
   --
   -- Only for Iir_Kind_Choice_By_Range:
   -- Only for Iir_Kind_Choice_By_Expression:
   --   Get/Set_Choice_Staticness (State2)

   -- Iir_Kind_Entity_Aspect_Entity (Short)
   --
   --   Get/Set_Entity_Name (Field2)
   --
   --  parse: a simple name.
   --  sem: an architecture declaration or NULL_IIR.
   --   Get/Set_Architecture (Field3)

   -- Iir_Kind_Entity_Aspect_Open (Short)

   -- Iir_Kind_Entity_Aspect_Configuration (Short)
   --
   --   Get/Set_Configuration_Name (Field1)

   -- Iir_Kind_Block_Configuration (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --  Only use_clause are allowed here.
   --   Get/Set_Declaration_Chain (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Configuration_Item_Chain (Field3)
   --
   --  Single linked list of block configuration that apply to the same
   --  for scheme generate block.
   --   Get/Set_Prev_Block_Configuration (Field4)
   --
   --  Note: for default block configurations of iterative generate statement,
   --  the block specification is an indexed_name, whose index_list is others.
   --  The name designates either a block statement or a generate statement
   --  body.
   --   Get/Set_Block_Specification (Field5)

   -- Iir_Kind_Binding_Indication (Medium)
   --
   --   Get/Set_Default_Entity_Aspect (Field1)
   --
   --  The entity aspect.
   --  It is a iir_kind_entity_aspect_entity, iir_kind_entity_aspect_open or
   --  iir_kind_entity_aspect_configuration.  This may be transformed into a
   --  declaration by semantic.
   --   Get/Set_Entity_Aspect (Field3)
   --
   --   Get/Set_Default_Generic_Map_Aspect_Chain (Field6)
   --
   --   Get/Set_Default_Port_Map_Aspect_Chain (Field7)
   --
   --   Get/Set_Generic_Map_Aspect_Chain (Field8)
   --
   --   Get/Set_Port_Map_Aspect_Chain (Field9)

   -- Iir_Kind_Component_Configuration (Short)
   -- Iir_Kind_Configuration_Specification (Short)
   --
   --  LRM08 7.3 Configuration specification
   --
   --  configuration_specification ::=
   --     simple_configuration_specification
   --   | compound_configuration_specification
   --
   --  simple_configuration_specification ::=
   --     FOR component_specification binding_indication ;
   --     [ END FOR ; ]
   --
   --  compound_configuration_specification ::=
   --     FOR component_specification binding_indication ;
   --        verification_unit_binding_indication ;
   --        { verification_unit_binding_indication ; }
   --     END FOR ;
   --
   --  component_specification ::=
   --     instantiation_list : component_name
   --
   --  instantiation_list ::=
   --     instantiation_label { , instantiation_label }
   --   | OTHERS
   --   | ALL
   --
   --  The declaration containing this type declaration.
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Component_Name (Field4)
   --
   --  Must be one of designator_list, designator_by_others or
   --  designator_by_all.
   --   Get/Set_Instantiation_List (Field1)
   --
   -- Only for Iir_Kind_Component_Configuration:
   --   Get/Set_Block_Configuration (Field5)
   --
   --   Get/Set_Binding_Indication (Field3)
   --
   --   Get/Set_Chain (Field2)

   -- Iir_Kind_Disconnection_Specification (Short)
   --
   --  LRM08 7.4 Disconnection specification
   --
   --  disconnection_specification ::=
   --    DISCONNECT guarded_signal_specification AFTER time_expression ;
   --
   --  guarded_signal_specification ::=
   --    guarded_signal_list : type_mark
   --
   --  signal_list ::=
   --       signal_name { , signal_name }
   --     | OTHERS
   --     | ALL
   --
   --  The declaration containing this type declaration.
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Signal_List (Field3)
   --
   --   Get/Set_Type_Mark (Field4)
   --
   --   Get/Set_Expression (Field5)

   -- Iir_Kind_Block_Header (Medium)
   --
   --   Get/Set_Generic_Chain (Field6)
   --
   --   Get/Set_Port_Chain (Field7)
   --
   --   Get/Set_Generic_Map_Aspect_Chain (Field8)
   --
   --   Get/Set_Port_Map_Aspect_Chain (Field9)

   -- Iir_Kind_Entity_Class (Short)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Entity_Class (Field3)

   -- Iir_Kind_Attribute_Specification (Medium)
   --
   --  LRM08 7.2 Attribute specification
   --
   --  attribute_specification ::=
   --     ATTRIBUTE attribute_designator OF entity_specification
   --        IS expression ;
   --
   --  entity_specification ::= entity_name_list : entity_class
   --
   --  entity_name_list ::=
   --       entity_designator { , entity_designator }
   --     | OTHERS
   --     | ALL
   --
   --  entity_designator ::= entity_tag [ signature ]
   --
   --  entity_tag ::= simple_name | character_literal | operator_symbol
   --
   --  LRM08 8.6 Attribute names
   --
   --  attribute_designator ::= /attribute/_simple_name
   --
   --   Get/Set_Parent (Field0)
   --
   --  The type can be constrained due to the expression.
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Entity_Class (Field3)
   --
   --   Get/Set_Attribute_Value_Spec_Chain (Field4)
   --
   --   Get/Set_Expression (Field5)
   --
   --  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
   --  entity, marking the entity as decorated by the attribute.
   --  This node is built only by sem.
   --  In fact, the node is member of the chain of attribute of an entity, and
   --  of the chain of entity of the attribute specification.
   --  This makes elaboration (and more precisely, expression evaluation)
   --  easier.
   --
   --   Get/Set_Spec_Chain (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Designated_Entity (Field3)
   --
   --   Get/Set_Attribute_Specification (Field4)
   --
   --   Get/Set_Base_Name (Field5)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Psl_Expression (Short)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Psl_Expression (Field3)

   -- Iir_Kind_Signature (Medium)
   --
   --  LRM08 4.5.3 Signatures
   --
   --  signature ::= '[' [ type_mark { , type_mark } ] [ RETURN type_mark ] ']'
   --
   --   Get/Set_Signature_Prefix (Field1)
   --
   --   Get/Set_Type_Marks_List (Field2)
   --
   --   Get/Set_Return_Type_Mark (Field8)

   -- Iir_Kind_Overload_List (Short)
   --
   --   Get/Set_Overload_List (Field1)

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

   -- Iir_Kind_Entity_Declaration (Medium)
   --
   --   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_Visible_Flag (Flag4)
   --
   --   Get/Set_Is_Within_Flag (Flag5)
   --
   --   Get/Set_End_Has_Reserved_Id (Flag8)
   --
   --   Get/Set_End_Has_Identifier (Flag9)
   --
   --   Get/Set_Has_Begin (Flag10)

   -- Iir_Kind_Architecture_Body (Medium)
   --
   --   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_Attribute_Value_Chain (Field4)
   --
   --   Get/Set_Concurrent_Statement_Chain (Field5)
   --
   --  The default configuration created by canon.  This is a design unit.
   --   Get/Set_Default_Configuration_Declaration (Field6)
   --
   --   Get/Set_Foreign_Flag (Flag3)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Is_Within_Flag (Flag5)
   --
   --   Get/Set_End_Has_Reserved_Id (Flag8)
   --
   --   Get/Set_End_Has_Identifier (Flag9)

   -- Iir_Kind_Configuration_Declaration (Short)
   --
   --   Get/Set_Parent (Field0)
   --   Get/Set_Design_Unit (Alias Field0)
   --
   --   Get/Set_Declaration_Chain (Field1)
   --
   --  Name of the entity of a configuration.
   --   Get/Set_Entity_Name (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Attribute_Value_Chain (Field4)
   --
   --   Get/Set_Block_Configuration (Field5)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_End_Has_Reserved_Id (Flag8)
   --
   --   Get/Set_End_Has_Identifier (Flag9)

   -- Iir_Kind_Package_Header (Medium)
   --
   --   Get/Set_Generic_Chain (Field6)
   --
   --   Get/Set_Generic_Map_Aspect_Chain (Field8)

   -- Iir_Kind_Package_Declaration (Short)
   --
   --   Get/Set_Parent (Field0)
   --   Get/Set_Design_Unit (Alias Field0)
   --
   --   Get/Set_Declaration_Chain (Field1)
   --
   --   Get/Set_Package_Body (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Attribute_Value_Chain (Field4)
   --
   --   Get/Set_Package_Header (Field5)
   --
   --   Get/Set_Need_Body (Flag1)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_End_Has_Reserved_Id (Flag8)
   --
   --   Get/Set_End_Has_Identifier (Flag9)

   -- Iir_Kind_Package_Body (Short)
   --  Note: a body is not a declaration, that's the reason why there is no
   --  _declaration suffix in the name.
   --
   --   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)
   --
   --  The corresponding package declaration.
   --   Get/Set_Package (Field5)
   --
   --   Get/Set_End_Has_Reserved_Id (Flag8)
   --
   --   Get/Set_End_Has_Identifier (Flag9)

   -- Iir_Kind_Package_Instantiation_Declaration (Medium)
   --
   --   Get/Set_Parent (Field0)
   --   Get/Set_Design_Unit (Alias Field0)
   --
   --   Get/Set_Declaration_Chain (Field1)
   --
   --   Get/Set_Package_Body (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Attribute_Value_Chain (Field4)
   --
   --   Get/Set_Uninstantiated_Package_Name (Field5)
   --
   --   Get/Set_Generic_Chain (Field6)
   --
   --   Get/Set_Generic_Map_Aspect_Chain (Field8)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_End_Has_Reserved_Id (Flag8)
   --
   --   Get/Set_End_Has_Identifier (Flag9)

   -- Iir_Kind_Context_Declaration (Short)
   --
   --   Get/Set_Parent (Field0)
   --   Get/Set_Design_Unit (Alias Field0)
   --
   --  Get the chain of context clause.
   --   Get/Set_Context_Items (Field1)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_End_Has_Reserved_Id (Flag8)
   --
   --   Get/Set_End_Has_Identifier (Flag9)

   -- Iir_Kind_Library_Declaration (Short)
   --
   --  Design files in the library.
   --   Get/Set_Design_File_Chain (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --  This node is used to contain all a library.  Only internaly used.
   --  Name (identifier) of the library.
   --   Get/Set_Identifier (Field3)
   --
   --  Most recent date in this library.
   --   Get/Set_Date (Field4)
   --
   --   Get/Set_Library_Directory (Field5)
   --
   --  Used to compute dependences.
   --   Get/Set_Elab_Flag (Flag3)
   --
   --   Get/Set_Visible_Flag (Flag4)

   -- Iir_Kind_Component_Declaration (Medium)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Generic_Chain (Field6)
   --
   --   Get/Set_Port_Chain (Field7)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Use_Flag (Flag6)
   --
   --   Get/Set_Has_Is (Flag7)
   --
   --   Get/Set_End_Has_Reserved_Id (Flag8)
   --
   --   Get/Set_End_Has_Identifier (Flag9)

   --  LRM08 6.6 Alias declarations
   --
   --  alias_declaration ::=
   --     ALIAS alias_designator [ : subtype_indication ] IS
   --        name [ signature ] ;
   --
   --  alias_designator ::= identifier | character_literal | operator_symbol
   --
   --  Object aliases and non-object aliases are represented by two different
   --  nodes, as their semantic is different.  The parser only creates object
   --  alias declaration nodes, but sem_decl replaces the node for non-object
   --  alias declarations.

   -- Iir_Kind_Object_Alias_Declaration (Short)
   --
   --   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_Name (Field4)
   --
   --  The subtype indication may not be present.
   --   Get/Set_Subtype_Indication (Field5)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_After_Drivers_Flag (Flag5)
   --
   --   Get/Set_Use_Flag (Flag6)
   --
   --   Get/Set_Is_Ref (Flag7)

   -- Iir_Kind_Non_Object_Alias_Declaration (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Name (Field4)
   --
   --   Get/Set_Alias_Signature (Field5)
   --
   --  Set when the alias was implicitely created (by Sem) because of an
   --  explicit alias of a type.
   --   Get/Set_Implicit_Alias_Flag (Flag1)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Use_Flag (Flag6)

   -- Iir_Kind_Anonymous_Type_Declaration (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Type_Definition (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --  Used for informative purpose only.
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Subtype_Definition (Field4)

   -- Iir_Kind_Type_Declaration (Short)
   --
   --  LRM08 6.3 Type declarations
   --
   --  type_declaration ::=
   --       full_type_declaration
   --     | incomplete_type_declaration
   --
   --  full_type_declaration ::=
   --     TYPE identifier IS type_definition ;
   --
   --  type_definition ::=
   --       scalar_type_definition
   --     | composite_type_definition
   --     | access_type_definition
   --     | file_type_definition
   --     | protected_type_definition
   --
   --  LRM08 5.4.2 Incomplete type declarations
   --
   --  incomplete_type_declaration ::=
   --       TYPE identifier ;
   --
   --   Get/Set_Parent (Field0)
   --
   --  Definition of the type.
   --  Note: the type definition can be a real type (unconstrained array,
   --  enumeration, file, record, access) or a subtype (integer, floating
   --  point).
   --  The parser set this field to null_iir for an incomplete type
   --  declaration.  This field is set to an incomplete_type_definition node
   --  when first analyzed.
   --   Get/Set_Type_Definition (Field1)
   --   Get/Set_Type (Alias Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Use_Flag (Flag6)

   -- Iir_Kind_Subtype_Declaration (Short)
   --
   --  LRM08 6.3 Subtype declarations
   --
   --  subtype_declaration ::=
   --     SUBTYPE identifier IS subtype_indication ;
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Subtype_Indication (Field5)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Use_Flag (Flag6)
   --
   --   Get/Set_Is_Ref (Flag7)

   -- Iir_Kind_Nature_Declaration (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Nature (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Use_Flag (Flag6)

   -- Iir_Kind_Subnature_Declaration (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Nature (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Use_Flag (Flag6)

   -- Iir_Kind_Interface_Signal_Declaration (Short)
   -- Iir_Kind_Interface_Constant_Declaration (Short)
   -- Iir_Kind_Interface_Variable_Declaration (Short)
   -- Iir_Kind_Interface_File_Declaration (Short)
   --
   --  Get/Set the parent of an interface declaration.
   --  The parent is an entity declaration, a subprogram specification, a
   --  component declaration, a loop statement, a block declaration or ??
   --  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)
   --
   --  Must always be null_iir for iir_kind_interface_file_declaration.
   --   Get/Set_Default_Value (Field4)
   --
   --   Get/Set_Subtype_Indication (Field5)
   --
   --   Get/Set_Mode (Odigit1)
   --
   -- Only for Iir_Kind_Interface_Signal_Declaration:
   --   Get/Set_Has_Disconnect_Flag (Flag1)
   --
   -- Only for Iir_Kind_Interface_Signal_Declaration:
   --   Get/Set_Has_Active_Flag (Flag2)
   --
   --   Get/Set_Has_Identifier_List (Flag3)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_After_Drivers_Flag (Flag5)
   --
   --   Get/Set_Use_Flag (Flag6)
   --
   --   Get/Set_Is_Ref (Flag7)
   --
   -- Only for Iir_Kind_Interface_Signal_Declaration:
   --   Get/Set_Guarded_Signal_Flag (Flag8)
   --
   -- Only for Iir_Kind_Interface_Signal_Declaration:
   --   Get/Set_Signal_Kind (Flag9)
   --
   --   Get/Set_Has_Mode (Flag10)
   --
   --   Get/Set_Has_Class (Flag11)
   --
   -- Only for Iir_Kind_Interface_Signal_Declaration:
   --   Get/Set_Open_Flag (Flag12)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Interface_Package_Declaration (Medium)
   --
   --  LRM08 6.5.5 Interface package declarations
   --
   --  interface_package_declaration ::=
   --     PACKAGE identifier IS NEW /uninstantiated_package/_name
   --        interface_package_generic_map_aspect
   --
   --  interface_package_generic_map_aspect ::=
   --       generic_map_aspect
   --     | GENERIC MAP ( <> )                  --  Represented by Null_Iir
   --     | GENERIC MAP ( DEFAULT )             --  Not yet implemented
   --
   --   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 (Field5)
   --
   --   Get/Set_Generic_Chain (Field6)
   --
   --   Get/Set_Generic_Map_Aspect_Chain (Field8)
   --
   --   Get/Set_Visible_Flag (Flag4)

   -- Iir_Kind_Function_Declaration (Medium)
   -- Iir_Kind_Procedure_Declaration (Medium)
   --
   --  LRM08 4.2 Subprogram declarations
   --
   --  subprogram_declaration ::= subprogram_specification ;
   --
   --  subprogram_specification ::=
   --     procedure_specification | function_specification
   --
   --  procedure_specification ::=
   --     PROCEDURE designator
   --        subprogram_header
   --        [ [ PARAMETER ] ( formal_parameter_list ) ]
   --
   --  function_specification ::=
   --     [ PURE | IMPURE ] FUNCTION designator
   --        subprogram_header
   --        [ [ PARAMETER ] ( formal_parameter_list ) ] return type_mark
   --
   --  designator ::= identifier | operator_symbol
   --
   --  operator_symbol ::= string_literal
   --
   --  Note: the subprogram specification of a body is kept, but should be
   --  ignored if there is a subprogram declaration.  The function
   --  Is_Second_Subprogram_Specification returns True on such specification.
   --
   --  The declaration containing this subrogram declaration.
   --   Get/Set_Parent (Field0)
   --
   -- Only for Iir_Kind_Function_Declaration:
   --   Get/Set_Return_Type (Field1)
   --
   -- Only for Iir_Kind_Function_Declaration:
   --   Get/Set_Type (Alias Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   -- For string, the identifier is the corresponding reserved word.
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Subprogram_Hash (Field4)
   --
   --   Get/Set_Interface_Declaration_Chain (Field5)
   --
   --   Get/Set_Generic_Chain (Field6)
   --
   --   --Get/Set_Generic_Map_Aspect_Chain (Field8)
   --
   --   Get/Set_Implicit_Definition (Field7)
   --
   --   Get/Set_Return_Type_Mark (Field8)
   --
   --   Get/Set_Subprogram_Body (Field9)
   --
   --   Get/Set_Subprogram_Depth (Field10)
   --
   --   Get/Set_Overload_Number (Field12)
   --
   --   Get/Set_Seen_Flag (Flag1)
   --
   -- Only for Iir_Kind_Function_Declaration:
   --   Get/Set_Pure_Flag (Flag2)
   --
   -- Only for Iir_Kind_Procedure_Declaration:
   --   Get/Set_Passive_Flag (Flag2)
   --
   --   Get/Set_Foreign_Flag (Flag3)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Is_Within_Flag (Flag5)
   --
   --   Get/Set_Use_Flag (Flag6)
   --
   -- Only for Iir_Kind_Function_Declaration:
   --   Get/Set_Resolution_Function_Flag (Flag7)
   --
   -- Only for Iir_Kind_Function_Declaration:
   --   Get/Set_Has_Pure (Flag8)
   --
   --  True is the specification is immediately followed by a body.
   --   Get/Set_Has_Body (Flag9)
   --
   -- Only for Iir_Kind_Procedure_Declaration:
   --   Get/Set_Suspend_Flag (Flag11)
   --
   -- For an explicit subprogram: true if the declaration is an homograph of
   -- an implicit operation of a type.
   --   Get/Set_Hide_Implicit_Flag (Flag12)
   --
   --   Get/Set_Wait_State (State1)
   --
   -- Only for Iir_Kind_Procedure_Declaration:
   --   Get/Set_Purity_State (State2)
   --
   --   Get/Set_All_Sensitized_State (State3)

   -- Iir_Kind_Function_Body (Medium)
   -- Iir_Kind_Procedure_Body (Medium)
   --
   --  LRM08 4.3 Subprogram bodies
   --
   --  subprogram_body ::=
   --     subprogram_specification IS
   --        subprogram_declarative_part
   --     BEGIN
   --        subprogram_statement_part
   --     END [ subprogram_kind ] [ designator ] ;
   --
   --  subprogram_kind ::= PROCEDURE | FUNCTION
   --
   --   Get/Set_Parent (Field0)
   --
   --  The parse stage always puts a declaration before a body.
   --  Sem will remove the declaration if there is a forward declaration.
   --
   --   Get/Set_Declaration_Chain (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Impure_Depth (Field3)
   --
   --   Get/Set_Attribute_Value_Chain (Field4)
   --
   --   Get/Set_Sequential_Statement_Chain (Field5)
   --
   --   Get/Set_Subprogram_Specification (Field6)
   --
   --   Get/Set_Callees_List (Field7)
   --
   --   Get/Set_End_Has_Reserved_Id (Flag8)
   --
   --   Get/Set_End_Has_Identifier (Flag9)
   --
   -- Only for Iir_Kind_Procedure_Body:
   --   Get/Set_Suspend_Flag (Flag11)

   -- Iir_Kind_Signal_Declaration (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Default_Value (Field4)
   --
   --   Get/Set_Subtype_Indication (Field5)
   --
   --  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
   --  driver.  This is used to catch at analyse time unresolved signals with
   --  several drivers.
   --  -- Get/Set_Signal_Driver (Field7)
   --
   --   Get/Set_Has_Disconnect_Flag (Flag1)
   --
   --   Get/Set_Has_Active_Flag (Flag2)
   --
   --   Get/Set_Has_Identifier_List (Flag3)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_After_Drivers_Flag (Flag5)
   --
   --   Get/Set_Use_Flag (Flag6)
   --
   --   Get/Set_Is_Ref (Flag7)
   --
   --   Get/Set_Guarded_Signal_Flag (Flag8)
   --
   --   Get/Set_Signal_Kind (Flag9)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Guard_Signal_Declaration (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Guard_Expression (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Guard_Sensitivity_List (Field4)
   --
   --   Get/Set_Block_Statement (Field5)
   --
   --   Get/Set_Has_Active_Flag (Flag2)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Use_Flag (Flag6)
   --
   --   Get/Set_Guarded_Signal_Flag (Flag8)
   --
   --   Get/Set_Signal_Kind (Flag9)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Constant_Declaration (Medium)
   -- Iir_Kind_Iterator_Declaration (Medium)
   --
   --   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)
   --
   -- Only for Iir_Kind_Iterator_Declaration:
   --   Get/Set_Discrete_Range (Field6)
   --
   -- Only for Iir_Kind_Constant_Declaration:
   --  Summary:
   --  |  constant C1 : integer;        -- Deferred declaration (in a package)
   --  |  constant C2 : integer := 4;   -- Declaration
   --  |  constant C1 : integer := 3;   -- Full declaration (in a body)
   --  | NAME   Deferred_declaration  Deferred_declaration_flag
   --  |  C1      Null_iir or C1' (*)     True
   --  |  C2      Null_Iir                False
   --  |  C1'     C1                      False
   --  |(*): Deferred_declaration is Null_Iir as long as the full declaration
   --  |   has not been analyzed.
   --   Get/Set_Deferred_Declaration (Field6)
   --
   -- Only for Iir_Kind_Constant_Declaration:
   --   Get/Set_Deferred_Declaration_Flag (Flag1)
   --
   --   Get/Set_Has_Identifier_List (Flag3)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Use_Flag (Flag6)
   --
   --   Get/Set_Is_Ref (Flag7)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Variable_Declaration (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Default_Value (Field4)
   --
   --   Get/Set_Subtype_Indication (Field5)
   --
   --  True if the variable is a shared variable.
   --   Get/Set_Shared_Flag (Flag2)
   --
   --   Get/Set_Has_Identifier_List (Flag3)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Use_Flag (Flag6)
   --
   --   Get/Set_Is_Ref (Flag7)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_File_Declaration (Medium)
   --
   --  LRM08 6.4.2.5 File declarations
   --
   --  file_declaration ::=
   --     FILE identifier_list : subtype_indication [ file_open_information ] ;
   --
   --  file_open_information ::=
   --     [ OPEN file_open_kind_expression ] IS file_logical_name
   --
   --  file_logical_name ::= string_expression
   --
   --  LRM87
   --
   --  file_declaration ::=
   --     FILE identifier : subtype_indication IS [ mode ] file_logical_name ;
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Subtype_Indication (Field5)
   --
   --   Get/Set_File_Logical_Name (Field6)
   --
   --  This is not used in vhdl 87.
   --   Get/Set_File_Open_Kind (Field7)
   --
   --  This is used only in vhdl 87.
   --   Get/Set_Mode (Odigit1)
   --
   --   Get/Set_Has_Identifier_List (Flag3)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Use_Flag (Flag6)
   --
   --   Get/Set_Is_Ref (Flag7)
   --
   --   Get/Set_Has_Mode (Flag10)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Element_Declaration (Short)
   --
   --  LRM08 5.3.3 Record types
   --
   --  element_declaration ::=
   --     identifier_list : element_subtype_definition ;
   --
   --  identifier_list ::= identifier { , identifier }
   --
   --  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)
   --
   --  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)
   --
   --   Get/Set_Has_Identifier_List (Flag3)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Is_Ref (Flag7)

   -- Iir_Kind_Record_Element_Constraint (Short)
   --
   --  Record subtype definition which defines this constraint.
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Element_Declaration (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --  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_Visible_Flag (Flag4)

   -- Iir_Kind_Attribute_Declaration (Short)
   --
   --  LRM08 6.7 Attribute declarations
   --
   --  attribute_declaration ::=
   --     ATTRIBUTE identifier : type_mark ;
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Type_Mark (Field4)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Use_Flag (Flag6)

   -- Iir_Kind_Group_Template_Declaration (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --  List of entity class entry.
   --  To handle `<>', the last element of the list can be an entity_class of
   --  kind tok_box.
   --   Get/Set_Entity_Class_Entry_Chain (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Use_Flag (Flag6)

   -- Iir_Kind_Group_Declaration (Short)
   --
   --  The declaration containing this type declaration.
   --   Get/Set_Parent (Field0)
   --
   --  List of constituents.
   --   Get/Set_Group_Constituent_List (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Group_Template_Name (Field5)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Use_Flag (Flag6)

   -- Iir_Kind_Psl_Endpoint_Declaration (Medium)
   --
   --   Get/Set_Parent (Field0)
   --
   --  Always boolean.
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Psl_Declaration (Field6)
   --
   --   Get/Set_PSL_Clock (Field7)
   --
   --   Get/Set_PSL_NFA (Field8)
   --
   --  Number of states in the NFA.
   --   Get/Set_PSL_Nbr_States (Field9)
   --
   --   Get/Set_PSL_Clock_Sensitivity (Field10)
   --
   --  True if at least one of the NFA edge has the EOS flag.
   --   Get/Set_PSL_EOS_Flag (Flag1)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Use_Flag (Flag6)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Psl_Declaration (Medium)
   --  A psl sequence or property declaration.
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Psl_Declaration (Field6)
   --
   --  Valid only for property declaration.
   --   Get/Set_PSL_Clock (Field7)
   --
   --  Valid only for property declaration without parameters.
   --   Get/Set_PSL_NFA (Field8)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Use_Flag (Flag6)

   -- Iir_Kind_Terminal_Declaration (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Nature (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Use_Flag (Flag6)

   -- Iir_Kind_Free_Quantity_Declaration (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Default_Value (Field4)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Use_Flag (Flag6)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Across_Quantity_Declaration (Medium)
   -- Iir_Kind_Through_Quantity_Declaration (Medium)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Default_Value (Field4)
   --
   --   Get/Set_Tolerance (Field7)
   --
   --   Get/Set_Plus_Terminal (Field8)
   --
   --   Get/Set_Minus_Terminal (Field9)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Use_Flag (Flag6)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Use_Clause (Short)
   --
   --  LRM08 12.4 Use clauses
   --
   --  use_clause ::=
   --     USE selected_name { , selected_name } ;
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Selected_Name (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Use_Clause_Chain (Field3)

   -- Iir_Kind_Context_Reference (Short)
   --
   --  LRM08 13.4 Context clauses
   --
   --  context_reference ::=
   --     CONTEXT selected_name { , selected_name }
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Selected_Name (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Context_Reference_Chain (Field3)


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

   --  For Iir_Kinds_Type_And_Subtype_Definition:
   --
   --  Type_Declarator:
   --  Points to the type declaration or subtype declaration that has created
   --  this definition. For some types, such as integer and floating point
   --  types, both type and subtype points to the declaration.
   --  However, there are cases where a type definition doesn't point to
   --  a declarator: anonymous subtype created by index contraints, or
   --  anonymous subtype created by an object declaration.
   --  Note: a type definition cannot be anoynymous.
   --   Get/Set_Type_Declarator (Field3)
   --
   --  The base type.
   --  For a subtype, it returns the type.
   --  For a type, it must return the type itself.
   --   Get/Set_Base_Type (Field4)
   --
   --  The staticness of a type, according to LRM93 7.4.1.
   --  Note: These types definition are always locally static:
   --  enumeration, integer, floating.
   --  However, their subtype are not necessary locally static.
   --   Get/Set_Type_Staticness (State1)
   --
   --  The resolved flag of a subtype, according to LRM93 2.4
   --   Get/Set_Resolved_Flag (Flag1)
   --
   --  The signal_type flag of a type definition.
   --  It is true when the type can be used for a signal.
   --   Get/Set_Signal_Type_Flag (Flag2)
   --
   --   Get/Set_Has_Signal_Flag (Flag3)

   -- 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/Set_Type_Declarator (Field3)
   --
   --   Get/Set_Base_Type (Field4)
   --
   --   Get/Set_Resolved_Flag (Flag1)
   --
   --   Get/Set_Signal_Type_Flag (Flag2)
   --
   --   Get/Set_Has_Signal_Flag (Flag3)
   --
   --   Get/Set_Only_Characters_Flag (Flag4)
   --
   --   Get/Set_Type_Staticness (State1)

   -- Iir_Kind_Enumeration_Literal (Short)
   --
   --  Nota: two literals of the same type are equal iff their value is the
   --  same; in other words, there may be severals literals with the same
   --  value.
   --
   --  The parent of an enumeration_literal is the same parent as the type
   --  declaration.
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Type (Field1)
   --   Get/Set_Return_Type (Alias Field1)
   --
   --   Get/Set_Literal_Origin (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Subprogram_Hash (Field4)
   --
   --  The value of an enumeration literal is the position.
   --   Get/Set_Enum_Pos (Field5)
   --
   --   Get/Set_Seen_Flag (Flag1)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --  Never set to true, but possible when used as a prefix of an expanded
   --  name in a overloaded subprogram.
   --   Get/Set_Is_Within_Flag (Flag5)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Physical_Type_Definition (Short)
   --
   --   Get/Set_Unit_Chain (Field1)
   --   Get/Set_Primary_Unit (Alias Field1)
   --
   --   Get/Set_Type_Declarator (Field3)
   --
   --   Get/Set_Base_Type (Field4)
   --
   --   Get/Set_Resolved_Flag (Flag1)
   --
   --   Get/Set_Signal_Type_Flag (Flag2)
   --
   --   Get/Set_Has_Signal_Flag (Flag3)
   --
   --   Get/Set_Type_Staticness (State1)
   --
   --   Get/Set_End_Has_Reserved_Id (Flag8)
   --
   --   Get/Set_End_Has_Identifier (Flag9)

   -- Iir_Kind_Unit_Declaration (Short)
   --
   --  LRM08 5.2.4 Physical types
   --
   --  primary_unit_declaration ::= identifier ;
   --
   --  secondary_unit_declaration ::= identifier = physical_literal ;
   --
   --  physical_literal ::= [ abstract_literal ] /unit/_name
   --
   --  The parent of a physical unit is the same parent as the type
   --  declaration.
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   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)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)
   --
   --   Get/Set_Visible_Flag (Flag4)

   --  LRM08 5.2 Scalar types
   --
   --  range_constraint ::= RANGE range
   --
   --  range ::=
   --       range_attribute_name
   --     | simple_expression direction simple_expression
   --
   --  direction ::= to | downto

   -- Iir_Kind_Integer_Type_Definition (Short)
   -- Iir_Kind_Floating_Type_Definition (Short)
   --
   --  The type declarator that has created this type.
   --   Get/Set_Type_Declarator (Field3)
   --
   --   Get/Set_Base_Type (Field4)
   --
   --  Type staticness is always locally.
   --   Get/Set_Type_Staticness (State1)
   --
   --   Get/Set_Resolved_Flag (Flag1)
   --
   --   Get/Set_Signal_Type_Flag (Flag2)
   --
   --   Get/Set_Has_Signal_Flag (Flag3)

   -- Iir_Kind_Array_Type_Definition (Medium)
   --
   --  LRM08 5.3.2 Array types / LRM93 3.2.1
   --
   --  unbounded_array_definition ::=
   --     ARRAY ( index_subtype_definition { , index_subtype_definition } )
   --       OF element_subtype_indication
   --
   --  index_subtype_definition ::= type_mark RANGE <>
   --
   --   Get/Set_Element_Subtype (Field1)
   --
   --   Get/Set_Element_Subtype_Indication (Field2)
   --
   --   Get/Set_Type_Declarator (Field3)
   --
   --   Get/Set_Base_Type (Field4)
   --
   --  This is a list of type marks.
   --   Get/Set_Index_Subtype_Definition_List (Field6)
   --
   --  Same as the index_subtype_definition_list.
   --   Get/Set_Index_Subtype_List (Field9)
   --
   --   Get/Set_Type_Staticness (State1)
   --
   --   Get/Set_Constraint_State (State2)
   --
   --   Get/Set_Resolved_Flag (Flag1)
   --
   --   Get/Set_Signal_Type_Flag (Flag2)
   --
   --   Get/Set_Has_Signal_Flag (Flag3)
   --
   --   Get/Set_Index_Constraint_Flag (Flag4)

   -- Iir_Kind_Record_Type_Definition (Short)
   --
   --  LRM08 5.3.3 Record types / LRM93 3.2.2 Record types
   --
   --  record_type_definition ::=
   --     RECORD
   --        element_declaration
   --        { element_declaration }
   --     END RECORD [ /record_type/_simple_name ]
   --
   --   Get/Set_Elements_Declaration_List (Field1)
   --
   --   Get/Set_Type_Declarator (Field3)
   --
   --   Get/Set_Base_Type (Field4)
   --
   --   Get/Set_Type_Staticness (State1)
   --
   --   Get/Set_Constraint_State (State2)
   --
   --   Get/Set_Resolved_Flag (Flag1)
   --
   --   Get/Set_Signal_Type_Flag (Flag2)
   --
   --   Get/Set_Has_Signal_Flag (Flag3)
   --
   --   Get/Set_End_Has_Reserved_Id (Flag8)
   --
   --   Get/Set_End_Has_Identifier (Flag9)

   -- Iir_Kind_Access_Type_Definition (Short)
   --
   --  LRM08 5.4 Access types
   --
   --  access_type_definition ::= ACCESS subtype_indication
   --
   --   Get/Set_Designated_Type (Field1)
   --
   --   Get/Set_Designated_Subtype_Indication (Field5)
   --
   --   Get/Set_Type_Declarator (Field3)
   --
   --   Get/Set_Base_Type (Field4)
   --
   --   Get/Set_Resolved_Flag (Flag1)
   --
   --   Get/Set_Signal_Type_Flag (Flag2)
   --
   --   Get/Set_Type_Staticness (State1)

   -- Iir_Kind_File_Type_Definition (Short)
   --
   --   Get/Set_File_Type_Mark (Field2)
   --
   --   Get/Set_Type_Declarator (Field3)
   --
   --   Get/Set_Base_Type (Field4)
   --
   --   Get/Set_Resolved_Flag (Flag1)
   --
   --   Get/Set_Signal_Type_Flag (Flag2)
   --
   --  True if this is the std.textio.text file type, which may require special
   --  handling.
   --   Get/Set_Text_File_Flag (Flag4)
   --
   --   Get/Set_Type_Staticness (State1)

   -- Iir_Kind_Incomplete_Type_Definition (Short)
   --  Type definition for an incomplete type.  This is created during the
   --  semantisation of the incomplete type declaration.
   --
   --   Get/Set_Incomplete_Type_List (Field2)
   --
   --  Set to the incomplete type declaration when analyzed, and set to the
   --  complete type declaration when the latter one is analyzed.
   --   Get/Set_Type_Declarator (Field3)
   --
   --   Get/Set_Base_Type (Field4)
   --
   --   Get/Set_Type_Staticness (State1)
   --
   --   Get/Set_Resolved_Flag (Flag1)
   --
   --   Get/Set_Signal_Type_Flag (Flag2)
   --
   --   Get/Set_Has_Signal_Flag (Flag3)

   -- Iir_Kind_Protected_Type_Declaration (Short)
   --
   --   Get/Set_Declaration_Chain (Field1)
   --
   --   Get/Set_Protected_Type_Body (Field2)
   --
   --   Get/Set_Type_Declarator (Field3)
   --
   --   Get/Set_Base_Type (Field4)
   --
   --   Get/Set_Type_Staticness (State1)
   --
   --   Get/Set_Resolved_Flag (Flag1)
   --
   --   Get/Set_Signal_Type_Flag (Flag2)
   --
   --   Get/Set_End_Has_Reserved_Id (Flag8)
   --
   --   Get/Set_End_Has_Identifier (Flag9)

   -- Iir_Kind_Protected_Type_Body (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Declaration_Chain (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Protected_Type_Declaration (Field4)
   --
   --   Get/Set_End_Has_Reserved_Id (Flag8)
   --
   --   Get/Set_End_Has_Identifier (Flag9)

   -- Iir_Kind_Wildcard_Type_Definition (Short)
   --  A wildcard type doesn't correspond to a type defined by VHDL.  It
   --  is used only during analysis to temporary set the type of an entity
   --  when the type is not precisely known but restricted to some class of
   --  types.  Eg: the type of an aggregate is not known before being
   --  determined by the context, but can only be an array or a record.
   --  Wildcard types are statically created by std_package and the set of
   --  restrictions depends on the node.  See std_package.ads
   --
   --   Get/Set_Type_Declarator (Field3)
   --
   --   Get/Set_Base_Type (Field4)
   --
   --   Get/Set_Resolved_Flag (Flag1)
   --
   --   Get/Set_Signal_Type_Flag (Flag2)
   --
   --   Get/Set_Type_Staticness (State1)

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

   --  LRM08 6.3 Subtype declarations
   --
   --  subtype_indication ::=
   --    [ resolution_indication ] type_mark [ constraint ]
   --
   --  There is no uniq representation for a subtype indication.  If there is
   --  only a type_mark, then a subtype indication is represented by a name
   --  (a simple name or an expanded name); otherwise it is represented by one
   --  of the subtype definition node.
   --
   --  resolution_indication ::=
   --     resolution_function_name | ( element_resolution )
   --
   --  element_resolution ::= array_element_resolution | record_resolution
   --
   --  If there is no constraint but a resolution function name, the subtype
   --  indication is represented by a subtype_definition (which will be
   --  replaced by the correct subtype definition).  If there is an array
   --  element resolution the subtype indication is represented by an array
   --  subtype definition, and if there is a record resolution, it is
   --  represented by a record subtype definition.
   --
   --  constraint ::=
   --     range_constraint
   --   | index_constraint
   --   | array_constraint
   --   | record_constraint
   --
   --  There is no node for constraint, it is directly represented by one of
   --  the rhs.
   --
   --  element_constraint ::=
   --     array_constraint
   --   | record_constraint
   --
   --  Likewise, there is no node for element_constraint.
   --
   --  index_constraint ::= ( discrete_range { , discrete_range } )
   --
   --  An index_constraint is represented by an array_subtype_definition.
   --
   --  discrete_range ::= /discrete/_subtype_indication | range
   --
   --  array_constraint ::=
   --     index_constraint [ array_element_constraint ]
   --   | ( OPEN ) [ array_element_constraint ]
   --
   --  An array_constraint is also represented by an array_subtype_definition.
   --
   --  array_element_constraint ::= element_constraint
   --
   --  There is no node for array_element_constraint.
   --
   --  record_constraint ::=
   --     ( record_element_constraint { , record_element_constraint } )
   --
   --  A record_constraint is represented by a record_subtype_definition.
   --
   --  record_element_constraint ::=
   --     record_element_simple_name element_constraint
   --
   --  Represented by Record_Element_Constraint.

   -- Iir_Kind_Enumeration_Subtype_Definition (Short)
   -- Iir_Kind_Integer_Subtype_Definition (Short)
   -- Iir_Kind_Physical_Subtype_Definition (Short)
   --
   --   Get/Set_Range_Constraint (Field1)
   --
   --   Get/Set_Subtype_Type_Mark (Field2)
   --
   --   Get/Set_Type_Declarator (Field3)
   --
   --   Get/Set_Base_Type (Field4)
   --
   --   Get/Set_Resolution_Indication (Field5)
   --
   --   Get/Set_Resolved_Flag (Flag1)
   --
   --   Get/Set_Signal_Type_Flag (Flag2)
   --
   --   Get/Set_Has_Signal_Flag (Flag3)
   --
   --   Get/Set_Type_Staticness (State1)

   -- Iir_Kind_Floating_Subtype_Definition (Medium)
   --
   --   Get/Set_Range_Constraint (Field1)
   --
   --   Get/Set_Subtype_Type_Mark (Field2)
   --
   --   Get/Set_Type_Declarator (Field3)
   --
   --   Get/Set_Base_Type (Field4)
   --
   --   Get/Set_Resolution_Indication (Field5)
   --
   --   Get/Set_Tolerance (Field7)
   --
   --   Get/Set_Resolved_Flag (Flag1)
   --
   --   Get/Set_Signal_Type_Flag (Flag2)
   --
   --   Get/Set_Has_Signal_Flag (Flag3)
   --
   --   Get/Set_Type_Staticness (State1)

   -- Iir_Kind_Access_Subtype_Definition (Short)
   --
   --   Get/Set_Designated_Type (Field1)
   --
   --   Get/Set_Subtype_Type_Mark (Field2)
   --
   --   Get/Set_Type_Declarator (Field3)
   --
   --   Get/Set_Base_Type (Field4)
   --
   --   Get/Set_Designated_Subtype_Indication (Field5)
   --
   --  Note: no resolution function for access subtype.
   --
   --   Get/Set_Type_Staticness (State1)
   --
   --   Get/Set_Resolved_Flag (Flag1)
   --
   --   Get/Set_Signal_Type_Flag (Flag2)

   -- Iir_Kind_Array_Element_Resolution (Short)
   --
   --  LRM08 6.3 Subtype declarations
   --
   --  array_element_resolution ::= resolution_indication
   --
   --   Get/Set_Resolution_Indication (Field5)

   -- Iir_Kind_Record_Resolution (Short)
   --
   --  LRM08 6.3 Subtype declarations
   --
   --  record_resolution ::=
   --     record_element_resolution { , record_element_resolution }
   --
   --   Get/Set_Record_Element_Resolution_Chain (Field1)

   -- Iir_Kind_Record_Element_Resolution (Short)
   --
   --  LRM08 6.3 Subtype declarations
   --
   --  record_element_resolution ::=
   --     /record_element/_simple_name resolution_indication
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Resolution_Indication (Field5)

   -- Iir_Kind_Record_Subtype_Definition (Medium)
   --
   --   Get/Set_Elements_Declaration_List (Field1)
   --
   --   Get/Set_Subtype_Type_Mark (Field2)
   --
   --   Get/Set_Type_Declarator (Field3)
   --
   --   Get/Set_Base_Type (Field4)
   --
   --   Get/Set_Resolution_Indication (Field5)
   --
   --   Get/Set_Tolerance (Field7)
   --
   --   Get/Set_Resolved_Flag (Flag1)
   --
   --   Get/Set_Signal_Type_Flag (Flag2)
   --
   --   Get/Set_Has_Signal_Flag (Flag3)
   --
   --   Get/Set_Type_Staticness (State1)
   --
   --   Get/Set_Constraint_State (State2)

   -- 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_Type_Staticness (State1)
   --
   --   Get/Set_Constraint_State (State2)
   --
   --   Get/Set_Resolved_Flag (Flag1)
   --
   --   Get/Set_Signal_Type_Flag (Flag2)
   --
   --   Get/Set_Has_Signal_Flag (Flag3)
   --
   --   Get/Set_Index_Constraint_Flag (Flag4)

   -- Iir_Kind_Range_Expression (Short)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Left_Limit (Field2)
   --
   --   Get/Set_Right_Limit (Field3)
   --
   --   Get/Set_Range_Origin (Field4)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Direction (State2)

   -- Iir_Kind_Subtype_Definition (Medium)
   --  Such a node is only created by parse and transformed into the correct
   --  kind (enumeration_subtype, integer_subtype...) by sem.
   --
   --   Get/Set_Range_Constraint (Field1)
   --
   --   Get/Set_Subtype_Type_Mark (Field2)
   --
   --   Get/Set_Resolution_Indication (Field5)
   --
   --   Get/Set_Tolerance (Field7)

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

   -- Iir_Kind_Scalar_Nature_Definition (Medium)
   --
   --   Get/Set_Reference (Field2)
   --
   --  The declarator that has created this nature type.
   --   Get/Set_Nature_Declarator (Field3)
   --
   --  C--  Get/Set_Base_Type (Field4)
   --
   --  Type staticness is always locally.
   --  C--  Get/Set_Type_Staticness (State1)
   --
   --   Get/Set_Across_Type (Field7)
   --
   --   Get/Set_Through_Type (Field8)

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

   -- Iir_Kind_Concurrent_Conditional_Signal_Assignment (Medium)
   -- Iir_Kind_Concurrent_Selected_Signal_Assignment (Medium)
   -- Iir_Kind_Concurrent_Simple_Signal_Assignment (Medium)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Target (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   --   Get/Set_Reject_Time_Expression (Field4)
   --
   -- Only for Iir_Kind_Concurrent_Simple_Signal_Assignment:
   --   Get/Set_Waveform_Chain (Field5)
   --
   -- Only for Iir_Kind_Concurrent_Selected_Signal_Assignment:
   --   Get/Set_Expression (Field5)
   --
   -- Only for Iir_Kind_Concurrent_Conditional_Signal_Assignment:
   --   Get/Set_Conditional_Waveform_Chain (Field5)
   --
   -- Only for Iir_Kind_Concurrent_Selected_Signal_Assignment:
   --   Get/Set_Selected_Waveform_Chain (Field7)
   --
   --  If the assignment is guarded, then get_guard must return the
   --  declaration of the signal guard, otherwise, null_iir.
   --  If the guard signal decl is not known, as a kludge and only to mark this
   --  assignment guarded, the guard can be this assignment.
   --   Get/Set_Guard (Field8)
   --
   --   Get/Set_Delay_Mechanism (Flag1)
   --
   --   Get/Set_Postponed_Flag (Flag3)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --  True if the target of the assignment is guarded
   --   Get/Set_Guarded_Target_State (State1)

   -- Iir_Kind_Sensitized_Process_Statement (Medium)
   -- Iir_Kind_Process_Statement (Medium)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Declaration_Chain (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   --   Get/Set_Attribute_Value_Chain (Field4)
   --
   --   Get/Set_Sequential_Statement_Chain (Field5)
   --
   -- Only for Iir_Kind_Sensitized_Process_Statement:
   --   Get/Set_Sensitivity_List (Field6)
   --
   --   Get/Set_Callees_List (Field7)
   --
   --  The concurrent statement at the origin of that process.  This is
   --  Null_Iir for a user process.
   --   Get/Set_Process_Origin (Field8)
   --
   --   Get/Set_Wait_State (State1)
   --
   --   Get/Set_Seen_Flag (Flag1)
   --
   --   Get/Set_Passive_Flag (Flag2)
   --
   --   Get/Set_Postponed_Flag (Flag3)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Is_Within_Flag (Flag5)
   --
   --   Get/Set_Has_Label (Flag6)
   --
   --   Get/Set_Has_Is (Flag7)
   --
   --   Get/Set_End_Has_Reserved_Id (Flag8)
   --
   --   Get/Set_End_Has_Identifier (Flag9)
   --
   --   Get/Set_End_Has_Postponed (Flag10)
   --
   -- Only for Iir_Kind_Process_Statement:
   --   Get/Set_Suspend_Flag (Flag11)

   -- Iir_Kind_Concurrent_Assertion_Statement (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Assertion_Condition (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   --   Get/Set_Severity_Expression (Field4)
   --
   --   Get/Set_Report_Expression (Field5)
   --
   --   Get/Set_Postponed_Flag (Flag3)
   --
   --   Get/Set_Visible_Flag (Flag4)

   -- Iir_Kind_Psl_Default_Clock (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Psl_Boolean (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)

   -- Iir_Kind_Psl_Assert_Statement (Medium)
   -- Iir_Kind_Psl_Cover_Statement (Medium)
   --
   --   Get/Set_Parent (Field0)
   --
   -- Only for Iir_Kind_Psl_Assert_Statement:
   --   Get/Set_Psl_Property (Field1)
   --
   -- Only for Iir_Kind_Psl_Cover_Statement:
   --   Get/Set_Psl_Sequence (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   --   Get/Set_Severity_Expression (Field4)
   --
   --   Get/Set_Report_Expression (Field5)
   --
   --  The following fields are set by canon.
   --   Get/Set_PSL_Clock (Field7)
   --
   --   Get/Set_PSL_NFA (Field8)
   --
   --  Number of states in the NFA.
   --   Get/Set_PSL_Nbr_States (Field9)
   --
   --   Get/Set_PSL_Clock_Sensitivity (Field10)
   --
   --  True if at least one of the NFA edge has the EOS flag.
   --   Get/Set_PSL_EOS_Flag (Flag1)
   --
   --   Get/Set_Visible_Flag (Flag4)

   -- Iir_Kind_Component_Instantiation_Statement (Medium)
   --
   --  LRM08 11.7 Component instantiation statements
   --
   --  component_instantiation_statement ::=
   --     instantiation_label :
   --        instantiated_unit
   --           [ generic_map_aspect ]
   --           [ port_map_aspect ] ;
   --
   --  instantiated_unit ::=
   --       [ COMPONENT ] component_name
   --     | ENTITY entity_name [ ( architecture_identifier ) ]
   --     | CONFIGURATION configuration_name
   --
   --   Get/Set_Parent (Field0)
   --
   --  Unit instantiated.  This is a name, an entity_aspect_entity or an
   --  entity_aspect_configuration.
   --   Get/Set_Instantiated_Unit (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   --   Get/Set_Default_Binding_Indication (Field5)
   --
   --   Get/Set_Generic_Map_Aspect_Chain (Field8)
   --
   --   Get/Set_Port_Map_Aspect_Chain (Field9)
   --
   --  Configuration:
   --  In case of a configuration specification, the node is put into
   --  default configuration.  In the absence of a specification, the
   --  default entity aspect, if any; if none, this field is null_iir.
   --   Get/Set_Configuration_Specification (Field7)
   --
   --  During Sem and elaboration, the configuration field can be filled by
   --  a component configuration declaration.
   --
   --  Configuration for this component.
   --  FIXME: must be get/set_binding_indication.
   --   Get/Set_Component_Configuration (Field6)
   --
   --   Get/Set_Visible_Flag (Flag4)

   -- Iir_Kind_Block_Statement (Medium)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Declaration_Chain (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   --   Get/Set_Attribute_Value_Chain (Field4)
   --
   --   Get/Set_Concurrent_Statement_Chain (Field5)
   --
   --   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)
   --
   --   Get/Set_End_Has_Reserved_Id (Flag8)
   --
   --   Get/Set_End_Has_Identifier (Flag9)

   -- Iir_Kind_Generate_Statement_Body (Short)
   --  LRM08 11.8 Generate statements
   --
   --  generate_statement_body ::=
   --        [ block_declarative_part
   --     BEGIN ]
   --        { concurrent_statement }
   --     [ END [ alternative_label ] ; ]
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Declaration_Chain (Field1)
   --
   --  The block configuration for this statement body.
   --   Get/Set_Generate_Block_Configuration (Field2)
   --
   --   Get/Set_Alternative_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   --   Get/Set_Attribute_Value_Chain (Field4)
   --
   --   Get/Set_Concurrent_Statement_Chain (Field5)
   --
   --   Get/Set_Is_Within_Flag (Flag5)
   --
   --   Get/Set_Has_Label (Flag6)
   --
   --   Get/Set_End_Has_Identifier (Flag9)
   --
   --   Get/Set_Has_Begin (Flag10)
   --
   --   Get/Set_Has_End (Flag11)

   -- Iir_Kind_For_Generate_Statement (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --  The parameters specification is represented by an Iterator_Declaration.
   --   Get/Set_Parameter_Specification (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   --   Get/Set_Generate_Statement_Body (Field4)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Is_Within_Flag (Flag5)
   --
   --   Get/Set_End_Has_Reserved_Id (Flag8)
   --
   --   Get/Set_End_Has_Identifier (Flag9)

   -- Iir_Kind_If_Generate_Else_Clause (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --  Null_Iir for the else clause.
   --   Get/Set_Condition (Field1)
   --
   --   Get/Set_Generate_Statement_Body (Field4)
   --
   --   Get/Set_Generate_Else_Clause (Field5)
   --
   --   Get/Set_Visible_Flag (Flag4)

   -- Iir_Kind_If_Generate_Statement (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --  Null_Iir for the else clause.
   --   Get/Set_Condition (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   --   Get/Set_Generate_Statement_Body (Field4)
   --
   --   Get/Set_Generate_Else_Clause (Field5)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Is_Within_Flag (Flag5)
   --
   --   Get/Set_End_Has_Reserved_Id (Flag8)
   --
   --   Get/Set_End_Has_Identifier (Flag9)

   -- Iir_Kind_Case_Generate_Statement (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --  Chain is composed of Iir_Kind_Choice_By_XXX.
   --   Get/Set_Case_Statement_Alternative_Chain (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   --   Get/Set_Expression (Field5)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Is_Within_Flag (Flag5)
   --
   --   Get/Set_End_Has_Reserved_Id (Flag8)
   --
   --   Get/Set_End_Has_Identifier (Flag9)

   -- Iir_Kind_Simple_Simultaneous_Statement (Medium)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   --   Get/Set_Simultaneous_Left (Field5)
   --
   --   Get/Set_Simultaneous_Right (Field6)
   --
   --   Get/Set_Tolerance (Field7)
   --
   --   Get/Set_Visible_Flag (Flag4)

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

   -- Iir_Kind_If_Statement (Short)
   -- Iir_Kind_Elsif (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --  May be NULL only for an iir_kind_elsif node, and then means the else
   --  clause.
   --   Get/Set_Condition (Field1)
   --
   -- Only for Iir_Kind_If_Statement:
   --   Get/Set_Chain (Field2)
   --
   -- Only for Iir_Kind_If_Statement:
   --   Get/Set_Label (Field3)
   --
   -- Only for Iir_Kind_If_Statement:
   --   Get/Set_Identifier (Alias Field3)
   --
   --  Must be an Iir_kind_elsif node, or NULL for no more elsif clauses.
   --   Get/Set_Else_Clause (Field4)
   --
   --   Get/Set_Sequential_Statement_Chain (Field5)
   --
   -- Only for Iir_Kind_If_Statement:
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_End_Has_Identifier (Flag9)
   --
   -- Only for Iir_Kind_If_Statement:
   --   Get/Set_Suspend_Flag (Flag11)

   --  LRM08 10.10 Loop statement / LRM93 8.9
   --
   --  loop_statement ::=
   --     [ loop_label : ]
   --        [ iteration_scheme ] LOOP
   --           sequence_of_statements
   --        END LOOP [ loop_label ] ;
   --
   --  iteration_scheme ::=
   --       WHILE condition
   --     | FOR loop_parameter_specification
   --
   --  parameter_specification ::=
   --     identifier IN discrete_range

   -- Iir_Kind_For_Loop_Statement (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --  The parameters specification is represented by an Iterator_Declaration.
   --   Get/Set_Parameter_Specification (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   --   Get/Set_Sequential_Statement_Chain (Field5)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Is_Within_Flag (Flag5)
   --
   --   Get/Set_End_Has_Identifier (Flag9)
   --
   --   Get/Set_Suspend_Flag (Flag11)

   -- Iir_Kind_While_Loop_Statement (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Condition (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   --   Get/Set_Sequential_Statement_Chain (Field5)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_End_Has_Identifier (Flag9)
   --
   --   Get/Set_Suspend_Flag (Flag11)

   -- Iir_Kind_Exit_Statement (Short)
   -- Iir_Kind_Next_Statement (Short)
   --
   --  LRM08 10.11 Next statement
   --
   --  next_statement ::=
   --     [ label : ] NEXT [ loop_label ] [ WHEN condition ] ;
   --
   --  LRM08 10.12 Exit statement
   --
   --  exit_statement ::=
   --     [ label : ] exit [ loop_label ] [ when condition ] ;
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Condition (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   --   Get/Set_Loop_Label (Field5)
   --
   --   Get/Set_Visible_Flag (Flag4)

   -- Iir_Kind_Simple_Signal_Assignment_Statement (Short)
   -- Iir_Kind_Conditional_Signal_Assignment_Statement (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Target (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   --   Get/Set_Reject_Time_Expression (Field4)
   --
   -- Only for Iir_Kind_Simple_Signal_Assignment_Statement:
   --  The waveform.
   --  If the waveform_chain is null_iir, then the signal assignment is a
   --  disconnection statement, ie TARGET <= null_iir after disconection_time,
   --  where disconnection_time is specified by a disconnection specification.
   --   Get/Set_Waveform_Chain (Field5)
   --
   -- Only for Iir_Kind_Conditional_Signal_Assignment_Statement:
   --   Get/Set_Conditional_Waveform_Chain (Field5)
   --
   --   Get/Set_Delay_Mechanism (Flag1)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --  True if the target of the assignment is guarded
   --   Get/Set_Guarded_Target_State (State1)

   -- Iir_Kind_Variable_Assignment_Statement (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Target (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   --   Get/Set_Expression (Field5)
   --
   --   Get/Set_Visible_Flag (Flag4)

   -- Iir_Kind_Conditional_Variable_Assignment_Statement (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Target (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   --   Get/Set_Conditional_Expression (Field5)
   --
   --   Get/Set_Visible_Flag (Flag4)

   -- Iir_Kind_Assertion_Statement (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Assertion_Condition (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   --   Get/Set_Severity_Expression (Field4)
   --
   --   Get/Set_Report_Expression (Field5)
   --
   --   Get/Set_Visible_Flag (Flag4)

   -- Iir_Kind_Report_Statement (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   --   Get/Set_Severity_Expression (Field4)
   --
   --   Get/Set_Report_Expression (Field5)
   --
   --   Get/Set_Visible_Flag (Flag4)

   -- Iir_Kind_Wait_Statement (Medium)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Timeout_Clause (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   --   Get/Set_Condition_Clause (Field5)
   --
   --   Get/Set_Sensitivity_List (Field6)
   --
   --   Get/Set_Visible_Flag (Flag4)

   -- Iir_Kind_Return_Statement (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --  Type of the return value of the function.  This is a copy of
   --  return_type.
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   --   Get/Set_Expression (Field5)
   --
   --   Get/Set_Visible_Flag (Flag4)

   -- Iir_Kind_Case_Statement (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --  Chain is composed of Iir_Kind_Choice_By_XXX.
   --   Get/Set_Case_Statement_Alternative_Chain (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   --   Get/Set_Expression (Field5)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_End_Has_Identifier (Flag9)
   --
   --   Get/Set_Suspend_Flag (Flag11)

   -- Iir_Kind_Procedure_Call_Statement (Short)
   -- Iir_Kind_Concurrent_Procedure_Call_Statement (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Procedure_Call (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   -- Only for Iir_Kind_Concurrent_Procedure_Call_Statement:
   --   Get/Set_Postponed_Flag (Flag3)
   --
   --   Get/Set_Visible_Flag (Flag4)
   --
   --   Get/Set_Suspend_Flag (Flag11)

   -- Iir_Kind_Procedure_Call (Short)
   --
   --   Get/Set_Prefix (Field0)
   --
   --   Get/Set_Parameter_Association_Chain (Field2)
   --
   --  Procedure declaration corresponding to the procedure to call.
   --   Get/Set_Implementation (Field3)
   --
   --   Get/Set_Method_Object (Field4)

   -- Iir_Kind_Null_Statement (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_Label (Field3)
   --   Get/Set_Identifier (Alias Field3)
   --
   --   Get/Set_Visible_Flag (Flag4)

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

   -- Iir_Kinds_Monadic_Operator (Short)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Operand (Field2)
   --
   --  Function declaration corresponding to the function to call.
   --   Get/Set_Implementation (Field3)
   --
   --  Expr_staticness is defined by LRM93 7.4
   --   Get/Set_Expr_Staticness (State1)

   -- Iir_Kinds_Dyadic_Operator (Short)
   --
   --   Get/Set_Type (Field1)
   --
   --  Left and Right operands.
   --   Get/Set_Left (Field2)
   --
   --  Function declaration corresponding to the function to call.
   --   Get/Set_Implementation (Field3)
   --
   --   Get/Set_Right (Field4)
   --
   --   Get/Set_Expr_Staticness (State1)

   -- Iir_Kind_Function_Call (Short)
   --
   --   Get/Set_Prefix (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Parameter_Association_Chain (Field2)
   --
   --  Function declaration corresponding to the function to call.
   --   Get/Set_Implementation (Field3)
   --
   --   Get/Set_Method_Object (Field4)
   --
   --   Get/Set_Base_Name (Field5)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Aggregate (Short)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Aggregate_Info (Field2)
   --
   --  Same as Type, but marked as property of that node.
   --   Get/Set_Literal_Subtype (Field3)
   --
   --   Get/Set_Association_Choices_Chain (Field4)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Value_Staticness (State2)

   -- Iir_Kind_Aggregate_Info (Short)
   --
   --  Get info for the next dimension.  NULL_IIR terminated.
   --   Get/Set_Sub_Aggregate_Info (Field1)
   --
   --  For array aggregate only:
   --  If TRUE, the choices are not locally static.
   --  This flag is only valid when the array aggregate is constrained, ie
   --  has no 'others' choice.
   --   Get/Set_Aggr_Dynamic_Flag (Flag3)
   --
   --  If TRUE, the aggregate is named, else it is positionnal.
   --   Get/Set_Aggr_Named_Flag (Flag4)
   --
   --  The following three fields are used to check bounds of an array
   --  aggregate.
   --  For named aggregate, low and high bounds are computed, for positionnal
   --  aggregate, the (minimum) number of elements is computed.
   --  Note there may be elements beyond the bounds, due to other choice.
   --  These fields may apply for the aggregate or for the aggregate and its
   --  brothers if the node is for a sub-aggregate.
   --
   --  The low and high index choice, if any.
   --   Get/Set_Aggr_Low_Limit (Field2)
   --
   --   Get/Set_Aggr_High_Limit (Field3)
   --
   --  The minimum number of elements, if any.  This is a minimax.
   --   Get/Set_Aggr_Min_Length (Field4)
   --
   --  True if the choice list has an 'others' choice.
   --   Get/Set_Aggr_Others_Flag (Flag2)

   -- Iir_Kind_Parenthesis_Expression (Short)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Expression (Field5)
   --
   --   Get/Set_Expr_Staticness (State1)

   -- Iir_Kind_Qualified_Expression (Short)
   --
   --  LRM08 9.3.5 Qualified expressions
   --
   --  qualified_expression ::=
   --       type_mark ' ( expression )
   --     | type_mark ' aggregate
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Type_Mark (Field4)
   --
   --   Get/Set_Expression (Field5)
   --
   --   Get/Set_Expr_Staticness (State1)

   -- Iir_Kind_Type_Conversion (Short)
   --
   --  LRM08 9.3.6 Type conversions
   --
   --  type_conversion ::= type_mark ( expression )
   --
   --   Get/Set_Type (Field1)
   --
   --  If the type mark denotes an unconstrained array and the expression is
   --  locally static, the result should be locally static according to vhdl93
   --  (which is not clear on that point).  As a subtype is created, it is
   --  referenced by this field.
   --   Get/Set_Type_Conversion_Subtype (Field3)
   --
   --   Get/Set_Type_Mark (Field4)
   --
   --   Get/Set_Expression (Field5)
   --
   --   Get/Set_Expr_Staticness (State1)

   -- Iir_Kind_Allocator_By_Expression (Short)
   -- Iir_Kind_Allocator_By_Subtype (Short)
   --
   --  LRM08 9.3.7 Allocators
   --
   --  allocator ::=
   --     NEW subtype_indication
   --   | NEW qualified_expression
   --
   --   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 to own the 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)
   --
   -- Only for Iir_Kind_Allocator_By_Subtype:
   --  Contains the subtype indication for a by subtype allocator.
   --   Get/Set_Subtype_Indication (Field5)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   -- Only for Iir_Kind_Allocator_By_Subtype:
   --   Get/Set_Is_Ref (Flag7)

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

   -- Iir_Kind_Simple_Name (Short)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Alias_Declaration (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Named_Entity (Field4)
   --
   --   Get/Set_Base_Name (Field5)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Character_Literal (Short)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Alias_Declaration (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Named_Entity (Field4)
   --
   --   Get/Set_Base_Name (Field5)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Operator_Symbol (Short)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Alias_Declaration (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Named_Entity (Field4)
   --
   --   Get/Set_Base_Name (Field5)

   -- Iir_Kind_Selected_Name (Short)
   --
   --   Get/Set_Prefix (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Alias_Declaration (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Named_Entity (Field4)
   --
   --   Get/Set_Base_Name (Field5)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Selected_By_All_Name (Short)
   --
   --   Get/Set_Prefix (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Named_Entity (Field4)
   --
   --   Get/Set_Base_Name (Field5)
   --
   --   Get/Set_Expr_Staticness (State1)

   -- Iir_Kind_Indexed_Name (Short)
   --  Select the element designed with the INDEX_LIST from array PREFIX.
   --
   --   Get/Set_Prefix (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Index_List (Field2)
   --
   --   Get/Set_Base_Name (Field5)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Slice_Name (Short)
   --
   --   Get/Set_Prefix (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Suffix (Field2)
   --
   --   Get/Set_Slice_Subtype (Field3)
   --
   --   Get/Set_Base_Name (Field5)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Parenthesis_Name (Short)
   --  Created by the parser, and mutated into the correct iir node: it can be
   --  either a function call, an indexed array, a type conversion or a slice
   --  name.
   --
   --   Get/Set_Prefix (Field0)
   --
   --  Always returns null_iir.
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Association_Chain (Field2)
   --
   --   Get/Set_Named_Entity (Field4)

   -- Iir_Kind_Selected_Element (Short)
   --  A record element selection.  This corresponds to a reffined selected
   --  names.  The production doesn't exist in the VHDL grammar.
   --
   --   Get/Set_Prefix (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Selected_Element (Field2)
   --
   --   Get/Set_Base_Name (Field5)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Implicit_Dereference (Short)
   -- Iir_Kind_Dereference (Short)
   --  An implicit access dereference.
   --
   --   Get/Set_Prefix (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Base_Name (Field5)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_External_Constant_Name (Short)
   -- Iir_Kind_External_Signal_Name (Short)
   -- Iir_Kind_External_Variable_Name (Short)
   --
   --   Get/Set_Parent (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --   Get/Set_External_Pathname (Field3)
   --
   --   Get/Set_Subtype_Indication (Field5)
   --
   --  Only for Iir_Kind_External_Variable_Name:
   --   Get/Set_Shared_Flag (Flag2)
   --
   --   Get/Set_Is_Ref (Flag7)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Package_Pathname (Short)
   --  This node represents only the library_logical_name. Package and object
   --  simple_names are represented by Selected_Name.
   --
   --   Get/Set_Pathname_Suffix (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Named_Entity (Field4)

   -- Iir_Kind_Absolute_Pathname (Short)
   --  Represents only the '.'.
   --
   --   Get/Set_Pathname_Suffix (Field2)

   -- Iir_Kind_Relative_Pathname (Short)
   --  Represents only one '^.'
   --
   --   Get/Set_Pathname_Suffix (Field2)

   -- Iir_Kind_Pathname_Element (Short)
   --
   --   Get/Set_Pathname_Suffix (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Named_Entity (Field4)
   --
   --   Get/Set_Pathname_Expression (Field5)

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

   -- Iir_Kind_Attribute_Name (Short)
   --
   --   Get/Set_Prefix (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Attribute_Signature (Field2)
   --
   --   Get/Set_Identifier (Field3)
   --
   --   Get/Set_Named_Entity (Field4)
   --
   --   Get/Set_Base_Name (Field5)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Base_Attribute (Short)
   --
   --   Get/Set_Prefix (Field0)
   --
   --   Get/Set_Type (Field1)

   -- Iir_Kind_Left_Type_Attribute (Short)
   -- Iir_Kind_Right_Type_Attribute (Short)
   -- Iir_Kind_High_Type_Attribute (Short)
   -- Iir_Kind_Low_Type_Attribute (Short)
   -- Iir_Kind_Ascending_Type_Attribute (Short)
   --
   --   Get/Set_Prefix (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Base_Name (Field5)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Range_Array_Attribute (Short)
   -- Iir_Kind_Reverse_Range_Array_Attribute (Short)
   -- Iir_Kind_Left_Array_Attribute (Short)
   -- Iir_Kind_Right_Array_Attribute (Short)
   -- Iir_Kind_High_Array_Attribute (Short)
   -- Iir_Kind_Low_Array_Attribute (Short)
   -- Iir_Kind_Ascending_Array_Attribute (Short)
   -- Iir_Kind_Length_Array_Attribute (Short)
   --
   --   Get/Set_Prefix (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Index_Subtype (Field2)
   --
   --   Get/Set_Parameter (Field4)
   --
   --   Get/Set_Base_Name (Field5)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Stable_Attribute (Short)
   -- Iir_Kind_Delayed_Attribute (Short)
   -- Iir_Kind_Quiet_Attribute (Short)
   -- Iir_Kind_Transaction_Attribute (Short)
   --  (Iir_Kinds_Signal_Attribute)
   --
   --   Get/Set_Prefix (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Chain (Field2)
   --
   --  Not used by Iir_Kind_Transaction_Attribute
   --   Get/Set_Parameter (Field4)
   --
   --   Get/Set_Base_Name (Field5)
   --
   --   Get/Set_Has_Active_Flag (Flag2)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Event_Attribute (Short)
   -- Iir_Kind_Last_Event_Attribute (Short)
   -- Iir_Kind_Last_Value_Attribute (Short)
   -- Iir_Kind_Active_Attribute (Short)
   -- Iir_Kind_Last_Active_Attribute (Short)
   -- Iir_Kind_Driving_Attribute (Short)
   -- Iir_Kind_Driving_Value_Attribute (Short)
   --
   --   Get/Set_Prefix (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Pos_Attribute (Short)
   -- Iir_Kind_Val_Attribute (Short)
   -- Iir_Kind_Succ_Attribute (Short)
   -- Iir_Kind_Pred_Attribute (Short)
   -- Iir_Kind_Leftof_Attribute (Short)
   -- Iir_Kind_Rightof_Attribute (Short)
   --
   --   Get/Set_Prefix (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Parameter (Field4)
   --
   --   Get/Set_Base_Name (Field5)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Image_Attribute (Short)
   -- Iir_Kind_Value_Attribute (Short)
   --
   --   Get/Set_Prefix (Field0)
   --
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Parameter (Field4)
   --
   --   Get/Set_Base_Name (Field5)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

   -- Iir_Kind_Simple_Name_Attribute (Short)
   -- Iir_Kind_Instance_Name_Attribute (Short)
   -- Iir_Kind_Path_Name_Attribute (Short)
   --
   --   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_Base_Name (Field5)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Name_Staticness (State2)

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

   -- Iir_Kind_Error (Short)
   --  Can be used instead of an expression or a type.
   --   Get/Set_Type (Field1)
   --
   --   Get/Set_Error_Origin (Field2)
   --
   --   Get/Set_Type_Declarator (Field3)
   --
   --   Get/Set_Base_Type (Field4)
   --
   --   Get/Set_Expr_Staticness (State1)
   --
   --   Get/Set_Type_Staticness (Alias State1)
   --
   --   Get/Set_Resolved_Flag (Flag1)
   --
   --   Get/Set_Signal_Type_Flag (Flag2)
   --
   --   Get/Set_Has_Signal_Flag (Flag3)

   -- Iir_Kind_Unused (Short)

   -- End of Iir_Kind.


   type Iir_Kind is
     (
      Iir_Kind_Unused,
      Iir_Kind_Error,

      Iir_Kind_Design_File,
      Iir_Kind_Design_Unit,
      Iir_Kind_Library_Clause,
      Iir_Kind_Use_Clause,
      Iir_Kind_Context_Reference,

   -- Literals.
      Iir_Kind_Integer_Literal,
      Iir_Kind_Floating_Point_Literal,
      Iir_Kind_Null_Literal,
      Iir_Kind_String_Literal8,
      Iir_Kind_Physical_Int_Literal,
      Iir_Kind_Physical_Fp_Literal,
      Iir_Kind_Simple_Aggregate,
      Iir_Kind_Overflow_Literal,

   -- Tuple,
      Iir_Kind_Waveform_Element,
      Iir_Kind_Conditional_Waveform,
      Iir_Kind_Conditional_Expression,
      Iir_Kind_Association_Element_By_Expression,
      Iir_Kind_Association_Element_By_Individual,
      Iir_Kind_Association_Element_Open,
      Iir_Kind_Association_Element_Package,
      Iir_Kind_Choice_By_Others,
      Iir_Kind_Choice_By_Expression,
      Iir_Kind_Choice_By_Range,
      Iir_Kind_Choice_By_None,
      Iir_Kind_Choice_By_Name,
      Iir_Kind_Entity_Aspect_Entity,
      Iir_Kind_Entity_Aspect_Configuration,
      Iir_Kind_Entity_Aspect_Open,
      Iir_Kind_Block_Configuration,
      Iir_Kind_Block_Header,
      Iir_Kind_Component_Configuration,
      Iir_Kind_Binding_Indication,
      Iir_Kind_Entity_Class,
      Iir_Kind_Attribute_Value,
      Iir_Kind_Signature,
      Iir_Kind_Aggregate_Info,
      Iir_Kind_Procedure_Call,
      Iir_Kind_Record_Element_Constraint,
      Iir_Kind_Array_Element_Resolution,
      Iir_Kind_Record_Resolution,
      Iir_Kind_Record_Element_Resolution,

      Iir_Kind_Attribute_Specification,
      Iir_Kind_Disconnection_Specification,
      Iir_Kind_Configuration_Specification,

   -- Type definitions.
   -- iir_kinds_type_and_subtype_definition
   -- kinds: disc: discrete, st: subtype.
      Iir_Kind_Access_Type_Definition,
      Iir_Kind_Incomplete_Type_Definition,
      Iir_Kind_File_Type_Definition,
      Iir_Kind_Protected_Type_Declaration,
      Iir_Kind_Record_Type_Definition,           -- composite
      Iir_Kind_Array_Type_Definition,            -- composite, array
      Iir_Kind_Array_Subtype_Definition,         -- composite, array, st
      Iir_Kind_Record_Subtype_Definition,        -- composite, st
      Iir_Kind_Access_Subtype_Definition,        -- st
      Iir_Kind_Physical_Subtype_Definition,      -- scalar, st, rng
      Iir_Kind_Floating_Subtype_Definition,      -- scalar, st, rng
      Iir_Kind_Integer_Subtype_Definition,       -- scalar, disc, st, rng
      Iir_Kind_Enumeration_Subtype_Definition,   -- scalar, disc, st, rng
      Iir_Kind_Enumeration_Type_Definition,      -- scalar, disc, rng
      Iir_Kind_Integer_Type_Definition,          -- scalar, disc
      Iir_Kind_Floating_Type_Definition,         -- scalar
      Iir_Kind_Physical_Type_Definition,         -- scalar
      Iir_Kind_Range_Expression,
      Iir_Kind_Protected_Type_Body,
      Iir_Kind_Wildcard_Type_Definition,
      Iir_Kind_Subtype_Definition,  -- temporary (must not appear after sem).

   -- Nature definition
      Iir_Kind_Scalar_Nature_Definition,

   -- Lists.
      Iir_Kind_Overload_List,  -- used internally by sem_expr.

   -- Declarations.
      Iir_Kind_Type_Declaration,
      Iir_Kind_Anonymous_Type_Declaration,
      Iir_Kind_Subtype_Declaration,
      Iir_Kind_Nature_Declaration,
      Iir_Kind_Subnature_Declaration,
      Iir_Kind_Package_Declaration,
      Iir_Kind_Package_Instantiation_Declaration,
      Iir_Kind_Package_Body,
      Iir_Kind_Configuration_Declaration,
      Iir_Kind_Entity_Declaration,
      Iir_Kind_Architecture_Body,
      Iir_Kind_Context_Declaration,
      Iir_Kind_Package_Header,
      Iir_Kind_Unit_Declaration,
      Iir_Kind_Library_Declaration,
      Iir_Kind_Component_Declaration,
      Iir_Kind_Attribute_Declaration,
      Iir_Kind_Group_Template_Declaration,
      Iir_Kind_Group_Declaration,
      Iir_Kind_Element_Declaration,
      Iir_Kind_Non_Object_Alias_Declaration,

      Iir_Kind_Psl_Declaration,
      Iir_Kind_Psl_Endpoint_Declaration,
      Iir_Kind_Terminal_Declaration,
      Iir_Kind_Free_Quantity_Declaration,
      Iir_Kind_Across_Quantity_Declaration,
      Iir_Kind_Through_Quantity_Declaration,

      Iir_Kind_Enumeration_Literal,
      Iir_Kind_Function_Declaration,            --  Subprg, Func
      Iir_Kind_Procedure_Declaration,           --  Subprg, Proc
      Iir_Kind_Function_Body,
      Iir_Kind_Procedure_Body,

      Iir_Kind_Object_Alias_Declaration,       -- object
      Iir_Kind_File_Declaration,               -- object
      Iir_Kind_Guard_Signal_Declaration,       -- object
      Iir_Kind_Signal_Declaration,             -- object
      Iir_Kind_Variable_Declaration,           -- object
      Iir_Kind_Constant_Declaration,           -- object
      Iir_Kind_Iterator_Declaration,           -- object
      Iir_Kind_Interface_Constant_Declaration, -- object, interface
      Iir_Kind_Interface_Variable_Declaration, -- object, interface
      Iir_Kind_Interface_Signal_Declaration,   -- object, interface
      Iir_Kind_Interface_File_Declaration,     -- object, interface
      Iir_Kind_Interface_Package_Declaration,

   -- Expressions.
      Iir_Kind_Identity_Operator,
      Iir_Kind_Negation_Operator,
      Iir_Kind_Absolute_Operator,
      Iir_Kind_Not_Operator,
      Iir_Kind_Condition_Operator,
      Iir_Kind_Reduction_And_Operator,
      Iir_Kind_Reduction_Or_Operator,
      Iir_Kind_Reduction_Nand_Operator,
      Iir_Kind_Reduction_Nor_Operator,
      Iir_Kind_Reduction_Xor_Operator,
      Iir_Kind_Reduction_Xnor_Operator,
      Iir_Kind_And_Operator,
      Iir_Kind_Or_Operator,
      Iir_Kind_Nand_Operator,
      Iir_Kind_Nor_Operator,
      Iir_Kind_Xor_Operator,
      Iir_Kind_Xnor_Operator,
      Iir_Kind_Equality_Operator,
      Iir_Kind_Inequality_Operator,
      Iir_Kind_Less_Than_Operator,
      Iir_Kind_Less_Than_Or_Equal_Operator,
      Iir_Kind_Greater_Than_Operator,
      Iir_Kind_Greater_Than_Or_Equal_Operator,
      Iir_Kind_Match_Equality_Operator,
      Iir_Kind_Match_Inequality_Operator,
      Iir_Kind_Match_Less_Than_Operator,
      Iir_Kind_Match_Less_Than_Or_Equal_Operator,
      Iir_Kind_Match_Greater_Than_Operator,
      Iir_Kind_Match_Greater_Than_Or_Equal_Operator,
      Iir_Kind_Sll_Operator,
      Iir_Kind_Sla_Operator,
      Iir_Kind_Srl_Operator,
      Iir_Kind_Sra_Operator,
      Iir_Kind_Rol_Operator,
      Iir_Kind_Ror_Operator,
      Iir_Kind_Addition_Operator,
      Iir_Kind_Substraction_Operator,
      Iir_Kind_Concatenation_Operator,
      Iir_Kind_Multiplication_Operator,
      Iir_Kind_Division_Operator,
      Iir_Kind_Modulus_Operator,
      Iir_Kind_Remainder_Operator,
      Iir_Kind_Exponentiation_Operator,
      Iir_Kind_Function_Call,
      Iir_Kind_Aggregate,
      Iir_Kind_Parenthesis_Expression,
      Iir_Kind_Qualified_Expression,
      Iir_Kind_Type_Conversion,
      Iir_Kind_Allocator_By_Expression,
      Iir_Kind_Allocator_By_Subtype,
      Iir_Kind_Selected_Element,
      Iir_Kind_Dereference,
      Iir_Kind_Implicit_Dereference,
      Iir_Kind_Slice_Name,
      Iir_Kind_Indexed_Name,
      Iir_Kind_Psl_Expression,

   -- Concurrent statements.
      Iir_Kind_Sensitized_Process_Statement,
      Iir_Kind_Process_Statement,
      Iir_Kind_Concurrent_Simple_Signal_Assignment,
      Iir_Kind_Concurrent_Conditional_Signal_Assignment,
      Iir_Kind_Concurrent_Selected_Signal_Assignment,
      Iir_Kind_Concurrent_Assertion_Statement,
      Iir_Kind_Psl_Default_Clock,
      Iir_Kind_Psl_Assert_Statement,
      Iir_Kind_Psl_Cover_Statement,
      Iir_Kind_Concurrent_Procedure_Call_Statement,
      Iir_Kind_Block_Statement,
      Iir_Kind_If_Generate_Statement,
      Iir_Kind_Case_Generate_Statement,
      Iir_Kind_For_Generate_Statement,
      Iir_Kind_Component_Instantiation_Statement,

      Iir_Kind_Simple_Simultaneous_Statement,

      Iir_Kind_Generate_Statement_Body,
      Iir_Kind_If_Generate_Else_Clause,

   -- Iir_Kind_Sequential_Statement
      Iir_Kind_Simple_Signal_Assignment_Statement,
      Iir_Kind_Conditional_Signal_Assignment_Statement,
      Iir_Kind_Null_Statement,
      Iir_Kind_Assertion_Statement,
      Iir_Kind_Report_Statement,
      Iir_Kind_Wait_Statement,
      Iir_Kind_Variable_Assignment_Statement,
      Iir_Kind_Conditional_Variable_Assignment_Statement,
      Iir_Kind_Return_Statement,
      Iir_Kind_For_Loop_Statement,
      Iir_Kind_While_Loop_Statement,
      Iir_Kind_Next_Statement,
      Iir_Kind_Exit_Statement,
      Iir_Kind_Case_Statement,
      Iir_Kind_Procedure_Call_Statement,
      Iir_Kind_If_Statement,
      Iir_Kind_Elsif,

   -- Names
      Iir_Kind_Character_Literal,              --  denoting_name
      Iir_Kind_Simple_Name,                    --  denoting_name
      Iir_Kind_Selected_Name,                  --  denoting_name
      Iir_Kind_Operator_Symbol,                --  denoting_name

      Iir_Kind_Selected_By_All_Name,
      Iir_Kind_Parenthesis_Name,

      Iir_Kind_External_Constant_Name,
      Iir_Kind_External_Signal_Name,
      Iir_Kind_External_Variable_Name,

      Iir_Kind_Package_Pathname,
      Iir_Kind_Absolute_Pathname,
      Iir_Kind_Relative_Pathname,
      Iir_Kind_Pathname_Element,

   -- Attributes
      Iir_Kind_Base_Attribute,
      Iir_Kind_Left_Type_Attribute,            --  type_attribute
      Iir_Kind_Right_Type_Attribute,           --  type_attribute
      Iir_Kind_High_Type_Attribute,            --  type_attribute
      Iir_Kind_Low_Type_Attribute,             --  type_attribute
      Iir_Kind_Ascending_Type_Attribute,       --  type_attribute
      Iir_Kind_Image_Attribute,
      Iir_Kind_Value_Attribute,
      Iir_Kind_Pos_Attribute,                  --  scalar_type_attribute
      Iir_Kind_Val_Attribute,                  --  scalar_type_attribute
      Iir_Kind_Succ_Attribute,                 --  scalar_type_attribute
      Iir_Kind_Pred_Attribute,                 --  scalar_type_attribute
      Iir_Kind_Leftof_Attribute,               --  scalar_type_attribute
      Iir_Kind_Rightof_Attribute,              --  scalar_type_attribute
      Iir_Kind_Delayed_Attribute,              --  signal_attribute
      Iir_Kind_Stable_Attribute,               --  signal_attribute
      Iir_Kind_Quiet_Attribute,                --  signal_attribute
      Iir_Kind_Transaction_Attribute,          --  signal_attribute
      Iir_Kind_Event_Attribute,                --  signal_value_attribute
      Iir_Kind_Active_Attribute,               --  signal_value_attribute
      Iir_Kind_Last_Event_Attribute,           --  signal_value_attribute
      Iir_Kind_Last_Active_Attribute,          --  signal_value_attribute
      Iir_Kind_Last_Value_Attribute,           --  signal_value_attribute
      Iir_Kind_Driving_Attribute,              --  signal_value_attribute
      Iir_Kind_Driving_Value_Attribute,        --  signal_value_attribute
      Iir_Kind_Behavior_Attribute,
      Iir_Kind_Structure_Attribute,
      Iir_Kind_Simple_Name_Attribute,
      Iir_Kind_Instance_Name_Attribute,
      Iir_Kind_Path_Name_Attribute,
      Iir_Kind_Left_Array_Attribute,           --  array_attribute
      Iir_Kind_Right_Array_Attribute,          --  array_attribute
      Iir_Kind_High_Array_Attribute,           --  array_attribute
      Iir_Kind_Low_Array_Attribute,            --  array_attribute
      Iir_Kind_Length_Array_Attribute,         --  array_attribute
      Iir_Kind_Ascending_Array_Attribute,      --  array_attribute
      Iir_Kind_Range_Array_Attribute,          --  array_attribute
      Iir_Kind_Reverse_Range_Array_Attribute,  --  array_attribute

      Iir_Kind_Attribute_Name
     );

   --  Return TRUE iif K is K1 or K is K2.
   function Kind_In (K : Iir_Kind; K1, K2 : Iir_Kind) return Boolean;
   pragma Inline (Kind_In);

   type Iir_Signal_Kind is
      (
       Iir_Register_Kind,
       Iir_Bus_Kind
      );

   --  If the order of elements in IIR_MODE is modified, also modify the
   --  order in GRT (types and rtis).
   type Iir_Mode is
      (
       Iir_Unknown_Mode,
       Iir_Linkage_Mode,
       Iir_Buffer_Mode,
       Iir_Out_Mode,
       Iir_Inout_Mode,
       Iir_In_Mode
      );

   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;

   type Iir_Delay_Mechanism is (Iir_Inertial_Delay, Iir_Transport_Delay);

   type Iir_Direction is (Iir_To, Iir_Downto);

   --  LRM93 2.7 (conformance rules).
   --  To keep this simple, the layout is stored as a bit-string.
   --  Fields are:
   --  Get_Has_type: set if the interface is the last of a list.
   --  Get_Has_Mode: set if mode is explicit
   --  has_class: set if class (constant, signal, variable or file) is explicit
   --
   --  Exemple:
   --  procedure P (         A, B:       integer;
   --               constant C:    in    bit;
   --                        D:    inout bit;
   --               variable E:          bit;
   --                        F, G: in    bit;
   --               constant H, I:       bit;
   --               constant J, K: in    bit);
   --  A:
   --  B:                      has_type
   --  C, has_class, has_mode, has_type
   --  D:            has_mode, has_type
   --  E, has_class,           has_type
   --  F:            has_mode
   --  G:            has_mode, has_type
   --  H: has_class
   --  I: has_class,           has_type
   --  J: has_class, has_mode
   --  K: has_class, has_mode, has_type

   --  List of predefined operators and functions.
   type Iir_Predefined_Functions is
      (
       Iir_Predefined_Error,

       --  Predefined operators for BOOLEAN type

       --  LRM08 9.2.2 Logical Operators
       Iir_Predefined_Boolean_And,
       Iir_Predefined_Boolean_Or,
       Iir_Predefined_Boolean_Nand,
       Iir_Predefined_Boolean_Nor,
       Iir_Predefined_Boolean_Xor,
       Iir_Predefined_Boolean_Xnor,
       Iir_Predefined_Boolean_Not,

       --  LRM08 5.2.6 Predefined operations on scalar types.
       Iir_Predefined_Boolean_Rising_Edge,
       Iir_Predefined_Boolean_Falling_Edge,

       --  Predefined operators for any enumeration type.

       --  LRM08 9.2.3 Relational Operators
       Iir_Predefined_Enum_Equality,
       Iir_Predefined_Enum_Inequality,
       Iir_Predefined_Enum_Less,
       Iir_Predefined_Enum_Less_Equal,
       Iir_Predefined_Enum_Greater,
       Iir_Predefined_Enum_Greater_Equal,

       --  LRM08 5.2.6 Predefined operations on scalar types.
       Iir_Predefined_Enum_Minimum,
       Iir_Predefined_Enum_Maximum,
       Iir_Predefined_Enum_To_String,

       --  Predefined operators for BIT type.

       --  LRM08 9.2.2 Logical Operators
       Iir_Predefined_Bit_And,
       Iir_Predefined_Bit_Or,
       Iir_Predefined_Bit_Nand,
       Iir_Predefined_Bit_Nor,
       Iir_Predefined_Bit_Xor,
       Iir_Predefined_Bit_Xnor,
       Iir_Predefined_Bit_Not,

       --  LRM08 9.2.3 Relational Operators
       Iir_Predefined_Bit_Match_Equality,
       Iir_Predefined_Bit_Match_Inequality,
       Iir_Predefined_Bit_Match_Less,
       Iir_Predefined_Bit_Match_Less_Equal,
       Iir_Predefined_Bit_Match_Greater,
       Iir_Predefined_Bit_Match_Greater_Equal,

       --  LRM08 9.2.9 Condition operator
       Iir_Predefined_Bit_Condition,

       --  LRM08 5.2.6 Predefined operations on scalar types.
       Iir_Predefined_Bit_Rising_Edge,
       Iir_Predefined_Bit_Falling_Edge,

       --  Predefined operators for any integer type.

       --  LRM08 9.2.3 Relational Operators
       Iir_Predefined_Integer_Equality,
       Iir_Predefined_Integer_Inequality,
       Iir_Predefined_Integer_Less,
       Iir_Predefined_Integer_Less_Equal,
       Iir_Predefined_Integer_Greater,
       Iir_Predefined_Integer_Greater_Equal,

       --  LRM08 9.2.6 Sign operators
       Iir_Predefined_Integer_Identity,
       Iir_Predefined_Integer_Negation,

       --  LRM08 9.2.8 Miscellaneous operators
       Iir_Predefined_Integer_Absolute,

       --  LRM08 9.2.5 Adding operators
       Iir_Predefined_Integer_Plus,
       Iir_Predefined_Integer_Minus,

       --  LRM08 9.2.7 Multiplying operators
       Iir_Predefined_Integer_Mul,
       Iir_Predefined_Integer_Div,
       Iir_Predefined_Integer_Mod,
       Iir_Predefined_Integer_Rem,

       --  LRM08 9.2.8 Miscellaneous operators
       Iir_Predefined_Integer_Exp,

       --  LRM08 5.2.6 Predefined operations on scalar types.
       Iir_Predefined_Integer_Minimum,
       Iir_Predefined_Integer_Maximum,
       Iir_Predefined_Integer_To_String,

       --  Predefined operators for any floating type.

       --  LRM08 9.2.3 Relational Operators
       Iir_Predefined_Floating_Equality,
       Iir_Predefined_Floating_Inequality,
       Iir_Predefined_Floating_Less,
       Iir_Predefined_Floating_Less_Equal,
       Iir_Predefined_Floating_Greater,
       Iir_Predefined_Floating_Greater_Equal,

       --  LRM08 9.2.6 Sign operators
       Iir_Predefined_Floating_Identity,
       Iir_Predefined_Floating_Negation,

       --  LRM08 9.2.8 Miscellaneous operators
       Iir_Predefined_Floating_Absolute,

       --  LRM08 9.2.5 Adding operators
       Iir_Predefined_Floating_Plus,
       Iir_Predefined_Floating_Minus,

       --  LRM08 9.2.7 Multiplying operators
       Iir_Predefined_Floating_Mul,
       Iir_Predefined_Floating_Div,

       --  LRM08 9.2.8 Miscellaneous operators
       Iir_Predefined_Floating_Exp,

       --  LRM08 5.2.6 Predefined operations on scalar types.
       Iir_Predefined_Floating_Minimum,
       Iir_Predefined_Floating_Maximum,
       Iir_Predefined_Floating_To_String,
       Iir_Predefined_Real_To_String_Digits,
       Iir_Predefined_Real_To_String_Format,

       --  Predefined operator for universal types.

       --  LRM08 9.2.7 Multiplying operators
       Iir_Predefined_Universal_R_I_Mul,
       Iir_Predefined_Universal_I_R_Mul,
       Iir_Predefined_Universal_R_I_Div,

       --  Predefined operators for physical types.

       --  LRM08 9.2.3 Relational Operators
       Iir_Predefined_Physical_Equality,
       Iir_Predefined_Physical_Inequality,
       Iir_Predefined_Physical_Less,
       Iir_Predefined_Physical_Less_Equal,
       Iir_Predefined_Physical_Greater,
       Iir_Predefined_Physical_Greater_Equal,

       --  LRM08 9.2.6 Sign operators
       Iir_Predefined_Physical_Identity,
       Iir_Predefined_Physical_Negation,

       --  LRM08 9.2.8 Miscellaneous operators
       Iir_Predefined_Physical_Absolute,

       --  LRM08 9.2.5 Adding operators
       Iir_Predefined_Physical_Plus,
       Iir_Predefined_Physical_Minus,

       --  LRM08 9.2.7 Multiplying operators
       Iir_Predefined_Physical_Integer_Mul,
       Iir_Predefined_Physical_Real_Mul,
       Iir_Predefined_Integer_Physical_Mul,
       Iir_Predefined_Real_Physical_Mul,
       Iir_Predefined_Physical_Integer_Div,
       Iir_Predefined_Physical_Real_Div,
       Iir_Predefined_Physical_Physical_Div,

       --  LRM08 5.2.6 Predefined operations on scalar types.
       Iir_Predefined_Physical_Minimum,
       Iir_Predefined_Physical_Maximum,
       Iir_Predefined_Physical_To_String,
       Iir_Predefined_Time_To_String_Unit,

       --  Predefined operators for access.

       --  LRM08 9.2.3 Relational Operators
       Iir_Predefined_Access_Equality,
       Iir_Predefined_Access_Inequality,

       --  Predefined operators for record.

       --  LRM08 9.2.3 Relational Operators
       Iir_Predefined_Record_Equality,
       Iir_Predefined_Record_Inequality,

       --  Predefined operators for array.

       --  LRM08 9.2.3 Relational Operators
       Iir_Predefined_Array_Equality,
       Iir_Predefined_Array_Inequality,
       Iir_Predefined_Array_Less,
       Iir_Predefined_Array_Less_Equal,
       Iir_Predefined_Array_Greater,
       Iir_Predefined_Array_Greater_Equal,

       --  LRM08 9.2.5 Adding operators
       Iir_Predefined_Array_Array_Concat,
       Iir_Predefined_Array_Element_Concat,
       Iir_Predefined_Element_Array_Concat,
       Iir_Predefined_Element_Element_Concat,

       --  LRM08 5.3.2.4 Predefined operations on array types
       Iir_Predefined_Array_Minimum,
       Iir_Predefined_Array_Maximum,
       Iir_Predefined_Vector_Minimum,
       Iir_Predefined_Vector_Maximum,

       --  LRM08 9.2.4 Shift operators
       Iir_Predefined_Array_Sll,
       Iir_Predefined_Array_Srl,
       Iir_Predefined_Array_Sla,
       Iir_Predefined_Array_Sra,
       Iir_Predefined_Array_Rol,
       Iir_Predefined_Array_Ror,

       --  LRM08 9.2.2 Logical operators
       --  Predefined operators for one dimensional array.
       --  For bit and boolean type, the operations are the same.  To be
       --  neutral, we use TF (for True/False) instead of Bit, Boolean or
       --  Logic.
       Iir_Predefined_TF_Array_And,
       Iir_Predefined_TF_Array_Or,
       Iir_Predefined_TF_Array_Nand,
       Iir_Predefined_TF_Array_Nor,
       Iir_Predefined_TF_Array_Xor,
       Iir_Predefined_TF_Array_Xnor,
       Iir_Predefined_TF_Array_Not,

       --  LRM08 9.2.2 Logical operators
       Iir_Predefined_TF_Reduction_And,
       Iir_Predefined_TF_Reduction_Or,
       Iir_Predefined_TF_Reduction_Nand,
       Iir_Predefined_TF_Reduction_Nor,
       Iir_Predefined_TF_Reduction_Xor,
       Iir_Predefined_TF_Reduction_Xnor,
       Iir_Predefined_TF_Reduction_Not,

       --  LRM08 9.2.2 Logical operators
       Iir_Predefined_TF_Array_Element_And,
       Iir_Predefined_TF_Element_Array_And,
       Iir_Predefined_TF_Array_Element_Or,
       Iir_Predefined_TF_Element_Array_Or,
       Iir_Predefined_TF_Array_Element_Nand,
       Iir_Predefined_TF_Element_Array_Nand,
       Iir_Predefined_TF_Array_Element_Nor,
       Iir_Predefined_TF_Element_Array_Nor,
       Iir_Predefined_TF_Array_Element_Xor,
       Iir_Predefined_TF_Element_Array_Xor,
       Iir_Predefined_TF_Array_Element_Xnor,
       Iir_Predefined_TF_Element_Array_Xnor,

       --  LRM08 9.2.3 Relational Operators
       Iir_Predefined_Bit_Array_Match_Equality,
       Iir_Predefined_Bit_Array_Match_Inequality,

       --  LRM08 5.3.2.4 Predefined operations on array types
       Iir_Predefined_Array_Char_To_String,
       Iir_Predefined_Bit_Vector_To_Ostring,
       Iir_Predefined_Bit_Vector_To_Hstring,

       --  LRM08 9.2.3 Relational Operators
       --  IEEE.Std_Logic_1164.Std_Ulogic
       Iir_Predefined_Std_Ulogic_Match_Equality,
       Iir_Predefined_Std_Ulogic_Match_Inequality,
       Iir_Predefined_Std_Ulogic_Match_Less,
       Iir_Predefined_Std_Ulogic_Match_Less_Equal,
       Iir_Predefined_Std_Ulogic_Match_Greater,
       Iir_Predefined_Std_Ulogic_Match_Greater_Equal,

       --  LRM08 9.2.3 Relational Operators
       Iir_Predefined_Std_Ulogic_Array_Match_Equality,
       Iir_Predefined_Std_Ulogic_Array_Match_Inequality,

       --  --  Predefined attribute functions.
       --  Iir_Predefined_Attribute_Image,
       --  Iir_Predefined_Attribute_Value,
       --  Iir_Predefined_Attribute_Pos,
       --  Iir_Predefined_Attribute_Val,
       --  Iir_Predefined_Attribute_Succ,
       --  Iir_Predefined_Attribute_Pred,
       --  Iir_Predefined_Attribute_Leftof,
       --  Iir_Predefined_Attribute_Rightof,
       --  Iir_Predefined_Attribute_Left,
       --  Iir_Predefined_Attribute_Right,
       --  Iir_Predefined_Attribute_Event,
       --  Iir_Predefined_Attribute_Active,
       --  Iir_Predefined_Attribute_Last_Event,
       --  Iir_Predefined_Attribute_Last_Active,
       --  Iir_Predefined_Attribute_Last_Value,
       --  Iir_Predefined_Attribute_Driving,
       --  Iir_Predefined_Attribute_Driving_Value,

       --  Impure subprograms.

       --  LRM08 5.4.3 Allocation and deallocation of objects
       Iir_Predefined_Deallocate,

       --  LRM08 5.5.2 File operations
       Iir_Predefined_File_Open,
       Iir_Predefined_File_Open_Status,
       Iir_Predefined_File_Close,
       Iir_Predefined_Read,
       Iir_Predefined_Read_Length,
       Iir_Predefined_Flush,
       Iir_Predefined_Write,
       Iir_Predefined_Endfile,

       --  Misc impure functions.
       Iir_Predefined_Now_Function,

       --  A not predefined and not known function.  User function.
       Iir_Predefined_None,

       --  Defined in package ieee.std_logic_1164

       --  Std_Ulogic operations.
       Iir_Predefined_Ieee_1164_Scalar_And,
       Iir_Predefined_Ieee_1164_Scalar_Nand,
       Iir_Predefined_Ieee_1164_Scalar_Or,
       Iir_Predefined_Ieee_1164_Scalar_Nor,
       Iir_Predefined_Ieee_1164_Scalar_Xor,
       Iir_Predefined_Ieee_1164_Scalar_Xnor,
       Iir_Predefined_Ieee_1164_Scalar_Not,

       --  Std_Logic_Vector or Std_Ulogic_Vector operations.
       --  Length of the result is the length of the left operand.
       Iir_Predefined_Ieee_1164_Vector_And,
       Iir_Predefined_Ieee_1164_Vector_Nand,
       Iir_Predefined_Ieee_1164_Vector_Or,
       Iir_Predefined_Ieee_1164_Vector_Nor,
       Iir_Predefined_Ieee_1164_Vector_Xor,
       Iir_Predefined_Ieee_1164_Vector_Xnor,
       Iir_Predefined_Ieee_1164_Vector_Not
      );

   --  Return TRUE iff FUNC is a short-cut predefined function.
   function Iir_Predefined_Shortcut_P (Func : Iir_Predefined_Functions)
     return Boolean;

   --  Pure and impure functions form a partition of implicit functions.
   subtype Iir_Predefined_Pure_Functions is Iir_Predefined_Functions range
     Iir_Predefined_Boolean_And ..
     Iir_Predefined_Functions'Pred (Iir_Predefined_Deallocate);
   subtype Iir_Predefined_Impure_Functions is Iir_Predefined_Functions range
     Iir_Predefined_Deallocate ..
     Iir_Predefined_Functions'Pred (Iir_Predefined_None);

   subtype Iir_Predefined_Dyadic_TF_Array_Functions
   is Iir_Predefined_Functions range
     Iir_Predefined_TF_Array_And ..
   --Iir_Predefined_TF_Array_Or
   --Iir_Predefined_TF_Array_Nand
   --Iir_Predefined_TF_Array_Nor
   --Iir_Predefined_TF_Array_Xor
     Iir_Predefined_TF_Array_Xnor;

   subtype Iir_Predefined_Shift_Functions is Iir_Predefined_Functions range
     Iir_Predefined_Array_Sll ..
   --Iir_Predefined_Array_Srl
   --Iir_Predefined_Array_Sla
   --Iir_Predefined_Array_Sra
   --Iir_Predefined_Array_Rol
     Iir_Predefined_Array_Ror;

   subtype Iir_Predefined_Concat_Functions is Iir_Predefined_Functions range
     Iir_Predefined_Array_Array_Concat ..
   --Iir_Predefined_Array_Element_Concat
   --Iir_Predefined_Element_Array_Concat
     Iir_Predefined_Element_Element_Concat;

   subtype Iir_Predefined_Std_Ulogic_Match_Ordering_Functions is
     Iir_Predefined_Functions range
     Iir_Predefined_Std_Ulogic_Match_Less ..
   --Iir_Predefined_Std_Ulogic_Match_Less_Equal
   --Iir_Predefined_Std_Ulogic_Match_Greater
     Iir_Predefined_Std_Ulogic_Match_Greater_Equal;

   --  Subtype for implicit subprograms.  These have no corresponding bodies.
   --  Implicit and explicit subprograms are partitions: they are disjoint
   --  and cover all the cases.
   subtype Iir_Predefined_Implicit is Iir_Predefined_Functions range
     Iir_Predefined_Error ..
     Iir_Predefined_Functions'Pred (Iir_Predefined_None);

   --  Subtype for exlicit subprograms.  These require a corresponding body.
   subtype Iir_Predefined_Explicit is Iir_Predefined_Functions range
     Iir_Predefined_None ..
     Iir_Predefined_Functions'Last;

   --  Staticness as defined by LRM93 6.1 and 7.4
   type Iir_Staticness is (Unknown, None, Globally, Locally);

   -- Staticness as defined by LRM93 6.1 and 7.4
   function Min (L,R: Iir_Staticness) return Iir_Staticness renames
     Iir_Staticness'Min;

   --  Purity state of a procedure.
   --  PURE means the procedure is pure.
   --  IMPURE means the procedure is impure: it references a file object or
   --    a signal or a variable declared outside a subprogram, or it calls an
   --    impure subprogram.
   --  MAYBE_IMPURE means the procedure references a signal or a variable
   --    declared in a subprogram.  The relative position of a parent has to
   --    be considered.  The list of callees must not be checked.
   --  UNKNOWN is like MAYBE_IMPURE, but the subprogram has a list of callees
   --    whose purity is not yet known.  As a consequence, a direct or
   --    indirect call to such a procedure cannot be proved to be allowed
   --    in a pure function.
   --  Note: UNKNOWN is the default state.  At any impure call, the state is
   --    set to IMPURE.  Only at the end of body analysis and only if the
   --    callee list is empty, the state can be set either to MAYBE_IMPURE or
   --    PURE.
   type Iir_Pure_State is (Unknown, Pure, Maybe_Impure, Impure);

   --  State of subprograms for validity of use in all-sensitized process.
   --  INVALID_SIGNAL means that the subprogram is in a package and
   --    reads a signal or that the subprogram calls (indirectly) such
   --    a subprogram.  In this case, the subprogram cannot be called from
   --    an all-sensitized process.
   --  READ_SIGNAL means that the subprogram reads a signal and is defined
   --    in an entity or an architecture or that the subprogram calls
   --    (indirectly) such a subprogram.  In this case, the subprogram can
   --    be called from an all-sensitized process and the reference will be
   --    part of the sensitivity list.
   --  NO_SIGNAL means that the subprogram doesn't read any signal and don't
   --    call such a subprogram.  The subprogram can be called from an
   --    all-sensitized process but there is no need to track this call.
   --  UNKNOWN means that the state is not yet defined.
   type Iir_All_Sensitized is
     (Unknown, No_Signal, Read_Signal, Invalid_Signal);

   --  Constraint state of a type.
   --  See LRM08 5.1 for definition.
   type Iir_Constraint is
     (Unconstrained, Partially_Constrained, Fully_Constrained);

   --  The kind of an inteface list.
   type Interface_Kind_Type is (Generic_Interface_List,
                                Port_Interface_List,
                                Procedure_Parameter_Interface_List,
                                Function_Parameter_Interface_List);
   subtype Parameter_Interface_List is Interface_Kind_Type range
     Procedure_Parameter_Interface_List ..
     Function_Parameter_Interface_List;

   ---------------
   -- subranges --
   ---------------
   -- These subtypes are used for ranges, for `case' statments or for the `in'
   -- operator.

   -- In order to be correctly parsed by check_iir, the declaration must
   -- follow these rules:
   -- * the first line must be "subtype Iir_Kinds_NAME is Iir_Kind_range"
   -- * the second line must be the lowest bound of the range, followed by "..
   -- * comments line
   -- * the last line must be the highest bound of the range, followed by ";"

--   subtype Iir_Kinds_List is Iir_Kind range
--     Iir_Kind_List ..
--     Iir_Kind_Callees_List;

   subtype Iir_Kinds_Library_Unit_Declaration is Iir_Kind range
     Iir_Kind_Package_Declaration ..
   --Iir_Kind_Package_Instantiation_Declaration
   --Iir_Kind_Package_Body
   --Iir_Kind_Configuration_Declaration
   --Iir_Kind_Entity_Declaration
   --Iir_Kind_Architecture_Body
     Iir_Kind_Context_Declaration;

   subtype Iir_Kinds_Package_Declaration is Iir_Kind range
     Iir_Kind_Package_Declaration ..
     Iir_Kind_Package_Instantiation_Declaration;

   --  Note: does not include iir_kind_enumeration_literal since it is
   --  considered as a declaration.
   subtype Iir_Kinds_Literal is Iir_Kind range
     Iir_Kind_Integer_Literal ..
   --Iir_Kind_Floating_Point_Literal
   --Iir_Kind_Null_Literal
   --Iir_Kind_String_Literal8
   --Iir_Kind_Physical_Int_Literal
     Iir_Kind_Physical_Fp_Literal;

   subtype Iir_Kinds_Array_Type_Definition is Iir_Kind range
     Iir_Kind_Array_Type_Definition ..
     Iir_Kind_Array_Subtype_Definition;

   subtype Iir_Kinds_Type_And_Subtype_Definition is Iir_Kind range
     Iir_Kind_Access_Type_Definition ..
   --Iir_Kind_Incomplete_Type_Definition
   --Iir_Kind_File_Type_Definition
   --Iir_Kind_Protected_Type_Declaration
   --Iir_Kind_Record_Type_Definition
   --Iir_Kind_Array_Type_Definition
   --Iir_Kind_Array_Subtype_Definition
   --Iir_Kind_Record_Subtype_Definition
   --Iir_Kind_Access_Subtype_Definition
   --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_Integer_Type_Definition
   --Iir_Kind_Floating_Type_Definition
     Iir_Kind_Physical_Type_Definition;

   subtype Iir_Kinds_Subtype_Definition is Iir_Kind range
     Iir_Kind_Array_Subtype_Definition ..
   --Iir_Kind_Record_Subtype_Definition
   --Iir_Kind_Access_Subtype_Definition
   --Iir_Kind_Physical_Subtype_Definition
   --Iir_Kind_Floating_Subtype_Definition
   --Iir_Kind_Integer_Subtype_Definition
     Iir_Kind_Enumeration_Subtype_Definition;

   subtype Iir_Kinds_Scalar_Subtype_Definition is Iir_Kind range
     Iir_Kind_Physical_Subtype_Definition ..
   --Iir_Kind_Floating_Subtype_Definition
   --Iir_Kind_Integer_Subtype_Definition
     Iir_Kind_Enumeration_Subtype_Definition;

   subtype Iir_Kinds_Scalar_Type_Definition is Iir_Kind range
     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_Integer_Type_Definition
   --Iir_Kind_Floating_Type_Definition
     Iir_Kind_Physical_Type_Definition;

   subtype Iir_Kinds_Range_Type_Definition is Iir_Kind range
     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;

   subtype Iir_Kinds_Discrete_Type_Definition is Iir_Kind range
     Iir_Kind_Integer_Subtype_Definition ..
   --Iir_Kind_Enumeration_Subtype_Definition
   --Iir_Kind_Enumeration_Type_Definition
     Iir_Kind_Integer_Type_Definition;

--     subtype Iir_Kinds_Discrete_Subtype_Definition is Iir_Kind range
--       Iir_Kind_Integer_Subtype_Definition ..
--       Iir_Kind_Enumeration_Subtype_Definition;

   subtype Iir_Kinds_Composite_Type_Definition is Iir_Kind range
     Iir_Kind_Record_Type_Definition ..
   --Iir_Kind_Array_Type_Definition
   --Iir_Kind_Array_Subtype_Definition
     Iir_Kind_Record_Subtype_Definition;

   subtype Iir_Kinds_Type_Declaration is Iir_Kind range
     Iir_Kind_Type_Declaration ..
   --Iir_Kind_Anonymous_Type_Declaration
     Iir_Kind_Subtype_Declaration;

   subtype Iir_Kinds_Nonoverloadable_Declaration is Iir_Kind range
     Iir_Kind_Type_Declaration ..
     Iir_Kind_Element_Declaration;

   subtype Iir_Kinds_Monadic_Operator is Iir_Kind range
     Iir_Kind_Identity_Operator ..
   --Iir_Kind_Negation_Operator
   --Iir_Kind_Absolute_Operator
   --Iir_Kind_Not_Operator
   --Iir_Kind_Condition_Operator
   --Iir_Kind_Reduction_And_Operator
   --Iir_Kind_Reduction_Or_Operator
   --Iir_Kind_Reduction_Nand_Operator
   --Iir_Kind_Reduction_Nor_Operator
   --Iir_Kind_Reduction_Xor_Operator
     Iir_Kind_Reduction_Xnor_Operator;

   subtype Iir_Kinds_Dyadic_Operator is Iir_Kind range
     Iir_Kind_And_Operator ..
   --Iir_Kind_Or_Operator
   --Iir_Kind_Nand_Operator
   --Iir_Kind_Nor_Operator
   --Iir_Kind_Xor_Operator
   --Iir_Kind_Xnor_Operator
   --Iir_Kind_Equality_Operator
   --Iir_Kind_Inequality_Operator
   --Iir_Kind_Less_Than_Operator
   --Iir_Kind_Less_Than_Or_Equal_Operator
   --Iir_Kind_Greater_Than_Operator
   --Iir_Kind_Greater_Than_Or_Equal_Operator
   --Iir_Kind_Match_Equality_Operator
   --Iir_Kind_Match_Inequality_Operator
   --Iir_Kind_Match_Less_Than_Operator
   --Iir_Kind_Match_Less_Than_Or_Equal_Operator
   --Iir_Kind_Match_Greater_Than_Operator
   --Iir_Kind_Match_Greater_Than_Or_Equal_Operator
   --Iir_Kind_Sll_Operator
   --Iir_Kind_Sla_Operator
   --Iir_Kind_Srl_Operator
   --Iir_Kind_Sra_Operator
   --Iir_Kind_Rol_Operator
   --Iir_Kind_Ror_Operator
   --Iir_Kind_Addition_Operator
   --Iir_Kind_Substraction_Operator
   --Iir_Kind_Concatenation_Operator
   --Iir_Kind_Multiplication_Operator
   --Iir_Kind_Division_Operator
   --Iir_Kind_Modulus_Operator
   --Iir_Kind_Remainder_Operator
     Iir_Kind_Exponentiation_Operator;

   subtype Iir_Kinds_Functions_And_Literals is Iir_Kind range
     Iir_Kind_Enumeration_Literal ..
     Iir_Kind_Function_Declaration;

   subtype Iir_Kinds_Subprogram_Declaration is Iir_Kind range
     Iir_Kind_Function_Declaration ..
     Iir_Kind_Procedure_Declaration;

   subtype Iir_Kinds_Process_Statement is Iir_Kind range
     Iir_Kind_Sensitized_Process_Statement ..
     Iir_Kind_Process_Statement;

   subtype Iir_Kinds_Interface_Object_Declaration is Iir_Kind range
     Iir_Kind_Interface_Constant_Declaration ..
   --Iir_Kind_Interface_Variable_Declaration
   --Iir_Kind_Interface_Signal_Declaration
     Iir_Kind_Interface_File_Declaration;

   subtype Iir_Kinds_Object_Declaration is Iir_Kind range
     Iir_Kind_Object_Alias_Declaration ..
   --Iir_Kind_File_Declaration
   --Iir_Kind_Guard_Signal_Declaration
   --Iir_Kind_Signal_Declaration
   --Iir_Kind_Variable_Declaration
   --Iir_Kind_Constant_Declaration
   --Iir_Kind_Iterator_Declaration
   --Iir_Kind_Interface_Constant_Declaration
   --Iir_Kind_Interface_Variable_Declaration
   --Iir_Kind_Interface_Signal_Declaration
     Iir_Kind_Interface_File_Declaration;

   subtype Iir_Kinds_Branch_Quantity_Declaration is Iir_Kind range
     Iir_Kind_Across_Quantity_Declaration ..
     Iir_Kind_Through_Quantity_Declaration;

   subtype Iir_Kinds_Quantity_Declaration is Iir_Kind range
     Iir_Kind_Free_Quantity_Declaration ..
   --Iir_Kind_Across_Quantity_Declaration
     Iir_Kind_Through_Quantity_Declaration;

   subtype Iir_Kinds_Non_Alias_Object_Declaration is Iir_Kind range
     Iir_Kind_File_Declaration ..
   --Iir_Kind_Guard_Signal_Declaration
   --Iir_Kind_Signal_Declaration
   --Iir_Kind_Variable_Declaration
   --Iir_Kind_Constant_Declaration
   --Iir_Kind_Iterator_Declaration
   --Iir_Kind_Interface_Constant_Declaration
   --Iir_Kind_Interface_Variable_Declaration
   --Iir_Kind_Interface_Signal_Declaration
     Iir_Kind_Interface_File_Declaration;

   subtype Iir_Kinds_Association_Element is Iir_Kind range
     Iir_Kind_Association_Element_By_Expression ..
   --Iir_Kind_Association_Element_By_Individual
     Iir_Kind_Association_Element_Open;

   subtype Iir_Kinds_Choice is Iir_Kind range
     Iir_Kind_Choice_By_Others ..
   --Iir_Kind_Choice_By_Expression
   --Iir_Kind_Choice_By_Range
   --Iir_Kind_Choice_By_None
     Iir_Kind_Choice_By_Name;

   subtype Iir_Kinds_Denoting_Name is Iir_Kind range
     Iir_Kind_Character_Literal ..
   --Iir_Kind_Simple_Name
   --Iir_Kind_Selected_Name
     Iir_Kind_Operator_Symbol;

   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_Selected_By_All_Name
     Iir_Kind_Parenthesis_Name;

   subtype Iir_Kinds_Dereference is Iir_Kind range
     Iir_Kind_Dereference ..
     Iir_Kind_Implicit_Dereference;

   subtype Iir_Kinds_External_Name is Iir_Kind range
     Iir_Kind_External_Constant_Name ..
   --Iir_Kind_External_Signal_Name
     Iir_Kind_External_Variable_Name;

   --  Any attribute that is an expression.
   subtype Iir_Kinds_Expression_Attribute is Iir_Kind range
     Iir_Kind_Left_Type_Attribute ..
   --Iir_Kind_Right_Type_Attribute
   --Iir_Kind_High_Type_Attribute
   --Iir_Kind_Low_Type_Attribute
   --Iir_Kind_Ascending_Type_Attribute
   --Iir_Kind_Image_Attribute
   --Iir_Kind_Value_Attribute
   --Iir_Kind_Pos_Attribute
   --Iir_Kind_Val_Attribute
   --Iir_Kind_Succ_Attribute
   --Iir_Kind_Pred_Attribute
   --Iir_Kind_Leftof_Attribute
   --Iir_Kind_Rightof_Attribute
   --Iir_Kind_Delayed_Attribute
   --Iir_Kind_Stable_Attribute
   --Iir_Kind_Quiet_Attribute
   --Iir_Kind_Transaction_Attribute
   --Iir_Kind_Event_Attribute
   --Iir_Kind_Active_Attribute
   --Iir_Kind_Last_Event_Attribute
   --Iir_Kind_Last_Active_Attribute
   --Iir_Kind_Last_Value_Attribute
   --Iir_Kind_Driving_Attribute
   --Iir_Kind_Driving_Value_Attribute
   --Iir_Kind_Behavior_Attribute
   --Iir_Kind_Structure_Attribute
   --Iir_Kind_Simple_Name_Attribute
   --Iir_Kind_Instance_Name_Attribute
   --Iir_Kind_Path_Name_Attribute
   --Iir_Kind_Left_Array_Attribute
   --Iir_Kind_Right_Array_Attribute
   --Iir_Kind_High_Array_Attribute
   --Iir_Kind_Low_Array_Attribute
   --Iir_Kind_Length_Array_Attribute
     Iir_Kind_Ascending_Array_Attribute;

   --  All the attributes.
   subtype Iir_Kinds_Attribute is Iir_Kind range
     Iir_Kind_Base_Attribute ..
     Iir_Kind_Reverse_Range_Array_Attribute;

   subtype Iir_Kinds_Type_Attribute is Iir_Kind range
     Iir_Kind_Left_Type_Attribute ..
   --Iir_Kind_Right_Type_Attribute
   --Iir_Kind_High_Type_Attribute
   --Iir_Kind_Low_Type_Attribute
     Iir_Kind_Ascending_Type_Attribute;

   subtype Iir_Kinds_Scalar_Type_Attribute is Iir_Kind range
     Iir_Kind_Pos_Attribute ..
   --Iir_Kind_Val_Attribute
   --Iir_Kind_Succ_Attribute
   --Iir_Kind_Pred_Attribute
   --Iir_Kind_Leftof_Attribute
     Iir_Kind_Rightof_Attribute;

   subtype Iir_Kinds_Array_Attribute is Iir_Kind range
     Iir_Kind_Left_Array_Attribute ..
   --Iir_Kind_Right_Array_Attribute
   --Iir_Kind_High_Array_Attribute
   --Iir_Kind_Low_Array_Attribute
   --Iir_Kind_Length_Array_Attribute
   --Iir_Kind_Ascending_Array_Attribute
   --Iir_Kind_Range_Array_Attribute
     Iir_Kind_Reverse_Range_Array_Attribute;

   subtype Iir_Kinds_Signal_Attribute is Iir_Kind range
     Iir_Kind_Delayed_Attribute ..
   --Iir_Kind_Stable_Attribute
   --Iir_Kind_Quiet_Attribute
     Iir_Kind_Transaction_Attribute;

   subtype Iir_Kinds_Signal_Value_Attribute is Iir_Kind range
     Iir_Kind_Event_Attribute ..
   --Iir_Kind_Active_Attribute
   --Iir_Kind_Last_Event_Attribute
   --Iir_Kind_Last_Active_Attribute
   --Iir_Kind_Last_Value_Attribute
   --Iir_Kind_Driving_Attribute
     Iir_Kind_Driving_Value_Attribute;

   subtype Iir_Kinds_Name_Attribute is Iir_Kind range
     Iir_Kind_Simple_Name_Attribute ..
   --Iir_Kind_Instance_Name_Attribute
     Iir_Kind_Path_Name_Attribute;

   subtype Iir_Kinds_Concurrent_Statement is Iir_Kind range
     Iir_Kind_Sensitized_Process_Statement ..
   --Iir_Kind_Process_Statement
   --Iir_Kind_Concurrent_Simple_Signal_Assignment
   --Iir_Kind_Concurrent_Conditional_Signal_Assignment
   --Iir_Kind_Concurrent_Selected_Signal_Assignment
   --Iir_Kind_Concurrent_Assertion_Statement
   --Iir_Kind_Psl_Default_Clock
   --Iir_Kind_Psl_Assert_Statement
   --Iir_Kind_Psl_Cover_Statement
   --Iir_Kind_Concurrent_Procedure_Call_Statement
   --Iir_Kind_Block_Statement
   --Iir_Kind_If_Generate_Statement
   --Iir_Kind_Case_Generate_Statement
   --Iir_Kind_For_Generate_Statement
     Iir_Kind_Component_Instantiation_Statement;

   subtype Iir_Kinds_Concurrent_Signal_Assignment is Iir_Kind range
     Iir_Kind_Concurrent_Simple_Signal_Assignment ..
   --Iir_Kind_Concurrent_Conditional_Signal_Assignment
     Iir_Kind_Concurrent_Selected_Signal_Assignment;

   subtype Iir_Kinds_If_Case_Generate_Statement is Iir_Kind range
     Iir_Kind_If_Generate_Statement ..
     Iir_Kind_Case_Generate_Statement;

   subtype Iir_Kinds_Sequential_Statement is Iir_Kind range
     Iir_Kind_Simple_Signal_Assignment_Statement ..
   --Iir_Kind_Conditional_Signal_Assignment_Statement
   --Iir_Kind_Null_Statement
   --Iir_Kind_Assertion_Statement
   --Iir_Kind_Report_Statement
   --Iir_Kind_Wait_Statement
   --Iir_Kind_Variable_Assignment_Statement
   --Iir_Kind_Conditional_Variable_Assignment_Statement
   --Iir_Kind_Return_Statement
   --Iir_Kind_For_Loop_Statement
   --Iir_Kind_While_Loop_Statement
   --Iir_Kind_Next_Statement
   --Iir_Kind_Exit_Statement
   --Iir_Kind_Case_Statement
   --Iir_Kind_Procedure_Call_Statement
     Iir_Kind_If_Statement;

   subtype Iir_Kinds_Variable_Assignment_Statement is Iir_Kind range
     Iir_Kind_Variable_Assignment_Statement ..
     Iir_Kind_Conditional_Variable_Assignment_Statement;

   subtype Iir_Kinds_Allocator is Iir_Kind range
     Iir_Kind_Allocator_By_Expression ..
     Iir_Kind_Allocator_By_Subtype;

   subtype Iir_Kinds_Clause is Iir_Kind range
     Iir_Kind_Library_Clause ..
   --Iir_Kind_Use_Clause
     Iir_Kind_Context_Reference;

   subtype Iir_Kinds_Specification is Iir_Kind range
     Iir_Kind_Attribute_Specification ..
   --Iir_Kind_Disconnection_Specification
     Iir_Kind_Configuration_Specification;

   -------------------------------------
   -- Types and subtypes declarations --
   -------------------------------------

   -- Level 1 base class.
   subtype Iir is Nodes.Node_Type;
   subtype Iir_List is Lists.List_Type;
   Null_Iir_List : constant Iir_List := Lists.Null_List;
   Iir_List_All : constant Iir_List := Lists.List_All;
   Iir_List_Others : constant Iir_List := Lists.List_Others;
   subtype Iir_Lists_All_Others is Iir_List
     range Iir_List_Others .. Iir_List_All;

   Null_Iir : constant Iir := Nodes.Null_Node;

   function Is_Null (Node : Iir) return Boolean;
   pragma Inline (Is_Null);

   function Is_Null_List (Node : Iir_List) return Boolean;
   pragma Inline (Is_Null_List);

   function "=" (L, R : Iir) return Boolean renames Nodes."=";

   function Get_Last_Node return Iir renames Nodes.Get_Last_Node;

   function Create_Iir_List return Iir_List
     renames Lists.Create_List;
   function Get_Nth_Element (L : Iir_List; N : Natural) return Iir
     renames Lists.Get_Nth_Element;
   procedure Replace_Nth_Element (L : Iir_List; N : Natural; El : Iir)
     renames Lists.Replace_Nth_Element;
   procedure Append_Element (L : Iir_List; E : Iir)
     renames Lists.Append_Element;
   procedure Add_Element (L : Iir_List; E : Iir)
     renames Lists.Add_Element;
   procedure Destroy_Iir_List (L : in out Iir_List)
     renames Lists.Destroy_List;
   function Get_Nbr_Elements (L : Iir_List) return Natural
     renames Lists.Get_Nbr_Elements;
   procedure Set_Nbr_Elements (L : Iir_List; Nbr : Natural)
     renames Lists.Set_Nbr_Elements;
   function Get_First_Element (L : Iir_List) return Iir
     renames Lists.Get_First_Element;
   function Get_Last_Element (L : Iir_List) return Iir
     renames Lists.Get_Last_Element;
   function "=" (L, R : Iir_List) return Boolean renames Lists."=";

   -- This is used only for lists.
   type Iir_Array is array (Natural range <>) of Iir;
   type Iir_Array_Acc is access Iir_Array;
   procedure Free is new Ada.Unchecked_Deallocation
     (Object => Iir_Array, Name => Iir_Array_Acc);

   --  Date State.
   --  This indicates the origin of the data information.
   --  This also indicates the state of the unit (loaded or not).
   type Date_State_Type is
     (
      --  The unit is not yet in the library.
      Date_Extern,

      --  The unit is not loaded (still on the disk).
      --  All the informations come from the library file.
      Date_Disk,

      --  The unit has been parsed, but not analyzed.
      --  Only the date information come from the library.
      Date_Parse,

      --  The unit has been analyzed.
      Date_Analyze
     );

   --  A date is used for analysis order.  All design units from a library
   --  are ordered according to the date.
   type Date_Type is new Nat32;

   --  The unit is obsoleted (ie replaced) by a more recently analyzed design
   --  unit.another design unit.
   --  If another design unit depends (directly or not) on an obseleted design
   --  unit, it is also obsolete, and cannot be defined.
   Date_Obsolete      : constant Date_Type := 0;
   --  The unit was not analyzed.
   Date_Not_Analyzed  : constant Date_Type := 1;
   --  The unit has been analyzed but it has bad dependences.
   Date_Bad_Analyze   : constant Date_Type := 2;
   --  The unit has been parsed but not analyzed.
   Date_Parsed        : constant Date_Type := 4;
   --  The unit is being analyzed.
   Date_Analyzing     : constant Date_Type := 5;
   --  This unit has just been analyzed and should be marked at the last
   --  analyzed unit.
   Date_Analyzed      : constant Date_Type := 6;
   --  Used only for default configuration.
   --  Such units are always up-to-date.
   Date_Uptodate      : constant Date_Type := 7;
   subtype Date_Valid is Date_Type range 10 .. Date_Type'Last;

   --  Predefined depth values.
   --  Depth of a subprogram not declared in another subprogram.
   Iir_Depth_Top : constant Iir_Int32 := 0;
   --  Purity depth of a pure subprogram.
   Iir_Depth_Pure : constant Iir_Int32 := Iir_Int32'Last;
   --  Purity depth of an impure subprogram.
   Iir_Depth_Impure : constant Iir_Int32 := -1;

   type Base_Type is (Base_None, Base_2, Base_8, Base_10, Base_16);

   -- design file
   subtype Iir_Design_File is Iir;

   subtype Iir_Design_Unit is Iir;

   subtype Iir_Library_Clause is Iir;

   -- Literals.
   --subtype Iir_Text_Literal is Iir;

   subtype Iir_Character_Literal is Iir;

   subtype Iir_Integer_Literal is Iir;

   subtype Iir_Floating_Point_Literal is Iir;

   subtype Iir_Null_Literal is Iir;

   subtype Iir_Physical_Int_Literal is Iir;

   subtype Iir_Physical_Fp_Literal is Iir;

   subtype Iir_Enumeration_Literal is Iir;

   subtype Iir_Simple_Aggregate is Iir;

   subtype Iir_Enumeration_Type_Definition is Iir;

   subtype Iir_Enumeration_Subtype_Definition is Iir;

   subtype Iir_Range_Expression is Iir;

   subtype Iir_Integer_Subtype_Definition is Iir;

   subtype Iir_Integer_Type_Definition is Iir;

   subtype Iir_Floating_Subtype_Definition is Iir;

   subtype Iir_Floating_Type_Definition is Iir;

   subtype Iir_Array_Type_Definition is Iir;

   subtype Iir_Record_Type_Definition is Iir;

   subtype Iir_Protected_Type_Declaration is Iir;

   subtype Iir_Protected_Type_Body is Iir;

   subtype Iir_Subtype_Definition is Iir;

   subtype Iir_Array_Subtype_Definition is Iir;

   subtype Iir_Physical_Type_Definition is Iir;

   subtype Iir_Physical_Subtype_Definition is Iir;

   subtype Iir_Access_Type_Definition is Iir;

   subtype Iir_Access_Subtype_Definition is Iir;

   subtype Iir_File_Type_Definition is Iir;

   subtype Iir_Waveform_Element is Iir;

   subtype Iir_Conditional_Waveform is Iir;

   subtype Iir_Association_Element_By_Expression is Iir;

   subtype Iir_Association_Element_By_Individual is Iir;

   subtype Iir_Association_Element_Open is Iir;

   subtype Iir_Signature is Iir;

   subtype Iir_Unit_Declaration is Iir;

   subtype Iir_Entity_Aspect_Entity is Iir;

   subtype Iir_Entity_Aspect_Configuration is Iir;

   subtype Iir_Entity_Aspect_Open is Iir;

   subtype Iir_Block_Configuration is Iir;

   subtype Iir_Block_Header is Iir;

   subtype Iir_Component_Configuration is Iir;

   subtype Iir_Binding_Indication is Iir;

   subtype Iir_Entity_Class is Iir;

   subtype Iir_Attribute_Specification is Iir;

   subtype Iir_Attribute_Value is Iir;

   subtype Iir_Selected_Element is Iir;

   subtype Iir_Implicit_Dereference is Iir;

   subtype Iir_Aggregate_Info is Iir;

   subtype Iir_Procedure_Call is Iir;

   subtype Iir_Disconnection_Specification is Iir;

   -- Lists.

   subtype Iir_Index_List is Iir_List;

   subtype Iir_Design_Unit_List is Iir_List;

   subtype Iir_Enumeration_Literal_List is Iir_List;

   subtype Iir_Designator_List is Iir_List;

   subtype Iir_Attribute_Value_Chain is Iir_List;

   subtype Iir_Overload_List is Iir;

   subtype Iir_Group_Constituent_List is Iir_List;

   subtype Iir_Callees_List is Iir_List;

   -- Declaration and children.
   subtype Iir_Entity_Declaration is Iir;

   subtype Iir_Architecture_Body is Iir;

   subtype Iir_Interface_Signal_Declaration is Iir;

   subtype Iir_Configuration_Declaration is Iir;

   subtype Iir_Type_Declaration is Iir;

   subtype Iir_Anonymous_Type_Declaration is Iir;

   subtype Iir_Subtype_Declaration is Iir;

   subtype Iir_Package_Declaration is Iir;
   subtype Iir_Package_Body is Iir;

   subtype Iir_Library_Declaration is Iir;

   subtype Iir_Function_Declaration is Iir;

   subtype Iir_Function_Body is Iir;

   subtype Iir_Procedure_Declaration is Iir;

   subtype Iir_Procedure_Body is Iir;

   subtype Iir_Use_Clause is Iir;

   subtype Iir_Constant_Declaration is Iir;

   subtype Iir_Iterator_Declaration is Iir;

   subtype Iir_Interface_Constant_Declaration is Iir;

   subtype Iir_Interface_Variable_Declaration is Iir;

   subtype Iir_Interface_File_Declaration is Iir;

   subtype Iir_Guard_Signal_Declaration is Iir;

   subtype Iir_Signal_Declaration is Iir;

   subtype Iir_Variable_Declaration is Iir;

   subtype Iir_Component_Declaration is Iir;

   subtype Iir_Element_Declaration is Iir;

   subtype Iir_Object_Alias_Declaration is Iir;

   subtype Iir_Non_Object_Alias_Declaration is Iir;

   subtype Iir_Interface_Declaration is Iir;

   subtype Iir_Configuration_Specification is Iir;

   subtype Iir_File_Declaration is Iir;

   subtype Iir_Attribute_Declaration is Iir;

   subtype Iir_Group_Template_Declaration is Iir;

   subtype Iir_Group_Declaration is Iir;

   -- concurrent_statement and children.
   subtype Iir_Concurrent_Statement is Iir;

   subtype Iir_Concurrent_Conditional_Signal_Assignment is Iir;

   subtype Iir_Sensitized_Process_Statement is Iir;

   subtype Iir_Process_Statement is Iir;

   subtype Iir_Component_Instantiation_Statement is Iir;

   subtype Iir_Block_Statement is Iir;

   subtype Iir_Generate_Statement is Iir;

   -- sequential statements.
   subtype Iir_If_Statement is Iir;

   subtype Iir_Elsif is Iir;

   subtype Iir_For_Loop_Statement is Iir;

   subtype Iir_While_Loop_Statement is Iir;

   subtype Iir_Exit_Statement is Iir;
   subtype Iir_Next_Statement is Iir;

   subtype Iir_Variable_Assignment_Statement is Iir;

   subtype Iir_Signal_Assignment_Statement is Iir;

   subtype Iir_Assertion_Statement is Iir;

   subtype Iir_Report_Statement is Iir;

   subtype Iir_Wait_Statement is Iir;

   subtype Iir_Return_Statement is Iir;

   subtype Iir_Case_Statement is Iir;

   subtype Iir_Procedure_Call_Statement is Iir;

   -- expression and children.
   subtype Iir_Expression is Iir;

   subtype Iir_Function_Call is Iir;

   subtype Iir_Aggregate is Iir;

   subtype Iir_Qualified_Expression is Iir;

   subtype Iir_Type_Conversion is Iir;

   subtype Iir_Allocator_By_Expression is Iir;

   subtype Iir_Allocator_By_Subtype is Iir;

   -- names.
   subtype Iir_Simple_Name is Iir;

   subtype Iir_Slice_Name is Iir;

   subtype Iir_Selected_Name is Iir;

   subtype Iir_Selected_By_All_Name is Iir;

   subtype Iir_Indexed_Name is Iir;

   subtype Iir_Parenthesis_Name is Iir;

   -- attributes.
   subtype Iir_Attribute_Name is Iir;

   -- General methods.

   -- Get the kind of the iir.
   function Get_Kind (An_Iir: Iir) return Iir_Kind;
   pragma Inline (Get_Kind);

   --  Create a new IIR of kind NEW_KIND, and copy fields from SRC to this
   --  iir.  Src fields are cleaned.
   --function Clone_Iir (Src: Iir; New_Kind : Iir_Kind) return Iir;

   procedure Set_Location (Target: Iir; Location: Location_Type)
     renames Nodes.Set_Location;
   function Get_Location (Target: Iir) return Location_Type
     renames Nodes.Get_Location;

   procedure Location_Copy (Target: Iir; Src: Iir);

   function Create_Iir (Kind: Iir_Kind) return Iir;
   function Create_Iir_Error return Iir;
   procedure Free_Iir (Target: Iir) renames Nodes.Free_Node;

   --  Disp statistics about node usage.
   procedure Disp_Stats;

   --  Design units contained in a design file.
   --  Field: Field5 Chain
   function Get_First_Design_Unit (Design : Iir) return Iir;
   procedure Set_First_Design_Unit (Design : Iir; Chain : Iir);

   --  Field: Field6 Ref
   function Get_Last_Design_Unit (Design : Iir) return Iir;
   procedure Set_Last_Design_Unit (Design : Iir; Chain : Iir);

   --  Library declaration of a library clause.
   --  Field: Field1 Ref
   function Get_Library_Declaration (Design : Iir) return Iir;
   procedure Set_Library_Declaration (Design : Iir; Library : Iir);

   -- File time stamp is the system time of the file last modification.
   --  Field: Field4 (uc)
   function Get_File_Checksum (Design : Iir) return File_Checksum_Id;
   procedure Set_File_Checksum (Design : Iir; Checksum : File_Checksum_Id);

   -- Time stamp of the last analysis system time.
   --  Field: Field3 (uc)
   function Get_Analysis_Time_Stamp (Design : Iir) return Time_Stamp_Id;
   procedure Set_Analysis_Time_Stamp (Design : Iir; Stamp : Time_Stamp_Id);

   --  The library which FILE belongs to.
   --  Field: Field0 Ref
   function Get_Library (File : Iir_Design_File) return Iir;
   procedure Set_Library (File : Iir_Design_File; Lib : Iir);

   --  List of files which this design file depends on.
   --  Field: Field1 (uc)
   function Get_File_Dependence_List (File : Iir_Design_File) return Iir_List;
   procedure Set_File_Dependence_List (File : Iir_Design_File; Lst : Iir_List);

   --  Identifier for the design file file name.
   --  Field: Field12 (pos)
   function Get_Design_File_Filename (File : Iir_Design_File) return Name_Id;
   procedure Set_Design_File_Filename (File : Iir_Design_File; Name : Name_Id);

   --  Directory of a design file.
   --  Field: Field11 (pos)
   function Get_Design_File_Directory (File : Iir_Design_File) return Name_Id;
   procedure Set_Design_File_Directory (File : Iir_Design_File; Dir : Name_Id);

   --  The parent of a design unit is a design file.
   --  Field: Field0 Ref
   function Get_Design_File (Unit : Iir_Design_Unit) return Iir;
   procedure Set_Design_File (Unit : Iir_Design_Unit; File : Iir);

   --  Design files of a library.
   --  Field: Field1 Chain
   function Get_Design_File_Chain (Library : Iir) return Iir;
   procedure Set_Design_File_Chain (Library : Iir; Chain : Iir);

   --  System directory where the library is stored.
   --  Field: Field5 (pos)
   function Get_Library_Directory (Library : Iir) return Name_Id;
   procedure Set_Library_Directory (Library : Iir; Dir : Name_Id);

   -- Symbolic date, used to order design units in a library.
   --  Field: Field4 (pos)
   function Get_Date (Target : Iir) return Date_Type;
   procedure Set_Date (Target : Iir; Date : Date_Type);

   --  Chain of context clauses.
   --  Field: Field1 Chain
   function Get_Context_Items (Design_Unit : Iir) return Iir;
   procedure Set_Context_Items (Design_Unit : Iir; Items_Chain : Iir);

   --  List of design units on which the design unit depends. There is an
   --  exception: the architecture of an entity aspect (of a component
   --  instantiation) may not have been analyzed.  The Entity_Aspect_Entity
   --  is added to this list (instead of the non-existing design unit).
   --  Field: Field8 Of_Ref (uc)
   function Get_Dependence_List (Unit : Iir) return Iir_List;
   procedure Set_Dependence_List (Unit : Iir; List : Iir_List);

   --  List of functions or sensitized processes whose analysis checks are not
   --  complete.
   --  These elements have direct or indirect calls to procedure whose body is
   --  not yet analyzed.  Therefore, purity or wait checks are not complete.
   --  Field: Field9 Of_Ref (uc)
   function Get_Analysis_Checks_List (Unit : Iir) return Iir_List;
   procedure Set_Analysis_Checks_List (Unit : Iir; List : Iir_List);

   --  Wether the unit is on disk, parsed or analyzed.
   --  Field: State1 (pos)
   function Get_Date_State (Unit : Iir_Design_Unit) return Date_State_Type;
   procedure Set_Date_State (Unit : Iir_Design_Unit; State : Date_State_Type);

   --  If TRUE, the target of the signal assignment is guarded.
   --  If FALSE, the target is not guarded.
   --  This is determined during sem by examining the declaration(s) of the
   --  target (there may be severals declarations in the case of a aggregate
   --  target).
   --  If UNKNOWN, this is not determined at compile time but at run-time.
   --  This is the case for formal signal interfaces of subprograms.
   --  Field: State1 (pos)
   function Get_Guarded_Target_State (Stmt : Iir) return Tri_State_Type;
   procedure Set_Guarded_Target_State (Stmt : Iir; State : Tri_State_Type);

   --  Library unit of a design unit.
   --  Field: Field5
   function Get_Library_Unit (Design_Unit : Iir_Design_Unit) return Iir;
   procedure Set_Library_Unit (Design_Unit : Iir_Design_Unit; Lib_Unit : Iir);
   pragma Inline (Get_Library_Unit);

   --  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
   function Get_Hash_Chain (Design_Unit : Iir_Design_Unit) return Iir;
   procedure Set_Hash_Chain (Design_Unit : Iir_Design_Unit; Chain : Iir);

   -- Set the line and the offset in the line, only for the library manager.
   -- This is valid until the file is really loaded in memory.  On loading,
   -- location will contain all this informations.
   --  Field: Field10 (uc)
   function Get_Design_Unit_Source_Pos (Design_Unit : Iir) return Source_Ptr;
   procedure Set_Design_Unit_Source_Pos (Design_Unit : Iir; Pos : Source_Ptr);

   --  Field: Field11 (uc)
   function Get_Design_Unit_Source_Line (Design_Unit : Iir) return Int32;
   procedure Set_Design_Unit_Source_Line (Design_Unit : Iir; Line : Int32);

   --  Field: Field12 (uc)
   function Get_Design_Unit_Source_Col (Design_Unit : Iir) return Int32;
   procedure Set_Design_Unit_Source_Col (Design_Unit : Iir; Line : Int32);

   --  literals.

   --  Value of an integer/physical literal.
   --  Field: Int64
   function Get_Value (Lit : Iir) return Iir_Int64;
   procedure Set_Value (Lit : Iir; Val : Iir_Int64);

   --  Position (same as lit_type'pos) of an enumeration literal.
   --  Field: Field5 (pos)
   function Get_Enum_Pos (Lit : Iir) return Iir_Int32;
   procedure Set_Enum_Pos (Lit : Iir; Val : Iir_Int32);

   --  Field: Field4
   function Get_Physical_Literal (Unit : Iir) return Iir;
   procedure Set_Physical_Literal (Unit : Iir; Lit : Iir);

   --  Value of a physical unit declaration.
   --  Field: Field5
   function Get_Physical_Unit_Value (Unit : Iir) return Iir;
   procedure Set_Physical_Unit_Value (Unit : Iir; Lit : Iir);

   --  Value of a floating point literal.
   --  Field: Fp64
   function Get_Fp_Value (Lit : Iir) return Iir_Fp64;
   procedure Set_Fp_Value (Lit : Iir; Val : Iir_Fp64);

   --  List of elements of a simple aggregate.
   --  Field: Field4 (uc)
   function Get_Simple_Aggregate_List (Target : Iir) return Iir_List;
   procedure Set_Simple_Aggregate_List (Target : Iir; List : Iir_List);

   --  For a string literal: the string identifier.
   --  Field: Field5 (uc)
   function Get_String8_Id (Lit : Iir) return String8_Id;
   procedure Set_String8_Id (Lit : Iir; Id : String8_Id);

   --  For a string literal: the string length.
   --  Field: Field4 (uc)
   function Get_String_Length (Lit : Iir) return Int32;
   procedure Set_String_Length (Lit : Iir; Len : Int32);

   --  Base of a bit string.  Base_None for a string literal.
   --  Field: Odigit1 (pos)
   function Get_Bit_String_Base (Lit : Iir) return Base_Type;
   procedure Set_Bit_String_Base (Lit : Iir; Base : Base_Type);

   --  Bit string is signed.
   --  Field: Flag1
   function Get_Has_Signed (Lit : Iir) return Boolean;
   procedure Set_Has_Signed (Lit : Iir; Flag : Boolean);

   --  Bit string sign is explicit
   --  Field: Flag2
   function Get_Has_Sign (Lit : Iir) return Boolean;
   procedure Set_Has_Sign (Lit : Iir; Flag : Boolean);

   --  Bit string length is explicit
   --  Field: Flag3
   function Get_Has_Length (Lit : Iir) return Boolean;
   procedure Set_Has_Length (Lit : Iir; Flag : Boolean);

   --  The origin of a literal can be null_iir for a literal generated by the
   --  parser, or a node which was statically evaluated to this literal.
   --  Such nodes are created by eval_expr.
   --  Field: Field2
   function Get_Literal_Origin (Lit : Iir) return Iir;
   procedure Set_Literal_Origin (Lit : Iir; Orig : Iir);

   --  Field: Field4
   function Get_Range_Origin (Lit : Iir) return Iir;
   procedure Set_Range_Origin (Lit : Iir; Orig : Iir);

   --  Same as Type, but not marked as Ref.  This is when a literal has a
   --  subtype (such as string or bit_string) created specially for the
   --  literal.
   --  Field: Field3
   function Get_Literal_Subtype (Lit : Iir) return Iir;
   procedure Set_Literal_Subtype (Lit : Iir; Atype : Iir);

   --  Field: Field3
   function Get_Allocator_Subtype (Lit : Iir) return Iir;
   procedure Set_Allocator_Subtype (Lit : Iir; Atype : Iir);

   --  Field: Field3 (uc)
   function Get_Entity_Class (Target : Iir) return Token_Type;
   procedure Set_Entity_Class (Target : Iir; Kind : Token_Type);

   --  Field: Field8 (uc)
   function Get_Entity_Name_List (Target : Iir) return Iir_List;
   procedure Set_Entity_Name_List (Target : Iir; Names : Iir_List);

   --  Field: Field6
   function Get_Attribute_Designator (Target : Iir) return Iir;
   procedure Set_Attribute_Designator (Target : Iir; Designator : Iir);

   --  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
   function Get_Attribute_Specification_Chain (Target : Iir) return Iir;
   procedure Set_Attribute_Specification_Chain (Target : Iir; Chain : Iir);

   --  Field: Field4 Ref
   function Get_Attribute_Specification (Val : Iir) return Iir;
   procedure Set_Attribute_Specification (Val : Iir; Attr : Iir);

   --  Field: Field3 (uc)
   function Get_Signal_List (Target : Iir) return Iir_List;
   procedure Set_Signal_List (Target : Iir; List : Iir_List);

   --  Field: Field3 Ref
   function Get_Designated_Entity (Val : Iir_Attribute_Value) return Iir;
   procedure Set_Designated_Entity (Val : Iir_Attribute_Value; Entity : Iir);

   --  Field: Field1
   function Get_Formal (Target : Iir) return Iir;
   procedure Set_Formal (Target : Iir; Formal : Iir);

   --  Field: Field3
   function Get_Actual (Target : Iir) return Iir;
   procedure Set_Actual (Target : Iir; Actual : Iir);

   --  Field: Field4
   function Get_In_Conversion (Target : Iir) return Iir;
   procedure Set_In_Conversion (Target : Iir; Conv : Iir);

   --  Field: Field5
   function Get_Out_Conversion (Target : Iir) return Iir;
   procedure Set_Out_Conversion (Target : Iir; Conv : Iir);

   --  This flag is set when the formal is associated in whole (ie, not
   --  individually).
   --  Field: Flag1
   function Get_Whole_Association_Flag (Target : Iir) return Boolean;
   procedure Set_Whole_Association_Flag (Target : Iir; Flag : Boolean);

   --  This flag is set when the formal signal can be the actual signal.  In
   --  this case, the formal signal is not created, and the actual is shared.
   --  This is the signal collapsing optimisation.
   --  Field: Flag2
   function Get_Collapse_Signal_Flag (Target : Iir) return Boolean;
   procedure Set_Collapse_Signal_Flag (Target : Iir; Flag : Boolean);

   --  Set when the node was artificially created, eg by canon.
   --  Currently used only by association_element_open.
   --  Field: Flag3
   function Get_Artificial_Flag (Target : Iir) return Boolean;
   procedure Set_Artificial_Flag (Target : Iir; Flag : Boolean);

   --  This flag is set for a very short time during the check that no in
   --  port is unconnected.
   --  Field: Flag12
   function Get_Open_Flag (Target : Iir) return Boolean;
   procedure Set_Open_Flag (Target : Iir; Flag : Boolean);

   --  This flag is set by trans_analyze if there is a projected waveform
   --  assignment in the process.
   --  Field: Flag5
   function Get_After_Drivers_Flag (Target : Iir) return Boolean;
   procedure Set_After_Drivers_Flag (Target : Iir; Flag : Boolean);

   --  Field: Field1
   function Get_We_Value (We : Iir_Waveform_Element) return Iir;
   procedure Set_We_Value (We : Iir_Waveform_Element; An_Iir : Iir);

   --  Field: Field3
   function Get_Time (We : Iir_Waveform_Element) return Iir;
   procedure Set_Time (We : Iir_Waveform_Element; An_Iir : Iir);

   --  Node associated with a choice.
   --  Field: Field3
   function Get_Associated_Expr (Target : Iir) return Iir;
   procedure Set_Associated_Expr (Target : Iir; Associated : Iir);

   --  Node associated with a choice.
   --  Field: Field3
   function Get_Associated_Block (Target : Iir) return Iir;
   procedure Set_Associated_Block (Target : Iir; Associated : Iir);

   --  Chain associated with a choice.
   --  Field: Field4 Chain
   function Get_Associated_Chain (Target : Iir) return Iir;
   procedure Set_Associated_Chain (Target : Iir; Associated : Iir);

   --  Field: Field5
   function Get_Choice_Name (Choice : Iir) return Iir;
   procedure Set_Choice_Name (Choice : Iir; Name : Iir);

   --  Field: Field5
   function Get_Choice_Expression (Choice : Iir) return Iir;
   procedure Set_Choice_Expression (Choice : Iir; Name : Iir);

   --  Field: Field5
   function Get_Choice_Range (Choice : Iir) return Iir;
   procedure Set_Choice_Range (Choice : Iir; Name : Iir);

   --  Set when a choice belongs to the same alternative as the previous one.
   --  Field: Flag1
   function Get_Same_Alternative_Flag (Target : Iir) return Boolean;
   procedure Set_Same_Alternative_Flag (Target : Iir; Val : Boolean);

   --  Field: Field3
   function Get_Architecture (Target : Iir_Entity_Aspect_Entity) return Iir;
   procedure Set_Architecture (Target : Iir_Entity_Aspect_Entity; Arch : Iir);

   --  Field: Field5
   function Get_Block_Specification (Target : Iir) return Iir;
   procedure Set_Block_Specification (Target : Iir; Block : Iir);

   --  Return the link of the previous block_configuration of a
   --  block_configuration.
   --  This single linked list is used to list all the block_configuration that
   --  configuration the same block (which can only be an iterative generate
   --  statement).
   --  All elements of this list must belong to the same block configuration.
   --  The order is not important.
   --  Field: Field4 Ref
   function Get_Prev_Block_Configuration (Target : Iir) return Iir;
   procedure Set_Prev_Block_Configuration (Target : Iir; Block : Iir);

   --  Field: Field3 Chain
   function Get_Configuration_Item_Chain (Target : Iir) return Iir;
   procedure Set_Configuration_Item_Chain (Target : Iir; Chain : Iir);

   --  Chain of attribute values for declared items.
   --  To be used with Get/Set_Chain.
   --  There is no order, therefore, a new attribute value may be always
   --  prepended.
   --  Field: Field4 Chain
   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
   function Get_Spec_Chain (Target : Iir) return Iir;
   procedure Set_Spec_Chain (Target : Iir; Chain : Iir);

   --  Chain of attribute values for attribute specification.
   --  To be used with Get/Set_Spec_Chain.
   --  Field: Field4
   function Get_Attribute_Value_Spec_Chain (Target : Iir) return Iir;
   procedure Set_Attribute_Value_Spec_Chain (Target : Iir; Chain : Iir);

   --  The entity name for an architecture or a configuration.
   --  Field: Field2
   function Get_Entity_Name (Arch : Iir) return Iir;
   procedure Set_Entity_Name (Arch : Iir; Entity : Iir);

   --  The package declaration corresponding to the body.
   --  Field: Field5 Ref
   function Get_Package (Package_Body : Iir) return Iir;
   procedure Set_Package (Package_Body : Iir; Decl : Iir);

   --  The package body corresponding to the package declaration.
   --  Field: Field2 Ref
   function Get_Package_Body (Pkg : Iir) return Iir;
   procedure Set_Package_Body (Pkg : Iir; Decl : Iir);

   --  If true, the package need a body.
   --  Field: Flag1
   function Get_Need_Body (Decl : Iir_Package_Declaration) return Boolean;
   procedure Set_Need_Body (Decl : Iir_Package_Declaration; Flag : Boolean);

   --  Field: Field5
   function Get_Block_Configuration (Target : Iir) return Iir;
   procedure Set_Block_Configuration (Target : Iir; Block : Iir);

   --  Field: Field5 Chain
   function Get_Concurrent_Statement_Chain (Target : Iir) return Iir;
   procedure Set_Concurrent_Statement_Chain (Target : Iir; First : Iir);

   --  Field: Field2 Chain_Next
   function Get_Chain (Target : Iir) return Iir;
   procedure Set_Chain (Target : Iir; Chain : Iir);
   pragma Inline (Get_Chain);

   --  Field: Field7 Chain
   function Get_Port_Chain (Target : Iir) return Iir;
   procedure Set_Port_Chain (Target : Iir; Chain : Iir);

   --  Field: Field6 Chain
   function Get_Generic_Chain (Target : Iir) return Iir;
   procedure Set_Generic_Chain (Target : Iir; Generics : Iir);

   --  Field: Field1 Ref
   function Get_Type (Target : Iir) return Iir;
   procedure Set_Type (Target : Iir; Atype : Iir);
   pragma Inline (Get_Type);

   --  The subtype indication of a declaration.  Note that this node can be
   --  shared between declarations if they are separated by comma, such as in:
   --    variable a, b : integer := 5;
   --  Field: Field5 Maybe_Ref
   function Get_Subtype_Indication (Target : Iir) return Iir;
   procedure Set_Subtype_Indication (Target : Iir; Atype : Iir);

   --  Field: Field6
   function Get_Discrete_Range (Target : Iir) return Iir;
   procedure Set_Discrete_Range (Target : Iir; Rng : Iir);

   --  Field: Field1
   function Get_Type_Definition (Decl : Iir) return Iir;
   procedure Set_Type_Definition (Decl : Iir; Atype : Iir);

   --  The subtype definition associated with the type declaration (if any).
   --  Field: Field4
   function Get_Subtype_Definition (Target : Iir) return Iir;
   procedure Set_Subtype_Definition (Target : Iir; Def : Iir);

   --  Field: Field1
   function Get_Nature (Target : Iir) return Iir;
   procedure Set_Nature (Target : Iir; Nature : Iir);

   --  Mode of interfaces or file (v87).
   --  Field: Odigit1 (pos)
   function Get_Mode (Target : Iir) return Iir_Mode;
   procedure Set_Mode (Target : Iir; Mode : Iir_Mode);

   --  True if the signal is guarded (has a signal kind).
   --  Field: Flag8
   function Get_Guarded_Signal_Flag (Target : Iir) return Boolean;
   procedure Set_Guarded_Signal_Flag (Target : Iir; Guarded : Boolean);

   --  Field: Flag9 (uc)
   function Get_Signal_Kind (Target : Iir) return Iir_Signal_Kind;
   procedure Set_Signal_Kind (Target : Iir; Signal_Kind : Iir_Signal_Kind);

   --  The base name of a name is the node at the origin of the name.
   --  The base name is a declaration (signal, object, constant or interface),
   --  a selected_by_all name, an implicit_dereference name.
   --  Field: Field5 Ref
   function Get_Base_Name (Target : Iir) return Iir;
   procedure Set_Base_Name (Target : Iir; Name : Iir);
   pragma Inline (Get_Base_Name);

   --  Field: Field5 Chain
   function Get_Interface_Declaration_Chain (Target : Iir) return Iir;
   procedure Set_Interface_Declaration_Chain (Target : Iir; Chain : Iir);
   pragma Inline (Get_Interface_Declaration_Chain);

   --  Field: Field6 Ref
   function Get_Subprogram_Specification (Target : Iir) return Iir;
   procedure Set_Subprogram_Specification (Target : Iir; Spec : Iir);

   --  Field: Field5 Chain
   function Get_Sequential_Statement_Chain (Target : Iir) return Iir;
   procedure Set_Sequential_Statement_Chain (Target : Iir; Chain : Iir);

   --  Field: Field9 Ref
   function Get_Subprogram_Body (Target : Iir) return Iir;
   procedure Set_Subprogram_Body (Target : Iir; A_Body : Iir);

   --  Several subprograms in a declarative region may have the same
   --  identifier.  If the overload number is not 0, it is the rank of the
   --  subprogram.  If the overload number is 0, then the identifier is not
   --  overloaded in the declarative region.
   --  Field: Field12 (pos)
   function Get_Overload_Number (Target : Iir) return Iir_Int32;
   procedure Set_Overload_Number (Target : Iir; Val : Iir_Int32);

   --  Depth of a subprogram.
   --  For a subprogram declared immediatly within an entity, architecture,
   --  package, process, block, generate, the depth is 0.
   --  For a subprogram declared immediatly within a subprogram of level N,
   --  the depth is N + 1.
   --  Depth is used with depth of impure objects to check purity rules.
   --  Field: Field10 (pos)
   function Get_Subprogram_Depth (Target : Iir) return Iir_Int32;
   procedure Set_Subprogram_Depth (Target : Iir; Depth : Iir_Int32);

   --  Hash of a subprogram profile.
   --  This is used to speed up subprogram profile comparaison, which is very
   --  often used by overload.
   --  Field: Field4 (pos)
   function Get_Subprogram_Hash (Target : Iir) return Iir_Int32;
   procedure Set_Subprogram_Hash (Target : Iir; Val : Iir_Int32);
   pragma Inline (Get_Subprogram_Hash);

   --  Depth of the deepest impure object.
   --  Field: Field3 (uc)
   function Get_Impure_Depth (Target : Iir) return Iir_Int32;
   procedure Set_Impure_Depth (Target : Iir; Depth : Iir_Int32);

   --  Field: Field1 Ref
   function Get_Return_Type (Target : Iir) return Iir;
   procedure Set_Return_Type (Target : Iir; Decl : Iir);
   pragma Inline (Get_Return_Type);

   --  Code of an implicit subprogram definition.
   --  Field: Field7 (pos)
   function Get_Implicit_Definition (D : Iir) return Iir_Predefined_Functions;
   procedure Set_Implicit_Definition (D : Iir; Def : Iir_Predefined_Functions);

   --  Get the default value of an object declaration.
   --  Null_iir if no default value.
   --  Note that this node can be shared between declarations if they are
   --  separated by comma, such as in:
   --    variable a, b : integer := 5;
   --  Field: Field4 Maybe_Ref
   function Get_Default_Value (Target : Iir) return Iir;
   procedure Set_Default_Value (Target : Iir; Value : Iir);

   --  The deferred_declaration field points to the deferred constant
   --  declaration for a full constant declaration, or is null_iir for a
   --  usual or deferred constant declaration.
   --  Set only during sem.
   --  Field: Field6 Ref
   function Get_Deferred_Declaration (Target : Iir) return Iir;
   procedure Set_Deferred_Declaration (Target : Iir; Decl : Iir);

   --  The deferred_declaration_flag must be set if the constant declaration is
   --  a deferred_constant declaration.
   --  Set only during sem.
   --  Field: Flag1
   function Get_Deferred_Declaration_Flag (Target : Iir) return Boolean;
   procedure Set_Deferred_Declaration_Flag (Target : Iir; Flag : Boolean);

   --  If true, the variable is declared shared.
   --  Field: Flag2
   function Get_Shared_Flag (Target : Iir) return Boolean;
   procedure Set_Shared_Flag (Target : Iir; Shared : Boolean);

   --  Get the design unit in which the target is declared.
   --  For a library unit, this is to get the design unit node.
   --  Field: Field0
   function Get_Design_Unit (Target : Iir) return Iir;
   procedure Set_Design_Unit (Target : Iir; Unit : Iir);

   --  Corresponding block statement for an implicit guard signal.
   --  Field: Field5 Ref
   function Get_Block_Statement (Target : Iir) return Iir;
   procedure Set_Block_Statement (Target : Iir; Block : Iir);

   --  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
   --  driver.  This is used to catch at analyse time unresolved signals with
   --  several drivers.
   --  Field: Field7
   function Get_Signal_Driver (Target : Iir_Signal_Declaration) return Iir;
   procedure Set_Signal_Driver (Target : Iir_Signal_Declaration; Driver : Iir);

   --  Field: Field1 Chain
   function Get_Declaration_Chain (Target : Iir) return Iir;
   procedure Set_Declaration_Chain (Target : Iir; Decls : Iir);

   --  Field: Field6
   function Get_File_Logical_Name (Target : Iir_File_Declaration) return Iir;
   procedure Set_File_Logical_Name (Target : Iir_File_Declaration; Name : Iir);

   --  Field: Field7
   function Get_File_Open_Kind (Target : Iir_File_Declaration) return Iir;
   procedure Set_File_Open_Kind (Target : Iir_File_Declaration; Kind : Iir);

   --  Field: Field4 (pos)
   function Get_Element_Position (Target : Iir) return Iir_Index32;
   procedure Set_Element_Position (Target : Iir; Pos : Iir_Index32);

   --  Field: Field2
   function Get_Element_Declaration (Target : Iir) return Iir;
   procedure Set_Element_Declaration (Target : Iir; El : Iir);

   --  Field: Field2 Ref
   function Get_Selected_Element (Target : Iir) return Iir;
   procedure Set_Selected_Element (Target : Iir; El : Iir);

   --  Selected names of an use_clause are chained.
   --  Field: Field3
   function Get_Use_Clause_Chain (Target : Iir) return Iir;
   procedure Set_Use_Clause_Chain (Target : Iir; Chain : Iir);

   --  Selected names of a context_reference are chained.
   --  Field: Field3
   function Get_Context_Reference_Chain (Target : Iir) return Iir;
   procedure Set_Context_Reference_Chain (Target : Iir; Chain : Iir);

   --  Selected name of an use_clause or context_reference
   --  Field: Field1
   function Get_Selected_Name (Target : Iir) return Iir;
   procedure Set_Selected_Name (Target : Iir; Name : Iir);

   --  The type declarator which declares the type definition DEF.
   --  Field: Field3 Ref
   function Get_Type_Declarator (Def : Iir) return Iir;
   procedure Set_Type_Declarator (Def : Iir; Decl : Iir);

   --  Field: Field2 (uc)
   function Get_Enumeration_Literal_List (Target : Iir) return Iir_List;
   procedure Set_Enumeration_Literal_List (Target : Iir; List : Iir_List);

   --  Field: Field1 Chain
   function Get_Entity_Class_Entry_Chain (Target : Iir) return Iir;
   procedure Set_Entity_Class_Entry_Chain (Target : Iir; Chain : Iir);

   --  Field: Field1 (uc)
   function Get_Group_Constituent_List (Group : Iir) return Iir_List;
   procedure Set_Group_Constituent_List (Group : Iir; List : Iir_List);

   --  Chain of physical type units.
   --  The first unit is the primary unit.  If you really need the primary
   --  unit (and not the chain), you'd better to use Get_Primary_Unit.
   --  Field: Field1 Chain
   function Get_Unit_Chain (Target : Iir) return Iir;
   procedure Set_Unit_Chain (Target : Iir; Chain : Iir);

   --  Alias of Get_Unit_Chain.
   --  Return the primary unit of a physical type.
   --  Field: Field1 Ref
   function Get_Primary_Unit (Target : Iir) return Iir;
   procedure Set_Primary_Unit (Target : Iir; Unit : Iir);

   --  Get/Set the identifier of a declaration.
   --  Can also be used instead of get/set_label.
   --  Field: Field3 (uc)
   function Get_Identifier (Target : Iir) return Name_Id;
   procedure Set_Identifier (Target : Iir; Identifier : Name_Id);
   pragma Inline (Get_Identifier);

   --  Field: Field3 (uc)
   function Get_Label (Target : Iir) return Name_Id;
   procedure Set_Label (Target : Iir; Label : Name_Id);

   --  Get/Set the visible flag of a declaration.
   --  The visible flag is true to make invalid the use of the identifier
   --  during its declaration.  It is set to false when the identifier is added
   --  to the name table, and set to true when the declaration is finished.
   --  Field: Flag4
   function Get_Visible_Flag (Target : Iir) return Boolean;
   procedure Set_Visible_Flag (Target : Iir; Flag : Boolean);

   --  Field: Field1
   function Get_Range_Constraint (Target : Iir) return Iir;
   procedure Set_Range_Constraint (Target : Iir; Constraint : Iir);

   --  Field: State2 (pos)
   function Get_Direction (Decl : Iir) return Iir_Direction;
   procedure Set_Direction (Decl : Iir; Dir : Iir_Direction);

   --  Field: Field2
   function Get_Left_Limit (Decl : Iir_Range_Expression) return Iir;
   procedure Set_Left_Limit (Decl : Iir_Range_Expression; Limit : Iir);

   --  Field: Field3
   function Get_Right_Limit (Decl : Iir_Range_Expression) return Iir;
   procedure Set_Right_Limit (Decl : Iir_Range_Expression; Limit : Iir);

   --  Field: Field4 Ref
   function Get_Base_Type (Decl : Iir) return Iir;
   procedure Set_Base_Type (Decl : Iir; Base_Type : Iir);
   pragma Inline (Get_Base_Type);

   --  Either a resolution function name, an array_element_resolution or a
   --  record_resolution
   --  Field: Field5
   function Get_Resolution_Indication (Decl : Iir) return Iir;
   procedure Set_Resolution_Indication (Decl : Iir; Ind : Iir);

   --  Field: Field1 Chain
   function Get_Record_Element_Resolution_Chain (Res : Iir) return Iir;
   procedure Set_Record_Element_Resolution_Chain (Res : Iir; Chain : Iir);

   --  Field: Field7
   function Get_Tolerance (Def : Iir) return Iir;
   procedure Set_Tolerance (Def : Iir; Tol : Iir);

   --  Field: Field8
   function Get_Plus_Terminal (Def : Iir) return Iir;
   procedure Set_Plus_Terminal (Def : Iir; Terminal : Iir);

   --  Field: Field9
   function Get_Minus_Terminal (Def : Iir) return Iir;
   procedure Set_Minus_Terminal (Def : Iir; Terminal : Iir);

   --  Field: Field5
   function Get_Simultaneous_Left (Def : Iir) return Iir;
   procedure Set_Simultaneous_Left (Def : Iir; Expr : Iir);

   --  Field: Field6
   function Get_Simultaneous_Right (Def : Iir) return Iir;
   procedure Set_Simultaneous_Right (Def : Iir; Expr : Iir);

   --  True if ATYPE defines std.textio.text file type.
   --  Field: Flag4
   function Get_Text_File_Flag (Atype : Iir) return Boolean;
   procedure Set_Text_File_Flag (Atype : Iir; Flag : Boolean);

   --  True if enumeration type ATYPE has only character literals.
   --  Field: Flag4
   function Get_Only_Characters_Flag (Atype : Iir) return Boolean;
   procedure Set_Only_Characters_Flag (Atype : Iir; Flag : Boolean);

   --  Field: State1 (pos)
   function Get_Type_Staticness (Atype : Iir) return Iir_Staticness;
   procedure Set_Type_Staticness (Atype : Iir; Static : Iir_Staticness);

   --  Field: State2 (pos)
   function Get_Constraint_State (Atype : Iir) return Iir_Constraint;
   procedure Set_Constraint_State (Atype : Iir; State : Iir_Constraint);

   --  Reference either index_subtype_definition_list of array_type_definition
   --  or index_constraint_list of array_subtype_definition.
   --  Field: Field9 Ref (uc)
   function Get_Index_Subtype_List (Decl : Iir) return Iir_List;
   procedure Set_Index_Subtype_List (Decl : Iir; List : Iir_List);

   --  List of type marks for indexes type of array types.
   --  Field: Field6 (uc)
   function Get_Index_Subtype_Definition_List (Def : Iir) return Iir_List;
   procedure Set_Index_Subtype_Definition_List (Def : Iir; Idx : Iir_List);

   --  The subtype_indication as it appears in a array type declaration.
   --  Field: Field2
   function Get_Element_Subtype_Indication (Decl : Iir) return Iir;
   procedure Set_Element_Subtype_Indication (Decl : Iir; Sub_Type : Iir);

   --  Field: Field1 Ref
   function Get_Element_Subtype (Decl : Iir) return Iir;
   procedure Set_Element_Subtype (Decl : Iir; Sub_Type : Iir);

   --  Field: Field6 (uc)
   function Get_Index_Constraint_List (Def : Iir) return Iir_List;
   procedure Set_Index_Constraint_List (Def : Iir; List : Iir_List);

   --  Field: Field8
   function Get_Array_Element_Constraint (Def : Iir) return Iir;
   procedure Set_Array_Element_Constraint (Def : Iir; El : Iir);

   --  Chains of elements of a record.
   --  Field: Field1 (uc)
   function Get_Elements_Declaration_List (Decl : Iir) return Iir_List;
   procedure Set_Elements_Declaration_List (Decl : Iir; List : Iir_List);

   --  Field: Field1 Ref
   function Get_Designated_Type (Target : Iir) return Iir;
   procedure Set_Designated_Type (Target : Iir; Dtype : Iir);

   --  Field: Field5
   function Get_Designated_Subtype_Indication (Target : Iir) return Iir;
   procedure Set_Designated_Subtype_Indication (Target : Iir; Dtype : Iir);

   --  List of indexes for indexed name.
   --  Field: Field2 (uc)
   function Get_Index_List (Decl : Iir) return Iir_List;
   procedure Set_Index_List (Decl : Iir; List : Iir_List);

   --  The terminal declaration for the reference (ground) of a nature
   --  Field: Field2
   function Get_Reference (Def : Iir) return Iir;
   procedure Set_Reference (Def : Iir; Ref : Iir);

   --  Field: Field3
   function Get_Nature_Declarator (Def : Iir) return Iir;
   procedure Set_Nature_Declarator (Def : Iir; Decl : Iir);

   --  Field: Field7
   function Get_Across_Type (Def : Iir) return Iir;
   procedure Set_Across_Type (Def : Iir; Atype : Iir);

   --  Field: Field8
   function Get_Through_Type (Def : Iir) return Iir;
   procedure Set_Through_Type (Def : Iir; Atype : Iir);

   --  Field: Field1
   function Get_Target (Target : Iir) return Iir;
   procedure Set_Target (Target : Iir; Atarget : Iir);

   --  Field: Field5 Chain
   function Get_Waveform_Chain (Target : Iir) return Iir;
   procedure Set_Waveform_Chain (Target : Iir; Chain : Iir);

   --  Field: Field8
   function Get_Guard (Target : Iir) return Iir;
   procedure Set_Guard (Target : Iir; Guard : Iir);

   --  Field: Flag1 (uc)
   function Get_Delay_Mechanism (Target : Iir) return Iir_Delay_Mechanism;
   procedure Set_Delay_Mechanism (Target : Iir; Kind : Iir_Delay_Mechanism);

   --  Field: Field4
   function Get_Reject_Time_Expression (Target : Iir) return Iir;
   procedure Set_Reject_Time_Expression (Target : Iir; Expr : Iir);

   --  Field: Field6 (uc)
   function Get_Sensitivity_List (Wait : Iir) return Iir_List;
   procedure Set_Sensitivity_List (Wait : Iir; List : Iir_List);

   --  Field: Field8
   function Get_Process_Origin (Proc : Iir) return Iir;
   procedure Set_Process_Origin (Proc : Iir; Orig : Iir);

   --  Field: Field5
   function Get_Condition_Clause (Wait : Iir_Wait_Statement) return Iir;
   procedure Set_Condition_Clause (Wait : Iir_Wait_Statement; Cond : Iir);

   --  Field: Field1
   function Get_Timeout_Clause (Wait : Iir_Wait_Statement) return Iir;
   procedure Set_Timeout_Clause (Wait : Iir_Wait_Statement; Timeout : Iir);

   --  If set, the concurrent statement is postponed.
   --  Field: Flag3
   function Get_Postponed_Flag (Target : Iir) return Boolean;
   procedure Set_Postponed_Flag (Target : Iir; Value : Boolean);

   --  Returns the list of subprogram called in this subprogram or process.
   --  Note: implicit function (such as implicit operators) are omitted
   --  from this list, since the purpose of this list is to correctly set
   --  flags for side effects (purity_state, wait_state).
   --  Can return null_iir if there is no subprogram called.
   --  Field: Field7 Of_Ref (uc)
   function Get_Callees_List (Proc : Iir) return Iir_List;
   procedure Set_Callees_List (Proc : Iir; List : Iir_List);

   --  Get/Set the passive flag of a process.
   --   TRUE if the process must be passive.
   --   FALSE if the process may be not passive.
   --  For a procedure declaration, set if it is passive.
   --  Field: Flag2
   function Get_Passive_Flag (Proc : Iir) return Boolean;
   procedure Set_Passive_Flag (Proc : Iir; Flag : Boolean);

   --  True if the function is used as a resolution function.
   --  Field: Flag7
   function Get_Resolution_Function_Flag (Func : Iir) return Boolean;
   procedure Set_Resolution_Function_Flag (Func : Iir; Flag : Boolean);

   --  Get/Set the wait state of the current subprogram or process.
   --  TRUE if it contains a wait statement, either directly or
   --   indirectly.
   --  FALSE if it doesn't contain a wait statement.
   --  UNKNOWN if the wait status is not yet known.
   --  Field: State1 (pos)
   function Get_Wait_State (Proc : Iir) return Tri_State_Type;
   procedure Set_Wait_State (Proc : Iir; State : Tri_State_Type);

   --  Get/Set wether the subprogram may be called by a sensitized process
   --  whose sensitivity list is ALL.
   --  FALSE if declared in a package unit and reads a signal that is not
   --    one of its interface, or if it calls such a subprogram.
   --  TRUE if it doesn't call a subprogram whose state is False and
   --    either doesn't read a signal or declared within an entity or
   --    architecture.
   --  UNKNOWN if the status is not yet known.
   --  Field: State3 (pos)
   function Get_All_Sensitized_State (Proc : Iir) return Iir_All_Sensitized;
   procedure Set_All_Sensitized_State (Proc : Iir; State : Iir_All_Sensitized);

   --  Get/Set the seen flag.
   --  Used when the graph of callees is walked, to avoid infinite loops, since
   --  the graph is not a DAG (there may be cycles).
   --  Field: Flag1
   function Get_Seen_Flag (Proc : Iir) return Boolean;
   procedure Set_Seen_Flag (Proc : Iir; Flag : Boolean);

   --  Get/Set the pure flag of a function.
   --  TRUE if the function is declared pure.
   --  FALSE if the function is declared impure.
   --  Field: Flag2
   function Get_Pure_Flag (Func : Iir) return Boolean;
   procedure Set_Pure_Flag (Func : Iir; Flag : Boolean);

   --  Get/Set the foreign flag of a declaration.
   --  TRUE if the declaration was decored with the std.foreign attribute.
   --  Field: Flag3
   function Get_Foreign_Flag (Decl : Iir) return Boolean;
   procedure Set_Foreign_Flag (Decl : Iir; Flag : Boolean);

   --  Get/Set the resolved flag of a subtype definition.
   --  A subtype definition may be resolved either because a
   --  resolution_indication is present in the subtype_indication, or
   --  because all elements type are resolved.
   --  Field: Flag1
   function Get_Resolved_Flag (Atype : Iir) return Boolean;
   procedure Set_Resolved_Flag (Atype : Iir; Flag : Boolean);

   --  Get/Set the signal_type flag of a type/subtype definition.
   --  This flags indicates whether the type can be used as a signal type.
   --  Access types, file types and composite types whose a sub-element is
   --  an access type cannot be used as a signal type.
   --  Field: Flag2
   function Get_Signal_Type_Flag (Atype : Iir) return Boolean;
   procedure Set_Signal_Type_Flag (Atype : Iir; Flag : Boolean);

   --  True if ATYPE is used to declare a signal or to handle a signal
   --   (such as slice or aliases).
   --  Field: Flag3
   function Get_Has_Signal_Flag (Atype : Iir) return Boolean;
   procedure Set_Has_Signal_Flag (Atype : Iir; Flag : Boolean);

   --  Get/Set the purity status of a subprogram.
   --  Field: State2 (pos)
   function Get_Purity_State (Proc : Iir) return Iir_Pure_State;
   procedure Set_Purity_State (Proc : Iir; State : Iir_Pure_State);

   --  Set during binding when DESIGN is added in a list of file to bind.
   --  Field: Flag3
   function Get_Elab_Flag (Design : Iir) return Boolean;
   procedure Set_Elab_Flag (Design : Iir; Flag : Boolean);

   --  Used only by configuration to mark a design unit as already inserted in
   --  the list of units.  Used to avoid double insertion.
   --  Field: Flag4
   function Get_Configuration_Mark_Flag (Design : Iir) return Boolean;
   procedure Set_Configuration_Mark_Flag (Design : Iir; Flag : Boolean);

   --  Used only by configuration to flag units completely handled.  Used to
   --  detect recursion.
   --  Field: Flag5
   function Get_Configuration_Done_Flag (Design : Iir) return Boolean;
   procedure Set_Configuration_Done_Flag (Design : Iir; Flag : Boolean);

   --  Set on an array_subtype if there is an index constraint.
   --  If not set, the subtype is unconstrained.
   --  Field: Flag4
   function Get_Index_Constraint_Flag (Atype : Iir) return Boolean;
   procedure Set_Index_Constraint_Flag (Atype : Iir; Flag : Boolean);

   --  Field: Flag12
   function Get_Hide_Implicit_Flag (Subprg : Iir) return Boolean;
   procedure Set_Hide_Implicit_Flag (Subprg : Iir; Flag : Boolean);

   --  Condition of an assertion.
   --  Field: Field1
   function Get_Assertion_Condition (Target : Iir) return Iir;
   procedure Set_Assertion_Condition (Target : Iir; Cond : Iir);

   --  Report expression of an assertion or report statement.
   --  Field: Field5
   function Get_Report_Expression (Target : Iir) return Iir;
   procedure Set_Report_Expression (Target : Iir; Expr : Iir);

   --  Severity expression of an assertion or report statement.
   --  Field: Field4
   function Get_Severity_Expression (Target : Iir) return Iir;
   procedure Set_Severity_Expression (Target : Iir; Expr : Iir);

   --  Instantiated unit of a component instantiation statement.
   --  Field: Field1
   function Get_Instantiated_Unit (Target : Iir) return Iir;
   procedure Set_Instantiated_Unit (Target : Iir; Unit : Iir);

   --  Generic map aspect list.
   --  Field: Field8 Chain
   function Get_Generic_Map_Aspect_Chain (Target : Iir) return Iir;
   procedure Set_Generic_Map_Aspect_Chain (Target : Iir; Generics : Iir);

   --  Port map aspect list.
   --  Field: Field9 Chain
   function Get_Port_Map_Aspect_Chain (Target : Iir) return Iir;
   procedure Set_Port_Map_Aspect_Chain (Target : Iir; Port : Iir);

   --  Configuration of an entity_aspect_configuration.
   --  Field: Field1
   function Get_Configuration_Name (Target : Iir) return Iir;
   procedure Set_Configuration_Name (Target : Iir; Conf : Iir);

   --  Component configuration for a component_instantiation_statement.
   --  Field: Field6
   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
   function Get_Configuration_Specification (Target : Iir) return Iir;
   procedure Set_Configuration_Specification (Target : Iir; Conf : Iir);

   --  Set/Get the default binding indication of a configuration specification
   --  or a component configuration.
   --  Field: Field5
   function Get_Default_Binding_Indication (Target : Iir) return Iir;
   procedure Set_Default_Binding_Indication (Target : Iir; Conf : Iir);

   --  Set/Get the default configuration of an architecture.
   --  Field: Field6
   function Get_Default_Configuration_Declaration (Target : Iir) return Iir;
   procedure Set_Default_Configuration_Declaration (Target : Iir; Conf : Iir);

   --  Expression for an various nodes.
   --  Field: Field5
   function Get_Expression (Target : Iir) return Iir;
   procedure Set_Expression (Target : Iir; Expr : Iir);

   --  A conditional expression.
   --  Node kind is a Iir_Kind_Conditional_Expression.
   --  Field: Field5
   function Get_Conditional_Expression (Target : Iir) return Iir;
   procedure Set_Conditional_Expression (Target : Iir; Expr : Iir);

   --  Set to the designated type (either the type of the expression or the
   --  subtype) when the expression is analyzed.
   --  Field: Field2 Ref
   function Get_Allocator_Designated_Type (Target : Iir) return Iir;
   procedure Set_Allocator_Designated_Type (Target : Iir; A_Type : Iir);

   --  Field: Field7 Chain
   function Get_Selected_Waveform_Chain (Target : Iir) return Iir;
   procedure Set_Selected_Waveform_Chain (Target : Iir; Chain : Iir);

   --  Field: Field5 Chain
   function Get_Conditional_Waveform_Chain (Target : Iir) return Iir;
   procedure Set_Conditional_Waveform_Chain (Target : Iir; Chain : Iir);

   --  Expression defining the value of the implicit guard signal.
   --  Field: Field2
   function Get_Guard_Expression (Target : Iir) return Iir;
   procedure Set_Guard_Expression (Target : Iir; Expr : Iir);

   --  The declaration (if any) of the implicit guard signal of a block
   --  statement.
   --  Field: Field8
   function Get_Guard_Decl (Target : Iir_Block_Statement) return Iir;
   procedure Set_Guard_Decl (Target : Iir_Block_Statement; Decl : Iir);

   --  Sensitivity list for the implicit guard signal.
   --  Field: Field4 (uc)
   function Get_Guard_Sensitivity_List (Guard : Iir) return Iir_List;
   procedure Set_Guard_Sensitivity_List (Guard : Iir; List : Iir_List);

   --  Block_Configuration that applies to this block statement.
   --  Field: Field6
   function Get_Block_Block_Configuration (Block : Iir) return Iir;
   procedure Set_Block_Block_Configuration (Block : Iir; Conf : Iir);

   --  Field: Field5
   function Get_Package_Header (Pkg : Iir) return Iir;
   procedure Set_Package_Header (Pkg : Iir; Header : Iir);

   --  Field: Field7
   function Get_Block_Header (Target : Iir) return Iir;
   procedure Set_Block_Header (Target : Iir; Header : Iir);

   --  Field: Field5
   function Get_Uninstantiated_Package_Name (Inst : Iir) return Iir;
   procedure Set_Uninstantiated_Package_Name (Inst : Iir; Name : 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
   function Get_Generate_Block_Configuration (Target : Iir) return Iir;
   procedure Set_Generate_Block_Configuration (Target : Iir; Conf : Iir);

   --  Field: Field4
   function Get_Generate_Statement_Body (Target : Iir) return Iir;
   procedure Set_Generate_Statement_Body (Target : Iir; Bod : Iir);

   --  Field: Field3 (uc)
   function Get_Alternative_Label (Target : Iir) return Name_Id;
   procedure Set_Alternative_Label (Target : Iir; Label : Name_Id);

   --  Field: Field5
   function Get_Generate_Else_Clause (Target : Iir) return Iir;
   procedure Set_Generate_Else_Clause (Target : Iir; Clause : Iir);

   --  Condition of a conditionam_waveform, if_statement, elsif,
   --  while_loop_statement, next_statement or exit_statement.
   --  Field: Field1
   function Get_Condition (Target : Iir) return Iir;
   procedure Set_Condition (Target : Iir; Condition : Iir);

   --  Field: Field4
   function Get_Else_Clause (Target : Iir) return Iir;
   procedure Set_Else_Clause (Target : Iir; Clause : Iir);

   --  Iterator of a for_loop_statement.
   --  Field: Field1
   function Get_Parameter_Specification (Target : Iir) return Iir;
   procedure Set_Parameter_Specification (Target : Iir; Param : Iir);

   --  Get/Set the statement in which TARGET appears.  This is used to check
   --  if next/exit is in a loop.
   --  Field: Field0 Ref
   function Get_Parent (Target : Iir) return Iir;
   procedure Set_Parent (Target : Iir; Parent : Iir);

   --  Loop label for an exit_statement or next_statement.
   --  Field: Field5
   function Get_Loop_Label (Target : Iir) return Iir;
   procedure Set_Loop_Label (Target : Iir; Stmt : Iir);

   --  Component name for a component_configuration or
   --  a configuration_specification.
   --  Field: Field4
   function Get_Component_Name (Target : Iir) return Iir;
   procedure Set_Component_Name (Target : Iir; Name : Iir);

   --  Field: Field1 (uc)
   function Get_Instantiation_List (Target : Iir) return Iir_List;
   procedure Set_Instantiation_List (Target : Iir; List : Iir_List);

   --  Field: Field3
   function Get_Entity_Aspect (Target : Iir_Binding_Indication) return Iir;
   procedure Set_Entity_Aspect (Target : Iir_Binding_Indication; Entity : Iir);

   --  Field: Field1
   function Get_Default_Entity_Aspect (Target : Iir) return Iir;
   procedure Set_Default_Entity_Aspect (Target : Iir; Aspect : Iir);

   --  Field: Field6 Chain
   function Get_Default_Generic_Map_Aspect_Chain (Target : Iir) return Iir;
   procedure Set_Default_Generic_Map_Aspect_Chain (Target : Iir; Chain : Iir);

   --  Field: Field7 Chain
   function Get_Default_Port_Map_Aspect_Chain (Target : Iir) return Iir;
   procedure Set_Default_Port_Map_Aspect_Chain (Target : Iir; Chain : Iir);

   --  Field: Field3
   function Get_Binding_Indication (Target : Iir) return Iir;
   procedure Set_Binding_Indication (Target : Iir; Binding : Iir);

   --  The named entity designated by a name.
   --  Field: Field4 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
   function Get_Alias_Declaration (Name : Iir) return Iir;
   procedure Set_Alias_Declaration (Name : Iir; Val : Iir);

   --  Expression staticness, defined by rules of LRM 7.4
   --  Field: State1 (pos)
   function Get_Expr_Staticness (Target : Iir) return Iir_Staticness;
   procedure Set_Expr_Staticness (Target : Iir; Static : Iir_Staticness);

   --  Node which couldn't be correctly analyzed.
   --  Field: Field2
   function Get_Error_Origin (Target : Iir) return Iir;
   procedure Set_Error_Origin (Target : Iir; Origin : Iir);

   --  Operand of a monadic operator.
   --  Field: Field2
   function Get_Operand (Target : Iir) return Iir;
   procedure Set_Operand (Target : Iir; An_Iir : Iir);

   --  Left operand of a dyadic operator.
   --  Field: Field2
   function Get_Left (Target : Iir) return Iir;
   procedure Set_Left (Target : Iir; An_Iir : Iir);

   --  Right operand of a dyadic operator.
   --  Field: Field4
   function Get_Right (Target : Iir) return Iir;
   procedure Set_Right (Target : Iir; An_Iir : Iir);

   --  Field: Field3
   function Get_Unit_Name (Target : Iir) return Iir;
   procedure Set_Unit_Name (Target : Iir; Name : Iir);

   --  Field: Field4
   function Get_Name (Target : Iir) return Iir;
   procedure Set_Name (Target : Iir; Name : Iir);

   --  Field: Field5
   function Get_Group_Template_Name (Target : Iir) return Iir;
   procedure Set_Group_Template_Name (Target : Iir; Name : Iir);

   --  Staticness of a name, according to rules of LRM 6.1
   --  Field: State2 (pos)
   function Get_Name_Staticness (Target : Iir) return Iir_Staticness;
   procedure Set_Name_Staticness (Target : Iir; Static : Iir_Staticness);

   --  Prefix of a name.
   --  Field: Field0
   function Get_Prefix (Target : Iir) return Iir;
   procedure Set_Prefix (Target : Iir; Prefix : Iir);

   --  Prefix of a name signature
   --  Field: Field1 Ref
   function Get_Signature_Prefix (Sign : Iir) return Iir;
   procedure Set_Signature_Prefix (Sign : Iir; Prefix : Iir);

   --  External pathname for an external name.
   --  Field: Field3
   function Get_External_Pathname (Name : Iir) return Iir;
   procedure Set_External_Pathname (Name : Iir; Path : Iir);

   --  Field: Field2
   function Get_Pathname_Suffix (Path : Iir) return Iir;
   procedure Set_Pathname_Suffix (Path : Iir; Suffix : Iir);

   --  Field: Field5
   function Get_Pathname_Expression (Path : Iir) return Iir;
   procedure Set_Pathname_Expression (Path : Iir; Expr : Iir);

   --  The subtype of a slice.  Contrary to the Type field, this is not a
   --  reference.
   --  Field: Field3
   function Get_Slice_Subtype (Slice : Iir) return Iir;
   procedure Set_Slice_Subtype (Slice : Iir; Atype : Iir);

   --  Suffix of a slice or attribute.
   --  Field: Field2
   function Get_Suffix (Target : Iir) return Iir;
   procedure Set_Suffix (Target : Iir; Suffix : Iir);

   --  Set the designated index subtype of an array attribute.
   --  Field: Field2
   function Get_Index_Subtype (Attr : Iir) return Iir;
   procedure Set_Index_Subtype (Attr : Iir; St : Iir);

   --  Parameter of an attribute.
   --  Field: Field4
   function Get_Parameter (Target : Iir) return Iir;
   procedure Set_Parameter (Target : Iir; Param : Iir);

   --  Type of the actual for an association by individual.
   --  Unless the formal is an unconstrained array type, this is the same as
   --  the formal type.
   --  Field: Field3
   function Get_Actual_Type (Target : Iir) return Iir;
   procedure Set_Actual_Type (Target : Iir; Atype : Iir);

   --  Interface for a package association.
   --  Field: Field4 Ref
   function Get_Associated_Interface (Assoc : Iir) return Iir;
   procedure Set_Associated_Interface (Assoc : Iir; Inter : 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.
   --  Field: Field4 Chain
   function Get_Individual_Association_Chain (Target : Iir) return Iir;
   procedure Set_Individual_Association_Chain (Target : Iir; Chain : Iir);

   --  Get/Set info for the aggregate.
   --  There is one aggregate_info for for each dimension.
   --  Field: Field2
   function Get_Aggregate_Info (Target : Iir) return Iir;
   procedure Set_Aggregate_Info (Target : Iir; Info : Iir);

   --  Get/Set the info node for the next dimension.
   --  Field: Field1
   function Get_Sub_Aggregate_Info (Target : Iir) return Iir;
   procedure Set_Sub_Aggregate_Info (Target : Iir; Info : Iir);

   --  TRUE when the length of the aggregate is not locally static.
   --  Field: Flag3
   function Get_Aggr_Dynamic_Flag (Target : Iir) return Boolean;
   procedure Set_Aggr_Dynamic_Flag (Target : Iir; Val : Boolean);

   --  Get/Set the minimum number of elements for the lowest dimension of
   --  the aggregate or for the current dimension of a sub-aggregate.
   --  The real number of elements may be greater than this number if there
   --  is an 'other' choice.
   --  Field: Field4 (uc)
   function Get_Aggr_Min_Length (Info : Iir_Aggregate_Info) return Iir_Int32;
   procedure Set_Aggr_Min_Length (Info : Iir_Aggregate_Info; Nbr : Iir_Int32);

   --  Highest index choice, if any.
   --  Field: Field2
   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
   function Get_Aggr_High_Limit (Target : Iir_Aggregate_Info) return Iir;
   procedure Set_Aggr_High_Limit (Target : Iir_Aggregate_Info; Limit : Iir);

   --  True if the aggregate has an 'others' choice.
   --  Field: Flag2
   function Get_Aggr_Others_Flag (Target : Iir_Aggregate_Info) return Boolean;
   procedure Set_Aggr_Others_Flag (Target : Iir_Aggregate_Info; Val : Boolean);

   --  True if the aggregate have named associations.
   --  Field: Flag4
   function Get_Aggr_Named_Flag (Target : Iir_Aggregate_Info) return Boolean;
   procedure Set_Aggr_Named_Flag (Target : Iir_Aggregate_Info; Val : Boolean);

   --  Staticness of the expressions in an aggregate.
   --  We can't use expr_staticness for this purpose, since the staticness
   --  of an aggregate is at most globally.
   --  Field: State2 (pos)
   function Get_Value_Staticness (Target : Iir) return Iir_Staticness;
   procedure Set_Value_Staticness (Target : Iir; Staticness : Iir_Staticness);

   --  Chain of choices.
   --  Field: Field4 Chain
   function Get_Association_Choices_Chain (Target : Iir) return Iir;
   procedure Set_Association_Choices_Chain (Target : Iir; Chain : Iir);

   --  Chain of choices.
   --  Field: Field1 Chain
   function Get_Case_Statement_Alternative_Chain (Target : Iir) return Iir;
   procedure Set_Case_Statement_Alternative_Chain (Target : Iir; Chain : Iir);

   --  Staticness of the choice.
   --  Field: State2 (pos)
   function Get_Choice_Staticness (Target : Iir) return Iir_Staticness;
   procedure Set_Choice_Staticness (Target : Iir; Staticness : Iir_Staticness);

   --  Field: Field1
   function Get_Procedure_Call (Stmt : Iir) return Iir;
   procedure Set_Procedure_Call (Stmt : Iir; Call : Iir);

   --  Subprogram to be called by a procedure, function call or operator.  This
   --  is the declaration of the subprogram (or a list of during analysis).
   --  Field: Field3 Ref
   function Get_Implementation (Target : Iir) return Iir;
   procedure Set_Implementation (Target : Iir; Decl : Iir);

   --  Paramater associations for procedure and function call.
   --  Field: Field2 Chain
   function Get_Parameter_Association_Chain (Target : Iir) return Iir;
   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
   function Get_Method_Object (Target : Iir) return Iir;
   procedure Set_Method_Object (Target : Iir; Object : Iir);

   --  The type_mark that appeared in the subtype indication.  This is a name.
   --  May be null_iir if there is no type mark (as in an iterator).
   --  Field: Field2
   function Get_Subtype_Type_Mark (Target : Iir) return Iir;
   procedure Set_Subtype_Type_Mark (Target : Iir; Mark : Iir);

   --  Field: Field3
   function Get_Type_Conversion_Subtype (Target : Iir) return Iir;
   procedure Set_Type_Conversion_Subtype (Target : Iir; Atype : Iir);

   --  The type_mark that appeared in qualified expressions or type
   --  conversions.
   --  Field: Field4
   function Get_Type_Mark (Target : Iir) return Iir;
   procedure Set_Type_Mark (Target : Iir; Mark : Iir);

   --  The type of values for a type file.
   --  Field: Field2
   function Get_File_Type_Mark (Target : Iir) return Iir;
   procedure Set_File_Type_Mark (Target : Iir; Mark : Iir);

   --  Field: Field8
   function Get_Return_Type_Mark (Target : Iir) return Iir;
   procedure Set_Return_Type_Mark (Target : Iir; Mark : Iir);

   --  List of use (designated type of access types) of an incomplete type
   --  definition.  The purpose is to complete the uses with the full type
   --  definition.
   --  Field: Field2 (uc)
   function Get_Incomplete_Type_List (Target : Iir) return Iir_List;
   procedure Set_Incomplete_Type_List (Target : Iir; List : Iir_List);

   --  This flag is set on a signal_declaration, when a disconnection
   --  specification applies to the signal (or a subelement of it).
   --  This is used to check 'others' and 'all' designators.
   --  Field: Flag1
   function Get_Has_Disconnect_Flag (Target : Iir) return Boolean;
   procedure Set_Has_Disconnect_Flag (Target : Iir; Val : Boolean);

   --  This flag is set on a signal when its activity is read by the user.
   --  Some signals handling can be optimized when this flag is set.
   --  Field: Flag2
   function Get_Has_Active_Flag (Target : Iir) return Boolean;
   procedure Set_Has_Active_Flag (Target : Iir; Val : Boolean);

   --  This flag is set is code being analyzed is textually within TARGET.
   --  This is used for selected by name rule.
   --  Field: Flag5
   function Get_Is_Within_Flag (Target : Iir) return Boolean;
   procedure Set_Is_Within_Flag (Target : Iir; Val : Boolean);

   --  List of type_mark for an Iir_Kind_Signature
   --  Field: Field2 (uc)
   function Get_Type_Marks_List (Target : Iir) return Iir_List;
   procedure Set_Type_Marks_List (Target : Iir; List : Iir_List);

   --  Field: Flag1
   function Get_Implicit_Alias_Flag (Decl : Iir) return Boolean;
   procedure Set_Implicit_Alias_Flag (Decl : Iir; Flag : Boolean);

   --  Field: Field5
   function Get_Alias_Signature (Alias : Iir) return Iir;
   procedure Set_Alias_Signature (Alias : Iir; Signature : Iir);

   --  Field: Field2
   function Get_Attribute_Signature (Attr : Iir) return Iir;
   procedure Set_Attribute_Signature (Attr : Iir; Signature : Iir);

   --  Field: Field1 Of_Ref (uc)
   function Get_Overload_List (Target : Iir) return Iir_List;
   procedure Set_Overload_List (Target : Iir; List : Iir_List);

   --  Identifier of the simple_name attribute.
   --  Field: Field3 (uc)
   function Get_Simple_Name_Identifier (Target : Iir) return Name_Id;
   procedure Set_Simple_Name_Identifier (Target : Iir; Ident : Name_Id);

   --  Subtype for Simple_Name attribute.
   --  Field: Field4
   function Get_Simple_Name_Subtype (Target : Iir) return Iir;
   procedure Set_Simple_Name_Subtype (Target : Iir; Atype : Iir);

   --  Body of a protected type declaration.
   --  Field: Field2
   function Get_Protected_Type_Body (Target : Iir) return Iir;
   procedure Set_Protected_Type_Body (Target : Iir; Bod : Iir);

   --  Corresponsing protected type declaration of a protected type body.
   --  Field: Field4
   function Get_Protected_Type_Declaration (Target : Iir) return Iir;
   procedure Set_Protected_Type_Declaration (Target : Iir; Decl : Iir);

   --  Location of the 'end' token.
   --  Field: Field6 (uc)
   function Get_End_Location (Target : Iir) return Location_Type;
   procedure Set_End_Location (Target : Iir; Loc : Location_Type);

   --  For a declaration: true if the declaration is used somewhere.
   --  Field: Flag6
   function Get_Use_Flag (Decl : Iir) return Boolean;
   procedure Set_Use_Flag (Decl : Iir; Val : Boolean);

   --  Layout flag: true if 'end' is followed by the reserved identifier.
   --  Field: Flag8
   function Get_End_Has_Reserved_Id (Decl : Iir) return Boolean;
   procedure Set_End_Has_Reserved_Id (Decl : Iir; Flag : Boolean);

   --  Layout flag: true if 'end' is followed by the identifier.
   --  Field: Flag9
   function Get_End_Has_Identifier (Decl : Iir) return Boolean;
   procedure Set_End_Has_Identifier (Decl : Iir; Flag : Boolean);

   --  Layout flag: true if 'end' is followed by 'postponed'.
   --  Field: Flag10
   function Get_End_Has_Postponed (Decl : Iir) return Boolean;
   procedure Set_End_Has_Postponed (Decl : Iir; Flag : Boolean);

   --  Layout flag: true if a label is present.
   --  Field: Flag6
   function Get_Has_Label (Decl : Iir) return Boolean;
   procedure Set_Has_Label (Decl : Iir; Flag : Boolean);

   --  Layout flag: true if 'begin' is present.
   --  Field: Flag10
   function Get_Has_Begin (Decl : Iir) return Boolean;
   procedure Set_Has_Begin (Decl : Iir; Flag : Boolean);

   --  Layout flag: true if 'end' is present (only for generate body).
   --  Field: Flag11
   function Get_Has_End (Decl : Iir) return Boolean;
   procedure Set_Has_End (Decl : Iir; Flag : Boolean);

   --  Layout flag: true if 'is' is present.
   --  Field: Flag7
   function Get_Has_Is (Decl : Iir) return Boolean;
   procedure Set_Has_Is (Decl : Iir; Flag : Boolean);

   --  Layout flag: true if 'pure' or 'impure' is present.
   --  Field: Flag8
   function Get_Has_Pure (Decl : Iir) return Boolean;
   procedure Set_Has_Pure (Decl : Iir; Flag : Boolean);

   --  Layout flag: true if body appears just after the specification.
   --  Field: Flag9
   function Get_Has_Body (Decl : Iir) return Boolean;
   procedure Set_Has_Body (Decl : Iir; Flag : Boolean);

   --  Layout flag for object declaration.  If True, the identifier of this
   --  declaration is followed by an identifier (and separated by a comma).
   --  This flag is set on all but the last declarations.
   --  Eg: on 'signal A, B, C : Bit', the flag is set on A and B (but not C).
   --  Field: Flag3
   function Get_Has_Identifier_List (Decl : Iir) return Boolean;
   procedure Set_Has_Identifier_List (Decl : Iir; Flag : Boolean);

   --  Layout flag for object declaration.  If True, the mode is present.
   --  Field: Flag10
   function Get_Has_Mode (Decl : Iir) return Boolean;
   procedure Set_Has_Mode (Decl : Iir; Flag : Boolean);

   --  Layout flag for object declaration.  If True, the object class is
   --  present.
   --  Field: Flag11
   function Get_Has_Class (Decl : Iir) return Boolean;
   procedure Set_Has_Class (Decl : Iir; Flag : Boolean);

   --  Set on wait, procedure call and composite statements when there is a
   --  sub-statement that can suspend a procedure or a process.  Also set
   --  on procedure declaration.  Note that the flag is conservative: it must
   --  be true if the node contains directly or indirectly a wait statement,
   --  but need not to be false otherwise.
   --  Field: Flag11
   function Get_Suspend_Flag (Stmt : Iir) return Boolean;
   procedure Set_Suspend_Flag (Stmt : Iir; Flag : Boolean);

   --  Set to True if Maybe_Ref fields are references.  This cannot be shared
   --  with Has_Identifier_List as: Is_Ref is set to True on all items but
   --  the first, while Has_Identifier_List is set to True on all items but
   --  the last.  Furthermore Is_Ref appears in nodes where Has_Identifier_List
   --  is not present.
   --  Field: Flag7
   function Get_Is_Ref (N : Iir) return Boolean;
   procedure Set_Is_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);

   --  Field: Field1 (uc)
   function Get_Psl_Sequence (Decl : Iir) return PSL_Node;
   procedure Set_Psl_Sequence (Decl : Iir; Prop : PSL_Node);

   --  Field: Field6 (uc)
   function Get_Psl_Declaration (Decl : Iir) return PSL_Node;
   procedure Set_Psl_Declaration (Decl : Iir; Prop : PSL_Node);

   --  Field: Field3 (uc)
   function Get_Psl_Expression (Decl : Iir) return PSL_Node;
   procedure Set_Psl_Expression (Decl : Iir; Prop : PSL_Node);

   --  Field: Field1 (uc)
   function Get_Psl_Boolean (N : Iir) return PSL_Node;
   procedure Set_Psl_Boolean (N : Iir; Bool : PSL_Node);

   --  Field: Field7 (uc)
   function Get_PSL_Clock (N : Iir) return PSL_Node;
   procedure Set_PSL_Clock (N : Iir; Clock : PSL_Node);

   --  Field: Field8 (uc)
   function Get_PSL_NFA (N : Iir) return PSL_NFA;
   procedure Set_PSL_NFA (N : Iir; Fa : PSL_NFA);

   --  Field: Field9 (uc)
   function Get_PSL_Nbr_States (N : Iir) return Int32;
   procedure Set_PSL_Nbr_States (N : Iir; Nbr : Int32);

   --  Field: Field10 (uc)
   function Get_PSL_Clock_Sensitivity (N : Iir) return Iir_List;
   procedure Set_PSL_Clock_Sensitivity (N : Iir; List : Iir_List);

   --  Field: Flag1
   function Get_PSL_EOS_Flag (N : Iir) return Boolean;
   procedure Set_PSL_EOS_Flag (N : Iir; Flag : Boolean);

end Iirs;