sig
  type bnode = BIte of int * int * bool * int | BTrue
  type 'a bdd = {
    cond : int PSette.t Pervasives.ref;
    mutable bdef : (int, Output.bnode) PMappe.t;
    bhash : ('Cudd.Bdd.t, int) Hashhe.t;
    mutable blastid : int;
  }
  type 'a vnode = VIte of int * int * int | VCst of 'a
  type 'a vdd = {
    cond : int PSette.t Pervasives.ref;
    mutable vdef : (int, 'Output.vnode) PMappe.t;
    lhash : ('a, unit) PHashhe.t;
    vhash : ('Cudd.Vdd.t, int) Hashhe.t;
    mutable vlastid : int;
  }
  type anode = AIte of int * int * int | ACst of float
  type add = {
    cond : int PSette.t Pervasives.ref;
    mutable adef : (int, Output.anode) PMappe.t;
    mutable lset : float Sette.t;
    ahash : (Cudd.Add.t, int) Hashhe.t;
    mutable alastid : int;
  }
  val make_bdd : cond:int PSette.t Pervasives.ref -> 'Output.bdd
  val signid_of_bdd : 'Output.bdd -> 'Cudd.Bdd.t -> bool * int
  val make_vdd :
    compare:'Cudd.PWeakke.compare ->
    cond:int PSette.t Pervasives.ref -> 'Output.vdd
  val make_mtbdd :
    table:'Cudd.Mtbdd.table ->
    cond:int PSette.t Pervasives.ref -> 'Cudd.Mtbdd.unique Output.vdd
  val make_mtbddc :
    table:'Cudd.Mtbddc.table ->
    cond:int PSette.t Pervasives.ref -> 'Cudd.Mtbddc.unique Output.vdd
  val id_of_vdd : 'Output.vdd -> 'Cudd.Vdd.t -> int
  val iter_cond_ordered :
    int PSette.t -> 'Cudd.Man.t -> (int -> unit) -> unit
  val iter_bdef_ordered :
    'Output.bdd -> (int -> Output.bnode -> unit) -> unit
  val iter_vdef_ordered :
    'Output.vdd -> (int -> 'Output.vnode -> unit) -> unit
end