1------------------------------------------------------------------------------ 2-- -- 3-- GNAT RUN-TIME COMPONENTS -- 4-- -- 5-- A D A . R E A L _ T I M E -- 6-- -- 7-- S p e c -- 8-- -- 9-- Copyright (C) 1992-2015, Free Software Foundation, Inc. -- 10-- -- 11-- This specification is derived from the Ada Reference Manual for use with -- 12-- GNAT. The copyright notice above, and the license provisions that follow -- 13-- apply solely to the contents of the part following the private keyword. -- 14-- -- 15-- GNAT is free software; you can redistribute it and/or modify it under -- 16-- terms of the GNU General Public License as published by the Free Soft- -- 17-- ware Foundation; either version 3, or (at your option) any later ver- -- 18-- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- 19-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- 20-- or FITNESS FOR A PARTICULAR PURPOSE. -- 21-- -- 22-- As a special exception under Section 7 of GPL version 3, you are granted -- 23-- additional permissions described in the GCC Runtime Library Exception, -- 24-- version 3.1, as published by the Free Software Foundation. -- 25-- -- 26-- You should have received a copy of the GNU General Public License and -- 27-- a copy of the GCC Runtime Library Exception along with this program; -- 28-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- 29-- <http://www.gnu.org/licenses/>. -- 30-- -- 31-- GNAT was originally developed by the GNAT team at New York University. -- 32-- Extensive contributions were provided by Ada Core Technologies Inc. -- 33-- -- 34------------------------------------------------------------------------------ 35 36with System.Task_Primitives.Operations; 37pragma Elaborate_All (System.Task_Primitives.Operations); 38 39package Ada.Real_Time with 40 SPARK_Mode, 41 Abstract_State => (Clock_Time with Synchronous, 42 External => (Async_Readers, 43 Async_Writers)) 44is 45 46 pragma Compile_Time_Error 47 (Duration'Size /= 64, 48 "this version of Ada.Real_Time requires 64-bit Duration"); 49 50 type Time is private; 51 Time_First : constant Time; 52 Time_Last : constant Time; 53 Time_Unit : constant := 10#1.0#E-9; 54 55 type Time_Span is private; 56 Time_Span_First : constant Time_Span; 57 Time_Span_Last : constant Time_Span; 58 Time_Span_Zero : constant Time_Span; 59 Time_Span_Unit : constant Time_Span; 60 61 Tick : constant Time_Span; 62 function Clock return Time with 63 Volatile_Function, 64 Global => Clock_Time; 65 66 function "+" (Left : Time; Right : Time_Span) return Time with 67 Global => null; 68 function "+" (Left : Time_Span; Right : Time) return Time with 69 Global => null; 70 function "-" (Left : Time; Right : Time_Span) return Time with 71 Global => null; 72 function "-" (Left : Time; Right : Time) return Time_Span with 73 Global => null; 74 75 function "<" (Left, Right : Time) return Boolean with 76 Global => null; 77 function "<=" (Left, Right : Time) return Boolean with 78 Global => null; 79 function ">" (Left, Right : Time) return Boolean with 80 Global => null; 81 function ">=" (Left, Right : Time) return Boolean with 82 Global => null; 83 84 function "+" (Left, Right : Time_Span) return Time_Span with 85 Global => null; 86 function "-" (Left, Right : Time_Span) return Time_Span with 87 Global => null; 88 function "-" (Right : Time_Span) return Time_Span with 89 Global => null; 90 function "*" (Left : Time_Span; Right : Integer) return Time_Span with 91 Global => null; 92 function "*" (Left : Integer; Right : Time_Span) return Time_Span with 93 Global => null; 94 function "/" (Left, Right : Time_Span) return Integer with 95 Global => null; 96 function "/" (Left : Time_Span; Right : Integer) return Time_Span with 97 Global => null; 98 99 function "abs" (Right : Time_Span) return Time_Span with 100 Global => null; 101 102 function "<" (Left, Right : Time_Span) return Boolean with 103 Global => null; 104 function "<=" (Left, Right : Time_Span) return Boolean with 105 Global => null; 106 function ">" (Left, Right : Time_Span) return Boolean with 107 Global => null; 108 function ">=" (Left, Right : Time_Span) return Boolean with 109 Global => null; 110 111 function To_Duration (TS : Time_Span) return Duration with 112 Global => null; 113 function To_Time_Span (D : Duration) return Time_Span with 114 Global => null; 115 116 function Nanoseconds (NS : Integer) return Time_Span with 117 Global => null; 118 function Microseconds (US : Integer) return Time_Span with 119 Global => null; 120 function Milliseconds (MS : Integer) return Time_Span with 121 Global => null; 122 123 function Seconds (S : Integer) return Time_Span with 124 Global => null; 125 pragma Ada_05 (Seconds); 126 127 function Minutes (M : Integer) return Time_Span with 128 Global => null; 129 pragma Ada_05 (Minutes); 130 131 type Seconds_Count is new Long_Long_Integer; 132 -- Seconds_Count needs 64 bits, since the type Time has the full range of 133 -- Duration. The delta of Duration is 10 ** (-9), so the maximum number of 134 -- seconds is 2**63/10**9 = 8*10**9 which does not quite fit in 32 bits. 135 -- However, rather than make this explicitly 64-bits we derive from 136 -- Long_Long_Integer. In normal usage this will have the same effect. But 137 -- in the case of CodePeer with a target configuration file with a maximum 138 -- integer size of 32, it allows analysis of this unit. 139 140 procedure Split (T : Time; SC : out Seconds_Count; TS : out Time_Span) 141 with 142 Global => null; 143 function Time_Of (SC : Seconds_Count; TS : Time_Span) return Time 144 with 145 Global => null; 146 147private 148 pragma SPARK_Mode (Off); 149 150 -- Time and Time_Span are represented in 64-bit Duration value in 151 -- nanoseconds. For example, 1 second and 1 nanosecond is represented 152 -- as the stored integer 1_000_000_001. This is for the 64-bit Duration 153 -- case, not clear if this also is used for 32-bit Duration values. 154 155 type Time is new Duration; 156 157 Time_First : constant Time := Time'First; 158 159 Time_Last : constant Time := Time'Last; 160 161 type Time_Span is new Duration; 162 163 Time_Span_First : constant Time_Span := Time_Span'First; 164 165 Time_Span_Last : constant Time_Span := Time_Span'Last; 166 167 Time_Span_Zero : constant Time_Span := 0.0; 168 169 Time_Span_Unit : constant Time_Span := 10#1.0#E-9; 170 171 Tick : constant Time_Span := 172 Time_Span (System.Task_Primitives.Operations.RT_Resolution); 173 174 pragma Import (Intrinsic, "<"); 175 pragma Import (Intrinsic, "<="); 176 pragma Import (Intrinsic, ">"); 177 pragma Import (Intrinsic, ">="); 178 pragma Import (Intrinsic, "abs"); 179 180 pragma Inline (Microseconds); 181 pragma Inline (Milliseconds); 182 pragma Inline (Nanoseconds); 183 pragma Inline (Seconds); 184 pragma Inline (Minutes); 185 186end Ada.Real_Time; 187