ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
cloud.c File Reference
#include <string.h>
#include "cloud.h"
Include dependency graph for cloud.c:

Go to the source code of this file.

Functions

CloudManagerCloud_Init (int nVars, int nBits)
 FUNCTION DEFINITIONS ///.
 
void Cloud_Quit (CloudManager *dd)
 
void Cloud_Restart (CloudManager *dd)
 
void Cloud_CacheAllocate (CloudManager *dd, CloudOper oper, int logratio)
 
CloudNodeCloud_MakeNode (CloudManager *dd, CloudVar v, CloudNode *t, CloudNode *e)
 
CloudNodecloudBddAnd (CloudManager *dd, CloudNode *f, CloudNode *g)
 
CloudNodeCloud_bddAnd (CloudManager *dd, CloudNode *f, CloudNode *g)
 
CloudNodeCloud_bddOr (CloudManager *dd, CloudNode *f, CloudNode *g)
 
CloudNodeCloud_bddXor (CloudManager *dd, CloudNode *f, CloudNode *g)
 
CloudNodeCloud_Support (CloudManager *dd, CloudNode *n)
 
int Cloud_SupportSize (CloudManager *dd, CloudNode *n)
 
int Cloud_DagSize (CloudManager *dd, CloudNode *n)
 
int Cloud_DagCollect (CloudManager *dd, CloudNode *n)
 
int Cloud_SharingSize (CloudManager *dd, CloudNode **pn, int nn)
 
CloudNodeCloud_GetOneCube (CloudManager *dd, CloudNode *bFunc)
 
void Cloud_bddPrint (CloudManager *dd, CloudNode *Func)
 
void Cloud_bddPrintCube (CloudManager *dd, CloudNode *bCube)
 
void Cloud_PrintInfo (CloudManager *dd)
 
void Cloud_PrintHashTable (CloudManager *dd)
 

Function Documentation

◆ Cloud_bddAnd()

CloudNode * Cloud_bddAnd ( CloudManager * dd,
CloudNode * f,
CloudNode * g )

Function********************************************************************

Synopsis [Performs the AND or two BDDs]

Description []

SideEffects []

SeeAlso []

Definition at line 489 of file cloud.c.

490{
491 if ( Cloud_Regular(f) == NULL || Cloud_Regular(g) == NULL )
492 return NULL;
493 CLOUD_ASSERT(f);
494 CLOUD_ASSERT(g);
495 if ( dd->tCaches[CLOUD_OPER_AND] == NULL )
496 cloudCacheAllocate( dd, CLOUD_OPER_AND );
497 return cloudBddAnd_gate( dd, f, g );
498}
#define Cloud_Regular(p)
Definition cloud.h:185
@ CLOUD_OPER_AND
Definition cloud.h:62
#define CLOUD_ASSERT(p)
Definition cloud.h:216
Here is the caller graph for this function:

◆ Cloud_bddOr()

CloudNode * Cloud_bddOr ( CloudManager * dd,
CloudNode * f,
CloudNode * g )

Function********************************************************************

Synopsis [Performs the OR or two BDDs]

Description []

SideEffects []

SeeAlso []

Definition at line 511 of file cloud.c.

512{
513 CloudNode * res;
514 if ( Cloud_Regular(f) == NULL || Cloud_Regular(g) == NULL )
515 return NULL;
516 CLOUD_ASSERT(f);
517 CLOUD_ASSERT(g);
518 if ( dd->tCaches[CLOUD_OPER_AND] == NULL )
519 cloudCacheAllocate( dd, CLOUD_OPER_AND );
520 res = cloudBddAnd_gate( dd, Cloud_Not(f), Cloud_Not(g) );
521 res = Cloud_NotCond( res, res != NULL );
522 return res;
523}
struct cloudNode CloudNode
Definition cloud.h:55
#define Cloud_NotCond(p, c)
Definition cloud.h:187
#define Cloud_Not(p)
Definition cloud.h:186
Here is the caller graph for this function:

