DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦627d19edf⟧ Ada Source

    Length: 111616 (0x1b400)
    Types: Ada Source
    Notes: 03_class, FILE, Long Ada Source, R1k_Segment, e3_tag, generic, package Diana, pragma Cache_Register Attr_List 18, pragma Cache_Register Diana 11, pragma Cache_Register Seq_Type 14, pragma Cache_Register Sequence 15, pragma Cache_Register Symbol_Rep 13, pragma Cache_Register Temp_Seq 17, pragma Cache_Register Tree 12, pragma Module_Name 4 1110, pragma Segmented_Heap Decl_Number_Mask, pragma Segmented_Heap Declaration_Number_Mask, pragma Segmented_Heap Id_Map, pragma Subsystem Ada_Management, seg_02845b

Derivation

└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
    └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« 
        └─⟦this⟧ 

E3 Source Code



with System;
with Universal;

package Diana is

    pragma Subsystem (Ada_Management);
    pragma Module_Name (4, 1110);

    -- Outline of Diana package

    --    NODE_NAME type
    --    TREE type
    --    Lexical types and operations
    --    List types and primitive operations
    --    Constructors and generalized selectors for tree nodes
    --    VALUE type and primitive operations
    --    Selectors for structural attributes
    --    Selectors for semantic attributes
    --    Selectors for code attributes
    --    Procedures for setting structural attributes
    --    Procedures for setting semantic attributes
    --    Procedures for setting code attributes

    --    PERMANENT_ATTRIBUTES, mechanism for extensible user-defined attributes
    --    TEMPORARY_ATTRIBUTES
    --    STANDARD_PACKAGE, providing access to the tree for Standard
    --    EDIT_UTILITIES for traversing and manipulating trees
    --    LIST_UTILITIES for more powerful list operations
    --    ID_UTILITIES for computing id lists and other id operations
    --    SYMBOLIC_IO for dumping diana tree in symbolic form
    --    TRAVERSAL provides generics for traversing trees
    --    ATTR_NAMES
    --    PRAGMA_NAMES
    --    OPERATOR_NAMES
    --    CHECK_NAMES
    --    EXCEPTION_NAMES

    --  constraint_error  : exception;
    -- indicates attempt to apply incorrect selector to a node.

    Illegal_Structure : exception;
    -- Indicates attempt to introduce structural sharing

    ---------------------------------------------------------------------------

    type Node_Name is (Dn_Void, Dn_Aggregate, Dn_Deferred_Constant,
                       Dn_Allocator, Dn_Binary, Dn_Conversion, Dn_Membership,
                       Dn_Null_Access, Dn_Numeric_Literal, Dn_Parenthesized,
                       Dn_Qualified, Dn_String_Literal, Dn_Used_Char, Dn_All,
                       Dn_Attribute, Dn_Attribute_Call, Dn_Function_Call,
                       Dn_Indexed, Dn_Selected, Dn_Slice, Dn_Used_Op,
                       Dn_Used_Bltn_Op, Dn_Used_Object_Id, Dn_Used_Name_Id,
                       Dn_Used_Bltn_Id, Dn_Attr_Id, Dn_Pragma_Id,
                       Dn_Argument_Id, Dn_Comp_Id, Dn_Const_Id, Dn_Dscrmt_Id,
                       Dn_Entry_Id, Dn_Exception_Id, Dn_Function_Id,
                       Dn_Generic_Id, Dn_In_Id, Dn_In_Out_Id, Dn_Out_Id,
                       Dn_Iteration_Id, Dn_Label_Id, Dn_Number_Id,
                       Dn_Package_Id, Dn_Private_Type_Id, Dn_L_Private_Type_Id,
                       Dn_Proc_Id, Dn_Subtype_Id, Dn_Task_Body_Id, Dn_Type_Id,
                       Dn_Var_Id, Dn_Enum_Id, Dn_Def_Char, Dn_Def_Op, Dn_Box,
                       Dn_No_Default, Dn_Instantiation, Dn_Exception,
                       Dn_Constant, Dn_Var, Dn_Number, Dn_Type, Dn_Subtype,
                       Dn_Subprogram_Decl, Dn_Package_Decl, Dn_Task_Decl,
                       Dn_Pragma, Dn_Generic, Dn_Address, Dn_Record_Rep,
                       Dn_Simple_Rep, Dn_Use, Dn_Task_Body, Dn_Package_Body,
                       Dn_Subprogram_Body, Dn_Subunit, Dn_Loop, Dn_Abort,
                       Dn_Accept, Dn_Assign, Dn_Block, Dn_Case, Dn_Code,
                       Dn_Cond_Entry, Dn_Delay, Dn_Entry_Call, Dn_Exit, Dn_Goto,
                       Dn_If, Dn_Labeled, Dn_Named_Stm, Dn_Named_Stm_Id,
                       Dn_Null_Stm, Dn_Procedure_Call, Dn_Raise, Dn_Return,
                       Dn_Select, Dn_Terminate, Dn_Timed_Entry, Dn_Range,
                       Dn_Dscrmt_Aggregate, Dn_Dscrt_Range_S, Dn_Fixed,
                       Dn_Float, Dn_Constrained, Dn_Formal_Dscrt,
                       Dn_Formal_Fixed, Dn_Formal_Float, Dn_Formal_Integer,
                       Dn_Access, Dn_Array, Dn_Derived, Dn_Enum_Literal_S,
                       Dn_Integer, Dn_L_Private, Dn_Private, Dn_Record,
                       Dn_Task_Spec, Dn_Universal_Integer, Dn_Universal_Fixed,
                       Dn_Universal_Real, Dn_Stub, Dn_Pseudo_Stub, Dn_Entry,
                       Dn_Function, Dn_Procedure, Dn_Package_Spec,
                       Dn_Out, Dn_In, Dn_In_Out, Dn_Rename, Dn_For,
                       Dn_Reverse, Dn_While, Dn_Context, Dn_With, Dn_In_Op,
                       Dn_Not_In, Dn_Index, Dn_Alternative_S, Dn_Choice_S,
                       Dn_Comp_Rep_S, Dn_Decl_S, Dn_Exp_S, Dn_Generic_Assoc_S,
                       Dn_Generic_Param_S, Dn_Id_S, Dn_Item_S, Dn_Name_S,
                       Dn_Param_Assoc_S, Dn_Param_S, Dn_Pragma_S,
                       Dn_Select_Clause_S, Dn_Stm_S, Dn_Variant_S,
                       Dn_Dscrmt_Var_S, Dn_Variant, Dn_Dscrmt_Var,
                       Dn_And_Then, Dn_Or_Else, Dn_Select_Clause,
                       Dn_Alternative, Dn_Comp_Rep, Dn_Cond_Clause,
                       Dn_Inner_Record, Dn_Compilation, Dn_Others, Dn_Null_Comp,
                       Dn_Variant_Part, Dn_Named, Dn_Comp_Unit, Dn_Assoc,
                       Dn_Alignment, Dn_Nonterminal, Dn_Foo1, Dn_Foo2);

    ---------------------------------------------------------------------------

    -- basic node type

    type Tree is private;

    pragma Cache_Register (Tree, 12);

    function Get_Segment (T : Tree) return System.Segment;

    function Get_Offset (T : Tree) return System.Bit_Offset;

    function Empty return Tree;  -- returns a constant void node

    function Is_Empty (T : Tree) return Boolean;

    function Kind (T : Tree) return Node_Name;

    function Is_Id_Node (Name : Node_Name) return Boolean;

    function Is_Id_Node (T : Tree) return Boolean;

    function Hash (T : Tree) return Integer;

    function Hash (T : Tree) return Long_Integer;

    pragma Consume_Offset;

    ---------------------------------------------------------------------------

    -- Types introduced to allow implementation of user-defined attributes
    -- to be visible in the body of diana.

    type Attr_Name is private;

    function Equal (X, Y : Attr_Name) return Boolean;

    pragma Consume_Offset;

    function Get_Segment (A : Attr_Name) return System.Segment;

    function Get_Offset (A : Attr_Name) return System.Bit_Offset;

    type Attr_List is private;

    pragma Cache_Register (Attr_List, 18);

    pragma Consume_Offset;

    function Get_Segment (A : Attr_List) return System.Segment;

    function Get_Offset (A : Attr_List) return System.Bit_Offset;

    ---------------------------------------------------------------------------

    -- Lexical types and operations

    type Symbol_Rep is private;

    pragma Cache_Register (Symbol_Rep, 13);

    pragma Consume_Offset;

    function Get_Segment (S : Symbol_Rep) return System.Segment;

    function Get_Offset (S : Symbol_Rep) return System.Bit_Offset;

    function Null_Text return Symbol_Rep;

    function Equal (X, Y : Symbol_Rep) return Boolean;

    function Lx_Symrep (T : Tree) return Symbol_Rep;

    function Id (T : Tree) return Symbol_Rep renames Lx_Symrep;

    procedure Lx_Symrep (T : Tree; V : Symbol_Rep);

    procedure Lx_Symrep (T : Tree; V : String);

    function Image (Symbol : Symbol_Rep) return String;

    function Symrep (Image : String) return Symbol_Rep;

    pragma Consume_Offset (2);

    function Length (Symbol : Symbol_Rep) return Natural;

    function Ith (Symbol : Symbol_Rep; Position : Natural) return Character;

    function Hash (Symbol : Symbol_Rep) return Integer;

    ---------------------------------------------------------------------------

    type Number_Rep is private;

    pragma Consume_Offset;

    function Get_Segment (N : Number_Rep) return System.Segment;

    function Get_Offset (N : Number_Rep) return System.Bit_Offset;

    function Equal (X, Y : Number_Rep) return Boolean;

    function Lx_Numrep (T : Tree) return Number_Rep;

    procedure Lx_Numrep (T : Tree; V : Number_Rep);

    function Image (Number : Number_Rep) return String;

    function Numrep (Image : String) return Number_Rep;

    pragma Consume_Offset (2);

    function Length (Number : Number_Rep) return Natural;

    function Ith (Number : Number_Rep; Position : Natural) return Character;

    procedure Lx_Prefix (T : Tree; V : Boolean);

    function Lx_Prefix (T : Tree) return Boolean;

    procedure Lx_Default (T : Tree; V : Boolean);

    function Lx_Default (T : Tree) return Boolean;

    procedure Lx_Separate (T : Tree; V : Boolean);

    function Lx_Separate (T : Tree) return Boolean;

    ---------------------------------------------------------------------------

    type Comment is private;

    function Get_Segment (C : Comment) return System.Segment;
    function Get_Offset  (C : Comment) return System.Bit_Offset;

   function Make (Text                : String;
                   Start_Column        : Natural;
                   Trailing_Page_Marks : Natural := 0;
                   Trailing_Line_Marks : Natural := 0) return Comment;

    function Text                (C : Comment) return String;
    function Start_Column        (C : Comment) return Natural;
    function Trailing_Page_Marks (C : Comment) return Natural;
    function Trailing_Line_Marks (C : Comment) return Natural;

    procedure Text                (C : Comment; Value : String);
    procedure Start_Column        (C : Comment; Value : Natural);
    procedure Trailing_Page_Marks (C : Comment; Value : Natural);
    procedure Trailing_Line_Marks (C : Comment; Value : Natural);

    ---------------------------------------------------------------------------

    -- Structural list type

    type Seq_Type is private;

    pragma Cache_Register (Seq_Type, 14);

    function Get_Segment (S : Seq_Type) return System.Segment;

    function Get_Offset (S : Seq_Type) return System.Bit_Offset;

    function Hash (S : Seq_Type) return Integer;

    function Make return Seq_Type;

    function Is_Empty (S : Seq_Type) return Boolean;

    function Head (L : Seq_Type) return Tree;

    function Tail (L : Seq_Type) return Seq_Type;

    function Cons (T : Tree; L : Seq_Type) return Seq_Type;

    procedure Replace_Head (L : in out Seq_Type; T : Tree);

    procedure Replace_Tail (L1 : Seq_Type; L2 : Seq_Type);

    pragma Consume_Offset;

    ---------------------------------------------------------------------------

    -- Non-structural list type

    type Sequence is private;

    pragma Cache_Register (Sequence, 15);

    function Get_Segment (S : Sequence) return System.Segment;

    function Get_Offset (S : Sequence) return System.Bit_Offset;

    function Hash (S : Sequence) return Integer;

    function Make return Sequence;

    function Is_Empty (L : Sequence) return Boolean;

    function Head (L : Sequence) return Tree;

    function Tail (L : Sequence) return Sequence;

    function Cons (T : Tree; L : Sequence) return Sequence;

    function Cons (T : Tree; L : Sequence; In_Segment : System.Segment)
                  return Sequence;

    procedure Replace_Head (L : Sequence; T : Tree);

    procedure Replace_Tail (L1 : Sequence; L2 : Sequence);

    pragma Consume_Offset;

    ---------------------------------------------------------------------------

    -- list type which is not allocated in diana heap

    type Temp_Seq is private;

    pragma Cache_Register (Temp_Seq, 17);

    function Get_Segment (S : Temp_Seq) return System.Segment;

    function Get_Offset (S : Temp_Seq) return System.Bit_Offset;

    function Hash (S : Temp_Seq) return Integer;

    function Make return Temp_Seq;

    function Is_Empty (L : Temp_Seq) return Boolean;

    function Head (L : Temp_Seq) return Tree;

    function Tail (L : Temp_Seq) return Temp_Seq;

    function Cons (T : Tree; L : Temp_Seq) return Temp_Seq;

    function Cons (T : Tree; L : Temp_Seq; In_Segment : System.Segment)
                  return Temp_Seq;

    procedure Replace_Head (L : Temp_Seq; T : Tree);

    procedure Replace_Tail (L1 : Temp_Seq; L2 : Temp_Seq);

    ---------------------------------------------------------------------------

    -- constructor functions for diana nodes

    function Make (C : Node_Name) return Tree;

    function Make (C : Node_Name; V : Symbol_Rep) return Tree;

    function Make (C : Node_Name; V : String) return Tree;

    function Make (C : Node_Name; V : Boolean) return Tree;

    function Make (C : Node_Name; T1 : Tree) return Tree;

    function Make (C : Node_Name; T1, T2 : Tree) return Tree;

    function Make (C : Node_Name; T1, T2, T3 : Tree) return Tree;

    function Make (C : Node_Name; L : Seq_Type) return Tree;

    function Make (L : Sequence) return Tree;  -- returns dn_exp_s

    function Make (C : Node_Name; In_Segment : System.Segment) return Tree;

    ---------------------------------------------------------------------------

    type Arities is (Nullary, Unary, Binary, Ternary, Arbitrary);

    function Arity (T : Tree) return Arities;

    function Arity (N : Node_Name) return Arities;

    -- general selectors for subnodes

    function Child1  (T : Tree) return Tree;
    function Child2  (T : Tree) return Tree;
    function Child3  (T : Tree) return Tree;
    function List    (T : Tree) return Seq_Type;
    function As_List (T : Tree) return Seq_Type renames List;

    function Son1 (T : Tree) return Tree renames Child1;
    function Son2 (T : Tree) return Tree renames Child2;
    function Son3 (T : Tree) return Tree renames Child3;

    -- changing subnodes

    procedure Child1  (T : Tree; V : Tree);
    procedure Child2  (T : Tree; V : Tree);
    procedure Child3  (T : Tree; V : Tree);
    procedure List    (T : Tree; V : Seq_Type);
    procedure As_List (T : Tree; V : Seq_Type) renames List;

    procedure Son1 (T : Tree; V : Tree) renames Child1;
    procedure Son2 (T : Tree; V : Tree) renames Child2;
    procedure Son3 (T : Tree; V : Tree) renames Child3;

    ---------------------------------------------------------------------------

    -- Implementation defined Value type

    type Value_Kind is (Integer_Valued, Float_Valued, No_Value, Uninitialized);

    type Value is private;

    function Equal (V1, V2 : Value) return Boolean;

    function Kind (V : Value) return Value_Kind;

    function Make return Value;  -- returns value'(kind=>no_value);

    function Make (I : Integer) return Value;

    function Make (F : Float) return Value;

    function Make (I : Universal.Integer) return Value;

    function Make (F : Universal.Float) return Value;

    function Make (F : Universal.Real) return Value;


    function Integer_Value (V : Value) return Universal.Integer;

    function Float_Value (V : Value) return Universal.Float;

    function Float_Value (V : Value) return Universal.Real;


    procedure Integer_Value (V : in out Value; I : Universal.Integer);

    procedure Float_Value (V : in out Value; F : Universal.Float);

    procedure Float_Value (V : in out Value; F : Universal.Real);


    function Is_Integer (V : Value) return Boolean;

    function Is_Float (V : Value) return Boolean;

    function Is_No_Value (V : Value) return Boolean;


    function Make (I : Integer) return Tree;

    function Make (F : Float) return Tree;

    function Make (I : Universal.Integer) return Tree;

    function Make (F : Universal.Float) return Tree;

    function Make (F : Universal.Real) return Tree;
    -- construct dn_numeric_literal with appropriate value


    function Is_Integer (T : Tree) return Boolean;

    function Is_Float (T : Tree) return Boolean;


    function Integer_Value (T : Tree) return Universal.Integer;

    function Float_Value (T : Tree) return Universal.Float;

    function Float_Value (T : Tree) return Universal.Real;

    ---------------------------------------------------------------------------

    -- selector functions for structural attributes

    function As_Actual           (T : Tree) return Tree;
    function As_Alignment        (T : Tree) return Tree;
    function As_Alternative_S    (T : Tree) return Tree;
    function As_Binary_Op        (T : Tree) return Tree;
    function As_Block_Stub       (T : Tree) return Tree;
    function As_Choice_S         (T : Tree) return Tree;
    function As_Comp_Rep_S       (T : Tree) return Tree;
    function As_Constrained      (T : Tree) return Tree;
    function As_Constraint       (T : Tree) return Tree;
    function As_Context          (T : Tree) return Tree;
    function As_Decl_S           (T : Tree) return Tree;
    function As_Decl_S1          (T : Tree) return Tree;
    function As_Decl_S2          (T : Tree) return Tree;
    function As_Designator       (T : Tree) return Tree;
    function As_Designator_Char  (T : Tree) return Tree;
    function As_Dscrt_Range      (T : Tree) return Tree;
    function As_Dscrt_Range_S    (T : Tree) return Tree;
    function As_Dscrt_Range_Void (T : Tree) return Tree;
    function As_Exception_Def    (T : Tree) return Tree;
    function As_Exp              (T : Tree) return Tree;
    function As_Exp1             (T : Tree) return Tree;
    function As_Exp2             (T : Tree) return Tree;
    function As_Exp_Constrained  (T : Tree) return Tree;
    function As_Exp_S            (T : Tree) return Tree;
    function As_Exp_Void         (T : Tree) return Tree;
    function As_Generic_Assoc_S  (T : Tree) return Tree;
    function As_Generic_Header   (T : Tree) return Tree;
    function As_Generic_Param_S  (T : Tree) return Tree;
    function As_Header           (T : Tree) return Tree;
    function As_Id               (T : Tree) return Tree;
    function As_Id_S             (T : Tree) return Tree;
    function As_Item_S           (T : Tree) return Tree;
    function As_Iteration        (T : Tree) return Tree;
    function As_Membership_Op    (T : Tree) return Tree;
    function As_Name             (T : Tree) return Tree;
    function As_Name_S           (T : Tree) return Tree;
    function As_Name_Void        (T : Tree) return Tree;
    function As_Object_Def       (T : Tree) return Tree;
    function As_Package_Def      (T : Tree) return Tree;
    function As_Param_Assoc_S    (T : Tree) return Tree;
    function As_Param_S          (T : Tree) return Tree;
    function As_Pragma_S         (T : Tree) return Tree;
    function As_Range            (T : Tree) return Tree;
    function As_Range_Void       (T : Tree) return Tree;
    function As_Record           (T : Tree) return Tree;
    function As_Select_Clause_S  (T : Tree) return Tree;
    function As_Stm              (T : Tree) return Tree;
    function As_Stm_S            (T : Tree) return Tree;
    function As_Stm_S1           (T : Tree) return Tree;
    function As_Stm_S2           (T : Tree) return Tree;
    function As_Subprogram_Def   (T : Tree) return Tree;
    function As_Subunit_Body     (T : Tree) return Tree;
    function As_Task_Def         (T : Tree) return Tree;
    function As_Type_Range       (T : Tree) return Tree;
    function As_Type_Spec        (T : Tree) return Tree;
    function As_Unit_Body        (T : Tree) return Tree;
    function As_Variant_S        (T : Tree) return Tree;
    function As_Dscrmt_Var_S     (T : Tree) return Tree;
    function As_Parent           (T : Tree) return Tree;

    ---------------------------------------------------------------------------

    -- selectors for semantic attributes

    function Sm_List               (Exp_S : Tree) return Sequence;
    function Sm_Bits               (T : Tree)     return Integer;
    function Sm_Pos                (T : Tree)     return Integer;
    function Sm_Rep                (T : Tree)     return Integer;
    function Sm_Controlled         (T : Tree)     return Boolean;
    function Sm_Packing            (T : Tree)     return Boolean;
    function Sm_Actual_Delta       (T : Tree)     return Universal.Float;
    function Sm_Actual_Delta       (T : Tree)     return Universal.Real;
    function Sm_Value              (T : Tree)     return Value;
    function Sm_Address            (T : Tree)     return Tree;
    function Sm_Base_Type          (T : Tree)     return Tree;
    function Sm_Body               (T : Tree)     return Tree;
    function Sm_Constraint         (T : Tree)     return Tree;
    function Sm_Defn               (T : Tree)     return Tree;
    function Sm_Discriminants      (T : Tree)     return Tree;
    function Sm_Exp_Type           (T : Tree)     return Tree;
    function Sm_Exception_Def      (T : Tree)     return Tree;
    function Sm_Generic_Param_S    (T : Tree)     return Tree;
    function Sm_Init_Exp           (T : Tree)     return Tree;
    function Sm_Location           (T : Tree)     return Tree;
    function Sm_Obj_Def            (T : Tree)     return Tree;
    function Sm_Obj_Type           (T : Tree)     return Tree;
    function Sm_Size               (T : Tree)     return Tree;
    function Sm_Spec               (T : Tree)     return Tree;
    function Sm_Stm                (T : Tree)     return Tree;
    function Sm_Storage_Size       (T : Tree)     return Tree;
    function Sm_Type_Spec          (T : Tree)     return Tree;
    function Sm_Type_Struct        (T : Tree)     return Tree;
    function Sm_Comp_Spec          (T : Tree)     return Tree;
    function Sm_Decl_S             (T : Tree)     return Tree;
    function Sm_First              (T : Tree)     return Tree;
    function Sm_Normalized_Param_S (T : Tree)     return Tree;
    function Sm_Stub               (T : Tree)     return Tree;
    function Sm_Record_Spec        (T : Tree)     return Tree;
    function Sm_Normalized_Comp_S  (T : Tree)     return Tree;

    function Sm_Parent (T : Tree) return Tree;

    function Sm_Ops (T : Tree) return Sequence;

    -- selectors for code attributes

    function Cd_Impl_Size (T : Tree) return Integer;

    ---------------------------------------------------------------------------

    -- procedures for setting structural attributes

    procedure As_Actual           (T : Tree; V : Tree);
    procedure As_Alignment        (T : Tree; V : Tree);
    procedure As_Alternative_S    (T : Tree; V : Tree);
    procedure As_Binary_Op        (T : Tree; V : Tree);
    procedure As_Block_Stub       (T : Tree; V : Tree);
    procedure As_Choice_S         (T : Tree; V : Tree);
    procedure As_Comp_Rep_S       (T : Tree; V : Tree);
    procedure As_Constrained      (T : Tree; V : Tree);
    procedure As_Constraint       (T : Tree; V : Tree);
    procedure As_Context          (T : Tree; V : Tree);
    procedure As_Decl_S           (T : Tree; V : Tree);
    procedure As_Decl_S1          (T : Tree; V : Tree);
    procedure As_Decl_S2          (T : Tree; V : Tree);
    procedure As_Designator       (T : Tree; V : Tree);
    procedure As_Designator_Char  (T : Tree; V : Tree);
    procedure As_Dscrt_Range      (T : Tree; V : Tree);
    procedure As_Dscrt_Range_S    (T : Tree; V : Tree);
    procedure As_Dscrt_Range_Void (T : Tree; V : Tree);
    procedure As_Exception_Def    (T : Tree; V : Tree);
    procedure As_Exp              (T : Tree; V : Tree);
    procedure As_Exp1             (T : Tree; V : Tree);
    procedure As_Exp2             (T : Tree; V : Tree);
    procedure As_Exp_Constrained  (T : Tree; V : Tree);
    procedure As_Exp_S            (T : Tree; V : Tree);
    procedure As_Exp_Void         (T : Tree; V : Tree);
    procedure As_Generic_Assoc_S  (T : Tree; V : Tree);
    procedure As_Generic_Header   (T : Tree; V : Tree);
    procedure As_Generic_Param_S  (T : Tree; V : Tree);
    procedure As_Header           (T : Tree; V : Tree);
    procedure As_Id               (T : Tree; V : Tree);
    procedure As_Id_S             (T : Tree; V : Tree);
    procedure As_Item_S           (T : Tree; V : Tree);
    procedure As_Iteration        (T : Tree; V : Tree);
    procedure As_Membership_Op    (T : Tree; V : Tree);
    procedure As_Name             (T : Tree; V : Tree);
    procedure As_Name_S           (T : Tree; V : Tree);
    procedure As_Name_Void        (T : Tree; V : Tree);
    procedure As_Object_Def       (T : Tree; V : Tree);
    procedure As_Package_Def      (T : Tree; V : Tree);
    procedure As_Param_Assoc_S    (T : Tree; V : Tree);
    procedure As_Param_S          (T : Tree; V : Tree);
    procedure As_Pragma_S         (T : Tree; V : Tree);
    procedure As_Range            (T : Tree; V : Tree);
    procedure As_Range_Void       (T : Tree; V : Tree);
    procedure As_Record           (T : Tree; V : Tree);
    procedure As_Select_Clause_S  (T : Tree; V : Tree);
    procedure As_Stm              (T : Tree; V : Tree);
    procedure As_Stm_S            (T : Tree; V : Tree);
    procedure As_Stm_S1           (T : Tree; V : Tree);
    procedure As_Stm_S2           (T : Tree; V : Tree);
    procedure As_Subprogram_Def   (T : Tree; V : Tree);
    procedure As_Subunit_Body     (T : Tree; V : Tree);
    procedure As_Task_Def         (T : Tree; V : Tree);
    procedure As_Type_Range       (T : Tree; V : Tree);
    procedure As_Type_Spec        (T : Tree; V : Tree);
    procedure As_Unit_Body        (T : Tree; V : Tree);
    procedure As_Variant_S        (T : Tree; V : Tree);
    procedure As_Dscrmt_Var_S     (T : Tree; V : Tree);

    ---------------------------------------------------------------------------

    -- procedures for setting semantic attributes

    procedure Sm_Bits               (T : Tree; V : Integer);
    procedure Sm_Pos                (T : Tree; V : Integer);
    procedure Sm_Rep                (T : Tree; V : Integer);
    procedure Sm_Controlled         (T : Tree; V : Boolean);
    procedure Sm_Packing            (T : Tree; V : Boolean);
    procedure Sm_Actual_Delta       (T : Tree; V : Universal.Float);
    procedure Sm_Actual_Delta       (T : Tree; V : Universal.Real);
    procedure Sm_Value              (T : Tree; V : Value);
    procedure Sm_Address            (T : Tree; V : Tree);
    procedure Sm_Base_Type          (T : Tree; V : Tree);
    procedure Sm_Body               (T : Tree; V : Tree);
    procedure Sm_Constraint         (T : Tree; V : Tree);
    procedure Sm_Defn               (T : Tree; V : Tree);
    procedure Sm_Discriminants      (T : Tree; V : Tree);
    procedure Sm_Exp_Type           (T : Tree; V : Tree);
    procedure Sm_Exception_Def      (T : Tree; V : Tree);
    procedure Sm_Generic_Param_S    (T : Tree; V : Tree);
    procedure Sm_Init_Exp           (T : Tree; V : Tree);
    procedure Sm_Location           (T : Tree; V : Tree);
    procedure Sm_Obj_Def            (T : Tree; V : Tree);
    procedure Sm_Obj_Type           (T : Tree; V : Tree);
    procedure Sm_Size               (T : Tree; V : Tree);
    procedure Sm_Spec               (T : Tree; V : Tree);
    procedure Sm_Stm                (T : Tree; V : Tree);
    procedure Sm_Storage_Size       (T : Tree; V : Tree);
    procedure Sm_Type_Spec          (T : Tree; V : Tree);
    procedure Sm_Type_Struct        (T : Tree; V : Tree);
    procedure Sm_Comp_Spec          (T : Tree; V : Tree);
    procedure Sm_Decl_S             (T : Tree; V : Tree);
    procedure Sm_First              (T : Tree; V : Tree);
    procedure Sm_Normalized_Param_S (T : Tree; V : Tree);
    procedure Sm_Stub               (T : Tree; V : Tree);
    procedure Sm_Record_Spec        (T : Tree; V : Tree);
    procedure Sm_Normalized_Comp_S  (T : Tree; V : Tree);

    procedure Sm_Parent (T : Tree; V : Tree);

    procedure Sm_Ops (T : Tree; S : Sequence);


    -- procedures for setting code attributes

    procedure Cd_Impl_Size (T : Tree; V : Integer);

    ---------------------------------------------------------------------------

    package Id_Table is
        -- ID_TABLE provides a mapping between DIANA.SYMBOL_REPS and
        -- DEF_IDs having that symbol representation in the context
        -- associated with the ID_TABLE.

        -- For the purpose of semantic analysis, id tables are attached
        -- to the following list headers and provide efficient random access
        -- (via symbol rep) to the declarations therein.

        -- Node      Contents

        -- DECL_S      package visible and private specs
        --    and task specs
        -- ITEM_S      decls (including labels and statement ids)
        --           within blocks (including
        --    program unit bodies)
        --      RECORD      all discriminants and fields of record
        --      PARAM_S      parameters
        -- GENERIC_PARAM_S     generic parameters
        -- DSCRMT_VAR_S     discriminant vars of private type

        type Id_Map is private;
        Null_Table : constant Id_Map;

        procedure Create (Mumble_S : Diana.Tree);
        procedure Create (Mumble_S : Diana.Tree; Of_Size : Integer);

        procedure Enter (Mumble_S : Diana.Tree; Defn : Diana.Tree);
        procedure Enter (Mumble_S : Diana.Tree; Defns : Diana.Sequence);
        procedure Enter (Mumble_S : Diana.Tree; Defns : Diana.Seq_Type);
        -- DEFN(S) is a (list of) def id(s).

        procedure Enter_New (Mumble_S : Diana.Tree; Defn : Diana.Tree);
        -- enter an id from an incrementally inserted decl


        procedure Remove (Mumble_S, Defn_Or_Decl : Diana.Tree);
        -- DEFN(S) is a (list of) def id(s).

        procedure Remove (Decl : Diana.Tree);
        -- Decl must be rooted on the list of a decl_s, item_s, param_s,
        -- generic_param_s, or record.

        function Identify (Mumble_S  : Diana.Tree;
                           Symbol    : Diana.Symbol_Rep;
                           Stop_Decl : Diana.Tree) return Diana.Sequence;

        function Identify (Mumble_S : Diana.Tree; Symbol : Diana.Symbol_Rep)
                          return Diana.Sequence;

        function Identify (Mumble_S  : Diana.Tree;
                           Symbol    : Diana.Symbol_Rep;
                           Stop_Decl : Diana.Tree) return Diana.Tree;

        function Identify (Mumble_S : Diana.Tree; Symbol : Diana.Symbol_Rep)
                          return Diana.Tree;

        function Identify (Mumble_S  : Diana.Tree;
                           Name      : String;
                           Stop_Decl : Diana.Tree) return Diana.Sequence;

        -- IDENTIFY returns the DEFN_IDs associated with the given SYMBOL from
        -- the given table.
        -- The form returning a single node, returns an arbitrary node
        -- associated with the symbol and should be used only when one can
        -- guarantee that at most one association could exist.
        -- A null value is returned if no association exists.
        -- If a STOP_DECL is given, only those associations that were
        -- established "before" the given STOP_DECL are retrieved.
        -- The ordering of ids in the table is the order of declaration
        -- in the underlying MUMBLE_S (or ITEM_S).

        function Identify_Wild (Mumble_S  : Diana.Tree;
                                Symbol    : Diana.Symbol_Rep;
                                Seen      : Diana.Temp_Seq;
                                Stop_Decl : Diana.Tree := Diana.Empty)
                               return Diana.Temp_Seq;


        function All_Ids (Mumble_S, Stop_Decl : Diana.Tree)
                         return Diana.Temp_Seq;
        function All_Ids (Mumble_S : Diana.Tree) return Diana.Temp_Seq;


        function Copy (Table : Id_Map) return Id_Map;

        generic
            with function Translate (Def_Id : Diana.Tree) return Diana.Tree;
        procedure Convert (Table : Id_Map);

        function All_Ids (Mumble_S, Stop_Decl : Diana.Tree)
                         return Diana.Sequence;
        function All_Ids (Mumble_S : Diana.Tree) return Diana.Sequence;

        function Header_Size    (M : Id_Map) return Integer;
        function Links_Size     (M : Id_Map) return Integer;
        function Total_Size     (M : Id_Map) return Integer;
        function Sequence_Nodes (M : Id_Map) return Integer;

        type Local_Id_Table is private;

        function Xlate (T : Local_Id_Table) return Id_Map;
        function Xlate (T : Id_Map)         return Local_Id_Table;

        generic
            with function Translate (Def_Id : Diana.Tree) return Diana.Tree;
        procedure Convert_Table (Old_Table, New_Table : Id_Map);
    private
        type Id_Map_Head;
        type Id_Map is access Id_Map_Head;
        pragma Segmented_Heap (Id_Map);

        type Local_Id_Table is new Id_Map;
        pragma Short_Pointer (Local_Id_Table);

        Null_Table : constant Id_Map := null;
        for Local_Id_Table'Size use 26;
    end Id_Table;

    ---------------------------------------------------------------------------

    package Permanent_Attributes is

        -- This is the low-level package for user-defined attributes.
        -- Usage of this package should be limited to small packages
        -- defining abstract user-defined attributes.  Implementation
        -- of the abstract user-defined attributes must be in terms of
        -- the limited set of types provided here.  More complex user-defined
        -- attributes (which are not directly representable as integers, trees,
        -- lists, etc.) may be implemented by using one of the simple types
        -- provided here for a key and having the package which encapsulates the
        -- the implementation of the user defined attribute do a mapping from
        -- the low-level type to a more appropriate type.  Note that in
        -- this case the Ada Object Manager is only storing the handle or key
        -- that is stored on the attribute list;  the implementation
        -- of the user defined attribute must provide storage facilities if
        -- the attribute is to be a permanent attribute.

        -- WARNING!!! Failure to follow these instructions may result in
        -- maintenance problems.  This package is exporting low-level
        -- unencapsulated operations that are subject to change.  Scattering
        -- usage of this package through millions of lines of code is strongly
        -- discouraged.  Proper encapsulation of the definition of all
        -- user-defined attributes will minimize the impact of such changes,
        -- and may result in the Diana-hackers actually doing the maintenance
        -- for you.

        type Attr_Sort is (Tree_Attr, Sequence_Attr, Symbol_Rep_Attr,
                           Integer_Attr, Float_Attr, Boolean_Attr,
                           Short_Integer_Attr, Byte_Attr,
                           Universal_Integer_Attr, Universal_Real_Attr,
                           Comment_Attr, List_Attr, Id_Table_Attr);

        subtype Name is Attr_Name;

        function Equal (X, Y : Name) return Boolean renames Diana.Equal;

        function Hash (Attr : Attr_Name) return Integer;

        function Permanent_Attr_Name  (Image : String) return Name;
        function Predefined_Attr_Name (Image : String) return Name;

        type Attr_Class is (Predefined, Permanent);

        function Class (Attr : Attr_Name) return Attr_Class;

        function Image  (Attr : Name) return String;
        function Symbol (Attr : Name) return Symbol_Rep;

        subtype List is Attr_List;

        function Attrs (Node : Tree) return List;
        function Hash  (L : List)    return Integer;

        subtype Id_Table is Diana.Id_Table.Id_Map;

        type Short_Integer is range -(2 ** 15 - 1) .. 2 ** 15 - 1;

        type Byte is range 0 .. 2 ** 8 - 1;

        function Get (Node : Tree; Attr : Name) return Tree;
        function Get (Node : Tree; Attr : Name) return Sequence;
        function Get (Node : Tree; Attr : Name) return Symbol_Rep;
        function Get (Node : Tree; Attr : Name) return Boolean;
        function Get (Node : Tree; Attr : Name) return Integer;
        function Get (Node : Tree; Attr : Name) return Float;
        function Get (Node : Tree; Attr : Name) return Short_Integer;
        function Get (Node : Tree; Attr : Name) return Byte;
        function Get (Node : Tree; Attr : Name) return Universal.Integer;
        function Get (Node : Tree; Attr : Name) return Universal.Real;
        function Get (Node : Tree; Attr : Name) return Comment;
        function Get (Node : Tree; Attr : Name) return List;
        function Get (Node : Tree; Attr : Name) return Id_Table;

        procedure Add (Node : Tree; Attr : Name; V : Tree);
        procedure Add (Node : Tree; Attr : Name; V : Sequence);
        procedure Add (Node : Tree; Attr : Name; V : Symbol_Rep);
        procedure Add (Node : Tree; Attr : Name; V : Boolean);
        procedure Add (Node : Tree; Attr : Name; V : Float);
        procedure Add (Node : Tree; Attr : Name; V : Integer);
        procedure Add (Node : Tree; Attr : Name; V : Short_Integer);
        procedure Add (Node : Tree; Attr : Name; V : Byte);
        procedure Add (Node : Tree; Attr : Name; V : Universal.Integer);
        procedure Add (Node : Tree; Attr : Name; V : Universal.Real);
        procedure Add (Node : Tree; Attr : Name; V : Comment);
        procedure Add (Node : Tree; Attr : Name; V : List);
        procedure Add (Node : Tree; Attr : Name; V : Id_Table);

        function  Has    (Node : Tree; Attr : Name) return Boolean;
        procedure Remove (Node : Tree; Attr : Name);

        function Nil                     return List;
        function Is_Empty (Attrs : List) return Boolean;

        function Cons (Head : Tree; Attrs : List)              return List;
        function Cons (Head : Sequence; Attrs : List)          return List;
        function Cons (Head : Symbol_Rep; Attrs : List)        return List;
        function Cons (Head : Boolean; Attrs : List)           return List;
        function Cons (Head : Float; Attrs : List)             return List;
        function Cons (Head : Integer; Attrs : List)           return List;
        function Cons (Head : Short_Integer; Attrs : List)     return List;
        function Cons (Head : Byte; Attrs : List)              return List;
        function Cons (Head : Universal.Integer; Attrs : List) return List;
        function Cons (Head : Universal.Real; Attrs : List)    return List;
        function Cons (Head : Comment; Attrs : List)           return List;
        function Cons (Head : Id_Table; Attrs : List)          return List;
        function Cons (Head : List; Attrs : List)              return List;

        function Kind     (Attrs : List) return Attr_Sort;
        function Get_Name (Attrs : List) return Name;
        -- returns the kind/name of the first element of the list.

        function Head (Attrs : List) return Tree;
        function Head (Attrs : List) return Sequence;
        function Head (Attrs : List) return Symbol_Rep;
        function Head (Attrs : List) return Boolean;
        function Head (Attrs : List) return Float;
        function Head (Attrs : List) return Integer;
        function Head (Attrs : List) return Short_Integer;
        function Head (Attrs : List) return Byte;
        function Head (Attrs : List) return Universal.Integer;
        function Head (Attrs : List) return Universal.Real;
        function Head (Attrs : List) return Id_Table;
        function Head (Attrs : List) return Comment;
        function Head (Attrs : List) return List;

        function Tail (Attrs : List) return List;

        procedure Replace_Head (Attrs : in out List; V : Tree);
        procedure Replace_Head (Attrs : in out List; V : Sequence);
        procedure Replace_Head (Attrs : in out List; V : Symbol_Rep);
        procedure Replace_Head (Attrs : in out List; V : Boolean);
        procedure Replace_Head (Attrs : in out List; V : Float);
        procedure Replace_Head (Attrs : in out List; V : Integer);
        procedure Replace_Head (Attrs : in out List; V : Short_Integer);
        procedure Replace_Head (Attrs : in out List; V : Byte);
        procedure Replace_Head (Attrs : in out List; V : Universal.Integer);
        procedure Replace_Head (Attrs : in out List; V : Universal.Real);
        procedure Replace_Head (Attrs : in out List; V : Id_Table);
        procedure Replace_Head (Attrs : in out List; V : Comment);
        procedure Replace_Head (Attrs : in out List; V : List);

        procedure Replace_Tail (L1, L2 : List);
    end Permanent_Attributes;

    ---------------------------------------------------------------------------

    package Edit_Utilities is

        function Copy (T : Tree) return Tree;
        -- copy a node including all its attributes and subtrees.

        function Copy (L : Seq_Type) return Seq_Type;
        -- copy a list - will copy all trees in the list.

        procedure Remove (T : Tree; Detach : Boolean := True);
        -- remove a tree from its parent.
        -- If DETACH is false, then the pointers in T will not be
        -- reset, and the resulting list structure will be illegal
        -- due to sharing.  Any further operations on T are likely
        -- to fail in unpleasant ways.

        procedure Remove (L : Seq_Type);
        -- remove a tree from its parent.

        procedure Exchange (T1, T2 : Tree);
        -- replaces T1 by T2 and T2 by T1, updating backpointers and parents.


        function Copy (S : Seq_Type) return Sequence;
        -- convert from a seq_type to a sequence

        function Copy (S : Temp_Seq) return Sequence;
        -- convert from a temp_seq to a sequence

        function Copy (S : Sequence) return Temp_Seq;
        -- convert from a sequence to a temp_seq

        function Copy (S : Sequence; In_Segment : System.Segment)
                      return Temp_Seq;
        -- convert from a sequence to a temp_seq

        procedure Move_Attributes (From : Tree; To : Tree);
        procedure Move_Attr_List  (From, To : Tree);

        procedure Change_Node_Name (T : in out Tree; New_Name : Node_Name);

        procedure Change_Node (From       : Tree;
                               To         : Tree;
                               Move_Attrs : Boolean := True;
                               Detach     : Boolean := True);

        function Root (Node : Tree) return Tree;

        procedure Set_Back_Pointer (Child : Tree; Parent : Tree);

        function Invert (L : Seq_Type) return Seq_Type;
        -- reverse a seq_type in-place returning head of reversed list

        function Duplicate (T : Tree) return Tree;
        -- used be tree compaction to copy a tree and its attributes.
    end Edit_Utilities;

    ---------------------------------------------------------------------------

    package List_Utilities is

        type List_Arity is (Zero, One, Many);

        -- operations on DIANA.SEQ_TYPE

        function List (N1 : Tree)                 return Seq_Type;
        function List (N1, N2 : Tree)             return Seq_Type;
        function List (N1, N2, N3 : Tree)         return Seq_Type;
        function List (N1, N2, N3, N4 : Tree)     return Seq_Type;
        function List (N1, N2, N3, N4, N5 : Tree) return Seq_Type;

        function Length        (L : Seq_Type) return Integer;
        function Length_Is_One (L : Seq_Type) return Boolean;
        function Arity         (L : Seq_Type) return List_Arity;

        function Is_Member (N : Tree; L : Seq_Type) return Boolean;
        -- test if node is a member of a list

        function Id_Is_Member
                    (Id_Node : Tree; Id_List : Seq_Type) return Boolean;
        -- test if an id with name of ID_NODE occurs on ID_LIST

        function Nconc (L1, L2 : Seq_Type) return Seq_Type;
        -- lisp nconc, L2 is attached to LAST (L1), L1 returned
        -- is_empty (L1) => return L2;

        function Jth (L : Seq_Type; J : Integer) return Tree;
        -- returns J'th member of L
        -- in J > 0 and LENGTH (L) >= J

        function Last (L : Seq_Type) return Seq_Type;
        -- returns list part of last member of L
        -- is_empty (L) => return make

        function Pos (N : Tree; L : Seq_Type) return Integer;
        -- position of N within L counting from 0
        -- N not in L => return -1

        procedure Nconc (L : in out Seq_Type; T : Tree);
        -- equivalent to L := NCONC (L, CONS (T, make))

        function Get_Seq_Type (List_Element : Tree) return Seq_Type;
        --| pre-condition: arity (as_parent (list_element)) = arbitrary.

        procedure Insert (Parent : Tree; Node : Tree; Position : Natural);
        -- Inserts NODE after the POSITION'th element in the AS_LIST of
        -- PARENT.  (POSITION = 0) => NODE is new head of list.


        -- operations on DIANA.SEQUENCE.

        function List (N1 : Tree)                 return Sequence;
        function List (N1, N2 : Tree)             return Sequence;
        function List (N1, N2, N3 : Tree)         return Sequence;
        function List (N1, N2, N3, N4 : Tree)     return Sequence;
        function List (N1, N2, N3, N4, N5 : Tree) return Sequence;

        function Length        (L : Sequence) return Integer;
        function Length_Is_One (L : Sequence) return Boolean;
        function Arity         (L : Sequence) return List_Arity;

        function Is_Member (N : Tree; L : Sequence) return Boolean;
        -- test if N occurs on list L

        function Id_Is_Member
                    (Id_Node : Tree; Id_List : Sequence) return Boolean;
        -- test if an id with name of ID_NODE occurs on ID_LIST

        function Append (L1, L2 : Sequence) return Sequence;
        -- lisp append, L1 is copied, L2 is attached to copy which is returned

        function Nconc (L1, L2 : Sequence) return Sequence;
        -- lisp nconc, L2 is attached to LAST (L1), L1 returned
        -- is_empty (L1) => return L2;

        function Concat (L1, L2 : Sequence) return Sequence;
        -- L1 and L2 are copied then nconc'ed

        function Invert (L : Sequence) return Sequence;
        -- lisp reverse, makes new copy of list (reverse is a keyword)

        function Jth (L : Sequence; J : Integer) return Tree;
        -- returns J'th member of L
        -- in J > 0 and LENGTH (L) >= J

        function Last (L : Sequence) return Sequence;
        -- returns list part of last member of L
        -- is_empty (L) => return make

        function Pos (N : Tree; L : Sequence) return Integer;
        -- position of N within L counting from 0
        -- N not in L => return -1

        procedure Nconc (L : in out Sequence; T : Tree);
        -- equivalent to L := NCONC (L, CONS (T, make))


        -- operations on DIANA.TEMP_SEQ

        function List (N1 : Tree)                 return Temp_Seq;
        function List (N1, N2 : Tree)             return Temp_Seq;
        function List (N1, N2, N3 : Tree)         return Temp_Seq;
        function List (N1, N2, N3, N4 : Tree)     return Temp_Seq;
        function List (N1, N2, N3, N4, N5 : Tree) return Temp_Seq;

        function Length        (L : Temp_Seq) return Integer;
        function Length_Is_One (L : Temp_Seq) return Boolean;
        function Arity         (L : Temp_Seq) return List_Arity;

        function Is_Member (N : Tree; L : Temp_Seq) return Boolean;
        -- test if N occurs on list L

        function Id_Is_Member
                    (Id_Node : Tree; Id_List : Temp_Seq) return Boolean;
        -- test if an id with name of ID_NODE occurs on ID_LIST

        function Append (L1, L2 : Temp_Seq)            return Temp_Seq;
        function Append (L1 : Sequence; L2 : Temp_Seq) return Temp_Seq;
        -- lisp append, L1 is copied, L2 is attached to copy which is returned

        function Nconc (L1, L2 : Temp_Seq) return Temp_Seq;
        -- lisp nconc, L2 is attached to LAST (L1), L1 returned
        -- is_empty (L1) => return L2;

        function Concat (L1, L2 : Temp_Seq) return Temp_Seq;       -- L1 and L2 are copied then nconc'ed

        function Invert (L : Temp_Seq) return Temp_Seq;
        -- lisp reverse, makes new copy of list (reverse is a keyword)

        function Jth (L : Temp_Seq; J : Integer) return Tree;
        -- returns J'th member of L
        -- in J > 0 and LENGTH (L) >= J

        function Last (L : Temp_Seq) return Temp_Seq;
        -- returns list part of last member of L
        -- is_empty (L) => return make

        function Pos (N : Tree; L : Temp_Seq) return Integer;
        -- position of N within L counting from 0
        -- N not in L => return -1

        procedure Nconc (L : in out Temp_Seq; T : Tree);
        -- equivalent to L := NCONC (L, CONS (T, make))


        procedure Insert (Parent : Tree; Node : Tree; After : Diana.Tree);
        -- Inserts NODE after AFTER in the AS_LIST of PARENT.
        -- is_empty (AFTER) => node is new head of list.
    end List_Utilities;

    ---------------------------------------------------------------------------

    package Id_Utilities is

        procedure Set_Trace;
        procedure Reset_Trace;

        function Comp_Unit_Id (Comp_Unit : Tree) return Tree;
        -- Returns the Id for a comp unit.

        function Unit_Id (Unit : Tree) return Tree;
        -- Returns the Id or Designator as appropriate for
        -- a given program unit item.

        function Get_Id (Decl_Node : Diana.Tree) return Diana.Tree;
        -- get the id out of anything that has a single id

        function Is_Predefined (Id_Node : Tree) return Boolean;

        function Get_Defn (Name : Tree) return Tree;
        -- Given a using occurence or selected, returns the defining occurence.

        function Enclosing_Declaration (Id : Tree) return Tree;
        -- Finds the nearest enclosing declaration (item).

        function First_Def_Id
                    (Item : Tree; Iterate : Boolean := True) return Tree;
        function Next_Def_Id (Def_Id : Tree)                 return Tree;
        -- These two functions allow traversal of the entities in a
        -- Decl_s or Item_s.  Each Def_id will be visited to account for
        -- multiple object declarations (x,y:t).  This only visits the
        -- def_ids for the explicit declarations at the top level.
        -- Does not go inside enumaration type declarations, visit
        -- implicit operators, visit parameters or record fields, etc.
        -- The optional iterate parameter causes first_def_id to
        -- search down the Item_s if Item is a use clause or some
        -- item which does not have an id.

        function First (Id : Diana.Tree) return Diana.Tree;
        -- Given a defining occurence, returns the first occurence.

        function Flatten (Name : Diana.Tree) return Diana.Sequence;

        function Fully_Qualified_Name
                    (Def_Id : Diana.Tree) return Diana.Sequence;


        -- The following functions retrieve all visible entities.

        function All_Ids_Of
                    (Decl_List : Tree; Until_Stub : Symbol_Rep := Null_Text)
                    return Sequence;

        function All_Ids_Of
                    (Decl_List : Tree; Until_Decl : Tree) return Sequence;

        function All_Ids_In_Visible_Part (Package_Spec : Tree) return Sequence;
        function All_Ids_In_Private_Part (Package_Spec : Tree) return Sequence;

        function All_Ids_In_Task_Spec (Task_Spec : Tree) return Sequence;

        function All_Param_Ids_Of (Params : Tree)         return Sequence;
        function All_Field_Ids_Of (Component_List : Tree) return Sequence;

        function All_Label_Ids_Of     (Block_Node : Tree) return Sequence;
        function All_Named_Stm_Ids_Of (Block_Node : Tree) return Sequence;

        function All_Ids_In_Block (Block_Node : Tree; Is_Unit : Boolean := True)
                                  return Sequence;
    end Id_Utilities;

    ---------------------------------------------------------------------------

    generic
        with procedure Put (S : String);
        with procedure New_Line;
        with procedure Print_Other_Attrs
                          (Node : Diana.Tree; Indentation : Integer);
    package Symbolic_Io is
        procedure Output (List            : Diana.Sequence;
                          With_Attributes : Boolean := True);

        procedure Output (Node : Diana.Tree; With_Attributes : Boolean := True);
    end Symbolic_Io;

    ---------------------------------------------------------------------------

    package Attr_Names is
        function Attr_Address           return Symbol_Rep;
        function Attr_Base              return Symbol_Rep;
        function Attr_Size              return Symbol_Rep;
        function Attr_First             return Symbol_Rep;
        function Attr_Last              return Symbol_Rep;
        function Attr_Image             return Symbol_Rep;
        function Attr_Value             return Symbol_Rep;
        function Attr_Pos               return Symbol_Rep;
        function Attr_Val               return Symbol_Rep;
        function Attr_Pred              return Symbol_Rep;
        function Attr_Succ              return Symbol_Rep;
        function Attr_Delta             return Symbol_Rep;
        function Attr_Machine_Rounds    return Symbol_Rep;
        function Attr_Digits            return Symbol_Rep;
        function Attr_Mantissa          return Symbol_Rep;
        function Attr_Emax              return Symbol_Rep;
        function Attr_Small             return Symbol_Rep;
        function Attr_Large             return Symbol_Rep;
        function Attr_Epsilon           return Symbol_Rep;
        function Attr_Machine_Radix     return Symbol_Rep;
        function Attr_Machine_Emax      return Symbol_Rep;
        function Attr_Machine_Emin      return Symbol_Rep;
        function Attr_Length            return Symbol_Rep;
        function Attr_Range             return Symbol_Rep;
        function Attr_Constrained       return Symbol_Rep;
        function Attr_Position          return Symbol_Rep;
        function Attr_First_Bit         return Symbol_Rep;
        function Attr_Last_Bit          return Symbol_Rep;
        function Attr_Storage_Size      return Symbol_Rep;
        function Attr_Terminated        return Symbol_Rep;
        function Attr_Count             return Symbol_Rep;
        function Attr_Machine_Mantissa  return Symbol_Rep;
        function Attr_Machine_Overflows return Symbol_Rep;
        function Attr_Aft               return Symbol_Rep;
        function Attr_Callable          return Symbol_Rep;
        function Attr_Fore              return Symbol_Rep;
        function Attr_Safe_Emax         return Symbol_Rep;
        function Attr_Safe_Large        return Symbol_Rep;
        function Attr_Safe_Small        return Symbol_Rep;
        function Attr_Width             return Symbol_Rep;
    end Attr_Names;


    package Pragma_Names is
        function Priority     return Symbol_Rep;
        function Memory_Size  return Symbol_Rep;
        function Suppress     return Symbol_Rep;
        function Inline       return Symbol_Rep;
        function List         return Symbol_Rep;
        function Pack         return Symbol_Rep;
        function Storage_Unit return Symbol_Rep;
        function Optimize     return Symbol_Rep;
        function Interface    return Symbol_Rep;
        function System_Name  return Symbol_Rep;
        function Controlled   return Symbol_Rep;
        function Elaborate    return Symbol_Rep;
        function Page         return Symbol_Rep;
        function Shared       return Symbol_Rep;
    end Pragma_Names;


    package Operator_Names is
        function Abs_Op    return Symbol_Rep;
        function Plus_Op   return Symbol_Rep;
        function Minus_Op  return Symbol_Rep;
        function Times_Op  return Symbol_Rep;
        function Divide_Op return Symbol_Rep;
        function Mod_Op    return Symbol_Rep;
        function Rem_Op    return Symbol_Rep;
        function Exp_Op    return Symbol_Rep;

        function And_Op return Symbol_Rep;
        function Or_Op  return Symbol_Rep;
        function Xor_Op return Symbol_Rep;
        function Not_Op return Symbol_Rep;

        function Eq_Op return Symbol_Rep;
        function Ne_Op return Symbol_Rep;
        function Lt_Op return Symbol_Rep;
        function Gt_Op return Symbol_Rep;
        function Ge_Op return Symbol_Rep;
        function Le_Op return Symbol_Rep;

        function Concat_Op return Symbol_Rep;

        function Operators (Index : Positive) return Symbol_Rep;
    end Operator_Names;


    package Check_Names is
        function Access_Check       return Symbol_Rep;
        function Discriminant_Check return Symbol_Rep;
        function Index_Check        return Symbol_Rep;
        function Length_Check       return Symbol_Rep;
        function Range_Check        return Symbol_Rep;
        function Division_Check     return Symbol_Rep;
        function Overflow_Check     return Symbol_Rep;
        function Elaboration_Check  return Symbol_Rep;
        function Storage_Check      return Symbol_Rep;
    end Check_Names;


    package Exception_Names is
        function Constraint_Err return Symbol_Rep;
        function Numeric_Err    return Symbol_Rep;
        function Storage_Err    return Symbol_Rep;
        function Tasking_Err    return Symbol_Rep;
        function Program_Err    return Symbol_Rep;
    end Exception_Names;

    ---------------------------------------------------------------------------

    function Convert (Segment : System.Segment; Offset : System.Bit_Offset)
                     return Tree;

    function Convert (Segment : System.Segment; Offset : System.Bit_Offset)
                     return Seq_Type;

    function Convert (Segment : System.Segment; Offset : System.Bit_Offset)
                     return Sequence;

    function Convert (Segment : System.Segment; Offset : System.Bit_Offset)
                     return Symbol_Rep;

    function Convert (Segment : System.Segment; Offset : System.Bit_Offset)
                     return Number_Rep;

    function Convert (Segment : System.Segment; Offset : System.Bit_Offset)
                     return Comment;

    function Convert (Segment : System.Segment; Offset : System.Bit_Offset)
                     return Attr_Name;

    function Convert (Segment : System.Segment; Offset : System.Bit_Offset)
                     return Attr_List;

    function Convert (Node : Tree) return System.Address;

    ---------------------------------------------------------------------------

    function Node_Size (T : Diana.Tree)     return Integer;
    function Node_Size (S : Diana.Seq_Type) return Integer;
    function Node_Size (S : Diana.Sequence) return Integer;
    function Node_Size (S : Diana.Temp_Seq) return Integer;
    function Node_Size (L : Attr_List)      return Integer;

    function Size (S : Diana.Symbol_Rep) return Integer;
    function Size (S : Diana.Number_Rep) return Integer;

    function Size (S : Diana.Sequence) return Integer;
    function Size (S : Diana.Temp_Seq) return Integer;

    function Hash (S : Diana.Seq_Type) return Long_Integer;
    function Hash (S : Diana.Sequence) return Long_Integer;
    function Hash (S : Diana.Temp_Seq) return Long_Integer;

    ---------------------------------------------------------------------------

    -- Operator type

    type Operator is
       (No_Operation, Boolean_Eq, Boolean_Ne,
        Boolean_Lt, Boolean_Le, Boolean_Gt, Boolean_Ge,

        Boolean_And, Boolean_Or, Boolean_Xor, Boolean_Not,

        Other_Boolean_Eq, Other_Boolean_Ne, Other_Boolean_Lt,
        Other_Boolean_Le, Other_Boolean_Gt, Other_Boolean_Ge,

        Other_Boolean_And, Other_Boolean_Or,
        Other_Boolean_Xor, Other_Boolean_Not,

        Integer_Eq, Integer_Ne, Integer_Lt, Integer_Le, Integer_Gt, Integer_Ge,

        Integer_Plus, Integer_Neg, Integer_Abs,

        Integer_Add, Integer_Sub, Integer_Mul,
        Integer_Div, Integer_Mod, Integer_Rem,

        Integer_Exp,

        Short_Integer_Eq, Short_Integer_Ne, Short_Integer_Lt,
        Short_Integer_Le, Short_Integer_Gt, Short_Integer_Ge,

        Short_Integer_Plus, Short_Integer_Neg, Short_Integer_Abs,

        Short_Integer_Add, Short_Integer_Sub, Short_Integer_Mul,
        Short_Integer_Div, Short_Integer_Mod, Short_Integer_Rem,

        Short_Integer_Exp,

        Short_Short_Integer_Eq, Short_Short_Integer_Ne, Short_Short_Integer_Lt,
        Short_Short_Integer_Le, Short_Short_Integer_Gt, Short_Short_Integer_Ge,

        Short_Short_Integer_Plus,
        Short_Short_Integer_Neg, Short_Short_Integer_Abs,

        Short_Short_Integer_Add, Short_Short_Integer_Sub,
        Short_Short_Integer_Mul, Short_Short_Integer_Div,
        Short_Short_Integer_Mod, Short_Short_Integer_Rem,

        Short_Short_Integer_Exp,

        Long_Integer_Eq, Long_Integer_Ne, Long_Integer_Lt,
        Long_Integer_Le, Long_Integer_Gt, Long_Integer_Ge,

        Long_Integer_Plus, Long_Integer_Neg, Long_Integer_Abs,

        Long_Integer_Add, Long_Integer_Sub, Long_Integer_Mul,
        Long_Integer_Div, Long_Integer_Mod, Long_Integer_Rem,

        Long_Integer_Exp,

        Long_Long_Integer_Eq, Long_Long_Integer_Ne, Long_Long_Integer_Lt,
        Long_Long_Integer_Le, Long_Long_Integer_Gt, Long_Long_Integer_Ge,

        Long_Long_Integer_Plus, Long_Long_Integer_Neg, Long_Long_Integer_Abs,

        Long_Long_Integer_Add, Long_Long_Integer_Sub, Long_Long_Integer_Mul,
        Long_Long_Integer_Div, Long_Long_Integer_Mod, Long_Long_Integer_Rem,

        Long_Long_Integer_Exp,

        Formal_Integer_Eq, Formal_Integer_Ne, Formal_Integer_Lt,
        Formal_Integer_Le, Formal_Integer_Gt, Formal_Integer_Ge,

        Formal_Integer_Plus, Formal_Integer_Neg, Formal_Integer_Abs,

        Formal_Integer_Add, Formal_Integer_Sub, Formal_Integer_Mul,
        Formal_Integer_Div, Formal_Integer_Mod, Formal_Integer_Rem,

        Formal_Integer_Exp,

        Universal_Integer_Eq, Universal_Integer_Ne, Universal_Integer_Lt,
        Universal_Integer_Le, Universal_Integer_Gt, Universal_Integer_Ge,

        Universal_Integer_Plus, Universal_Integer_Neg, Universal_Integer_Abs,

        Universal_Integer_Add, Universal_Integer_Sub, Universal_Integer_Mul,
        Universal_Integer_Div, Universal_Integer_Mod, Universal_Integer_Rem,

        Universal_Integer_Exp,

        Other_Integer_Eq, Other_Integer_Ne, Other_Integer_Lt,
        Other_Integer_Le, Other_Integer_Gt, Other_Integer_Ge,

        Other_Integer_Plus, Other_Integer_Neg, Other_Integer_Abs,

        Other_Integer_Add, Other_Integer_Sub, Other_Integer_Mul,
        Other_Integer_Div, Other_Integer_Mod, Other_Integer_Rem,

        Other_Integer_Exp,

        Float_Eq, Float_Ne, Float_Lt, Float_Le, Float_Gt, Float_Ge,

        Float_Plus, Float_Neg, Float_Abs,

        Float_Add, Float_Sub, Float_Mul, Float_Div,

        Float_Exp,

        Short_Float_Eq, Short_Float_Ne, Short_Float_Lt,
        Short_Float_Le, Short_Float_Gt, Short_Float_Ge,

        Short_Float_Plus, Short_Float_Neg, Short_Float_Abs,

        Short_Float_Add, Short_Float_Sub, Short_Float_Mul, Short_Float_Div,

        Short_Float_Exp,

        Short_Short_Float_Eq, Short_Short_Float_Ne, Short_Short_Float_Lt,
        Short_Short_Float_Le, Short_Short_Float_Gt, Short_Short_Float_Ge,

        Short_Short_Float_Plus, Short_Short_Float_Neg, Short_Short_Float_Abs,

        Short_Short_Float_Add, Short_Short_Float_Sub,
        Short_Short_Float_Mul, Short_Short_Float_Div,

        Short_Short_Float_Exp,

        Long_Float_Eq, Long_Float_Ne, Long_Float_Lt,
        Long_Float_Le, Long_Float_Gt, Long_Float_Ge,

        Long_Float_Plus, Long_Float_Neg, Long_Float_Abs,

        Long_Float_Add, Long_Float_Sub, Long_Float_Mul, Long_Float_Div,

        Long_Float_Exp,

        Long_Long_Float_Eq, Long_Long_Float_Ne, Long_Long_Float_Lt,
        Long_Long_Float_Le, Long_Long_Float_Gt, Long_Long_Float_Ge,

        Long_Long_Float_Plus, Long_Long_Float_Neg, Long_Long_Float_Abs,

        Long_Long_Float_Add, Long_Long_Float_Sub,
        Long_Long_Float_Mul, Long_Long_Float_Div,

        Long_Long_Float_Exp,

        Formal_Float_Eq, Formal_Float_Ne, Formal_Float_Lt,
        Formal_Float_Le, Formal_Float_Gt, Formal_Float_Ge,

        Formal_Float_Plus, Formal_Float_Neg, Formal_Float_Abs,

        Formal_Float_Add, Formal_Float_Sub, Formal_Float_Mul, Formal_Float_Div,

        Formal_Float_Exp,

        Universal_Real_Eq, Universal_Real_Ne, Universal_Real_Lt,
        Universal_Real_Le, Universal_Real_Gt, Universal_Real_Ge,

        Universal_Real_Plus, Universal_Real_Neg, Universal_Real_Abs,

        Universal_Real_Add, Universal_Real_Sub,
        Universal_Real_Mul, Universal_Real_Div,

        Universal_Real_Exp,

        Universal_Integer_Real_Mul, Universal_Real_Integer_Mul,
        Universal_Real_Integer_Div,

        Universal_Fixed_Mul, Universal_Fixed_Div,

        Duration_Eq, Duration_Ne, Duration_Lt,
        Duration_Le, Duration_Gt, Duration_Ge,

        Duration_Plus, Duration_Neg, Duration_Abs,

        Duration_Add, Duration_Sub, Duration_Integer_Mul,
        Integer_Duration_Mul, Duration_Integer_Div,

        Formal_Fixed_Eq, Formal_Fixed_Ne, Formal_Fixed_Lt,
        Formal_Fixed_Le, Formal_Fixed_Gt, Formal_Fixed_Ge,

        Formal_Fixed_Plus, Formal_Fixed_Neg, Formal_Fixed_Abs,

        Formal_Fixed_Add, Formal_Fixed_Sub, Formal_Fixed_Integer_Mul,
        Integer_Formal_Fixed_Mul, Formal_Fixed_Integer_Div,

        Other_Fixed_Eq, Other_Fixed_Ne, Other_Fixed_Lt,
        Other_Fixed_Le, Other_Fixed_Gt, Other_Fixed_Ge,

        Other_Fixed_Plus, Other_Fixed_Neg, Other_Fixed_Abs,

        Other_Fixed_Add, Other_Fixed_Sub, Other_Fixed_Integer_Mul,
        Integer_Other_Fixed_Mul, Other_Fixed_Integer_Div,

        Character_Eq, Character_Ne, Character_Lt,
        Character_Le, Character_Gt, Character_Ge,

        Enumeration_Eq, Enumeration_Ne, Enumeration_Lt,
        Enumeration_Le, Enumeration_Gt, Enumeration_Ge,

        Formal_Discrete_Eq, Formal_Discrete_Ne, Formal_Discrete_Lt,
        Formal_Discrete_Le, Formal_Discrete_Gt, Formal_Discrete_Ge,

        String_Eq, String_Ne, String_Lt, String_Le, String_Gt, String_Ge,

        String_String_Cat, String_Character_Cat,
        Character_String_Cat, Character_Character_Cat,

        One_Dim_Array_Eq, One_Dim_Array_Ne,
        One_Dim_Discrete_Array_Lt, One_Dim_Discrete_Array_Le,
        One_Dim_Discrete_Array_Gt, One_Dim_Discrete_Array_Ge,

        One_Dim_Boolean_Array_Not, One_Dim_Boolean_Array_And,
        One_Dim_Boolean_Array_Or, One_Dim_Boolean_Array_Xor,

        One_Dim_Array_Array_Cat, One_Dim_Array_Element_Cat,
        One_Dim_Element_Array_Cat, One_Dim_Element_Element_Cat,

        Multi_Dim_Array_Eq, Multi_Dim_Array_Ne,

        One_Dim_Formal_Array_Eq, One_Dim_Formal_Array_Ne,
        One_Dim_Discrete_Formal_Array_Lt, One_Dim_Discrete_Formal_Array_Le,
        One_Dim_Discrete_Formal_Array_Gt, One_Dim_Discrete_Formal_Array_Ge,

        One_Dim_Boolean_Formal_Array_Not, One_Dim_Boolean_Formal_Array_And,
        One_Dim_Boolean_Formal_Array_Or, One_Dim_Boolean_Formal_Array_Xor,

        One_Dim_Formal_Array_Array_Cat, One_Dim_Formal_Array_Element_Cat,
        One_Dim_Formal_Element_Array_Cat, One_Dim_Formal_Element_Element_Cat,

        Multi_Dim_Formal_Array_Eq, Multi_Dim_Formal_Array_Ne,

        Record_Eq, Record_Ne,

        Access_Eq, Access_Ne,

        Formal_Access_Eq, Formal_Access_Ne,

        Private_Eq, Private_Ne,

        Formal_Private_Eq, Formal_Private_Ne);

    procedure Sm_Operator (T : Tree; V : Operator);

    function Sm_Operator (T : Tree) return Operator;

    procedure Sm_Operator_Value (T : Tree; V : Operator);

    function Sm_Operator_Value (T : Tree) return Operator;

    ---------------------------------------------------------------------------

    -- Line Count attribute for pretty printer.

    type Line_Count is new Integer range 0 .. 2 ** 24 - 1;

    function Lx_Line_Count (T : Tree) return Line_Count;

    procedure Lx_Line_Count (T : Tree; V : Line_Count);

    -- Predicates to facilitate efficient traversal of structural
    -- lists.

    function Is_In_List (T : Diana.Tree) return Boolean;

    -- returns true iff T is a member of a structural list, i.e.
    -- iff T = Diana.Head (S) for some seq_type value S.

    function Is_At_Lists_End (T : Diana.Tree) return Boolean;

    ---------------------------------------------------------------------------

    package Id_Table_Attrs is
        function  Has_Sm_Seqnum (Id : Diana.Tree) return Boolean;
        procedure Sm_Seqnum     (Id : Diana.Tree; Seqnum : Integer);
        function  Sm_Seqnum     (Id : Diana.Tree) return Integer;

        procedure Sm_Id_Table (Decl_Regn : Diana.Tree; Value : Id_Table.Id_Map);
        function  Sm_Id_Table (Decl_Regn : Diana.Tree) return Id_Table.Id_Map;
        function  Has_Sm_Id_Table (Decl_Regn : Diana.Tree) return Boolean;
    end Id_Table_Attrs;

    ---------------------------------------------------------------------------

    type Decl_Number is range 0 .. 4095;

    type Decl_Number_Mask_Array is array (Decl_Number) of Boolean;

    type Decl_Number_Mask is access Decl_Number_Mask_Array;
    pragma Segmented_Heap (Decl_Number_Mask);

    ---------------------------------------------------------------------------

    type Tree_Vector is array (Positive range <>) of Diana.Tree;

    function Is_Comment (Node : Diana.Tree) return Boolean;

    type Declaration_Number is new Natural;

    type Declaration_Number_Mask_Array is
       array (Declaration_Number range <>) of Boolean;

    type Declaration_Number_Mask is access Declaration_Number_Mask_Array;
    pragma Segmented_Heap (Declaration_Number_Mask);


    function Has_Lx_Line_Count (T : Diana.Tree) return Boolean;
