28#define CHECK_FACTOR 10
56static DdNode * cuddBddAndRecurTime( DdManager * manager, DdNode * f, DdNode * g,
int * pRecCalls,
int TimeOut );
57static DdNode * cuddBddAndAbstractRecurTime( DdManager * manager, DdNode * f, DdNode * g, DdNode *
cube,
int * pRecCalls,
int TimeOut );
58static DdNode * extraTransferPermuteTime( DdManager * ddS, DdManager * ddD, DdNode * f,
int * Permute,
int TimeOut );
59static DdNode * extraTransferPermuteRecurTime( DdManager * ddS, DdManager * ddD, DdNode * f,
st__table * table,
int * Permute,
int TimeOut );
94 res = cuddBddAndRecurTime(dd,f,g, &Counter, TimeOut);
95 }
while (dd->reordered == 1);
128 manager->reordered = 0;
129 res = cuddBddAndAbstractRecurTime(manager, f, g,
cube, &Counter, TimeOut);
130 }
while (manager->reordered == 1);
155 ddDestination->reordered = 0;
156 bRes = extraTransferPermuteTime( ddSource, ddDestination, f, Permute, TimeOut );
158 while ( ddDestination->reordered == 1 );
189 DdNode *F, *fv, *fnv, *G, *gv, *gnv;
190 DdNode *one, *r, *t, *e;
191 unsigned int topf, topg, index;
194 one = DD_ONE(manager);
200 if (f == g)
return(f);
201 else return(Cudd_Not(one));
204 if (f == one)
return(g);
208 if (g == one)
return(f);
222 if (F->ref != 1 || G->ref != 1) {
223 r = cuddCacheLookup2(manager, Cudd_bddAnd, f, g);
224 if (r != NULL)
return(r);
228 if ( TimeOut && Abc_Clock() > TimeOut )
234 topf = manager->perm[F->index];
235 topg = manager->perm[G->index];
242 if (Cudd_IsComplement(f)) {
254 if (Cudd_IsComplement(g)) {
262 t = cuddBddAndRecurTime(manager, fv, gv, pRecCalls, TimeOut);
263 if (t == NULL)
return(NULL);
266 e = cuddBddAndRecurTime(manager, fnv, gnv, pRecCalls, TimeOut);
268 Cudd_IterDerefBdd(manager, t);
276 if (Cudd_IsComplement(t)) {
277 r = cuddUniqueInter(manager,(
int)index,Cudd_Not(t),Cudd_Not(e));
279 Cudd_IterDerefBdd(manager, t);
280 Cudd_IterDerefBdd(manager, e);
285 r = cuddUniqueInter(manager,(
int)index,t,e);
287 Cudd_IterDerefBdd(manager, t);
288 Cudd_IterDerefBdd(manager, e);
295 if (F->ref != 1 || G->ref != 1)
296 cuddCacheInsert2(manager, Cudd_bddAnd, f, g, r);
317cuddBddAndAbstractRecurTime(
325 DdNode *F, *ft, *fe, *G, *gt, *ge;
326 DdNode *one, *zero, *r, *t, *e;
327 unsigned int topf, topg, topcube, top, index;
330 one = DD_ONE(manager);
331 zero = Cudd_Not(one);
334 if (f == zero || g == zero || f == Cudd_Not(g))
return(zero);
335 if (f == one && g == one)
return(one);
338 return(cuddBddAndRecurTime(manager, f, g, pRecCalls, TimeOut));
340 if (f == one || f == g) {
341 return(cuddBddExistAbstractRecur(manager, g,
cube));
344 return(cuddBddExistAbstractRecur(manager, f,
cube));
359 topf = manager->perm[F->index];
360 topg = manager->perm[G->index];
361 top = ddMin(topf, topg);
362 topcube = manager->perm[
cube->index];
364 while (topcube < top) {
367 return(cuddBddAndRecurTime(manager, f, g, pRecCalls, TimeOut));
369 topcube = manager->perm[
cube->index];
374 if (F->ref != 1 || G->ref != 1) {
375 r = cuddCacheLookup(manager, DD_BDD_AND_ABSTRACT_TAG, f, g,
cube);
382 if ( TimeOut && Abc_Clock() > TimeOut )
389 if (Cudd_IsComplement(f)) {
401 if (Cudd_IsComplement(g)) {
409 if (topcube == top) {
411 t = cuddBddAndAbstractRecurTime(manager, ft, gt,
Cube, pRecCalls, TimeOut);
412 if (t == NULL)
return(NULL);
418 if (t == one || t == fe || t == ge) {
419 if (F->ref != 1 || G->ref != 1)
420 cuddCacheInsert(manager, DD_BDD_AND_ABSTRACT_TAG,
426 if (t == Cudd_Not(fe)) {
427 e = cuddBddExistAbstractRecur(manager, ge,
Cube);
428 }
else if (t == Cudd_Not(ge)) {
429 e = cuddBddExistAbstractRecur(manager, fe,
Cube);
431 e = cuddBddAndAbstractRecurTime(manager, fe, ge,
Cube, pRecCalls, TimeOut);
434 Cudd_IterDerefBdd(manager, t);
442 r = cuddBddAndRecurTime(manager, Cudd_Not(t), Cudd_Not(e), pRecCalls, TimeOut);
444 Cudd_IterDerefBdd(manager, t);
445 Cudd_IterDerefBdd(manager, e);
450 Cudd_DelayedDerefBdd(manager, t);
451 Cudd_DelayedDerefBdd(manager, e);
455 t = cuddBddAndAbstractRecurTime(manager, ft, gt,
cube, pRecCalls, TimeOut);
456 if (t == NULL)
return(NULL);
458 e = cuddBddAndAbstractRecurTime(manager, fe, ge,
cube, pRecCalls, TimeOut);
460 Cudd_IterDerefBdd(manager, t);
468 if (Cudd_IsComplement(t)) {
469 r = cuddUniqueInter(manager, (
int) index,
470 Cudd_Not(t), Cudd_Not(e));
472 Cudd_IterDerefBdd(manager, t);
473 Cudd_IterDerefBdd(manager, e);
478 r = cuddUniqueInter(manager,(
int)index,t,e);
480 Cudd_IterDerefBdd(manager, t);
481 Cudd_IterDerefBdd(manager, e);
490 if (F->ref != 1 || G->ref != 1)
491 cuddCacheInsert(manager, DD_BDD_AND_ABSTRACT_TAG, f, g,
cube, r);
513DdNode * extraTransferPermuteTime( DdManager * ddS, DdManager * ddD, DdNode * f,
int * Permute,
int TimeOut )
523 res = extraTransferPermuteRecurTime( ddS, ddD, f, table, Permute, TimeOut );
535 Cudd_RecursiveDeref( ddD,
value );
569extraTransferPermuteRecurTime(
577 DdNode *ft, *fe, *t, *e, *
var, *res;
584 comple = Cudd_IsComplement( f );
587 if ( Cudd_IsConstant( f ) )
588 return ( Cudd_NotCond( one, comple ) );
592 f = Cudd_NotCond( f, comple );
596 if (
st__lookup( table, (
char * ) f, (
char ** ) &res ) )
597 return ( Cudd_NotCond( res, comple ) );
599 if ( TimeOut && Abc_Clock() > TimeOut )
604 index = Permute[f->index];
611 t = extraTransferPermuteRecurTime( ddS, ddD, ft, table, Permute, TimeOut );
618 e = extraTransferPermuteRecurTime( ddS, ddD, fe, table, Permute, TimeOut );
621 Cudd_RecursiveDeref( ddD, t );
626 zero = Cudd_Not(ddD->one);
627 var = cuddUniqueInter( ddD, index, one, zero );
630 Cudd_RecursiveDeref( ddD, t );
631 Cudd_RecursiveDeref( ddD, e );
634 res = cuddBddIteRecur( ddD, var, t, e );
638 Cudd_RecursiveDeref( ddD, t );
639 Cudd_RecursiveDeref( ddD, e );
643 Cudd_RecursiveDeref( ddD, t );
644 Cudd_RecursiveDeref( ddD, e );
649 Cudd_RecursiveDeref( ddD, res );
652 return ( Cudd_NotCond( res, comple ) );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
ABC_NAMESPACE_IMPL_START typedef signed char value
int st__gen(st__generator *gen, const char **key_p, char **value_p)
int st__ptrhash(const char *, int)
int st__ptrcmp(const char *, const char *)
void st__free_gen(st__generator *gen)
int st__lookup(st__table *table, const char *key, char **value)
st__table * st__init_table(st__compare_func_type compare, st__hash_func_type hash)
st__generator * st__init_gen(st__table *table)
int st__add_direct(st__table *table, char *key, char *value)
void st__free_table(st__table *table)