◆ Cloud_bddPrint()

void Cloud_bddPrint ( CloudManager * dd,
CloudNode * Func )

Function********************************************************************

Synopsis [Prints the BDD as a set of disjoint cubes to the standard output.]

Description []

SideEffects []

Definition at line 866 of file cloud.c.

867{
868 CloudNode * Cube;
869 int fFirst = 1;
870
871 if ( Func == dd->zero )
872 printf( "Constant 0." );
873 else if ( Func == dd->one )
874 printf( "Constant 1." );
875 else
876 {
877 while ( 1 )
878 {
879 Cube = Cloud_GetOneCube( dd, Func );
880 if ( Cube == NULL || Cube == dd->zero )
881 break;
882 if ( fFirst ) fFirst = 0;
883 else printf( " + " );
885 Func = Cloud_bddAnd( dd, Func, Cloud_Not(Cube) );
886 }
887 }
888 printf( "\n" );
889}
CloudNode * Cloud_bddAnd(CloudManager *dd, CloudNode *f, CloudNode *g)
Definition cloud.c:489
CloudNode * Cloud_GetOneCube(CloudManager *dd, CloudNode *bFunc)
Definition cloud.c:817
void Cloud_bddPrintCube(CloudManager *dd, CloudNode *bCube)
Definition cloud.c:900
struct cube Cube
Here is the call graph for this function:

◆ Cloud_bddPrintCube()

void Cloud_bddPrintCube ( CloudManager * dd,
CloudNode * bCube )

Function********************************************************************

Synopsis [Prints one cube.]

Description []

SideEffects []

Definition at line 900 of file cloud.c.

901{
902 CloudNode * bCube0, * bCube1;
903
904 assert( !Cloud_IsConstant(bCube) );
905 while ( 1 )
906 {
907 // get the node structure
908 if ( Cloud_IsConstant(bCube) )
909 break;
910
911 // cofactor the cube
912 if ( Cloud_IsComplement(bCube) )
913 {
914 bCube0 = Cloud_Not( cloudE(bCube) );
915 bCube1 = Cloud_Not( cloudT(bCube) );
916 }
917 else
918 {
919 bCube0 = cloudE(bCube);
920 bCube1 = cloudT(bCube);
921 }
922
923 if ( bCube0 != dd->zero )
924 {
925 assert( bCube1 == dd->zero );
926 printf( "[%d]'", cloudV(bCube) );
927 bCube = bCube0;
928 }
929 else
930 {
931 assert( bCube1 != dd->zero );
932 printf( "[%d]", cloudV(bCube) );
933 bCube = bCube1;
934 }
935 }
936}
#define cloudE(p)
Definition cloud.h:199
#define Cloud_IsConstant(p)
Definition cloud.h:190
#define cloudT(p)
Definition cloud.h:200
#define Cloud_IsComplement(p)
Definition cloud.h:188
#define cloudV(p)
Definition cloud.h:198
#define assert(ex)
Definition util_old.h:213
Here is the caller graph for this function:

◆ Cloud_bddXor()

CloudNode * Cloud_bddXor ( CloudManager * dd,
CloudNode * f,
CloudNode * g )

Function********************************************************************

Synopsis [Performs the XOR or two BDDs]

Description []

SideEffects []

SeeAlso []

Definition at line 536 of file cloud.c.

537{
538 CloudNode * t0, * t1, * r;
539 if ( Cloud_Regular(f) == NULL || Cloud_Regular(g) == NULL )
540 return NULL;
541 CLOUD_ASSERT(f);
542 CLOUD_ASSERT(g);
543 if ( dd->tCaches[CLOUD_OPER_AND] == NULL )
544 cloudCacheAllocate( dd, CLOUD_OPER_AND );
545 t0 = cloudBddAnd_gate( dd, f, Cloud_Not(g) );
546 if ( t0 == NULL )
547 return NULL;
548 t1 = cloudBddAnd_gate( dd, Cloud_Not(f), g );
549 if ( t1 == NULL )
550 return NULL;
551 r = Cloud_bddOr( dd, t0, t1 );
552 return r;
553}
CloudNode * Cloud_bddOr(CloudManager *dd, CloudNode *f, CloudNode *g)
Definition cloud.c:511
Here is the call graph for this function:

