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

Go to the source code of this file.

Classes

struct  Extra_ImageTree_t_
 
struct  Extra_ImageNode_t_
 
struct  Extra_ImagePart_t_
 
struct  Extra_ImageVar_t_
 
struct  Extra_ImageTree2_t_
 

Typedefs

typedef typedefABC_NAMESPACE_IMPL_START struct Extra_ImageNode_t_ Extra_ImageNode_t
 
typedef struct Extra_ImagePart_t_ Extra_ImagePart_t
 
typedef struct Extra_ImageVar_t_ Extra_ImageVar_t
 

Functions

Extra_ImageTree_tExtra_bddImageStart (DdManager *dd, DdNode *bCare, int nParts, DdNode **pbParts, int nVars, DdNode **pbVars, int fVerbose)
 
DdNode * Extra_bddImageCompute (Extra_ImageTree_t *pTree, DdNode *bCare)
 
void Extra_bddImageTreeDelete (Extra_ImageTree_t *pTree)
 
DdNode * Extra_bddImageRead (Extra_ImageTree_t *pTree)
 
Extra_ImageTree2_tExtra_bddImageStart2 (DdManager *dd, DdNode *bCare, int nParts, DdNode **pbParts, int nVars, DdNode **pbVars, int fVerbose)
 
DdNode * Extra_bddImageCompute2 (Extra_ImageTree2_t *pTree, DdNode *bCare)
 
void Extra_bddImageTreeDelete2 (Extra_ImageTree2_t *pTree)
 
DdNode * Extra_bddImageRead2 (Extra_ImageTree2_t *pTree)
 

Typedef Documentation

◆ Extra_ImageNode_t

typedef typedefABC_NAMESPACE_IMPL_START struct Extra_ImageNode_t_ Extra_ImageNode_t

CFile****************************************************************

FileName [extraBddImage.c]

PackageName [extra]

Synopsis [Various reusable software utilities.]

Author [Alan Mishchenko]

Affiliation [UC Berkeley]

Date [Ver. 1.0. Started - September 1, 2003.]

Revision [

Id
extraBddImage.c,v 1.0 2003/09/01 00:00:00 alanmi Exp

]

Definition at line 39 of file extraBddImage.c.

◆ Extra_ImagePart_t

Definition at line 40 of file extraBddImage.c.

◆ Extra_ImageVar_t

Definition at line 41 of file extraBddImage.c.

Function Documentation

◆ Extra_bddImageCompute()

DdNode * Extra_bddImageCompute ( Extra_ImageTree_t * pTree,
DdNode * bCare )

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

Synopsis [Compute the image.]

Description []

SideEffects []

SeeAlso []

Definition at line 220 of file extraBddImage.c.

221{
222 DdManager * dd = pTree->pCare->dd;
223 DdNode * bSupp, * bRem;
224
225 pTree->nIter++;
226
227 // make sure the supports are okay
228 bSupp = Cudd_Support( dd, bCare ); Cudd_Ref( bSupp );
229 if ( bSupp != pTree->bCareSupp )
230 {
231 bRem = Cudd_bddExistAbstract( dd, bSupp, pTree->bCareSupp ); Cudd_Ref( bRem );
232 if ( bRem != b1 )
233 {
234printf( "Original care set support: " );
235ABC_PRB( dd, pTree->bCareSupp );
236printf( "Current care set support: " );
237ABC_PRB( dd, bSupp );
238 Cudd_RecursiveDeref( dd, bSupp );
239 Cudd_RecursiveDeref( dd, bRem );
240 printf( "The care set depends on some vars that were not in the care set during scheduling.\n" );
241 return NULL;
242 }
243 Cudd_RecursiveDeref( dd, bRem );
244 }
245 Cudd_RecursiveDeref( dd, bSupp );
246
247 // remove the previous image
248 Cudd_RecursiveDeref( dd, pTree->pCare->bImage );
249 pTree->pCare->bImage = bCare; Cudd_Ref( bCare );
250
251 // compute the image
252 pTree->nNodesMax = 0;
253 Extra_bddImageCompute_rec( pTree, pTree->pRoot );
254 if ( pTree->nNodesMaxT < pTree->nNodesMax )
255 pTree->nNodesMaxT = pTree->nNodesMax;
256
257// if ( pTree->fVerbose )
258// printf( "Iter %2d : Max nodes = %5d.\n", pTree->nIter, pTree->nNodesMax );
259 return pTree->pRoot->bImage;
260}
#define b1
Definition bbrImage.c:97
#define ABC_PRB(dd, f)
Definition bbrImage.c:100
Extra_ImageNode_t * pCare
Extra_ImageNode_t * pRoot

◆ Extra_bddImageCompute2()

DdNode * Extra_bddImageCompute2 ( Extra_ImageTree2_t * pTree,
DdNode * bCare )

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

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 1108 of file extraBddImage.c.

1109{
1110 if ( pTree->bImage )
1111 Cudd_RecursiveDeref( pTree->dd, pTree->bImage );
1112 pTree->bImage = Cudd_bddAndAbstract( pTree->dd, pTree->bRel, bCare, pTree->bCube );
1113 Cudd_Ref( pTree->bImage );
1114 return pTree->bImage;
1115}
Here is the caller graph for this function:

◆ Extra_bddImageRead()

DdNode * Extra_bddImageRead ( Extra_ImageTree_t * pTree)

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

Synopsis [Reads the image from the tree.]

Description []

SideEffects []

SeeAlso []

Definition at line 292 of file extraBddImage.c.

293{
294 return pTree->pRoot->bImage;
295}

◆ Extra_bddImageRead2()

DdNode * Extra_bddImageRead2 ( Extra_ImageTree2_t * pTree)

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

Synopsis [Returns the previously computed image.]

Description []

SideEffects []

SeeAlso []

Definition at line 1150 of file extraBddImage.c.

1151{
1152 return pTree->bImage;
1153}

◆ Extra_bddImageStart()

Extra_ImageTree_t * Extra_bddImageStart ( DdManager * dd,
DdNode * bCare,
int nParts,
DdNode ** pbParts,
int nVars,
DdNode ** pbVars,
int fVerbose )

AutomaticEnd Function*************************************************************

Synopsis [Starts the image computation using tree-based scheduling.]

Description [This procedure starts the image computation. It uses the given care set to test-run the image computation and creates the quantification tree by scheduling variable quantifications. The tree can be used to compute images for other care sets without rescheduling. In this case, Extra_bddImageCompute() should be called.]

SideEffects []

SeeAlso []

Definition at line 156 of file extraBddImage.c.

160{
161 Extra_ImageTree_t * pTree;
162 Extra_ImagePart_t ** pParts;
163 Extra_ImageVar_t ** pVars;
164 Extra_ImageNode_t ** pNodes;
165 int v;
166
167 if ( fVerbose && dd->size <= 80 )
168 Extra_bddImagePrintLatchDependency( dd, bCare, nParts, pbParts, nVars, pbVars );
169
170 // create variables, partitions and leaf nodes
171 pParts = Extra_CreateParts( dd, nParts, pbParts, bCare );
172 pVars = Extra_CreateVars( dd, nParts + 1, pParts, nVars, pbVars );
173 pNodes = Extra_CreateNodes( dd, nParts + 1, pParts, dd->size, pVars );
174
175 // create the tree
176 pTree = ABC_ALLOC( Extra_ImageTree_t, 1 );
177 memset( pTree, 0, sizeof(Extra_ImageTree_t) );
178 pTree->pCare = pNodes[nParts];
179 pTree->fVerbose = fVerbose;
180
181 // process the nodes
182 while ( Extra_BuildTreeNode( dd, nParts + 1, pNodes, dd->size, pVars ) );
183
184 // make sure the variables are gone
185 for ( v = 0; v < dd->size; v++ )
186 assert( pVars[v] == NULL );
187 ABC_FREE( pVars );
188
189 // merge the topmost nodes
190 while ( (pTree->pRoot = Extra_MergeTopNodes( dd, nParts + 1, pNodes )) == NULL );
191
192 // make sure the nodes are gone
193 for ( v = 0; v < nParts + 1; v++ )
194 assert( pNodes[v] == NULL );
195 ABC_FREE( pNodes );
196
197// if ( fVerbose )
198// Extra_bddImagePrintTree( pTree );
199
200 // set the support of the care set
201 pTree->bCareSupp = Cudd_Support( dd, bCare ); Cudd_Ref( pTree->bCareSupp );
202
203 // clean the partitions
204 Extra_DeleteParts_rec( pTree->pRoot );
205 ABC_FREE( pParts );
206 return pTree;
207}
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
#define ABC_FREE(obj)
Definition abc_global.h:267
struct Extra_ImageVar_t_ Extra_ImageVar_t
typedefABC_NAMESPACE_IMPL_START struct Extra_ImageNode_t_ Extra_ImageNode_t
struct Extra_ImagePart_t_ Extra_ImagePart_t
struct Extra_ImageTree_t_ Extra_ImageTree_t
Definition extraBdd.h:146
#define assert(ex)
Definition util_old.h:213
char * memset()
Here is the call graph for this function:

◆ Extra_bddImageStart2()

Extra_ImageTree2_t * Extra_bddImageStart2 ( DdManager * dd,
DdNode * bCare,
int nParts,
DdNode ** pbParts,
int nVars,
DdNode ** pbVars,
int fVerbose )

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

Synopsis [Starts the monolithic image computation.]

Description []

SideEffects []

SeeAlso []

Definition at line 1066 of file extraBddImage.c.

1070{
1071 Extra_ImageTree2_t * pTree;
1072 DdNode * bCubeAll, * bCubeNot, * bTemp;
1073 int i;
1074
1075 pTree = ABC_ALLOC( Extra_ImageTree2_t, 1 );
1076 pTree->dd = dd;
1077 pTree->bImage = NULL;
1078
1079 bCubeAll = Extra_bddComputeCube( dd, dd->vars, dd->size ); Cudd_Ref( bCubeAll );
1080 bCubeNot = Extra_bddComputeCube( dd, pbVars, nVars ); Cudd_Ref( bCubeNot );
1081 pTree->bCube = Cudd_bddExistAbstract( dd, bCubeAll, bCubeNot ); Cudd_Ref( pTree->bCube );
1082 Cudd_RecursiveDeref( dd, bCubeAll );
1083 Cudd_RecursiveDeref( dd, bCubeNot );
1084
1085 // derive the monolithic relation
1086 pTree->bRel = b1; Cudd_Ref( pTree->bRel );
1087 for ( i = 0; i < nParts; i++ )
1088 {
1089 pTree->bRel = Cudd_bddAnd( dd, bTemp = pTree->bRel, pbParts[i] ); Cudd_Ref( pTree->bRel );
1090 Cudd_RecursiveDeref( dd, bTemp );
1091 }
1092 Extra_bddImageCompute2( pTree, bCare );
1093 return pTree;
1094}
DdNode * Extra_bddImageCompute2(Extra_ImageTree2_t *pTree, DdNode *bCare)
DdNode * Extra_bddComputeCube(DdManager *dd, DdNode **bXVars, int nVars)
struct Extra_ImageTree2_t_ Extra_ImageTree2_t
Definition extraBdd.h:155
Here is the call graph for this function:

◆ Extra_bddImageTreeDelete()

void Extra_bddImageTreeDelete ( Extra_ImageTree_t * pTree)

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

Synopsis [Delete the tree.]

Description []

SideEffects []

SeeAlso []

Definition at line 273 of file extraBddImage.c.

274{
275 if ( pTree->bCareSupp )
276 Cudd_RecursiveDeref( pTree->pRoot->dd, pTree->bCareSupp );
277 Extra_bddImageTreeDelete_rec( pTree->pRoot );
278 ABC_FREE( pTree );
279}

◆ Extra_bddImageTreeDelete2()

void Extra_bddImageTreeDelete2 ( Extra_ImageTree2_t * pTree)

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

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 1128 of file extraBddImage.c.

1129{
1130 if ( pTree->bRel )
1131 Cudd_RecursiveDeref( pTree->dd, pTree->bRel );
1132 if ( pTree->bCube )
1133 Cudd_RecursiveDeref( pTree->dd, pTree->bCube );
1134 if ( pTree->bImage )
1135 Cudd_RecursiveDeref( pTree->dd, pTree->bImage );
1136 ABC_FREE( pTree );
1137}