sig
  module Hlib :
    sig
      val addr : D.name -> D.pointer
      val shift_pointer : D.pointer -> Formula.integer D.F.term -> D.pointer
      val shift_field : D.pointer -> D.name -> D.pointer
      val shift_ufield : D.pointer -> D.name -> D.pointer
      val shift_index : D.pointer -> Formula.integer D.F.term -> D.pointer
      val havoc_index : D.array -> Formula.integer D.F.term -> D.array
      val havoc_field : D.record -> D.name -> D.record
      val havoc_ufield : D.urecord -> D.name -> D.urecord
      val base : D.pointer -> D.pointer
      val block_length : D.pointer -> Formula.integer D.F.term
      val valid_pointer : D.pointer -> D.F.pred
      val valid_range : D.pointer -> D.set -> D.F.pred
      val separated : D.pointer -> D.pointer -> D.F.pred
      val array_length : D.pointer -> Formula.integer D.F.term
    end
  val get_array_length : Cil_types.typ -> Formula.integer D.F.term option
  val mk_v_array_length : D.pointer -> Formula.integer D.F.term -> D.F.pred
  module Globals :
    sig
      type t = Cil_types.varinfo
      val define : t -> unit
      val get_definition : t -> D.F.pred Formula.declaration
      val on_definition : (t -> D.F.pred Formula.declaration -> unit) -> unit
    end
end