◆ Cloud_CacheAllocate()

void Cloud_CacheAllocate ( CloudManager * dd,
CloudOper oper,
int logratio )

Function********************************************************************

Synopsis [This optional function allocates operation cache of the given size.]

Description [Cache for each operation is allocated independently when the first operation of the given type is performed. The user can allocate cache of his/her preferred size by calling Cloud_CacheAllocate before the first operation of the given type is performed, but this call is optional. Argument "logratio" gives the binary logarithm of the ratio of the size of the unique table to that of cache. For example, if "logratio" is equal to 3, and the unique table will be 2^3=8 times larger than cache; so, if unique table is 2^23 = 8,388,608 nodes, the cache size will be 2^3=8 times smaller and equal to 2^20 = 1,048,576 entries.]

SideEffects []

SeeAlso []

Definition at line 195 of file cloud.c.

196{
197 assert( logratio > 0 ); // cache cannot be larger than the unique table
198 assert( logratio < dd->bitsNode ); // cache cannot be smaller than 2 entries
199
200 if ( logratio )
201 {
202 dd->bitsCache[oper] = dd->bitsNode - logratio;
203 dd->shiftCache[oper] = 8*sizeof(unsigned) - dd->bitsCache[oper];
204 }
205 cloudCacheAllocate( dd, oper );
206}

◆ Cloud_DagCollect()

int Cloud_DagCollect ( CloudManager * dd,
CloudNode * n )

Function********************************************************************

Synopsis [Counts the number of nodes in a DD.]

Description [Counts the number of nodes in a DD. Returns the number of nodes in the graph rooted at node.]

SideEffects []

SeeAlso []

Definition at line 772 of file cloud.c.

773{
774 int res, Counter = 0;
775 if ( dd->ppNodes == NULL )
776 dd->ppNodes = ABC_ALLOC( CloudNode *, dd->nNodesLimit );
777 res = Cloud_DagCollect_rec( dd, Cloud_Regular( n ), &Counter );
778 cloudClearMark( dd, Cloud_Regular( n ) );
779 assert( res == Counter );
780 return res;
781
782}
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
Here is the caller graph for this function:

◆ Cloud_DagSize()

int Cloud_DagSize ( CloudManager * dd,
CloudNode * n )

Function********************************************************************

Synopsis [Counts the number of nodes in a DD.]

Description [Counts the number of nodes in a DD. Returns the number of nodes in the graph rooted at node.]

SideEffects []

SeeAlso []

Definition at line 721 of file cloud.c.

722{
723 int res;
724 res = cloudDagSize( dd, Cloud_Regular( n ) );
725 cloudClearMark( dd, Cloud_Regular( n ) );
726 return res;
727
728}
Here is the caller graph for this function:

◆ Cloud_GetOneCube()

CloudNode * Cloud_GetOneCube ( CloudManager * dd,
CloudNode * bFunc )

Function********************************************************************

Synopsis [Returns one cube contained in the given BDD.]

Description []

SideEffects []

Definition at line 817 of file cloud.c.

