------------------------------------------------------------------------------ | |

-- -- | |

-- GNAT RUN-TIME COMPONENTS -- | |

-- -- | |

-- S Y S T E M . D I M . G E N E R I C _ M K S -- | |

-- -- | |

-- S p e c -- | |

-- -- | |

-- Copyright (C) 2011-2021, Free Software Foundation, Inc. -- | |

-- -- | |

-- GNAT is free software; you can redistribute it and/or modify it under -- | |

-- terms of the GNU General Public License as published by the Free Soft- -- | |

-- ware Foundation; either version 3, or (at your option) any later ver- -- | |

-- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- | |

-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- | |

-- or FITNESS FOR A PARTICULAR PURPOSE. -- | |

-- -- | |

-- As a special exception under Section 7 of GPL version 3, you are granted -- | |

-- additional permissions described in the GCC Runtime Library Exception, -- | |

-- version 3.1, as published by the Free Software Foundation. -- | |

-- -- | |

-- You should have received a copy of the GNU General Public License and -- | |

-- a copy of the GCC Runtime Library Exception along with this program; -- | |

-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- | |

-- <http://www.gnu.org/licenses/>. -- | |

-- -- | |

-- GNAT was originally developed by the GNAT team at New York University. -- | |

-- Extensive contributions were provided by Ada Core Technologies Inc. -- | |

-- -- | |

------------------------------------------------------------------------------ | |

-- Defines the MKS dimension system which is the SI system of units | |

-- Some other prefixes of this system are defined in a child package (see | |

-- System.Dim.Generic_Mks.Generic_Other_Prefixes) in order to avoid too many | |

-- constant declarations in this package. | |

-- The dimension terminology is defined in System.Dim package | |

with Ada.Numerics; | |

generic | |

type Float_Type is digits <>; | |

package System.Dim.Generic_Mks is | |

e : constant := Ada.Numerics.e; | |

Pi : constant := Ada.Numerics.Pi; | |

-- Dimensioned type Mks_Type | |

type Mks_Type is new Float_Type | |

with | |

Dimension_System => ( | |

(Unit_Name => Meter, Unit_Symbol => 'm', Dim_Symbol => 'L'), | |

(Unit_Name => Kilogram, Unit_Symbol => "kg", Dim_Symbol => 'M'), | |

(Unit_Name => Second, Unit_Symbol => 's', Dim_Symbol => 'T'), | |

(Unit_Name => Ampere, Unit_Symbol => 'A', Dim_Symbol => 'I'), | |

(Unit_Name => Kelvin, Unit_Symbol => 'K', Dim_Symbol => '@'), | |

(Unit_Name => Mole, Unit_Symbol => "mol", Dim_Symbol => 'N'), | |

(Unit_Name => Candela, Unit_Symbol => "cd", Dim_Symbol => 'J')); | |

-- SI Base dimensioned subtypes | |

subtype Length is Mks_Type | |

with | |

Dimension => (Symbol => 'm', | |

Meter => 1, | |

others => 0); | |

subtype Mass is Mks_Type | |

with | |

Dimension => (Symbol => "kg", | |

Kilogram => 1, | |

others => 0); | |

subtype Time is Mks_Type | |

with | |

Dimension => (Symbol => 's', | |

Second => 1, | |

others => 0); | |

subtype Electric_Current is Mks_Type | |

with | |

Dimension => (Symbol => 'A', | |

Ampere => 1, | |

others => 0); | |

subtype Thermodynamic_Temperature is Mks_Type | |

with | |

Dimension => (Symbol => 'K', | |

Kelvin => 1, | |

others => 0); | |

subtype Amount_Of_Substance is Mks_Type | |

with | |

Dimension => (Symbol => "mol", | |

Mole => 1, | |

others => 0); | |

subtype Luminous_Intensity is Mks_Type | |

with | |

Dimension => (Symbol => "cd", | |

Candela => 1, | |

others => 0); | |

-- Initialize SI Base unit values | |

-- Turn off the all the dimension warnings for these basic assignments | |

-- since otherwise we would get complaints about assigning dimensionless | |

