/**CFile**************************************************************** FileName [dchSweep.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [Choice computation for tech-mapping.] Synopsis [One round of SAT sweeping.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 29, 2008.] Revision [$Id: dchSweep.c,v 1.00 2008/07/29 00:00:00 alanmi Exp $] ***********************************************************************/ #include "dchInt.h" #include "misc/bar/bar.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// static inline Aig_Obj_t * Dch_ObjChild0Fra( Aig_Obj_t * pObj ) { assert( !Aig_IsComplement(pObj) ); return Aig_ObjFanin0(pObj)? Aig_NotCond(Dch_ObjFraig(Aig_ObjFanin0(pObj)), Aig_ObjFaninC0(pObj)) : NULL; } static inline Aig_Obj_t * Dch_ObjChild1Fra( Aig_Obj_t * pObj ) { assert( !Aig_IsComplement(pObj) ); return Aig_ObjFanin1(pObj)? Aig_NotCond(Dch_ObjFraig(Aig_ObjFanin1(pObj)), Aig_ObjFaninC1(pObj)) : NULL; } //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Performs fraiging for one node.] Description [Returns the fraiged node.] SideEffects [] SeeAlso [] ***********************************************************************/ void Dch_ManSweepNode( Dch_Man_t * p, Aig_Obj_t * pObj ) { Aig_Obj_t * pObjRepr, * pObjFraig, * pObjFraig2, * pObjReprFraig; int RetValue; // get representative of this class pObjRepr = Aig_ObjRepr( p->pAigTotal, pObj ); if ( pObjRepr == NULL ) return; // get the fraiged node pObjFraig = Dch_ObjFraig( pObj ); if ( pObjFraig == NULL ) return; // get the fraiged representative pObjReprFraig = Dch_ObjFraig( pObjRepr ); if ( pObjReprFraig == NULL ) return; // if the fraiged nodes are the same, return if ( Aig_Regular(pObjFraig) == Aig_Regular(pObjReprFraig) ) { // remember the proved equivalence p->pReprsProved[ pObj->Id ] = pObjRepr; return; } assert( Aig_Regular(pObjFraig) != Aig_ManConst1(p->pAigFraig) ); RetValue = Dch_NodesAreEquiv( p, Aig_Regular(pObjReprFraig), Aig_Regular(pObjFraig) ); if ( RetValue == -1 ) // timed out { Dch_ObjSetFraig( pObj, NULL ); return; } if ( RetValue == 1 ) // proved equivalent { pObjFraig2 = Aig_NotCond( pObjReprFraig, pObj->fPhase ^ pObjRepr->fPhase ); Dch_ObjSetFraig( pObj, pObjFraig2 ); // remember the proved equivalence p->pReprsProved[ pObj->Id ] = pObjRepr; return; } // disproved the equivalence if ( p->pPars->fSimulateTfo ) Dch_ManResimulateCex( p, pObj, pObjRepr ); else Dch_ManResimulateCex2( p, pObj, pObjRepr ); assert( Aig_ObjRepr( p->pAigTotal, pObj ) != pObjRepr ); } /**Function************************************************************* Synopsis [Performs fraiging for the internal nodes.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Dch_ManSweep( Dch_Man_t * p ) { Bar_Progress_t * pProgress = NULL; Aig_Obj_t * pObj, * pObjNew; int i; // map constants and PIs p->pAigFraig = Aig_ManStart( Aig_ManObjNumMax(p->pAigTotal) ); Aig_ManCleanData( p->pAigTotal ); Aig_ManConst1(p->pAigTotal)->pData = Aig_ManConst1(p->pAigFraig); Aig_ManForEachCi( p->pAigTotal, pObj, i ) pObj->pData = Aig_ObjCreateCi( p->pAigFraig ); // sweep internal nodes pProgress = Bar_ProgressStart( stdout, Aig_ManObjNumMax(p->pAigTotal) ); Aig_ManForEachNode( p->pAigTotal, pObj, i ) { Bar_ProgressUpdate( pProgress, i, NULL ); if ( Dch_ObjFraig(Aig_ObjFanin0(pObj)) == NULL || Dch_ObjFraig(Aig_ObjFanin1(pObj)) == NULL ) continue; pObjNew = Aig_And( p->pAigFraig, Dch_ObjChild0Fra(pObj), Dch_ObjChild1Fra(pObj) ); if ( pObjNew == NULL ) continue; Dch_ObjSetFraig( pObj, pObjNew ); Dch_ManSweepNode( p, pObj ); } Bar_ProgressStop( pProgress ); // update the representatives of the nodes (makes classes invalid) ABC_FREE( p->pAigTotal->pReprs ); p->pAigTotal->pReprs = p->pReprsProved; p->pReprsProved = NULL; // clean the mark Aig_ManCleanMarkB( p->pAigTotal ); } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END