818{
819 CloudNode * bFunc0, * bFunc1, * res;
820
821 if ( Cloud_IsConstant(bFunc) )
822 return bFunc;
823
824 // cofactor
825 if ( Cloud_IsComplement(bFunc) )
826 {
827 bFunc0 = Cloud_Not( cloudE(bFunc) );
828 bFunc1 = Cloud_Not( cloudT(bFunc) );
829 }
830 else
831 {
832 bFunc0 = cloudE(bFunc);
833 bFunc1 = cloudT(bFunc);
834 }
835
836 // try to find the cube with the negative literal
837 res = Cloud_GetOneCube( dd, bFunc0 );
838 if ( res == NULL )
839 return NULL;
840
841 if ( res != dd->zero )
842 {
843 res = Cloud_bddAnd( dd, res, Cloud_Not(dd->vars[Cloud_V(bFunc)]) );
844 }
845 else
846 {
847 // try to find the cube with the positive literal
848 res = Cloud_GetOneCube( dd, bFunc1 );
849 if ( res == NULL )
850 return NULL;
851 assert( res != dd->zero );
852 res = Cloud_bddAnd( dd, res, dd->vars[Cloud_V(bFunc)] );
853 }
854 return res;
855}
#define Cloud_V(p)
Definition cloud.h:194
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Cloud_Init()

CloudManager * Cloud_Init ( int nVars,
int nBits )

FUNCTION DEFINITIONS ///.

FUNCTION DECLARATIONS ///.

Function********************************************************************

Synopsis [Starts the cloud manager.]

Description [The first arguments is the number of elementary variables used. The second arguments is the number of bits of the unsigned integer used to represent nodes in the unique table. If the second argument is 0, the package assumes 23 to represent nodes, which is equivalent to 2^23 = 8,388,608 nodes.]

SideEffects []

SeeAlso []

Definition at line 70 of file cloud.c.

71{
72 CloudManager * dd;
73 int i;
74 abctime clk1, clk2;
75
76 assert( nVars <= 100000 );
77 assert( nBits < 32 );
78
79 // assign the defaults
80 if ( nBits == 0 )
81 nBits = CLOUD_NODE_BITS;
82
83 // start the manager
84 dd = ABC_CALLOC( CloudManager, 1 );
85 dd->nMemUsed += sizeof(CloudManager);
86
87 // variables
88 dd->nVars = nVars; // the number of variables allocated
89 // bits
90 dd->bitsNode = nBits; // the number of bits used for the node
91 for ( i = 0; i < CacheOperNum; i++ )
92 dd->bitsCache[i] = nBits - CacheLogRatioDefault[i];
93 // shifts
94 dd->shiftUnique = 8*sizeof(unsigned) - (nBits + 1); // gets node index in the hash table
95 for ( i = 0; i < CacheOperNum; i++ )
96 dd->shiftCache[i] = 8*sizeof(unsigned) - dd->bitsCache[i];
97 // nodes
98 dd->nNodesAlloc = (1 << (nBits + 1)); // 2 ^ (nBits + 1)
99 dd->nNodesLimit = (1 << nBits); // 2 ^ nBits
100
101 // unique table
102clk1 = Abc_Clock();
103 dd->tUnique = ABC_CALLOC( CloudNode, dd->nNodesAlloc );
104 dd->nMemUsed += sizeof(CloudNode) * dd->nNodesAlloc;
105clk2 = Abc_Clock();
106//ABC_PRT( "calloc() time", clk2 - clk1 );
107
108 // set up the constant node (the only node that is not in the hash table)
109 dd->nSignCur = 1;
110 dd->tUnique[0].s = dd->nSignCur;
111 dd->tUnique[0].v = CLOUD_CONST_INDEX;
112 dd->tUnique[0].e = NULL;
113 dd->tUnique[0].t = NULL;
114 dd->one = dd->tUnique;
115 dd->zero = Cloud_Not(dd->one);
116 dd->nNodesCur = 1;
117
118 // special nodes
119 dd->pNodeStart = dd->tUnique + 1;
120 dd->pNodeEnd = dd->tUnique + dd->nNodesAlloc;
121
122 // set up the elementary variables
123 dd->vars = ABC_ALLOC( CloudNode *, dd->nVars );
124 dd->nMemUsed += sizeof(CloudNode *) * dd->nVars;
125 for ( i = 0; i < dd->nVars; i++ )
126 dd->vars[i] = cloudMakeNode( dd, i, dd->one, dd->zero );
127
128 return dd;
129};
ABC_INT64_T abctime
Definition abc_global.h:332
#define ABC_CALLOC(type, num)
Definition abc_global.h:265
typedefABC_NAMESPACE_HEADER_START struct cloudManager CloudManager
Definition cloud.h:52
#define CLOUD_NODE_BITS
Definition cloud.h:167
#define CLOUD_CONST_INDEX
Definition cloud.h:169
Here is the caller graph for this function:

