/** * This is the internal execution of set_enum * <levels> contains k BDDLEVEL levels. * 0 <= n < k */ static void set_enum_do(BDD root, const BDD variables, int *vec, int n, vset_element_cb cb, void* context) { if (root == sylvan_false) return; if (sylvan_set_isempty(variables)) { // Make sure that there are no variables left assert(root == sylvan_true); // We have one satisfying assignment! cb(context, vec); } else { BDDVAR var = sylvan_var(variables); BDD variables_next = sylvan_set_next(variables); int i = n / fddbits; // which slot in the state vector int j = n % fddbits; // which bit? uint32_t bitmask = 1 << (fddbits-1-j); if (root == sylvan_true || var != sylvan_var(root)) { // n is skipped, take both vec[i] |= bitmask; set_enum_do(root, variables_next, vec, n+1, cb, context); vec[i] &= ~bitmask; set_enum_do(root, variables_next, vec, n+1, cb, context); } else { vec[i] |= bitmask; set_enum_do((sylvan_high(root)), variables_next, vec, n+1, cb, context); vec[i] &= ~bitmask; set_enum_do((sylvan_low(root)), variables_next, vec, n+1, cb, context); } } }
JNIEXPORT jint JNICALL Java_jsylvan_JSylvan_getVar(JNIEnv *env, jclass cl, jlong bdd) { return sylvan_var(bdd); }
JNIEXPORT jlong JNICALL Java_jsylvan_JSylvan_getIf(JNIEnv *env, jclass cl, jlong bdd) { return sylvan_ithvar(sylvan_var(bdd)); }