/**CFile**************************************************************** FileName [cudd2.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [Minimalistic And-Inverter Graph package.] Synopsis [Recording AIGs for the BDD operations.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - October 3, 2006.] Revision [$Id: cudd2.c,v 1.00 2006/10/03 00:00:00 alanmi Exp $] ***********************************************************************/ #include "hop.h" #include "misc/st/st.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// typedef struct Aig_CuddMan_t_ Aig_CuddMan_t; struct Aig_CuddMan_t_ { Aig_Man_t * pAig; // internal AIG package st__table * pTable; // hash table mapping BDD nodes into AIG nodes }; // static Cudd AIG manager used in this experiment static Aig_CuddMan_t * s_pCuddMan = NULL; //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Start AIG recording.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Cudd2_Init( unsigned int numVars, unsigned int numVarsZ, unsigned int numSlots, unsigned int cacheSize, unsigned long maxMemory, void * pCudd ) { int v; // start the BDD-to-AIG manager when the first BDD manager is allocated if ( s_pCuddMan != NULL ) return; s_pCuddMan = ALLOC( Aig_CuddMan_t, 1 ); s_pCuddMan->pAig = Aig_ManStart(); s_pCuddMan->pTable = st__init_table( st__ptrcmp, st__ptrhash ); for ( v = 0; v < (int)numVars; v++ ) Aig_ObjCreatePi( s_pCuddMan->pAig ); } /**Function************************************************************* Synopsis [Stops AIG recording.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Cudd2_Quit( void * pCudd ) { assert( s_pCuddMan != NULL ); Aig_ManDumpBlif( s_pCuddMan->pAig, "aig_temp.blif", NULL, NULL ); Aig_ManStop( s_pCuddMan->pAig ); st__free_table( s_pCuddMan->pTable ); free( s_pCuddMan ); s_pCuddMan = NULL; } /**Function************************************************************* Synopsis [Fetches AIG node corresponding to the BDD node from the hash table.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static Aig_Obj_t * Cudd2_GetArg( void * pArg ) { Aig_Obj_t * pNode; assert( s_pCuddMan != NULL ); if ( ! st__lookup( s_pCuddMan->pTable, (char *)Aig_Regular(pArg), (char **)&pNode ) ) { printf( "Cudd2_GetArg(): An argument BDD is not in the hash table.\n" ); return NULL; } return Aig_NotCond( pNode, Aig_IsComplement(pArg) ); } /**Function************************************************************* Synopsis [Inserts the AIG node corresponding to the BDD node into the hash table.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static void Cudd2_SetArg( Aig_Obj_t * pNode, void * pResult ) { assert( s_pCuddMan != NULL ); if ( st__is_member( s_pCuddMan->pTable, (char *)Aig_Regular(pResult) ) ) return; pNode = Aig_NotCond( pNode, Aig_IsComplement(pResult) ); st__insert( s_pCuddMan->pTable, (char *)Aig_Regular(pResult), (char *)pNode ); } /**Function************************************************************* Synopsis [Registers constant 1 node.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Cudd2_bddOne( void * pCudd, void * pResult ) { Cudd2_SetArg( Aig_ManConst1(s_pCuddMan->pAig), pResult ); } /**Function************************************************************* Synopsis [Adds elementary variable.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Cudd2_bddIthVar( void * pCudd, int iVar, void * pResult ) { int v; assert( s_pCuddMan != NULL ); for ( v = Aig_ManPiNum(s_pCuddMan->pAig); v <= iVar; v++ ) Aig_ObjCreatePi( s_pCuddMan->pAig ); Cudd2_SetArg( Aig_ManPi(s_pCuddMan->pAig, iVar), pResult ); } /**Function************************************************************* Synopsis [Performs BDD operation.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Cudd2_bddAnd( void * pCudd, void * pArg0, void * pArg1, void * pResult ) { Aig_Obj_t * pNode0, * pNode1, * pNode; pNode0 = Cudd2_GetArg( pArg0 ); pNode1 = Cudd2_GetArg( pArg1 ); pNode = Aig_And( s_pCuddMan->pAig, pNode0, pNode1 ); Cudd2_SetArg( pNode, pResult ); } /**Function************************************************************* Synopsis [Performs BDD operation.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Cudd2_bddOr( void * pCudd, void * pArg0, void * pArg1, void * pResult ) { Cudd2_bddAnd( pCudd, Aig_Not(pArg0), Aig_Not(pArg1), Aig_Not(pResult) ); } /**Function************************************************************* Synopsis [Performs BDD operation.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Cudd2_bddNand( void * pCudd, void * pArg0, void * pArg1, void * pResult ) { Cudd2_bddAnd( pCudd, pArg0, pArg1, Aig_Not(pResult) ); } /**Function************************************************************* Synopsis [Performs BDD operation.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Cudd2_bddNor( void * pCudd, void * pArg0, void * pArg1, void * pResult ) { Cudd2_bddAnd( pCudd, Aig_Not(pArg0), Aig_Not(pArg1), pResult ); } /**Function************************************************************* Synopsis [Performs BDD operation.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Cudd2_bddXor( void * pCudd, void * pArg0, void * pArg1, void * pResult ) { Aig_Obj_t * pNode0, * pNode1, * pNode; pNode0 = Cudd2_GetArg( pArg0 ); pNode1 = Cudd2_GetArg( pArg1 ); pNode = Aig_Exor( s_pCuddMan->pAig, pNode0, pNode1 ); Cudd2_SetArg( pNode, pResult ); } /**Function************************************************************* Synopsis [Performs BDD operation.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Cudd2_bddXnor( void * pCudd, void * pArg0, void * pArg1, void * pResult ) { Cudd2_bddXor( pCudd, pArg0, pArg1, Aig_Not(pResult) ); } /**Function************************************************************* Synopsis [Performs BDD operation.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Cudd2_bddIte( void * pCudd, void * pArg0, void * pArg1, void * pArg2, void * pResult ) { Aig_Obj_t * pNode0, * pNode1, * pNode2, * pNode; pNode0 = Cudd2_GetArg( pArg0 ); pNode1 = Cudd2_GetArg( pArg1 ); pNode2 = Cudd2_GetArg( pArg2 ); pNode = Aig_Mux( s_pCuddMan->pAig, pNode0, pNode1, pNode2 ); Cudd2_SetArg( pNode, pResult ); } /**Function************************************************************* Synopsis [Performs BDD operation.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Cudd2_bddCompose( void * pCudd, void * pArg0, void * pArg1, int v, void * pResult ) { Aig_Obj_t * pNode0, * pNode1, * pNode; pNode0 = Cudd2_GetArg( pArg0 ); pNode1 = Cudd2_GetArg( pArg1 ); pNode = Aig_Compose( s_pCuddMan->pAig, pNode0, pNode1, v ); Cudd2_SetArg( pNode, pResult ); } /**Function************************************************************* Synopsis [Should be called after each containment check.] Description [Result should be 1 if Cudd2_bddLeq returned 1.] SideEffects [] SeeAlso [] ***********************************************************************/ void Cudd2_bddLeq( void * pCudd, void * pArg0, void * pArg1, int Result ) { Aig_Obj_t * pNode0, * pNode1, * pNode; pNode0 = Cudd2_GetArg( pArg0 ); pNode1 = Cudd2_GetArg( pArg1 ); pNode = Aig_And( s_pCuddMan->pAig, pNode0, Aig_Not(pNode1) ); Aig_ObjCreatePo( s_pCuddMan->pAig, pNode ); } /**Function************************************************************* Synopsis [Should be called after each equality check.] Description [Result should be 1 if they are equal.] SideEffects [] SeeAlso [] ***********************************************************************/ void Cudd2_bddEqual( void * pCudd, void * pArg0, void * pArg1, int Result ) { Aig_Obj_t * pNode0, * pNode1, * pNode; pNode0 = Cudd2_GetArg( pArg0 ); pNode1 = Cudd2_GetArg( pArg1 ); pNode = Aig_Exor( s_pCuddMan->pAig, pNode0, pNode1 ); Aig_ObjCreatePo( s_pCuddMan->pAig, pNode ); } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END