ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
bbrImage.c File Reference
#include "bbr.h"
#include "bdd/mtr/mtr.h"
Include dependency graph for bbrImage.c:

Go to the source code of this file.

Classes

struct  Bbr_ImageTree_t_
 
struct  Bbr_ImageNode_t_
 
struct  Bbr_ImagePart_t_
 
struct  Bbr_ImageVar_t_
 
struct  Bbr_ImageTree2_t_
 

Macros

#define b0   Cudd_Not((dd)->one)
 
#define b1   (dd)->one
 
#define ABC_PRB(dd, f)
 

Typedefs

typedef typedefABC_NAMESPACE_IMPL_START struct Bbr_ImageNode_t_ Bbr_ImageNode_t
 
typedef struct Bbr_ImagePart_t_ Bbr_ImagePart_t
 
typedef struct Bbr_ImageVar_t_ Bbr_ImageVar_t
 

Functions

Bbr_ImageTree_tBbr_bddImageStart (DdManager *dd, DdNode *bCare, int nParts, DdNode **pbParts, int nVars, DdNode **pbVars, int nBddMax, int fVerbose)
 
DdNode * Bbr_bddImageCompute (Bbr_ImageTree_t *pTree, DdNode *bCare)
 
void Bbr_bddImageTreeDelete (Bbr_ImageTree_t *pTree)
 
DdNode * Bbr_bddImageRead (Bbr_ImageTree_t *pTree)
 
DdNode * Bbr_bddComputeCube (DdManager *dd, DdNode **bXVars, int nVars)
 
Bbr_ImageTree2_tBbr_bddImageStart2 (DdManager *dd, DdNode *bCare, int nParts, DdNode **pbParts, int nVars, DdNode **pbVars, int fVerbose)
 
DdNode * Bbr_bddImageCompute2 (Bbr_ImageTree2_t *pTree, DdNode *bCare)
 
void Bbr_bddImageTreeDelete2 (Bbr_ImageTree2_t *pTree)
 
DdNode * Bbr_bddImageRead2 (Bbr_ImageTree2_t *pTree)
 

Macro Definition Documentation

◆ ABC_PRB

