1------------------------------------------------------------------------------
2--                                                                          --
3--                         GNAT RUN-TIME COMPONENTS                         --
4--                                                                          --
5--                        S Y S T E M . D I M . M K S                       --
6--                                                                          --
7--                                  S p e c                                 --
8--                                                                          --
9--          Copyright (C) 2011-2013, Free Software Foundation, Inc.         --
10--                                                                          --
11-- GNAT is free software;  you can  redistribute it  and/or modify it under --
12-- terms of the  GNU General Public License as published  by the Free Soft- --
13-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
14-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
15-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
16-- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
17--                                                                          --
18-- As a special exception under Section 7 of GPL version 3, you are granted --
19-- additional permissions described in the GCC Runtime Library Exception,   --
20-- version 3.1, as published by the Free Software Foundation.               --
21--                                                                          --
22-- You should have received a copy of the GNU General Public License and    --
23-- a copy of the GCC Runtime Library Exception along with this program;     --
24-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
25-- <http://www.gnu.org/licenses/>.                                          --
26--                                                                          --
27-- GNAT was originally developed  by the GNAT team at  New York University. --
28-- Extensive contributions were provided by Ada Core Technologies Inc.      --
29--                                                                          --
30------------------------------------------------------------------------------
31
32--  Defines the MKS dimension system which is the SI system of units
33
34--  Some other prefixes of this system are defined in a child package (see
35--  System.Dim_Mks.Other_Prefixes) in order to avoid too many constant
36--  declarations in this package.
37
38--  The dimension terminology is defined in System.Dim_IO package
39
40with Ada.Numerics;
41
42package System.Dim.Mks is
43
44   e  : constant := Ada.Numerics.e;
45   Pi : constant := Ada.Numerics.Pi;
46
47   --  Dimensioned type Mks_Type
48
49   type Mks_Type is new Long_Long_Float
50     with
51      Dimension_System => (
52        (Unit_Name => Meter,    Unit_Symbol => 'm',   Dim_Symbol => 'L'),
53        (Unit_Name => Kilogram, Unit_Symbol => "kg",  Dim_Symbol => 'M'),
54        (Unit_Name => Second,   Unit_Symbol => 's',   Dim_Symbol => 'T'),
55        (Unit_Name => Ampere,   Unit_Symbol => 'A',   Dim_Symbol => 'I'),
56        (Unit_Name => Kelvin,   Unit_Symbol => 'K',   Dim_Symbol => '@'),
57        (Unit_Name => Mole,     Unit_Symbol => "mol", Dim_Symbol => 'N'),
58        (Unit_Name => Candela,  Unit_Symbol => "cd",  Dim_Symbol => 'J'));
59
60   --  SI Base dimensioned subtypes
61
62   subtype Length is Mks_Type
63     with
64      Dimension => (Symbol => 'm',
65        Meter  => 1,
66        others => 0);
67
68   subtype Mass is Mks_Type
69     with
70      Dimension => (Symbol => "kg",
71        Kilogram => 1,
72        others   => 0);
73
74   subtype Time is Mks_Type
75     with
76      Dimension => (Symbol => 's',
77        Second => 1,
78        others => 0);
79
80   subtype Electric_Current is Mks_Type
81     with
82      Dimension => (Symbol => 'A',
83        Ampere => 1,
84        others => 0);
85
86   subtype Thermodynamic_Temperature is Mks_Type
87     with
88      Dimension => (Symbol => 'K',
89        Kelvin => 1,
90        others => 0);
91
92   subtype Amount_Of_Substance is Mks_Type
93     with
94      Dimension => (Symbol => "mol",
95        Mole   => 1,
96        others => 0);
97
98   subtype Luminous_Intensity is Mks_Type
99     with
100      Dimension => (Symbol => "cd",
101        Candela => 1,
102        others  => 0);
103
104   --  Initialize SI Base unit values
105
106   --  Turn off the all the dimension warnings for these basic assignments
107   --  since otherwise we would get complaints about assigning dimensionless
108   --  values to dimensioned subtypes (we can't assign 1.0*m to m).
109
110   pragma Warnings (Off, "*assumed to be*");
111
112   m   : constant Length                    := 1.0;
113   kg  : constant Mass                      := 1.0;
114   s   : constant Time                      := 1.0;
115   A   : constant Electric_Current          := 1.0;
116   K   : constant Thermodynamic_Temperature := 1.0;
117   mol : constant Amount_Of_Substance       := 1.0;
118   cd  : constant Luminous_Intensity        := 1.0;
119
120   pragma Warnings (On, "*assumed to be*");
121
122   --  SI Derived dimensioned subtypes
123
124   subtype Absorbed_Dose is Mks_Type
125     with
126      Dimension => (Symbol => "Gy",
127        Meter  =>  2,
128        Second => -2,
129        others =>  0);
130
131   subtype Angle is Mks_Type
132     with
133      Dimension => (Symbol => "rad",
134        others => 0);
135
136   subtype Area is Mks_Type
137     with
138      Dimension => (
139        Meter  => 2,
140        others => 0);
141
142   subtype Catalytic_Activity is Mks_Type
143     with
144      Dimension => (Symbol => "kat",
145        Second => -1,
146        Mole   => 1,
147        others => 0);
148
149   subtype Celsius_Temperature is Mks_Type
150     with
151      Dimension => (Symbol => "°C",
152        Kelvin => 1,
153        others => 0);
154
155   subtype Electric_Capacitance is Mks_Type
156     with
157      Dimension => (Symbol => 'F',
158        Meter    => -2,
159        Kilogram => -1,
160        Second   =>  4,
161        Ampere   =>  2,
162        others   =>  0);
163
164   subtype Electric_Charge is Mks_Type
165     with
166      Dimension => (Symbol => 'C',
167        Second => 1,
168        Ampere => 1,
169        others => 0);
170
171   subtype Electric_Conductance is Mks_Type
172     with
173      Dimension => (Symbol => 'S',
174        Meter    => -2,
175        Kilogram => -1,
176        Second   =>  3,
177        Ampere   =>  2,
178        others   =>  0);
179
180   subtype Electric_Potential_Difference is Mks_Type
181     with
182      Dimension => (Symbol => 'V',
183        Meter    =>  2,
184        Kilogram =>  1,
185        Second   => -3,
186        Ampere   => -1,
187        others   =>  0);
188
189   subtype Electric_Resistance is Mks_Type
190     with
191      Dimension => (Symbol => "Ω",
192        Meter    =>  2,
193        Kilogram =>  1,
194        Second   => -3,
195        Ampere   => -2,
196        others   =>  0);
197
198   subtype Energy is Mks_Type
199     with
200      Dimension => (Symbol => 'J',
201        Meter    =>  2,
202        Kilogram =>  1,
203        Second   => -2,
204        others   =>  0);
205
206   subtype Equivalent_Dose is Mks_Type
207     with
208      Dimension => (Symbol => "Sv",
209        Meter  =>  2,
210        Second => -2,
211        others =>  0);
212
213   subtype Force is Mks_Type
214     with
215      Dimension => (Symbol => 'N',
216        Meter    => 1,
217        Kilogram => 1,
218        Second   => -2,
219        others   => 0);
220
221   subtype Frequency is Mks_Type
222     with
223      Dimension => (Symbol => "Hz",
224        Second => -1,
225        others =>  0);
226
227   subtype Illuminance is Mks_Type
228     with
229      Dimension => (Symbol => "lx",
230        Meter   => -2,
231        Candela =>  1,
232        others  =>  0);
233
234   subtype Inductance is Mks_Type
235     with
236      Dimension => (Symbol => 'H',
237        Meter    =>  2,
238        Kilogram =>  1,
239        Second   => -2,
240        Ampere   => -2,
241        others   =>  0);
242
243   subtype Luminous_Flux is Mks_Type
244     with
245      Dimension => (Symbol => "lm",
246        Candela => 1,
247        others  => 0);
248
249   subtype Magnetic_Flux is Mks_Type
250     with
251      Dimension => (Symbol => "Wb",
252        Meter    =>  2,
253        Kilogram =>  1,
254        Second   => -2,
255        Ampere   => -1,
256        others   =>  0);
257
258   subtype Magnetic_Flux_Density is Mks_Type
259     with
260      Dimension => (Symbol => 'T',
261        Kilogram =>  1,
262        Second   => -2,
263        Ampere   => -1,
264        others   =>  0);
265
266   subtype Power is Mks_Type
267     with
268      Dimension => (Symbol => 'W',
269        Meter    =>  2,
270        Kilogram =>  1,
271        Second   => -3,
272        others   =>  0);
273
274   subtype Pressure is Mks_Type
275     with
276      Dimension => (Symbol => "Pa",
277        Meter    => -1,
278        Kilogram =>  1,
279        Second   => -2,
280        others   =>  0);
281
282   subtype Radioactivity is Mks_Type
283     with
284      Dimension => (Symbol => "Bq",
285        Second => -1,
286        others =>  0);
287
288   subtype Solid_Angle is Mks_Type
289     with
290      Dimension => (Symbol => "sr",
291        others => 0);
292
293   subtype Speed is Mks_Type
294     with
295      Dimension => (
296        Meter  =>  1,
297        Second => -1,
298        others =>  0);
299
300   subtype Volume is Mks_Type
301     with
302      Dimension => (
303        Meter  => 3,
304        others => 0);
305
306   --  Initialize derived dimension values
307
308   --  Turn off the all the dimension warnings for these basic assignments
309   --  since otherwise we would get complaints about assigning dimensionless
310   --  values to dimensioned subtypes.
311
312   pragma Warnings (Off, "*assumed to be*");
313
314   rad : constant Angle                         := 1.0;
315   sr  : constant Solid_Angle                   := 1.0;
316   Hz  : constant Frequency                     := 1.0;
317   N   : constant Force                         := 1.0;
318   Pa  : constant Pressure                      := 1.0;
319   J   : constant Energy                        := 1.0;
320   W   : constant Power                         := 1.0;
321   C   : constant Electric_Charge               := 1.0;
322   V   : constant Electric_Potential_Difference := 1.0;
323   F   : constant Electric_Capacitance          := 1.0;
324   Ohm : constant Electric_Resistance           := 1.0;
325   Si  : constant Electric_Conductance          := 1.0;
326   Wb  : constant Magnetic_Flux                 := 1.0;
327   T   : constant Magnetic_Flux_Density         := 1.0;
328   H   : constant Inductance                    := 1.0;
329   dC  : constant Celsius_Temperature           := 273.15;
330   lm  : constant Luminous_Flux                 := 1.0;
331   lx  : constant Illuminance                   := 1.0;
332   Bq  : constant Radioactivity                 := 1.0;
333   Gy  : constant Absorbed_Dose                 := 1.0;
334   Sv  : constant Equivalent_Dose               := 1.0;
335   kat : constant Catalytic_Activity            := 1.0;
336
337   --  SI prefixes for Meter
338
339   um  : constant Length := 1.0E-06;  -- micro (u)
340   mm  : constant Length := 1.0E-03;  -- milli
341   cm  : constant Length := 1.0E-02;  -- centi
342   dm  : constant Length := 1.0E-01;  -- deci
343   dam : constant Length := 1.0E+01;  -- deka
344   hm  : constant Length := 1.0E+02;  -- hecto
345   km  : constant Length := 1.0E+03;  -- kilo
346   Mem : constant Length := 1.0E+06;  -- mega
347
348   --  SI prefixes for Kilogram
349
350   ug  : constant Mass := 1.0E-09;  -- micro (u)
351   mg  : constant Mass := 1.0E-06;  -- milli
352   cg  : constant Mass := 1.0E-05;  -- centi
353   dg  : constant Mass := 1.0E-04;  -- deci
354   g   : constant Mass := 1.0E-03;  -- gram
355   dag : constant Mass := 1.0E-02;  -- deka
356   hg  : constant Mass := 1.0E-01;  -- hecto
357   Meg : constant Mass := 1.0E+03;  -- mega
358
359   --  SI prefixes for Second
360
361   us  : constant Time := 1.0E-06;  -- micro (u)
362   ms  : constant Time := 1.0E-03;  -- milli
363   cs  : constant Time := 1.0E-02;  -- centi
364   ds  : constant Time := 1.0E-01;  -- deci
365   das : constant Time := 1.0E+01;  -- deka
366   hs  : constant Time := 1.0E+02;  -- hecto
367   ks  : constant Time := 1.0E+03;  -- kilo
368   Mes : constant Time := 1.0E+06;  -- mega
369
370   --  Other constants for Second
371
372   min  : constant Time := 60.0 * s;
373   hour : constant Time := 60.0 * min;
374   day  : constant Time := 24.0 * hour;
375   year : constant Time := 365.25 * day;
376
377   --  SI prefixes for Ampere
378
379   mA  : constant Electric_Current := 1.0E-03;  -- milli
380   cA  : constant Electric_Current := 1.0E-02;  -- centi
381   dA  : constant Electric_Current := 1.0E-01;  -- deci
382   daA : constant Electric_Current := 1.0E+01;  -- deka
383   hA  : constant Electric_Current := 1.0E+02;  -- hecto
384   kA  : constant Electric_Current := 1.0E+03;  -- kilo
385   MeA : constant Electric_Current := 1.0E+06;  -- mega
386
387   pragma Warnings (On, "*assumed to be*");
388end System.Dim.Mks;
389