sig
  type node_kind =
      Scalar of Cil_types.varinfo * Cil_types.typ * Cil_types.offset
    | Composite of Cil_types.varinfo
    | Scattered of Cil_types.lval * Cil_types.kinstr
    | Unknown of Cil_types.lval * Cil_types.kinstr
    | Alarm of Cil_types.stmt * Alarms.alarm
    | AbsoluteMemory
    | String of int * Base.cstring
    | Error of string
  type callstack = Callstack.t
  type node_locality = {
    loc_file : string;
    loc_callstack : Dive_types.callstack;
  }
  type node_range = Empty | Singleton | Normal of int | Wide
  type 'a computation = NotDone | Partial of '| Done
  type node = {
    node_key : int;
    node_kind : Dive_types.node_kind;
    node_locality : Dive_types.node_locality;
    mutable node_is_root : bool;
    mutable node_hidden : bool;
    mutable node_values : Cvalue.V.t option;
    mutable node_range : Dive_types.node_range;
    mutable node_writes_computation :
      Cil_types.stmt list Dive_types.computation;
    mutable node_reads_computation :
      Cil_types.stmt list Dive_types.computation;
    mutable node_writes_stmts : Cil_types.stmt list;
  }
  type dependency_kind = Callee | Data | Address | Control | Composition
  type dependency = {
    dependency_key : int;
    dependency_kind : Dive_types.dependency_kind;
    mutable dependency_origins : Cil_types.stmt list;
  }
  type graph_diff = {
    last_root : Dive_types.node option;
    added_nodes : Dive_types.node list;
    removed_nodes : Dive_types.node list;
  }
  type 'a range = { backward : 'a; forward : 'a; }
  type window = {
    perception : int option Dive_types.range;
    horizon : int option Dive_types.range;
  }
end