sig
  module Unit :
    sig
      type u =
          Metre
        | Second
        | Minute
        | Mole
        | Gram
        | Litre
        | Amp
        | Kelvin
        | Candela
        | Tera of SIunits.Unit.u
        | Giga of SIunits.Unit.u
        | Mega of SIunits.Unit.u
        | Kilo of SIunits.Unit.u
        | Deci of SIunits.Unit.u
        | Centi of SIunits.Unit.u
        | Milli of SIunits.Unit.u
        | Micro of SIunits.Unit.u
        | Nano of SIunits.Unit.u
        | Pico of SIunits.Unit.u
        | Femto of SIunits.Unit.u
        | Power of SIunits.Unit.u * int
      type d =
          Ratio of SIunits.Unit.u list * SIunits.Unit.u list
        | Per of SIunits.Unit.u list
        | In of SIunits.Unit.u list
        | NoUnits
      type t
      val create : ?scale:float -> SIunits.Unit.d -> SIunits.Unit.t
      val scale : float -> SIunits.Unit.t -> SIunits.Unit.t
      val no_units : SIunits.Unit.t
      val in_units : SIunits.Unit.u list -> SIunits.Unit.t
      val per : SIunits.Unit.u list -> SIunits.Unit.t
      val ratio :
        SIunits.Unit.u list -> SIunits.Unit.u list -> SIunits.Unit.t
      val mult : SIunits.Unit.t -> SIunits.Unit.t -> SIunits.Unit.t
      val ( %* ) : SIunits.Unit.t -> SIunits.Unit.t -> SIunits.Unit.t
      val div : SIunits.Unit.t -> SIunits.Unit.t -> SIunits.Unit.t
      val ( %/ ) : SIunits.Unit.t -> SIunits.Unit.t -> SIunits.Unit.t
      val dimensions_of : SIunits.Unit.t -> SIunits.Unit.d
      val scale_of : SIunits.Unit.t -> float
      val eq : SIunits.Unit.t -> SIunits.Unit.t -> bool
      val ( %= ) : SIunits.Unit.t -> SIunits.Unit.t -> bool
      val to_string : SIunits.Unit.t -> string
    end
  module Value :
    sig
      type t
      exception Invalid_conversion of SIunits.Value.t * SIunits.Unit.d
      exception Invalid_units of SIunits.Value.t * SIunits.Value.t * string
      val value : float -> SIunits.Unit.t -> SIunits.Value.t
      val ( %< ) : float -> SIunits.Unit.t -> SIunits.Value.t
      val units_of : SIunits.Value.t -> SIunits.Unit.t
      val ( =. ) : float -> float -> bool
      val ( =!. ) : float -> float -> bool
      val float_eq :
        ?rel:float -> ?abs:float -> unit -> float -> float -> bool
      val eq : SIunits.Value.t -> SIunits.Value.t -> bool
      val ( =: ) : SIunits.Value.t -> SIunits.Value.t -> bool
      val eq_units : SIunits.Value.t -> SIunits.Value.t -> bool
      val ( =?: ) : SIunits.Value.t -> SIunits.Value.t -> bool
      val assign : SIunits.Value.t Pervasives.ref -> SIunits.Value.t -> unit
      val ( <-: ) : SIunits.Value.t Pervasives.ref -> SIunits.Value.t -> unit
      val get : SIunits.Value.t Pervasives.ref -> float
      val ( !: ) : SIunits.Value.t Pervasives.ref -> float
      val scale_to : SIunits.Value.t -> SIunits.Unit.t -> float
      val ( %> ) : SIunits.Value.t -> SIunits.Unit.t -> float
      val convert :
        value:float -> from:SIunits.Unit.t -> into:SIunits.Unit.t -> float
      val ( +: ) : SIunits.Value.t -> SIunits.Value.t -> SIunits.Value.t
      val ( -: ) : SIunits.Value.t -> SIunits.Value.t -> SIunits.Value.t
      val ( *: ) : SIunits.Value.t -> SIunits.Value.t -> SIunits.Value.t
      val ( /: ) : SIunits.Value.t -> SIunits.Value.t -> SIunits.Value.t
      val ( *:. ) : SIunits.Value.t -> float -> SIunits.Value.t
      val ( /:. ) : SIunits.Value.t -> float -> SIunits.Value.t
      val ( /.: ) : float -> SIunits.Value.t -> SIunits.Value.t
    end
  module Ops :
    sig
      val ( %* ) : SIunits.Unit.t -> SIunits.Unit.t -> SIunits.Unit.t
      val ( %/ ) : SIunits.Unit.t -> SIunits.Unit.t -> SIunits.Unit.t
      val ( %< ) : float -> SIunits.Unit.t -> SIunits.Value.t
      val ( %> ) : SIunits.Value.t -> SIunits.Unit.t -> float
      val ( %= ) : SIunits.Unit.t -> SIunits.Unit.t -> bool
      val ( <-: ) : SIunits.Value.t Pervasives.ref -> SIunits.Value.t -> unit
      val ( !: ) : SIunits.Value.t Pervasives.ref -> float
      val ( =?: ) : SIunits.Value.t -> SIunits.Value.t -> bool
      val ( =: ) : SIunits.Value.t -> SIunits.Value.t -> bool
      val ( +: ) : SIunits.Value.t -> SIunits.Value.t -> SIunits.Value.t
      val ( -: ) : SIunits.Value.t -> SIunits.Value.t -> SIunits.Value.t
      val ( *: ) : SIunits.Value.t -> SIunits.Value.t -> SIunits.Value.t
      val ( /: ) : SIunits.Value.t -> SIunits.Value.t -> SIunits.Value.t
      val ( *:. ) : SIunits.Value.t -> float -> SIunits.Value.t
      val ( /:. ) : SIunits.Value.t -> float -> SIunits.Value.t
      val ( /.: ) : float -> SIunits.Value.t -> SIunits.Value.t
    end
  module Common :
    sig
      type t = SIunits.Unit.t
      val sec : SIunits.Common.t
      val min : SIunits.Common.t
      val hour : SIunits.Common.t
      val metre : SIunits.Common.t
      val km : SIunits.Common.t
      val cm : SIunits.Common.t
      val mm : SIunits.Common.t
      val um : SIunits.Common.t
      val cm_per_sec : SIunits.Common.t
      val cm_per_min : SIunits.Common.t
      val um_per_sec : SIunits.Common.t
      val um_per_min : SIunits.Common.t
      val mmol_per_cm2_sec : SIunits.Common.t
      val mmol_per_cm2_min : SIunits.Common.t
      val nmol_per_cm2_sec : SIunits.Common.t
      val nmol_per_cm2_min : SIunits.Common.t
      val newton : SIunits.Common.t
      val pascal : SIunits.Common.t
      val kilo_pascal : SIunits.Common.t
      val mmHg : SIunits.Common.t
      val l_per_sec : SIunits.Common.t
      val l_per_min : SIunits.Common.t
      val ml_per_sec : SIunits.Common.t
      val ml_per_min : SIunits.Common.t
      val ul_per_sec : SIunits.Common.t
      val ul_per_min : SIunits.Common.t
      val nl_per_sec : SIunits.Common.t
      val nl_per_min : SIunits.Common.t
      val pl_per_sec : SIunits.Common.t
      val pl_per_min : SIunits.Common.t
      val kelvin : SIunits.Common.t
      val to_celsius : SIunits.Value.t -> float
      val to_fahrenheit : SIunits.Value.t -> float
      val from_celsius : float -> SIunits.Value.t
      val from_fahrenheit : float -> SIunits.Value.t
    end
end