------------------------------------------------------------------------------ -- -- -- 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-2024, 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 -- -- . -- -- -- -- 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;