◆ Cloud_MakeNode()

CloudNode * Cloud_MakeNode ( CloudManager * dd,
CloudVar v,
CloudNode * t,
CloudNode * e )

Function********************************************************************

Synopsis [Returns or creates a new node]

Description [Checks the unique table for the existance of the node. If the node is present, returns the node. If the node is absent, creates a new node.]

SideEffects []

SeeAlso []

Definition at line 254 of file cloud.c.

255{
256 CloudNode * pRes;
257 CLOUD_ASSERT(t);
258 CLOUD_ASSERT(e);
259 assert( v < Cloud_V(t) && v < Cloud_V(e) ); // variable should be above in the order
260 if ( Cloud_IsComplement(t) )
261 {
262 pRes = cloudMakeNode( dd, v, Cloud_Not(t), Cloud_Not(e) );
263 if ( pRes != NULL )
264 pRes = Cloud_Not(pRes);
265 }
266 else
267 pRes = cloudMakeNode( dd, v, t, e );
268 return pRes;
269}
Here is the caller graph for this function:

◆ Cloud_PrintHashTable()

void Cloud_PrintHashTable ( CloudManager * dd)

Function********************************************************************

Synopsis [Prints the state of the hash table.]

Description []

SideEffects []

SeeAlso []

Definition at line 975 of file cloud.c.

976{
977 int i;
978
979 for ( i = 0; i < dd->nNodesAlloc; i++ )
980 if ( dd->tUnique[i].v == CLOUD_CONST_INDEX )
981 printf( "-" );
982 else
983 printf( "+" );
984 printf( "\n" );
985}

◆ Cloud_PrintInfo()

void Cloud_PrintInfo ( CloudManager * dd)

Function********************************************************************

Synopsis [Prints info.]

Description []

SideEffects []

SeeAlso []

Definition at line 950 of file cloud.c.

951{
952 if ( dd == NULL ) return;
953 printf( "The number of unique table nodes allocated = %12d.\n", dd->nNodesAlloc );
954 printf( "The number of unique table nodes present = %12d.\n", dd->nNodesCur );
955 printf( "The number of unique table hits = %12d.\n", dd->nUniqueHits );
956 printf( "The number of unique table misses = %12d.\n", dd->nUniqueMisses );
957 printf( "The number of unique table steps = %12d.\n", dd->nUniqueSteps );
958 printf( "The number of cache hits = %12d.\n", dd->nCacheHits );
959 printf( "The number of cache misses = %12d.\n", dd->nCacheMisses );
960 printf( "The current signature = %12d.\n", dd->nSignCur );
961 printf( "The total memory in use = %12d.\n", dd->nMemUsed );
962}

◆ Cloud_Quit()

void Cloud_Quit ( CloudManager * dd)

Function********************************************************************

Synopsis [Stops the cloud manager.]

Description [The first arguments tells show many elementary variables are used. The second arguments tells how many bits of the unsigned integer are used to represent regular nodes in the unique table.]

SideEffects []

SeeAlso []

Definition at line 144 of file cloud.c.

145{
146 int i;
147 ABC_FREE( dd->ppNodes );
148 ABC_FREE( dd->tUnique );
149 ABC_FREE( dd->vars );
150 for ( i = 0; i < 4; i++ )
151 ABC_FREE( dd->tCaches[i] );
152 ABC_FREE( dd );
153}
#define ABC_FREE(obj)
Definition abc_global.h:267
Here is the caller graph for this function:

