/**CFile**************************************************************** FileName [cswCore.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [Cut sweeping.] Synopsis [] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - July 11, 2007.] Revision [$Id: cswCore.c,v 1.00 2007/07/11 00:00:00 alanmi Exp $] ***********************************************************************/ #include "cswInt.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Aig_Man_t * Csw_Sweep( Aig_Man_t * pAig, int nCutsMax, int nLeafMax, int fVerbose ) { Csw_Man_t * p; Aig_Man_t * pRes; Aig_Obj_t * pObj, * pObjNew, * pObjRes; int i; abctime clk; clk = Abc_Clock(); // start the manager p = Csw_ManStart( pAig, nCutsMax, nLeafMax, fVerbose ); // set elementary cuts at the PIs Aig_ManForEachCi( p->pManRes, pObj, i ) { Csw_ObjPrepareCuts( p, pObj, 1 ); Csw_ObjAddRefs( p, pObj, Aig_ManCi(p->pManAig,i)->nRefs ); } // process the nodes Aig_ManForEachNode( pAig, pObj, i ) { // create the new node pObjNew = Aig_And( p->pManRes, Csw_ObjChild0Equiv(p, pObj), Csw_ObjChild1Equiv(p, pObj) ); // check if this node can be represented using another node // pObjRes = Csw_ObjSweep( p, Aig_Regular(pObjNew), pObj->nRefs > 1 ); // pObjRes = Aig_NotCond( pObjRes, Aig_IsComplement(pObjNew) ); // try recursively if resubsitution is used do { pObjRes = Csw_ObjSweep( p, Aig_Regular(pObjNew), pObj->nRefs > 1 ); pObjRes = Aig_NotCond( pObjRes, Aig_IsComplement(pObjNew) ); pObjNew = pObjRes; } while ( Csw_ObjCuts(p, Aig_Regular(pObjNew)) == NULL && !Aig_ObjIsConst1(Aig_Regular(pObjNew)) ); // save the resulting node Csw_ObjSetEquiv( p, pObj, pObjRes ); // add to the reference counter Csw_ObjAddRefs( p, Aig_Regular(pObjRes), pObj->nRefs ); } // add the POs Aig_ManForEachCo( pAig, pObj, i ) Aig_ObjCreateCo( p->pManRes, Csw_ObjChild0Equiv(p, pObj) ); // remove dangling nodes Aig_ManCleanup( p->pManRes ); // return the resulting manager p->timeTotal = Abc_Clock() - clk; p->timeOther = p->timeTotal - p->timeCuts - p->timeHash; pRes = p->pManRes; Csw_ManStop( p ); return pRes; } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END