/**CFile**************************************************************** FileName [mfsGia.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [The good old minimization with complete don't-cares.] Synopsis [Experimental code based on the new AIG package.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - July 29, 2009.] Revision [$Id: mfsGia.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] ***********************************************************************/ #include "mfsInt.h" #include "aig/gia/giaAig.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// static inline int Gia_ObjChild0Copy( Aig_Obj_t * pObj ) { return Gia_LitNotCond( Aig_ObjFanin0(pObj)->iData, Aig_ObjFaninC0(pObj) ); } static inline int Gia_ObjChild1Copy( Aig_Obj_t * pObj ) { return Gia_LitNotCond( Aig_ObjFanin1(pObj)->iData, Aig_ObjFaninC1(pObj) ); } // r i10_if6.blif; ps; mfs -v // r pj1_if6.blif; ps; mfs -v // r x/01_if6.blif; ps; mfs -v //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Derives the resubstitution miter as an GIA.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Gia_Man_t * Gia_ManCreateResubMiter( Aig_Man_t * p ) { Gia_Man_t * pNew;//, * pTemp; Aig_Obj_t * pObj; int i, * pOuts0, * pOuts1; Aig_ManSetPioNumbers( p ); // create the new manager pNew = Gia_ManStart( Aig_ManObjNum(p) ); pNew->pName = Gia_UtilStrsav( p->pName ); pNew->pSpec = Gia_UtilStrsav( p->pSpec ); Gia_ManHashAlloc( pNew ); // create the objects pOuts0 = ABC_ALLOC( int, Aig_ManPoNum(p) ); Aig_ManForEachObj( p, pObj, i ) { if ( Aig_ObjIsAnd(pObj) ) pObj->iData = Gia_ManHashAnd( pNew, Gia_ObjChild0Copy(pObj), Gia_ObjChild1Copy(pObj) ); else if ( Aig_ObjIsPi(pObj) ) pObj->iData = Gia_ManAppendCi( pNew ); else if ( Aig_ObjIsPo(pObj) ) pOuts0[ Aig_ObjPioNum(pObj) ] = Gia_ObjChild0Copy(pObj); else if ( Aig_ObjIsConst1(pObj) ) pObj->iData = 1; else assert( 0 ); } // create the objects pOuts1 = ABC_ALLOC( int, Aig_ManPoNum(p) ); Aig_ManForEachObj( p, pObj, i ) { if ( Aig_ObjIsAnd(pObj) ) pObj->iData = Gia_ManHashAnd( pNew, Gia_ObjChild0Copy(pObj), Gia_ObjChild1Copy(pObj) ); else if ( Aig_ObjIsPi(pObj) ) pObj->iData = Gia_ManAppendCi( pNew ); else if ( Aig_ObjIsPo(pObj) ) pOuts1[ Aig_ObjPioNum(pObj) ] = Gia_ObjChild0Copy(pObj); else if ( Aig_ObjIsConst1(pObj) ) pObj->iData = 1; else assert( 0 ); } // add the outputs Gia_ManAppendCo( pNew, pOuts0[0] ); Gia_ManAppendCo( pNew, pOuts1[0] ); Gia_ManAppendCo( pNew, pOuts0[1] ); Gia_ManAppendCo( pNew, Gia_LitNot(pOuts1[1]) ); for ( i = 2; i < Aig_ManPoNum(p); i++ ) Gia_ManAppendCo( pNew, Gia_LitNot( Gia_ManHashXor(pNew, pOuts0[i], pOuts1[i]) ) ); Gia_ManHashStop( pNew ); ABC_FREE( pOuts0 ); ABC_FREE( pOuts1 ); // pNew = Gia_ManCleanup( pTemp = pNew ); // Gia_ManStop( pTemp ); return pNew; } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Abc_NtkMfsConstructGia( Mfs_Man_t * p ) { int nBTLimit = 500; // prepare AIG assert( p->pGia == NULL ); p->pGia = Gia_ManCreateResubMiter( p->pAigWin ); // prepare AIG Gia_ManCreateRefs( p->pGia ); Gia_ManCleanMark0( p->pGia ); Gia_ManCleanMark1( p->pGia ); Gia_ManFillValue ( p->pGia ); // maps nodes into trail ids Gia_ManCleanPhase( p->pGia ); // prepare solver p->pTas = Tas_ManAlloc( p->pGia, nBTLimit ); p->vCex = Tas_ReadModel( p->pTas ); p->vGiaLits = Vec_PtrAlloc( 100 ); } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Abc_NtkMfsDeconstructGia( Mfs_Man_t * p ) { assert( p->pGia != NULL ); Gia_ManStop( p->pGia ); p->pGia = NULL; Tas_ManStop( p->pTas ); p->pTas = NULL; Vec_PtrFree( p->vGiaLits ); } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Abc_NtkMfsResimulate( Gia_Man_t * p, Vec_Int_t * vCex ) { Gia_Obj_t * pObj; int i, Entry; // Gia_ManCleanMark1( p ); Gia_ManConst0(p)->fMark1 = 0; Gia_ManForEachCi( p, pObj, i ) pObj->fMark1 = 0; // pObj->fMark1 = Gia_ManRandom(0); Vec_IntForEachEntry( vCex, Entry, i ) { pObj = Gia_ManCi( p, Gia_Lit2Var(Entry) ); pObj->fMark1 = !Gia_LitIsCompl(Entry); } Gia_ManForEachAnd( p, pObj, i ) pObj->fMark1 = (Gia_ObjFanin0(pObj)->fMark1 ^ Gia_ObjFaninC0(pObj)) & (Gia_ObjFanin1(pObj)->fMark1 ^ Gia_ObjFaninC1(pObj)); Gia_ManForEachCo( p, pObj, i ) pObj->fMark1 = Gia_ObjFanin0(pObj)->fMark1 ^ Gia_ObjFaninC0(pObj); } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Abc_NtkMfsTryResubOnceGia( Mfs_Man_t * p, int * pCands, int nCands ) { int fVeryVerbose = 0; int fUseGia = 1; unsigned * pData; int i, iVar, status, iOut; clock_t clk = clock(); p->nSatCalls++; // return -1; assert( p->pGia != NULL ); assert( p->pTas != NULL ); // convert to literals Vec_PtrClear( p->vGiaLits ); // create the first four literals Vec_PtrPush( p->vGiaLits, Gia_ObjChild0(Gia_ManPo(p->pGia, 0)) ); Vec_PtrPush( p->vGiaLits, Gia_ObjChild0(Gia_ManPo(p->pGia, 1)) ); Vec_PtrPush( p->vGiaLits, Gia_ObjChild0(Gia_ManPo(p->pGia, 2)) ); Vec_PtrPush( p->vGiaLits, Gia_ObjChild0(Gia_ManPo(p->pGia, 3)) ); for ( i = 0; i < nCands; i++ ) { // get the output number iOut = Gia_Lit2Var(pCands[i]) - 2 * p->pCnf->nVars; // write the literal Vec_PtrPush( p->vGiaLits, Gia_ObjChild0(Gia_ManPo(p->pGia, 4 + iOut)) ); } // perform SAT solving status = Tas_ManSolveArray( p->pTas, p->vGiaLits ); if ( status == -1 ) { p->nTimeOuts++; if ( fVeryVerbose ) printf( "t" ); // p->nSatUndec++; // p->nConfUndec += p->Pars.nBTThis; // Cec_ManSatAddToStore( vCexStore, NULL, i ); // timeout // p->timeSatUndec += clock() - clk; } else if ( status == 1 ) { if ( fVeryVerbose ) printf( "u" ); // p->nSatUnsat++; // p->nConfUnsat += p->Pars.nBTThis; // p->timeSatUnsat += clock() - clk; } else { p->nSatCexes++; if ( fVeryVerbose ) printf( "s" ); // p->nSatSat++; // p->nConfSat += p->Pars.nBTThis; // Gia_SatVerifyPattern( pAig, pRoot, vCex, vVisit ); // Cec_ManSatAddToStore( vCexStore, vCex, i ); // p->timeSatSat += clock() - clk; // resimulate the counter-example Abc_NtkMfsResimulate( p->pGia, Tas_ReadModel(p->pTas) ); if ( fUseGia ) { /* int Val0 = Gia_ManPo(p->pGia, 0)->fMark1; int Val1 = Gia_ManPo(p->pGia, 1)->fMark1; int Val2 = Gia_ManPo(p->pGia, 2)->fMark1; int Val3 = Gia_ManPo(p->pGia, 3)->fMark1; assert( Val0 == 1 ); assert( Val1 == 1 ); assert( Val2 == 1 ); assert( Val3 == 1 ); */ // store the counter-example Vec_IntForEachEntry( p->vProjVarsSat, iVar, i ) { pData = (unsigned *)Vec_PtrEntry( p->vDivCexes, i ); iOut = iVar - 2 * p->pCnf->nVars; // if ( !Gia_ManPo( p->pGia, 4 + iOut )->fMark1 ) // remove 0s!!! if ( Gia_ManPo( p->pGia, 4 + iOut )->fMark1 ) // remove 0s!!! - rememeber complemented attribute { assert( Aig_InfoHasBit(pData, p->nCexes) ); Aig_InfoXorBit( pData, p->nCexes ); } } p->nCexes++; } } return status; } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END