| /**CFile**************************************************************** |
| |
| FileName [dsdMan.c] |
| |
| PackageName [DSD: Disjoint-support decomposition package.] |
| |
| Synopsis [APIs of the DSD manager.] |
| |
| Author [Alan Mishchenko] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 8.0. Started - September 22, 2003.] |
| |
| Revision [$Id: dsdMan.c,v 1.0 2002/22/09 00:00:00 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "dsdInt.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// API OF DSD MANAGER /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**Function************************************************************* |
| |
| Synopsis [Starts the DSD manager.] |
| |
| Description [Takes the started BDD manager and the maximum support size |
| of the function to be DSD-decomposed. The manager should have at least as |
| many variables as there are variables in the support. The functions should |
| be expressed using the first nSuppSizeMax variables in the manager (these |
| may be ordered not necessarily on top of the manager).] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Dsd_Manager_t * Dsd_ManagerStart( DdManager * dd, int nSuppMax, int fVerbose ) |
| { |
| Dsd_Manager_t * dMan; |
| Dsd_Node_t * pNode; |
| int i; |
| |
| assert( nSuppMax <= dd->size ); |
| |
| dMan = ABC_ALLOC( Dsd_Manager_t, 1 ); |
| memset( dMan, 0, sizeof(Dsd_Manager_t) ); |
| dMan->dd = dd; |
| dMan->nInputs = nSuppMax; |
| dMan->fVerbose = fVerbose; |
| dMan->nRoots = 0; |
| dMan->nRootsAlloc = 50; |
| dMan->pRoots = (Dsd_Node_t **) ABC_ALLOC( char, dMan->nRootsAlloc * sizeof(Dsd_Node_t *) ); |
| dMan->pInputs = (Dsd_Node_t **) ABC_ALLOC( char, dMan->nInputs * sizeof(Dsd_Node_t *) ); |
| |
| // create the primary inputs and insert them into the table |
| dMan->Table = st__init_table( st__ptrcmp, st__ptrhash); |
| for ( i = 0; i < dMan->nInputs; i++ ) |
| { |
| pNode = Dsd_TreeNodeCreate( DSD_NODE_BUF, 1, 0 ); |
| pNode->G = dd->vars[i]; Cudd_Ref( pNode->G ); |
| pNode->S = dd->vars[i]; Cudd_Ref( pNode->S ); |
| st__insert( dMan->Table, (char*)dd->vars[i], (char*)pNode ); |
| dMan->pInputs[i] = pNode; |
| } |
| pNode = Dsd_TreeNodeCreate( DSD_NODE_CONST1, 0, 0 ); |
| pNode->G = b1; Cudd_Ref( pNode->G ); |
| pNode->S = b1; Cudd_Ref( pNode->S ); |
| st__insert( dMan->Table, (char*)b1, (char*)pNode ); |
| dMan->pConst1 = pNode; |
| |
| Dsd_CheckCacheAllocate( 5000 ); |
| return dMan; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Stops the DSD manager.] |
| |
| Description [Stopping the DSD manager automatically derefereces and |
| deallocates all the DSD nodes that were created during the life time |
| of the DSD manager. As a result, the user does not need to deref or |
| deallocate any DSD nodes or trees that are derived and placed in |
| the manager while it exists.] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Dsd_ManagerStop( Dsd_Manager_t * dMan ) |
| { |
| st__generator * gen; |
| Dsd_Node_t * pNode; |
| DdNode * bFunc; |
| // delete the nodes |
| st__foreach_item( dMan->Table, gen, (const char**)&bFunc, (char**)&pNode ) |
| Dsd_TreeNodeDelete( dMan->dd, Dsd_Regular(pNode) ); |
| st__free_table(dMan->Table); |
| ABC_FREE( dMan->pInputs ); |
| ABC_FREE( dMan->pRoots ); |
| ABC_FREE( dMan ); |
| Dsd_CheckCacheDeallocate(); |
| } |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| ABC_NAMESPACE_IMPL_END |
| |