◆ Cloud_Restart()

void Cloud_Restart ( CloudManager * dd)

Function********************************************************************

Synopsis [Prepares the manager for another run.]

Description []

SideEffects []

SeeAlso []

Definition at line 166 of file cloud.c.

167{
168 int i;
169 assert( dd->one->s == dd->nSignCur );
170 dd->nSignCur++;
171 dd->one->s++;
172 for ( i = 0; i < dd->nVars; i++ )
173 dd->vars[i]->s++;
174 dd->nNodesCur = 1 + dd->nVars;
175}
Here is the caller graph for this function:

◆ Cloud_SharingSize()

int Cloud_SharingSize ( CloudManager * dd,
CloudNode ** pn,
int nn )

Function********************************************************************

Synopsis [Counts the number of nodes in an array of DDs.]

Description [Counts the number of nodes in a DD. Returns the number of nodes in the graph rooted at node.]

SideEffects []

SeeAlso []

Definition at line 796 of file cloud.c.

797{
798 int res, i;
799 res = 0;
800 for ( i = 0; i < nn; i++ )
801 res += cloudDagSize( dd, Cloud_Regular( pn[i] ) );
802 for ( i = 0; i < nn; i++ )
803 cloudClearMark( dd, Cloud_Regular( pn[i] ) );
804 return res;
805}

◆ Cloud_Support()

CloudNode * Cloud_Support ( CloudManager * dd,
CloudNode * n )

Function********************************************************************

Synopsis [Finds the variables on which a DD depends.]

Description [Finds the variables on which a DD depends. Returns a BDD consisting of the product of the variables if successful; NULL otherwise.]

SideEffects [None]

SeeAlso []

Definition at line 618 of file cloud.c.

619{
620 CloudNode * res;
621 int * support, i;
622
623 CLOUD_ASSERT(n);
624
625 // allocate and initialize support array for cloudSupport
626 support = ABC_CALLOC( int, dd->nVars );
627
628 // compute support and clean up markers
629 cloudSupport( dd, Cloud_Regular(n), support );
630 cloudClearMark( dd, Cloud_Regular(n) );
631
632 // transform support from array to cube
633 res = dd->one;
634 for ( i = dd->nVars - 1; i >= 0; i-- ) // for each level bottom-up
635 if ( support[i] == 1 )
636 {
637 res = Cloud_bddAnd( dd, res, dd->vars[i] );
638 if ( res == NULL )
639 break;
640 }
641 ABC_FREE( support );
642 return res;
643}
Here is the call graph for this function:

◆ Cloud_SupportSize()

int Cloud_SupportSize ( CloudManager * dd,
CloudNode * n )

Function********************************************************************

Synopsis [Counts the variables on which a DD depends.]

Description [Counts the variables on which a DD depends. Returns the number of the variables if successful; Cloud_OUT_OF_MEM otherwise.]

SideEffects [None]

SeeAlso []

Definition at line 658 of file cloud.c.

659{
660 int * support, i, count;
661
662 CLOUD_ASSERT(n);
663
664 // allocate and initialize support array for cloudSupport
665 support = ABC_CALLOC( int, dd->nVars );
666
667 // compute support and clean up markers
668 cloudSupport( dd, Cloud_Regular(n), support );
669 cloudClearMark( dd, Cloud_Regular(n) );
670
671 // count support variables
672 count = 0;
673 for ( i = 0; i < dd->nVars; i++ )
674 {
675 if ( support[i] == 1 )
676 count++;
677 }
678
679 ABC_FREE( support );
680 return count;
681}

◆ cloudBddAnd()

CloudNode * cloudBddAnd ( CloudManager * dd,
CloudNode * f,
CloudNode * g )

Function********************************************************************

Synopsis [Performs the AND or two BDDs]