-- values to dimensioned subtypes (we can't assign 1.0*m to m). | |

pragma Warnings (Off, "*assumed to be*"); | |

m : constant Length := 1.0; | |

kg : constant Mass := 1.0; | |

s : constant Time := 1.0; | |

A : constant Electric_Current := 1.0; | |

K : constant Thermodynamic_Temperature := 1.0; | |

mol : constant Amount_Of_Substance := 1.0; | |

cd : constant Luminous_Intensity := 1.0; | |

pragma Warnings (On, "*assumed to be*"); | |

-- SI Derived dimensioned subtypes | |

subtype Absorbed_Dose is Mks_Type | |

with | |

Dimension => (Symbol => "Gy", | |

Meter => 2, | |

Second => -2, | |

others => 0); | |

subtype Angle is Mks_Type | |

with | |

Dimension => (Symbol => "rad", | |

others => 0); | |

subtype Area is Mks_Type | |

with | |

Dimension => ( | |

Meter => 2, | |

others => 0); | |

subtype Catalytic_Activity is Mks_Type | |

with | |

Dimension => (Symbol => "kat", | |

Second => -1, | |

Mole => 1, | |

others => 0); | |

subtype Celsius_Temperature is Mks_Type | |

with | |

Dimension => (Symbol => "°C", | |

Kelvin => 1, | |

others => 0); | |

subtype Electric_Capacitance is Mks_Type | |

with | |

Dimension => (Symbol => 'F', | |

Meter => -2, | |

Kilogram => -1, | |

Second => 4, | |

Ampere => 2, | |

others => 0); | |

subtype Electric_Charge is Mks_Type | |

with | |

Dimension => (Symbol => 'C', | |

Second => 1, | |

Ampere => 1, | |

others => 0); | |

subtype Electric_Conductance is Mks_Type | |

with | |

Dimension => (Symbol => 'S', | |

Meter => -2, | |

Kilogram => -1, | |

Second => 3, | |

Ampere => 2, | |

others => 0); | |

subtype Electric_Potential_Difference is Mks_Type | |

with | |

Dimension => (Symbol => 'V', | |

Meter => 2, | |

Kilogram => 1, | |

Second => -3, | |

Ampere => -1, | |

others => 0); | |

-- Note the type punning below. The Symbol is a single "ohm" character | |

-- encoded in UTF-8 (ce a9 in hexadecimal), but this file is not compiled | |

-- with -gnatW8, so we're treating the string literal as a two-character | |

-- String. | |

subtype Electric_Resistance is Mks_Type | |

with | |

Dimension => (Symbol => "Ω", | |

Meter => 2, | |

Kilogram => 1, | |

Second => -3, | |

Ampere => -2, | |

others => 0); | |

subtype Energy is Mks_Type | |

with | |

Dimension => (Symbol => 'J', | |

Meter => 2, | |

Kilogram => 1, | |

Second => -2, | |

others => 0); | |

subtype Equivalent_Dose is Mks_Type | |

with | |

Dimension => (Symbol => "Sv", | |

Meter => 2, | |

Second => -2, | |

others => 0); | |

subtype Force is Mks_Type | |

with | |

Dimension => (Symbol => 'N', | |

Meter => 1, | |

Kilogram => 1, | |

Second => -2, | |

others => 0); | |

subtype Frequency is Mks_Type | |

with | |

Dimension => (Symbol => "Hz", | |

Second => -1, | |

others => 0); | |

subtype Illuminance is Mks_Type | |

with | |

Dimension => (Symbol => "lx", | |

Meter => -2, | |

Candela => 1, | |

others => 0); | |

subtype Inductance is Mks_Type | |

with | |

Dimension => (Symbol => 'H', | |

Meter => 2, | |

Kilogram => 1, | |

Second => -2, | |

Ampere => -2, | |

others => 0); | |

subtype Luminous_Flux is Mks_Type | |

with | |

Dimension => (Symbol => "lm", | |

Candela => 1, | |

others => 0); | |

subtype Magnetic_Flux is Mks_Type | |

with | |

Dimension => (Symbol => "Wb", | |

Meter => 2, | |

Kilogram => 1, | |

Second => -2, | |

Ampere => -1, | |

others => 0); | |

subtype Magnetic_Flux_Density is Mks_Type | |

with | |

Dimension => (Symbol => 'T', | |

Kilogram => 1, | |

Second => -2, | |

Ampere => -1, | |

others => 0); | |

subtype Power is Mks_Type | |

with | |

Dimension => (Symbol => 'W', | |

Meter => 2, | |

Kilogram => 1, | |

Second => -3, | |

others => 0); | |

subtype Pressure is Mks_Type | |

with | |

Dimension => (Symbol => "Pa", | |

Meter => -1, | |

Kilogram => 1, | |

Second => -2, | |

others => 0); | |

subtype Radioactivity is Mks_Type | |

with | |

Dimension => (Symbol => "Bq", | |

Second => -1, | |

others => 0); | |

subtype Solid_Angle is Mks_Type | |

with | |

Dimension => (Symbol => "sr", | |

others => 0); | |

subtype Speed is Mks_Type | |

with | |

Dimension => ( | |

Meter => 1, | |

Second => -1, | |

others => 0); | |

subtype Volume is Mks_Type | |

with | |

Dimension => ( | |

Meter => 3, | |

others => 0); | |

-- Initialize derived dimension values | |

-- Turn off the all the dimension warnings for these basic assignments | |

-- since otherwise we would get complaints about assigning dimensionless | |

-- values to dimensioned subtypes. | |

pragma Warnings (Off, "*assumed to be*"); | |

rad : constant Angle := 1.0; | |

sr : constant Solid_Angle := 1.0; | |

Hz : constant Frequency := 1.0; | |

N : constant Force := 1.0; | |

Pa : constant Pressure := 1.0; | |

J : constant Energy := 1.0; | |

W : constant Power := 1.0; | |

C : constant Electric_Charge := 1.0; | |

V : constant Electric_Potential_Difference := 1.0; | |

F : constant Electric_Capacitance := 1.0; | |

Ohm : constant Electric_Resistance := 1.0; | |

Si : constant Electric_Conductance := 1.0; | |

Wb : constant Magnetic_Flux := 1.0; | |

T : constant Magnetic_Flux_Density := 1.0; | |

H : constant Inductance := 1.0; | |

dC : constant Celsius_Temperature := 273.15; | |

lm : constant Luminous_Flux := 1.0; | |

lx : constant Illuminance := 1.0; | |

Bq : constant Radioactivity := 1.0; | |

Gy : constant Absorbed_Dose := 1.0; | |

Sv : constant Equivalent_Dose := 1.0; | |

kat : constant Catalytic_Activity := 1.0; | |

-- SI prefixes for Meter | |

um : constant Length := 1.0E-06; -- micro (u) | |

mm : constant Length := 1.0E-03; -- milli | |

cm : constant Length := 1.0E-02; -- centi | |

dm : constant Length := 1.0E-01; -- deci | |

dam : constant Length := 1.0E+01; -- deka | |

hm : constant Length := 1.0E+02; -- hecto | |

km : constant Length := 1.0E+03; -- kilo | |

Mem : constant Length := 1.0E+06; -- mega | |

-- SI prefixes for Kilogram | |

ug : constant Mass := 1.0E-09; -- micro (u) | |

mg : constant Mass := 1.0E-06; -- milli | |

cg : constant Mass := 1.0E-05; -- centi | |

dg : constant Mass := 1.0E-04; -- deci | |

g : constant Mass := 1.0E-03; -- gram | |

dag : constant Mass := 1.0E-02; -- deka | |

hg : constant Mass := 1.0E-01; -- hecto | |

Meg : constant Mass := 1.0E+03; -- mega | |

-- SI prefixes for Second | |

us : constant Time := 1.0E-06; -- micro (u) | |

ms : constant Time := 1.0E-03; -- milli | |

cs : constant Time := 1.0E-02; -- centi | |

ds : constant Time := 1.0E-01; -- deci | |

das : constant Time := 1.0E+01; -- deka | |

hs : constant Time := 1.0E+02; -- hecto | |

ks : constant Time := 1.0E+03; -- kilo | |

Mes : constant Time := 1.0E+06; -- mega | |

-- Other constants for Second | |

min : constant Time := 60.0 * s; | |

hour : constant Time := 60.0 * min; | |

day : constant Time := 24.0 * hour; | |

year : constant Time := 365.25 * day; | |

-- SI prefixes for Ampere | |

mA : constant Electric_Current := 1.0E-03; -- milli | |

cA : constant Electric_Current := 1.0E-02; -- centi | |

dA : constant Electric_Current := 1.0E-01; -- deci | |

daA : constant Electric_Current := 1.0E+01; -- deka | |

hA : constant Electric_Current := 1.0E+02; -- hecto | |

kA : constant Electric_Current := 1.0E+03; -- kilo | |

MeA : constant Electric_Current := 1.0E+06; -- mega | |

pragma Warnings (On, "*assumed to be*"); | |

end System.Dim.Generic_Mks; |