end Diana;

pragma Cache_Register (Diana, 11);

E3 Meta Data

    nblk1=6c
    nid=6c
    hdr6=d6
        [0x00] rec0=1d rec1=00 rec2=01 rec3=040
        [0x01] rec0=16 rec1=00 rec2=02 rec3=074
        [0x02] rec0=0e rec1=00 rec2=03 rec3=022
        [0x03] rec0=0d rec1=00 rec2=04 rec3=05c
        [0x04] rec0=0e rec1=00 rec2=05 rec3=032
        [0x05] rec0=21 rec1=00 rec2=06 rec3=06c
        [0x06] rec0=25 rec1=00 rec2=07 rec3=04a
        [0x07] rec0=22 rec1=00 rec2=08 rec3=064
        [0x08] rec0=23 rec1=00 rec2=09 rec3=006
        [0x09] rec0=00 rec1=00 rec2=56 rec3=002
        [0x0a] rec0=17 rec1=00 rec2=0a rec3=062
        [0x0b] rec0=02 rec1=00 rec2=55 rec3=032
        [0x0c] rec0=24 rec1=00 rec2=0b rec3=068
        [0x0d] rec0=25 rec1=00 rec2=0c rec3=010
        [0x0e] rec0=1f rec1=00 rec2=0d rec3=024
        [0x0f] rec0=1c rec1=00 rec2=0e rec3=01e
        [0x10] rec0=00 rec1=00 rec2=54 rec3=012
        [0x11] rec0=1e rec1=00 rec2=0f rec3=064
        [0x12] rec0=00 rec1=00 rec2=53 rec3=004
        [0x13] rec0=26 rec1=00 rec2=10 rec3=026
        [0x14] rec0=17 rec1=00 rec2=11 rec3=062
        [0x15] rec0=02 rec1=00 rec2=52 rec3=022
        [0x16] rec0=11 rec1=00 rec2=12 rec3=03e
        [0x17] rec0=02 rec1=00 rec2=51 rec3=05e
        [0x18] rec0=12 rec1=00 rec2=13 rec3=004
        [0x19] rec0=02 rec1=00 rec2=50 rec3=038
        [0x1a] rec0=13 rec1=00 rec2=14 rec3=03c
        [0x1b] rec0=01 rec1=00 rec2=4d rec3=03e
        [0x1c] rec0=0f rec1=00 rec2=4f rec3=07c
        [0x1d] rec0=03 rec1=00 rec2=15 rec3=052
        [0x1e] rec0=17 rec1=00 rec2=4e rec3=06e
        [0x1f] rec0=06 rec1=00 rec2=16 rec3=04c
        [0x20] rec0=12 rec1=00 rec2=17 rec3=016
        [0x21] rec0=02 rec1=00 rec2=4c rec3=026
        [0x22] rec0=11 rec1=00 rec2=18 rec3=064
        [0x23] rec0=03 rec1=00 rec2=4b rec3=048
        [0x24] rec0=14 rec1=00 rec2=19 rec3=032
        [0x25] rec0=02 rec1=00 rec2=4a rec3=058
        [0x26] rec0=11 rec1=00 rec2=1a rec3=026
        [0x27] rec0=03 rec1=00 rec2=49 rec3=048
        [0x28] rec0=19 rec1=00 rec2=1b rec3=000
        [0x29] rec0=01 rec1=00 rec2=48 rec3=07a
        [0x2a] rec0=18 rec1=00 rec2=1c rec3=00e
        [0x2b] rec0=17 rec1=00 rec2=1d rec3=04e
        [0x2c] rec0=14 rec1=00 rec2=1e rec3=014
        [0x2d] rec0=17 rec1=00 rec2=1f rec3=076
        [0x2e] rec0=01 rec1=00 rec2=6b rec3=006
        [0x2f] rec0=1c rec1=00 rec2=20 rec3=012
        [0x30] rec0=00 rec1=00 rec2=6a rec3=018
        [0x31] rec0=0e rec1=00 rec2=21 rec3=06c
        [0x32] rec0=13 rec1=00 rec2=22 rec3=052
        [0x33] rec0=1b rec1=00 rec2=23 rec3=02a
        [0x34] rec0=00 rec1=00 rec2=69 rec3=00c
        [0x35] rec0=10 rec1=00 rec2=24 rec3=054
        [0x36] rec0=12 rec1=00 rec2=25 rec3=032
        [0x37] rec0=01 rec1=00 rec2=68 rec3=02c
        [0x38] rec0=11 rec1=00 rec2=26 rec3=004
        [0x39] rec0=01 rec1=00 rec2=67 rec3=01e
        [0x3a] rec0=12 rec1=00 rec2=27 rec3=038
        [0x3b] rec0=16 rec1=00 rec2=28 rec3=080
        [0x3c] rec0=1a rec1=00 rec2=29 rec3=068
        [0x3d] rec0=01 rec1=00 rec2=66 rec3=000
        [0x3e] rec0=1c rec1=00 rec2=2a rec3=008
        [0x3f] rec0=00 rec1=00 rec2=65 rec3=020
        [0x40] rec0=15 rec1=00 rec2=2b rec3=036
        [0x41] rec0=01 rec1=00 rec2=64 rec3=038
        [0x42] rec0=19 rec1=00 rec2=2c rec3=022
        [0x43] rec0=00 rec1=00 rec2=63 rec3=048
        [0x44] rec0=16 rec1=00 rec2=2d rec3=06c
        [0x45] rec0=01 rec1=00 rec2=62 rec3=014
        [0x46] rec0=1a rec1=00 rec2=2e rec3=01a
        [0x47] rec0=00 rec1=00 rec2=61 rec3=050
        [0x48] rec0=16 rec1=00 rec2=2f rec3=04c
        [0x49] rec0=01 rec1=00 rec2=60 rec3=002
        [0x4a] rec0=1a rec1=00 rec2=30 rec3=036
        [0x4b] rec0=1b rec1=00 rec2=31 rec3=010
        [0x4c] rec0=14 rec1=00 rec2=32 rec3=020
        [0x4d] rec0=00 rec1=00 rec2=5f rec3=020
        [0x4e] rec0=16 rec1=00 rec2=33 rec3=02a
        [0x4f] rec0=02 rec1=00 rec2=5e rec3=00c
        [0x50] rec0=16 rec1=00 rec2=34 rec3=05c
        [0x51] rec0=02 rec1=00 rec2=5d rec3=012
        [0x52] rec0=10 rec1=00 rec2=35 rec3=064
        [0x53] rec0=04 rec1=00 rec2=5c rec3=004
        [0x54] rec0=14 rec1=00 rec2=36 rec3=01e
        [0x55] rec0=02 rec1=00 rec2=5b rec3=060
        [0x56] rec0=19 rec1=00 rec2=37 rec3=032
        [0x57] rec0=02 rec1=00 rec2=5a rec3=02a
        [0x58] rec0=1b rec1=00 rec2=38 rec3=022
        [0x59] rec0=01 rec1=00 rec2=59 rec3=008
        [0x5a] rec0=18 rec1=00 rec2=39 rec3=016
        [0x5b] rec0=00 rec1=00 rec2=58 rec3=018
        [0x5c] rec0=18 rec1=00 rec2=3a rec3=06e
        [0x5d] rec0=01 rec1=00 rec2=47 rec3=004
        [0x5e] rec0=1d rec1=00 rec2=3b rec3=036
        [0x5f] rec0=1a rec1=00 rec2=3c rec3=072
        [0x60] rec0=1a rec1=00 rec2=3d rec3=01c
        [0x61] rec0=1c rec1=00 rec2=3e rec3=054
        [0x62] rec0=1e rec1=00 rec2=3f rec3=012
        [0x63] rec0=1d rec1=00 rec2=40 rec3=05a
    tail 0x21722370483c172fdeb01 0x42a00088462065003
Free Block Chain:
  0x6c: 0000  00 00 0d 80 20 84 61 90 04 20 d8 3c 00 86 09 06  ┆      a    <    ┆