Description []

SideEffects []

SeeAlso []

Definition at line 343 of file cloud.c.

344{
345 CloudNode * F, * G, * r;
346 CloudCacheEntry2 * cacheEntry;
347 CloudNode * fv, * fnv, * gv, * gnv, * t, * e;
349
350 assert( f <= g );
351
352 // terminal cases
353 F = Cloud_Regular(f);
354 G = Cloud_Regular(g);
355 if ( F == G )
356 {
357 if ( f == g )
358 return f;
359 else
360 return dd->zero;
361 }
362 if ( F == dd->one )
363 {
364 if ( f == dd->one )
365 return g;
366 else
367 return f;
368 }
369
370 // check cache
371 cacheEntry = dd->tCaches[CLOUD_OPER_AND] + cloudHashCudd2(f, g, dd->shiftCache[CLOUD_OPER_AND]);
372// cacheEntry = dd->tCaches[CLOUD_OPER_AND] + cloudHashBuddy2(f, g, dd->shiftCache[CLOUD_OPER_AND]);
373 r = cloudCacheLookup2( cacheEntry, dd->nSignCur, f, g );
374 if ( r != NULL )
375 {
376 dd->nCacheHits++;
377 return r;
378 }
379 dd->nCacheMisses++;
380
381
382 // compute cofactors
383 if ( cloudV(F) <= cloudV(G) )
384 {
385 var = cloudV(F);
386 if ( Cloud_IsComplement(f) )
387 {
388 fnv = Cloud_Not(cloudE(F));
389 fv = Cloud_Not(cloudT(F));
390 }
391 else
392 {
393 fnv = cloudE(F);
394 fv = cloudT(F);
395 }
396 }
397 else
398 {
399 var = cloudV(G);
400 fv = fnv = f;
401 }
402
403 if ( cloudV(G) <= cloudV(F) )
404 {
405 if ( Cloud_IsComplement(g) )
406 {
407 gnv = Cloud_Not(cloudE(G));
408 gv = Cloud_Not(cloudT(G));
409 }
410 else
411 {
412 gnv = cloudE(G);
413 gv = cloudT(G);
414 }
415 }
416 else
417 {
418 gv = gnv = g;
419 }
420
421 if ( fv <= gv )
422 t = cloudBddAnd( dd, fv, gv );
423 else
424 t = cloudBddAnd( dd, gv, fv );
425
426 if ( t == NULL )
427 return NULL;
428
429 if ( fnv <= gnv )
430 e = cloudBddAnd( dd, fnv, gnv );
431 else
432 e = cloudBddAnd( dd, gnv, fnv );
433
434 if ( e == NULL )
435 return NULL;
436
437 if ( t == e )
438 r = t;
439 else
440 {
441 if ( Cloud_IsComplement(t) )
442 {
443 r = cloudMakeNode( dd, var, Cloud_Not(t), Cloud_Not(e) );
444 if ( r == NULL )
445 return NULL;
446 r = Cloud_Not(r);
447 }
448 else
449 {
450 r = cloudMakeNode( dd, var, t, e );
451 if ( r == NULL )
452 return NULL;
453 }
454 }
455 cloudCacheInsert2( cacheEntry, dd->nSignCur, f, g, r );
456 return r;
457}
CloudNode * cloudBddAnd(CloudManager *dd, CloudNode *f, CloudNode *g)
Definition cloud.c:343
#define cloudCacheLookup2(p, sign, f, g)
Definition cloud.h:208
unsigned CloudVar
Definition cloud.h:53
#define cloudCacheInsert2(p, sign, f, g, r)
Definition cloud.h:212
struct cloudCacheEntry2 CloudCacheEntry2
Definition cloud.h:57
#define cloudHashCudd2(f, g, s)
Definition cloud.h:181
unsigned short var
Definition giaNewBdd.h:35
Here is the call graph for this function:
Here is the caller graph for this function: