12345678910111213141516171819202122232425262728293031323334353637383940414243444546(** Boolean variable on which a DD can branch. Morally just an integer, but
modeled as a record for type safety. *)openBasemoduleT=structtypet=Varofint[@@unboxed][@@derivingcompare,sexp,hash,eq]endincludeTletleaf_idx=-1let[@inline]inp(index:int):t=Var(index*2+1)let[@inline]out(index:int):t=Var(index*2)let[@inline]is_inp(Varid):bool=id%2=1let[@inline]is_out(Varid):bool=id%2=0let[@inline]to_out(Varidasvar):t=ifis_outvarthenvarelseVar(id-1)let[@inline]is_in_out_pair(Varinp_idasinp)(Varout_idasout):bool=is_inpinp&&is_outout&&(inp_id-1=out_id)let[@inline]index(Varid):int=id/2typecloser_to_root=Left|Right|Equallet[@inline]closer_to_root(Varid1)(Varid2):closer_to_root=matchInt.compareid1id2with|0->Equal|_whenid1>id2->Left|_->Rightlet[@inline]idx_strictly_closer_to_root(idx0:int)(idx1:int):bool=idx0>idx1letto_string(t:t):string=Caml.Format.sprintf"%s%d"(ifis_inptthen"I"else"O")(indext)