sig
  module Add :
    sig
      type leaf = Arith.expr
      type t
      type id_unop
      type id_binop
      type id_combinop
      type mtbdd = Leaf of leaf | Ite of int * t * t
      val leafbackground : leaf
      module Hash :
        sig
          type key = leaf
          type 'a t
          val create : int -> 'a t
          val clear : 'a t -> unit
          val copy : 'a t -> 'a t
          val add : 'a t -> key -> '-> unit
          val remove : 'a t -> key -> unit
          val find : 'a t -> key -> 'a
          val find_all : 'a t -> key -> 'a list
          val replace : 'a t -> key -> '-> unit
          val mem : 'a t -> key -> bool
          val iter : (key -> '-> unit) -> 'a t -> unit
          val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
          val length : 'a t -> int
        end
      val hasht : int Hash.t
      module Assoc :
        sig
          type key = int
          type +'a t
          val empty : 'a t
          val is_empty : 'a t -> bool
          val add : key -> '-> 'a t -> 'a t
          val find : key -> 'a t -> 'a
          val remove : key -> 'a t -> 'a t
          val mem : key -> 'a t -> bool
          val iter : (key -> '-> unit) -> 'a t -> unit
          val map : ('-> 'b) -> 'a t -> 'b t
          val mapi : (key -> '-> 'b) -> 'a t -> 'b t
          val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
          val compare : ('-> '-> int) -> 'a t -> 'a t -> int
          val equal : ('-> '-> bool) -> 'a t -> 'a t -> bool
        end
      val assoct : leaf Assoc.t ref
      val leaf_of_id : int -> leaf
      val id_of_leaf : leaf -> int
      val remove_leaf : leaf -> unit
      val iter_leaf : (int -> leaf -> unit) -> unit
      external to_idd : t -> Idd.t = "%identity"
      external of_idd : Idd.t -> t = "%identity"
      external manager : t -> Manager.t = "camlidl_cudd_bdd_manager"
      external is_cst : t -> bool = "camlidl_cudd_bdd_is_cst"
      external topvar : t -> int = "camlidl_cudd_bdd_topvar"
      external dthen : t -> t = "camlidl_cudd_rdd_dthen"
      external delse : t -> t = "camlidl_cudd_rdd_delse"
      external cofactors : int -> t -> t * t = "camlidl_cudd_rdd_cofactors"
      external cofactor : t -> Bdd.t -> t = "camlidl_cudd_rdd_cofactor"
      val dval : t -> leaf
      val inspect : t -> mtbdd
      external support : t -> Bdd.t = "camlidl_cudd_bdd_support"
      external supportsize : t -> int = "camlidl_cudd_bdd_supportsize"
      external is_var_in : int -> t -> bool = "camlidl_cudd_bdd_is_var_in"
      external vectorsupport : t array -> Bdd.t
        = "camlidl_cudd_bdd_vectorsupport"
      external vectorsupport2 : Bdd.t array -> t array -> Bdd.t
        = "camlidl_cudd_rdd_vectorsupport2"
      val cst : Manager.t -> leaf -> t
      external ite : Bdd.t -> t -> t -> t = "camlidl_cudd_rdd_ite"
      external compose : int -> Bdd.t -> t -> t = "camlidl_cudd_rdd_compose"
      external vectorcompose : Bdd.t array -> t -> t
        = "camlidl_cudd_rdd_vectorcompose"
      external is_equal : t -> t -> bool = "camlidl_cudd_bdd_is_equal"
      external is_equal_when : t -> t -> Bdd.t -> bool
        = "camlidl_cudd_bdd_is_equal_when"
      val is_eval_cst : t -> Bdd.t -> leaf option
      val is_ite_cst : Bdd.t -> t -> t -> leaf option
      external size : t -> int = "camlidl_cudd_bdd_size"
      external nbpaths : t -> float = "camlidl_cudd_bdd_nbpaths"
      external nbnonzeropaths : t -> float
        = "camlidl_cudd_rdd_nbnonzeropaths"
      external nbminterms : int -> t -> float = "camlidl_cudd_bdd_nbminterms"
      external density : int -> t -> float = "camlidl_cudd_bdd_density"
      external nbleaves : t -> int = "camlidl_cudd_rdd_nbleaves"
      external varmap : t -> t = "camlidl_cudd_rdd_varmap"
      external permute : int array -> t -> t = "camlidl_cudd_rdd_permute"
      external iter_node : (t -> unit) -> t -> unit
        = "camlidl_cudd_iter_node"
      val iter_cube : (Manager.tbool array -> leaf -> unit) -> t -> unit
      external guard_of_node : t -> t -> Bdd.t
        = "camlidl_cudd_rdd_guard_of_node"
      external guard_of_nonbackground : t -> Bdd.t
        = "camlidl_cudd_rdd_guard_of_nonbackground"
      external nodes_below_level : t -> int option -> t array
        = "camlidl_cudd_rdd_nodes_below_level"
      val leaves : t -> leaf array
      val guard_of_leaf : t -> leaf -> Bdd.t
      val guardleafs : t -> (Bdd.t * leaf) array
      external constrain : t -> Bdd.t -> t = "camlidl_cudd_rdd_constrain"
      external tdconstrain : t -> Bdd.t -> t = "camlidl_cudd_rdd_tdconstrain"
      external restrict : t -> Bdd.t -> t = "camlidl_cudd_rdd_restrict"
      external tdrestrict : t -> Bdd.t -> t = "camlidl_cudd_rdd_tdrestrict"
      external to_bdd : t -> Bdd.t = "camlidl_cudd_rdd_to_bdd"
      val alloc_unop : (leaf -> leaf) -> id_unop
      val alloc_binop : (leaf -> leaf -> leaf) -> id_binop
      val alloc_combinop : (leaf -> leaf -> leaf) -> id_combinop
      external apply_unop : id_unop -> t -> t = "camlidl_cudd_idd_apply_unop"
      external apply_binop : id_binop -> t -> t -> t
        = "camlidl_cudd_idd_apply_binop"
      external apply_combinop : id_combinop -> t -> t -> t
        = "camlidl_cudd_idd_apply_combinop"
      external transfer : t -> Manager.t -> t = "camlidl_cudd_rdd_transfer"
      external _print : t -> unit = "camlidl_cudd_print"
      val print__minterm : Format.formatter -> t -> unit
      val print_minterm :
        (int -> string) -> (leaf -> string) -> Format.formatter -> t -> unit
      val print :
        (int -> string) -> (leaf -> string) -> Format.formatter -> t -> unit
    end
  type t = (Arith.expr, ArithDD.Add.t) CondDD.ddexpr
  val of_expr : [> `Arith of ArithDD.t ] -> ArithDD.t
  val to_expr : ArithDD.t -> [> `Arith of ArithDD.t ]
  val to_add : #CondDD.db -> ArithDD.t -> ArithDD.Add.t
  val var : #CondDD.db -> Var.t -> ArithDD.t
  val cst : Mpqf.t -> ArithDD.t
  val add : #CondDD.db -> ArithDD.t -> ArithDD.t -> ArithDD.t
  val mul : #CondDD.db -> ArithDD.t -> ArithDD.t -> ArithDD.t
  val sub : #CondDD.db -> ArithDD.t -> ArithDD.t -> ArithDD.t
  val div : #CondDD.db -> ArithDD.t -> ArithDD.t -> ArithDD.t
  val gmod : #CondDD.db -> ArithDD.t -> ArithDD.t -> ArithDD.t
  val other : #CondDD.db -> Var.t -> ArithDD.t list -> ArithDD.t
  val negate : #CondDD.db -> ArithDD.t -> ArithDD.t
  val ite : #CondDD.db -> Bdd.t -> ArithDD.t -> ArithDD.t -> ArithDD.t
  val condition : #CondDD.db -> Arith.Condition.typ -> ArithDD.t -> Bdd.t
  val supeq : #CondDD.db -> ArithDD.t -> Bdd.t
  val sup : #CondDD.db -> ArithDD.t -> Bdd.t
  val eq : #CondDD.db -> ArithDD.t -> Bdd.t
  val cofactor : ArithDD.t -> Bdd.t -> ArithDD.t
  val tdrestrict : ArithDD.t -> Bdd.t -> ArithDD.t
  val support_cond : #CondDD.db -> ArithDD.t -> Bdd.t
  val support_leaf : #CondDD.db -> ArithDD.t -> Var.Set.t
  val substitute_expr :
    #CondDD.db ->
    Arith.expr -> [> `Arith of ArithDD.t ] Var.Map.t -> ArithDD.t
  val substitute_cond :
    #CondDD.db ->
    Arith.Condition.t -> [> `Arith of ArithDD.t ] Var.Map.t -> Bdd.t
  val print : #CondDD.db -> Format.formatter -> ArithDD.t -> unit
end