--
-- Copyright (C) 2015-2016 secunet Security Networks AG
--
-- This program 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 of the License, or
-- (at your option) any later version.
--
-- This program 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.
--

package HW.Time
   with Abstract_State => (State with External => Async_Writers)
is

   type T is private;

   T_First : constant T;

   function Now return T
   with
      Volatile_Function,
      Global => (Input => State);

   function US_From_Now (US : Natural) return T
   with
      Volatile_Function,
      Global => (Input => State);

   function MS_From_Now (MS : Natural) return T
   with
      Volatile_Function,
      Global => (Input => State);

   function Now_US return Int64
   with
      Volatile_Function,
      Global => (Input => State);

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

   pragma Warnings
     (GNATprove, Off, "subprogram ""*Delay*"" has no effect",
      Reason => "No effect on dataflow but time always passes.");

   -- Delay execution until Deadline has been reached.
   procedure Delay_Until (Deadline : T)
   with
      Global => (Input => State);

   procedure U_Delay (US : Natural)
   with
      Global => (Input => State);

   procedure M_Delay (MS : Natural)
   with
      Global => (Input => State);

   pragma Warnings
     (GNATprove, On, "subprogram ""*Delay*"" has no effect");

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

   function Timed_Out (Deadline : T) return Boolean
   with
      Volatile_Function,
      Global => (Input => State);

private

   type T is new Word64;

   T_First : constant T := T'First;

end HW.Time;

--  vim: set ts=8 sts=3 sw=3 et:
