open Prims
let norm (x : 'a) : 'a= x
type width =
  | W8 
  | W16 
  | W32 
  | W64 
  | W128 
  | Winfinite 
let uu___is_W8 (projectee : width) : Prims.bool=
  match projectee with | W8 -> true | uu___ -> false
let uu___is_W16 (projectee : width) : Prims.bool=
  match projectee with | W16 -> true | uu___ -> false
let uu___is_W32 (projectee : width) : Prims.bool=
  match projectee with | W32 -> true | uu___ -> false
let uu___is_W64 (projectee : width) : Prims.bool=
  match projectee with | W64 -> true | uu___ -> false
let uu___is_W128 (projectee : width) : Prims.bool=
  match projectee with | W128 -> true | uu___ -> false
let uu___is_Winfinite (projectee : width) : Prims.bool=
  match projectee with | Winfinite -> true | uu___ -> false
let nat_of_width (uu___ : width) : Prims.int FStar_Pervasives_Native.option=
  match uu___ with
  | W8 -> FStar_Pervasives_Native.Some (Prims.of_int (8))
  | W16 -> FStar_Pervasives_Native.Some (Prims.of_int (16))
  | W32 -> FStar_Pervasives_Native.Some (Prims.of_int (32))
  | W64 -> FStar_Pervasives_Native.Some (Prims.of_int (64))
  | W128 -> FStar_Pervasives_Native.Some (Prims.of_int (128))
  | Winfinite -> FStar_Pervasives_Native.None
type fixed_width = width
let nat_of_fixed_width (w : fixed_width) : Prims.int=
  match nat_of_width w with | FStar_Pervasives_Native.Some v -> v
type signed_width =
  | Signed of width 
  | Unsigned of fixed_width 
let uu___is_Signed (projectee : signed_width) : Prims.bool=
  match projectee with | Signed _0 -> true | uu___ -> false
let __proj__Signed__item___0 (projectee : signed_width) : width=
  match projectee with | Signed _0 -> _0
let uu___is_Unsigned (projectee : signed_width) : Prims.bool=
  match projectee with | Unsigned _0 -> true | uu___ -> false
let __proj__Unsigned__item___0 (projectee : signed_width) : fixed_width=
  match projectee with | Unsigned _0 -> _0
let width_of_sw (uu___ : signed_width) : width=
  match uu___ with | Signed w -> w | Unsigned w -> w
type ('sw, 'x) within_bounds = Obj.t
type uint_8 = FStar_UInt8.t
type uint_16 = FStar_UInt16.t
type uint_32 = FStar_UInt32.t
type uint_64 = FStar_UInt64.t
type int = Prims.int
type int_8 = FStar_Int8.t
type int_16 = FStar_Int16.t
type int_32 = FStar_Int32.t
type int_64 = FStar_Int64.t
type int_128 = FStar_Int128.t
type ('sw, 'op, 'x, 'y) ok = Obj.t
type nat = Prims.int
type pos = Prims.int
let f_int (x : Prims.int) (y : Prims.int) : Prims.int= x + y
let f_nat (x : Prims.int) (y : Prims.int) : Prims.int= x + y
let f_nat_int_pos (x : Prims.int) (y : Prims.int) (z : Prims.int) :
  Prims.int= (x + y) + z
let f_uint_8 (x : FStar_UInt8.t) (y : FStar_UInt8.t) : FStar_UInt8.t=
  FStar_UInt8.add x y
let f_int_16 (x : FStar_Int16.t) (y : FStar_Int16.t) : FStar_Int16.t=
  FStar_Int16.add x y
let g (x : FStar_UInt32.t) (y : FStar_UInt32.t) : FStar_UInt32.t=
  FStar_UInt32.add x (FStar_UInt32.mul y y)
let h (x : Prims.nat) (y : Prims.nat) : Prims.int= x + y
let i (x : Prims.nat) (y : Prims.nat) : Prims.int= x + y
let j (x : Prims.int) (y : Prims.nat) : Prims.int= x - y
let k (x : Prims.int) (y : Prims.int) : Prims.int= x * y