#define ABC_PRB ( dd,
f )
Value:
printf("%s = ", #f); Bbr_bddPrint(dd,f); printf("\n")

Definition at line 100 of file bbrImage.c.

◆ b0

#define b0   Cudd_Not((dd)->one)

Definition at line 96 of file bbrImage.c.

◆ b1

#define b1   (dd)->one

Definition at line 97 of file bbrImage.c.

Typedef Documentation

◆ Bbr_ImageNode_t

typedef typedefABC_NAMESPACE_IMPL_START struct Bbr_ImageNode_t_ Bbr_ImageNode_t

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

FileName [bbrImage.c]

SystemName [ABC: Logic synthesis and verification system.]

PackageName [BDD-based reachability analysis.]

Synopsis [Performs image computation.]

Author [Alan Mishchenko]

Affiliation [UC Berkeley]

Date [Ver. 1.0. Started - June 20, 2005.]

Revision [

Id
bbrImage.c,v 1.00 2005/06/20 00:00:00 alanmi Exp

]

Definition at line 42 of file bbrImage.c.

◆ Bbr_ImagePart_t

Definition at line 43 of file bbrImage.c.

◆ Bbr_ImageVar_t

Definition at line 44 of file bbrImage.c.

Function Documentation

◆ Bbr_bddComputeCube()

DdNode * Bbr_bddComputeCube ( DdManager * dd,
DdNode ** bXVars,
int nVars )

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

Synopsis [Computes the positive polarty cube composed of the first vars in the array.]

Description []

SideEffects []

SeeAlso []

Definition at line 1191 of file bbrImage.c.

1192{
1193 DdNode * bRes;
1194 DdNode * bTemp;
1195 int i;
1196
1197 bRes = b1; Cudd_Ref( bRes );
1198 for ( i = 0; i < nVars; i++ )
1199 {
1200 bRes = Cudd_bddAnd( dd, bTemp = bRes, bXVars[i] ); Cudd_Ref( bRes );
1201 Cudd_RecursiveDeref( dd, bTemp );
1202 }
1203
1204 Cudd_Deref( bRes );
1205 return bRes;
1206}
#define b1
Definition bbrImage.c:97
Here is the caller graph for this function:

◆ Bbr_bddImageCompute()

DdNode * Bbr_bddImageCompute ( Bbr_ImageTree_t * pTree,
DdNode * bCare )

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

Synopsis [Compute the image.]

Description []

SideEffects []

SeeAlso []

Definition at line 253 of file bbrImage.c.

254{
255 DdManager * dd = pTree->pCare->dd;
256 DdNode * bSupp, * bRem;
257
258 pTree->nIter++;
259
260 // make sure the supports are okay
261 bSupp = Cudd_Support( dd, bCare ); Cudd_Ref( bSupp );
262 if ( bSupp != pTree->bCareSupp )
263 {
264 bRem = Cudd_bddExistAbstract( dd, bSupp, pTree->bCareSupp ); Cudd_Ref( bRem );
265 if ( bRem != b1 )
266 {
267printf( "Original care set support: " );
268ABC_PRB( dd, pTree->bCareSupp );
269printf( "Current care set support: " );
270ABC_PRB( dd, bSupp );
271 Cudd_RecursiveDeref( dd, bSupp );
272 Cudd_RecursiveDeref( dd, bRem );
273 printf( "The care set depends on some vars that were not in the care set during scheduling.\n" );
274 return NULL;
275 }
276 Cudd_RecursiveDeref( dd, bRem );
277 }
278 Cudd_RecursiveDeref( dd, bSupp );
279
280 // remove the previous image
281 Cudd_RecursiveDeref( dd, pTree->pCare->bImage );
282 pTree->pCare->bImage = bCare; Cudd_Ref( bCare );
283
284 // compute the image
285 pTree->nNodesMax = 0;
286 if ( !Bbr_bddImageCompute_rec( pTree, pTree->pRoot ) )
287 return NULL;
288 if ( pTree->nNodesMaxT < pTree->nNodesMax )
289 pTree->nNodesMaxT = pTree->nNodesMax;
290
291// if ( pTree->fVerbose )
292// printf( "Iter %2d : Max nodes = %5d.\n", pTree->nIter, pTree->nNodesMax );
293 return pTree->pRoot->bImage;
294}
#define ABC_PRB(dd, f)
Definition bbrImage.c:100
Bbr_ImageNode_t * pRoot
Definition bbrImage.c:48
DdNode * bCareSupp
Definition bbrImage.c:50
Bbr_ImageNode_t * pCare
Definition bbrImage.c:49
Here is the caller graph for this function:

◆ Bbr_bddImageCompute2()

DdNode * Bbr_bddImageCompute2 ( Bbr_ImageTree2_t * pTree,
DdNode * bCare )

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

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 1273 of file bbrImage.c.

1274{
1275 if ( pTree->bImage )
1276 Cudd_RecursiveDeref( pTree->dd, pTree->bImage );
1277 pTree->bImage = Cudd_bddAndAbstract( pTree->dd, pTree->bRel, bCare, pTree->bCube );
1278 Cudd_Ref( pTree->bImage );
1279 return pTree->bImage;
1280}
DdManager * dd
Definition bbrImage.c:1214
Here is the caller graph for this function:

◆ Bbr_bddImageRead()

DdNode * Bbr_bddImageRead ( Bbr_ImageTree_t * pTree)

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

Synopsis [Reads the image from the tree.]

Description []

SideEffects []

SeeAlso []

Definition at line 326 of file bbrImage.c.

327{
328 return pTree->pRoot->bImage;
329}

◆ Bbr_bddImageRead2()

DdNode * Bbr_bddImageRead2 ( Bbr_ImageTree2_t * pTree)

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

Synopsis [Returns the previously computed image.]

Description []

SideEffects []

SeeAlso []

Definition at line 1315 of file bbrImage.c.

1316{
1317 return pTree->bImage;
1318}

◆ Bbr_bddImageStart()

Bbr_ImageTree_t * Bbr_bddImageStart ( DdManager * dd,
DdNode * bCare,
int nParts,
DdNode ** pbParts,
int nVars,
DdNode ** pbVars,
int nBddMax,
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, Bbr_bddImageCompute() should be called.]

SideEffects []

SeeAlso []

Definition at line 168 of file bbrImage.c.

172{
173 Bbr_ImageTree_t * pTree;
174 Bbr_ImagePart_t ** pParts;
175 Bbr_ImageVar_t ** pVars;
176 Bbr_ImageNode_t ** pNodes, * pCare;
177 int fStop, v;
178
179 if ( fVerbose && dd->size <= 80 )
180 Bbr_bddImagePrintLatchDependency( dd, bCare, nParts, pbParts, nVars, pbVars );
181
182 // create variables, partitions and leaf nodes
183 pParts = Bbr_CreateParts( dd, nParts, pbParts, bCare );
184 pVars = Bbr_CreateVars( dd, nParts + 1, pParts, nVars, pbVars );
185 pNodes = Bbr_CreateNodes( dd, nParts + 1, pParts, dd->size, pVars );
186 pCare = pNodes[nParts];
187
188 // process the nodes
189 while ( Bbr_BuildTreeNode( dd, nParts + 1, pNodes, dd->size, pVars, &fStop, nBddMax ) );
190
191 // consider the case of BDD node blowup
192 if ( fStop )
193 {
194 for ( v = 0; v < dd->size; v++ )
195 if ( pVars[v] )
196 ABC_FREE( pVars[v] );
197 ABC_FREE( pVars );
198 for ( v = 0; v <= nParts; v++ )
199 if ( pNodes[v] )
200 {
201 Bbr_DeleteParts_rec( pNodes[v] );
202 Bbr_bddImageTreeDelete_rec( pNodes[v] );
203 }
204 ABC_FREE( pNodes );
205 ABC_FREE( pParts );
206 return NULL;
207 }
208
209 // make sure the variables are gone
210 for ( v = 0; v < dd->size; v++ )
211 assert( pVars[v] == NULL );
212 ABC_FREE( pVars );
213
214 // create the tree
215 pTree = ABC_ALLOC( Bbr_ImageTree_t, 1 );
216 memset( pTree, 0, sizeof(Bbr_ImageTree_t) );
217 pTree->pCare = pCare;
218 pTree->nBddMax = nBddMax;
219 pTree->fVerbose = fVerbose;
220
221 // merge the topmost nodes
222 while ( (pTree->pRoot = Bbr_MergeTopNodes( dd, nParts + 1, pNodes )) == NULL );
223
224 // make sure the nodes are gone
225 for ( v = 0; v < nParts + 1; v++ )
226 assert( pNodes[v] == NULL );
227 ABC_FREE( pNodes );
228
229// if ( fVerbose )
230// Bbr_bddImagePrintTree( pTree );
231
232 // set the support of the care set
233 pTree->bCareSupp = Cudd_Support( dd, bCare ); Cudd_Ref( pTree->bCareSupp );
234
235 // clean the partitions
236 Bbr_DeleteParts_rec( pTree->pRoot );
237 ABC_FREE( pParts );
238
239 return pTree;
240}
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
#define ABC_FREE(obj)
Definition abc_global.h:267
struct Bbr_ImageVar_t_ Bbr_ImageVar_t
Definition bbrImage.c:44
typedefABC_NAMESPACE_IMPL_START struct Bbr_ImageNode_t_ Bbr_ImageNode_t
Definition bbrImage.c:42
struct Bbr_ImagePart_t_ Bbr_ImagePart_t
Definition bbrImage.c:43
struct Bbr_ImageTree_t_ Bbr_ImageTree_t
FUNCTION DECLARATIONS ///.
Definition bbr.h:58
#define assert(ex)
Definition util_old.h:213
char * memset()
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Bbr_bddImageStart2()

Bbr_ImageTree2_t * Bbr_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 1231 of file bbrImage.c.

1235{
1236 Bbr_ImageTree2_t * pTree;
1237 DdNode * bCubeAll, * bCubeNot, * bTemp;
1238 int i;
1239
1240 pTree = ABC_ALLOC( Bbr_ImageTree2_t, 1 );
1241 pTree->dd = dd;
1242 pTree->bImage = NULL;
1243
1244 bCubeAll = Bbr_bddComputeCube( dd, dd->vars, dd->size ); Cudd_Ref( bCubeAll );
1245 bCubeNot = Bbr_bddComputeCube( dd, pbVars, nVars ); Cudd_Ref( bCubeNot );
1246 pTree->bCube = Cudd_bddExistAbstract( dd, bCubeAll, bCubeNot ); Cudd_Ref( pTree->bCube );
1247 Cudd_RecursiveDeref( dd, bCubeAll );
1248 Cudd_RecursiveDeref( dd, bCubeNot );
1249
1250 // derive the monolithic relation
1251 pTree->bRel = b1; Cudd_Ref( pTree->bRel );
1252 for ( i = 0; i < nParts; i++ )
1253 {
1254 pTree->bRel = Cudd_bddAnd( dd, bTemp = pTree->bRel, pbParts[i] ); Cudd_Ref( pTree->bRel );
1255 Cudd_RecursiveDeref( dd, bTemp );
1256 }
1257 Bbr_bddImageCompute2( pTree, bCare );
1258 return pTree;
1259}
DdNode * Bbr_bddImageCompute2(Bbr_ImageTree2_t *pTree, DdNode *bCare)
Definition bbrImage.c:1273
DdNode * Bbr_bddComputeCube(DdManager *dd, DdNode **bXVars, int nVars)
Definition bbrImage.c:1191
struct Bbr_ImageTree2_t_ Bbr_ImageTree2_t
Definition bbr.h:66
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Bbr_bddImageTreeDelete()

void Bbr_bddImageTreeDelete ( Bbr_ImageTree_t * pTree)

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

Synopsis [Delete the tree.]

Description []

SideEffects []

SeeAlso []

Definition at line 307 of file bbrImage.c.

308{
309 if ( pTree->bCareSupp )
310 Cudd_RecursiveDeref( pTree->pRoot->dd, pTree->bCareSupp );
311 Bbr_bddImageTreeDelete_rec( pTree->pRoot );
312 ABC_FREE( pTree );
313}
Here is the caller graph for this function:

◆ Bbr_bddImageTreeDelete2()

void Bbr_bddImageTreeDelete2 ( Bbr_ImageTree2_t * pTree)

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

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 1293 of file bbrImage.c.

1294{
1295 if ( pTree->bRel )
1296 Cudd_RecursiveDeref( pTree->dd, pTree->bRel );
1297 if ( pTree->bCube )
1298 Cudd_RecursiveDeref( pTree->dd, pTree->bCube );
1299 if ( pTree->bImage )
1300 Cudd_RecursiveDeref( pTree->dd, pTree->bImage );
1301 ABC_FREE( pTree );
1302}
Here is the caller graph for this function: