--- ./pico_ml_wrapper/src/camlpico.c.orig 2008-07-08 22:38:01.000000000 -0600 +++ ./pico_ml_wrapper/src/camlpico.c 2013-07-31 16:11:40.000000000 -0600 @@ -26,6 +26,8 @@ #include #include +static PicoSAT *my_picosat; + /* the methods comment were directly taken from 'picosat.h' */ CAMLprim value unknown(){ return Val_int(PICOSAT_UNKNOWN);} @@ -35,13 +37,14 @@ CAMLprim value unsatisfiable(){ return V CAMLprim value init(value unit) { - picosat_init(); + my_picosat = picosat_init(); return Val_unit; } CAMLprim value reset(value unit) { - picosat_reset(); + picosat_reset(my_picosat); + my_picosat = NULL; return Val_unit; } @@ -55,7 +58,7 @@ CAMLprim value reset(value unit) */ CAMLprim value set_seed(value seed) { - picosat_set_seed(Unsigned_int_val(seed)); + picosat_set_seed(my_picosat, Unsigned_int_val(seed)); return Val_unit; } @@ -65,7 +68,7 @@ CAMLprim value set_seed(value seed) */ CAMLprim value enable_trace(value unit) { - picosat_enable_trace_generation(); + picosat_enable_trace_generation(my_picosat); return Val_unit; } @@ -76,7 +79,7 @@ CAMLprim value enable_trace(value unit) */ CAMLprim value adjust(value n) { - picosat_adjust(Int_val(n)); + picosat_adjust(my_picosat, Int_val(n)); return Val_unit; } @@ -85,7 +88,7 @@ CAMLprim value adjust(value n) */ CAMLprim value second(value unit) { - return caml_copy_double(picosat_seconds()); + return caml_copy_double(picosat_seconds(my_picosat)); } /*------------------------------------------------------------------------*/ @@ -95,7 +98,7 @@ CAMLprim value second(value unit) */ CAMLprim value add(value i) { - picosat_add(Int_val(i)); + picosat_add(my_picosat, Int_val(i)); return Val_unit; } @@ -106,7 +109,7 @@ CAMLprim value add(value i) */ CAMLprim value assume(value i) { - picosat_assume(Int_val(i)); + picosat_assume(my_picosat, Int_val(i)); return Val_unit; } @@ -117,7 +120,7 @@ CAMLprim value assume(value i) */ CAMLprim value sat(value limit) { - return Val_int(picosat_sat(Int_val(limit))); + return Val_int(picosat_sat(my_picosat, Int_val(limit))); } /* After 'picosat_sat' was called and returned 'PICOSAT_SATISFIABLE', then @@ -127,7 +130,7 @@ CAMLprim value sat(value limit) */ CAMLprim value deref(value lit) { - return Val_int(picosat_deref(Int_val(lit))); + return Val_int(picosat_deref(my_picosat, Int_val(lit))); } /* A cheap way of determining an over-approximation of a variable core is to @@ -138,7 +141,7 @@ CAMLprim value deref(value lit) */ CAMLprim value usedlit(value lit) { - return Val_int(picosat_usedlit(Int_val(lit))); + return Val_int(picosat_usedlit(my_picosat, Int_val(lit))); } /*------------------------------------------------------------------------*/ @@ -155,7 +158,7 @@ CAMLprim value usedlit(value lit) */ CAMLprim value corelit(value lit) { - return Val_int(picosat_corelit(Int_val(lit))); + return Val_int(picosat_corelit(my_picosat, Int_val(lit))); } //#include @@ -165,7 +168,7 @@ value get_proof(value unit) { CAMLparam0(); CAMLlocal1 (array); - int* proof = picosat_get_proof(); + int* proof = picosat_get_proof(my_picosat); int size = 0; while(proof[size] != EOP){ size++;