sig
  module type Data =
    sig
      type t
      val equal : Layout.Data.t -> Layout.Data.t -> bool
      val compare : Layout.Data.t -> Layout.Data.t -> int
      val pretty : Layout.Data.t Pretty_utils.formatter
    end
  type offset = Field of Cil_types.fieldinfo | Index of Cil_types.typ * int
  type lvalue =
      Eval of Cil_types.exp
    | Tval of Cil_types.term
    | Assigned of Cil_types.stmt
  module Offset :
    sig
      type t = offset
      val equal : t -> t -> bool
      val compare : t -> t -> int
      val pretty : t Pretty_utils.formatter
      val index : Cil_types.typ -> Layout.offset
      val field : Cil_types.fieldinfo -> Layout.offset
      val typeof : Layout.offset -> Cil_types.typ
      val typeof_chain : Cil_types.typ -> Layout.offset list -> Cil_types.typ
      val pp_chain :
        Cil_types.typ -> Layout.offset list Pretty_utils.formatter
      type cache
      val cache : unit -> Layout.Offset.cache
      val field_offset :
        Layout.Offset.cache -> Cil_types.fieldinfo -> int * int
      val range : Layout.Offset.cache -> Layout.offset -> (int * int) * int
      val sizeof : Layout.offset -> int
    end
  module Lvalue :
    sig
      type t = lvalue
      val equal : t -> t -> bool
      val compare : t -> t -> int
      val pretty : t Pretty_utils.formatter
    end
  type alias = NotUsed | NotAliased | Aliased
  type usage = Value | Deref | Array
  type deref = Layout.usage * Cil_types.typ
  module Alias :
    sig
      val use : Layout.alias -> Layout.alias
      val merge : Layout.alias -> Layout.alias -> Layout.alias
      val alias : Layout.alias -> Layout.alias -> Layout.alias
      val is_aliased : Layout.alias -> bool
      val pretty : Layout.alias Pretty_utils.formatter
    end
  module Usage :
    sig
      val pretty : Layout.usage Pretty_utils.formatter
      val merge : Layout.usage -> Layout.usage -> Layout.usage
      val is_shifted : Layout.usage -> bool
      val is_aliased : Layout.usage -> bool
    end
  module Deref :
    sig
      type t = deref
      val equal : t -> t -> bool
      val compare : t -> t -> int
      val pretty : t Pretty_utils.formatter
    end
  type 'a value =
      Int of Ctypes.c_int
    | Float of Ctypes.c_float
    | Pointer of 'a
  module Value :
    sig
      val compare :
        ('-> '-> int) -> 'Layout.value -> 'Layout.value -> int
      val equal :
        ('-> '-> bool) -> 'Layout.value -> 'Layout.value -> bool
      val pretty :
        'Pretty_utils.formatter -> 'Layout.value Pretty_utils.formatter
      val sizeof : 'Layout.value -> int
      val pointed : 'Layout.value -> 'a option
      val merge :
        ('-> '-> 'a) ->
        'Layout.value -> 'Layout.value -> 'Layout.value option
    end
  module Matrix :
    sig
      val gcd : int -> int -> int
      val pretty : int list Pretty_utils.formatter
      val sizeof : int -> int list -> int
      val merge : int list -> int list -> int list
    end
  type dim = Raw of int | Dim of int * int list
  type 'a range = private {
    ofs : int;
    len : int;
    reg : 'a;
    dim : Layout.dim;
  }
  type 'a overlay = 'Layout.range list
  type 'a merger = raw:bool -> '-> '-> 'a
  module Range :
    sig
      val pretty :
        'Pretty_utils.formatter -> 'Layout.range Pretty_utils.formatter
      val overlap :
        'Pretty_utils.formatter ->
        'Layout.merger ->
        'Layout.range -> 'Layout.range -> 'Layout.range
      val included : int -> int -> 'Layout.range -> bool
    end
  module Overlay :
    sig
      val pretty :
        ?title:(Format.formatter -> unit) ->
        'Pretty_utils.formatter -> 'Layout.overlay Pretty_utils.formatter
      val merge :
        'Pretty_utils.formatter ->
        'Layout.merger ->
        'Layout.overlay -> 'Layout.overlay -> 'Layout.overlay
      val once : '-> 'Layout.overlay -> bool
    end
  type 'a layout = { sizeof : int; layout : 'Layout.overlay; }
  module Compound :
    sig
      val garbled :
        Layout.Offset.cache -> Layout.offset -> '-> 'Layout.layout
      val reshape :
        eq:('-> '-> bool) ->
        flat:bool -> pack:bool -> 'Layout.layout -> 'Layout.layout
    end
  type 'a cluster =
      Empty
    | Garbled
    | Chunk of 'Layout.value
    | Layout of 'Layout.layout
  module Cluster :
    sig
      val pretty :
        'Pretty_utils.formatter -> 'Layout.cluster Pretty_utils.formatter
      val deref : pointed:'Lazy.t -> Layout.deref -> 'Layout.cluster
      val shift :
        Layout.Offset.cache ->
        'Pretty_utils.formatter ->
        Layout.offset ->
        '-> inline:bool -> 'Layout.cluster -> 'Layout.layout
      val merge :
        'Pretty_utils.formatter ->
        'Layout.merger ->
        'Layout.cluster -> 'Layout.cluster -> 'Layout.cluster
      val is_empty : 'Layout.cluster -> bool
      val is_garbled : 'Layout.cluster -> bool
      val reshape :
        eq:('-> '-> bool) ->
        flat:bool -> pack:bool -> 'Layout.cluster -> 'Layout.cluster
    end
  type 'a from =
      Fvar of Cil_types.varinfo
    | Ffield of 'a * int
    | Findex of 'a
    | Fderef of 'a
    | Farray of 'a
  type root =
      Rnone
    | Rfield of Cil_types.varinfo * int
    | Rindex of Cil_types.varinfo
    | Rtop
  module Root :
    sig
      val pretty : Layout.root Pretty_utils.formatter
      val from : root:('-> Layout.root) -> 'Layout.from -> Layout.root
      val merge : Layout.root -> Layout.root -> Layout.root
      val indexed : Layout.root -> bool
      val framed : Layout.root -> bool
    end
  type chunks = Qed.Intset.t
  type 'a chunk =
      Mref of 'a
    | Mmem of Layout.root * 'Layout.value
    | Mraw of Layout.root * 'a option
    | Mcomp of Layout.chunks * 'Layout.overlay
  module Chunk :
    sig
      val empty : Layout.chunks
      val singleton : int -> Layout.chunks
      val union : Layout.chunks -> Layout.chunks -> Layout.chunks
      val disjoint : Layout.chunks -> Layout.chunks -> bool
      val union_map : ('-> Layout.chunks) -> 'a list -> Layout.chunks
      val mem : int -> Layout.chunks -> bool
      val pretty :
        int Pretty_utils.formatter -> Layout.chunks Pretty_utils.formatter
    end
  module RW :
    sig val default : unit -> bool val merge : bool -> bool -> bool end
  module Flat :
    sig val default : unit -> bool val merge : bool -> bool -> bool end
  module Pack :
    sig val default : unit -> bool val merge : bool -> bool -> bool end
end