package Instrument is
    -- The Instrument routines.
    procedure Start          -- THIS ROUTINE MUST BE INVOKED AT THE
                             -- START OF A TEST, BEFORE ANY OF THE
                             -- OTHER REPORT ROUTINES ARE INVOKED.
                             -- IT SAVES THE TEST NAME AND OUTPUTS THE
                             -- NAME AND DESCRIPTION.
                 (Name : String;         -- TEST NAME, E.G., "C23001A-AB".
                  Descr : String      -- BRIEF DESCRIPTION OF TEST, E.G.,
                  -- "UPPER/LOWER CASE EQUIVALENCE IN " &
                  -- "IDENTIFIERS".
                  );
    procedure Comment        -- OUTPUT A COMMENT MESSAGE.
                 (Descr : String      -- THE MESSAGE.
                  );
    procedure Stop;          -- THIS ROUTINE MUST BE INVOKED AT THE
    -- END OF A TEST.  IT OUTPUTS A MESSAGE
    -- INDICATING WHETHER THE TEST AS A
    -- WHOLE HAS PASSED OR FAILED, OR IS
    -- NOT-APPLICABLE.
    -- THE DYNAMIC VALUE ROUTINES.
    -- EVEN WITH STATIC ARGUMENTS, THESE FUNCTIONS WILL HAVE DYNAMIC
    -- RESULTS.
    function Ident_Int       -- AN IDENTITY FUNCTION FOR TYPE INTEGER.
                (X : Integer         -- THE ARGUMENT.
                 ) return Integer;     -- X.
    function Ident_Char      -- AN IDENTITY FUNCTION FOR TYPE
                             -- CHARACTER.
                (X : Character       -- THE ARGUMENT.
                 ) return Character;   -- X.
    function Ident_Bool      -- AN IDENTITY FUNCTION FOR TYPE BOOLEAN.
                (X : Boolean         -- THE ARGUMENT.
                 ) return Boolean;     -- X.
    function Ident_Str       -- AN IDENTITY FUNCTION FOR TYPE STRING.
                (X : String          -- THE ARGUMENT.
                 ) return String;      -- X.
    function Equal           -- A RECURSIVE EQUALITY FUNCTION FOR TYPE

                -- INTEGER.

                (X, Y : Integer      -- THE ARGUMENTS.
                 ) return Boolean;     -- X = Y.
    --
    generic
        type Gen_Type is (<>);
    package Procs is
        subtype T is Gen_Type;
        type Ref_T is access T;
        Global : T;
        Global_Object : T;
        Global_Access : Ref_T := new T;
        Init : constant T := T'First;
        function Ident (X : in T) return T;
        procedure Let (X : in out T; Y : T);
    end Procs;
    --
    generic
        type Gen_Type is (<>);
        Arr_Size : Integer;
    package Arr_Procs is
        subtype Index is Integer range 1 .. Arr_Size;
        type T is array (Integer range <>) of Gen_Type;
        Init : T (Index) := (others => Gen_Type'First);
        Global : T (Index);
        function Ident (X : T) return T;
        procedure Let (X : in out T; Y : T);
    end Arr_Procs;
end Instrument;
--*********************************************************************