/**CFile**************************************************************** FileName [sswSemi.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [Inductive prover with constraints.] Synopsis [Semiformal for equivalence classes.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - September 1, 2008.] Revision [$Id: sswSemi.c,v 1.00 2008/09/01 00:00:00 alanmi Exp $] ***********************************************************************/ #include "sswInt.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// typedef struct Ssw_Sem_t_ Ssw_Sem_t; // BMC manager struct Ssw_Sem_t_ { // parameters int nConfMaxStart; // the starting conflict limit int nConfMax; // the intermediate conflict limit int nFramesSweep; // the number of frames to sweep int fVerbose; // prints output statistics // equivalences considered Ssw_Man_t * pMan; // SAT sweeping manager Vec_Ptr_t * vTargets; // the nodes that are watched // storage for patterns int nPatternsAlloc; // the max number of interesting states int nPatterns; // the number of patterns Vec_Ptr_t * vPatterns; // storage for the interesting states Vec_Int_t * vHistory; // what state and how many steps }; //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Ssw_Sem_t * Ssw_SemManStart( Ssw_Man_t * pMan, int nConfMax, int fVerbose ) { Ssw_Sem_t * p; Aig_Obj_t * pObj; int i; // create interpolation manager p = ABC_ALLOC( Ssw_Sem_t, 1 ); memset( p, 0, sizeof(Ssw_Sem_t) ); p->nConfMaxStart = nConfMax; p->nConfMax = nConfMax; p->nFramesSweep = Abc_MaxInt( (1<<21)/Aig_ManNodeNum(pMan->pAig), pMan->nFrames ); p->fVerbose = fVerbose; // equivalences considered p->pMan = pMan; p->vTargets = Vec_PtrAlloc( Saig_ManPoNum(p->pMan->pAig) ); Saig_ManForEachPo( p->pMan->pAig, pObj, i ) Vec_PtrPush( p->vTargets, Aig_ObjFanin0(pObj) ); // storage for patterns p->nPatternsAlloc = 512; p->nPatterns = 1; p->vPatterns = Vec_PtrAllocSimInfo( Aig_ManRegNum(p->pMan->pAig), Abc_BitWordNum(p->nPatternsAlloc) ); Vec_PtrCleanSimInfo( p->vPatterns, 0, Abc_BitWordNum(p->nPatternsAlloc) ); p->vHistory = Vec_IntAlloc( 100 ); Vec_IntPush( p->vHistory, 0 ); // update arrays of the manager assert( 0 ); /* ABC_FREE( p->pMan->pNodeToFrames ); Vec_IntFree( p->pMan->vSatVars ); p->pMan->pNodeToFrames = ABC_CALLOC( Aig_Obj_t *, Aig_ManObjNumMax(p->pMan->pAig) * p->nFramesSweep ); p->pMan->vSatVars = Vec_IntStart( Aig_ManObjNumMax(p->pMan->pAig) * (p->nFramesSweep+1) ); */ return p; } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Ssw_SemManStop( Ssw_Sem_t * p ) { Vec_PtrFree( p->vTargets ); Vec_PtrFree( p->vPatterns ); Vec_IntFree( p->vHistory ); ABC_FREE( p ); } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Ssw_SemCheckTargets( Ssw_Sem_t * p ) { Aig_Obj_t * pObj; int i; Vec_PtrForEachEntry( Aig_Obj_t *, p->vTargets, pObj, i ) if ( !Ssw_ObjIsConst1Cand(p->pMan->pAig, pObj) ) return 1; return 0; } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Ssw_ManFilterBmcSavePattern( Ssw_Sem_t * p ) { unsigned * pInfo; Aig_Obj_t * pObj; int i; if ( p->nPatterns >= p->nPatternsAlloc ) return; Saig_ManForEachLo( p->pMan->pAig, pObj, i ) { pInfo = (unsigned *)Vec_PtrEntry( p->vPatterns, i ); if ( Abc_InfoHasBit( p->pMan->pPatWords, Saig_ManPiNum(p->pMan->pAig) + i ) ) Abc_InfoSetBit( pInfo, p->nPatterns ); } p->nPatterns++; } /**Function************************************************************* Synopsis [Performs fraiging for the internal nodes.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Ssw_ManFilterBmc( Ssw_Sem_t * pBmc, int iPat, int fCheckTargets ) { Ssw_Man_t * p = pBmc->pMan; Aig_Obj_t * pObj, * pObjNew, * pObjLi, * pObjLo; unsigned * pInfo; int i, f, RetValue, fFirst = 0; abctime clk; clk = Abc_Clock(); // start initialized timeframes p->pFrames = Aig_ManStart( Aig_ManObjNumMax(p->pAig) * 3 ); Saig_ManForEachLo( p->pAig, pObj, i ) { pInfo = (unsigned *)Vec_PtrEntry( pBmc->vPatterns, i ); pObjNew = Aig_NotCond( Aig_ManConst1(p->pFrames), !Abc_InfoHasBit(pInfo, iPat) ); Ssw_ObjSetFrame( p, pObj, 0, pObjNew ); } // sweep internal nodes RetValue = pBmc->nFramesSweep; for ( f = 0; f < pBmc->nFramesSweep; f++ ) { // map constants and PIs Ssw_ObjSetFrame( p, Aig_ManConst1(p->pAig), f, Aig_ManConst1(p->pFrames) ); Saig_ManForEachPi( p->pAig, pObj, i ) Ssw_ObjSetFrame( p, pObj, f, Aig_ObjCreateCi(p->pFrames) ); // sweep internal nodes Aig_ManForEachNode( p->pAig, pObj, i ) { pObjNew = Aig_And( p->pFrames, Ssw_ObjChild0Fra(p, pObj, f), Ssw_ObjChild1Fra(p, pObj, f) ); Ssw_ObjSetFrame( p, pObj, f, pObjNew ); if ( Ssw_ManSweepNode( p, pObj, f, 1, NULL ) ) { Ssw_ManFilterBmcSavePattern( pBmc ); if ( fFirst == 0 ) { fFirst = 1; pBmc->nConfMax *= 10; } } if ( f > 0 && p->pMSat->pSat->stats.conflicts >= pBmc->nConfMax ) { RetValue = -1; break; } } // quit if this is the last timeframe if ( p->pMSat->pSat->stats.conflicts >= pBmc->nConfMax ) { RetValue += f + 1; break; } if ( fCheckTargets && Ssw_SemCheckTargets( pBmc ) ) break; // transfer latch input to the latch outputs // build logic cones for register outputs Saig_ManForEachLiLo( p->pAig, pObjLi, pObjLo, i ) { pObjNew = Ssw_ObjChild0Fra(p, pObjLi,f); Ssw_ObjSetFrame( p, pObjLo, f+1, pObjNew ); Ssw_CnfNodeAddToSolver( p->pMSat, Aig_Regular(pObjNew) ); } //Abc_Print( 1, "Frame %2d : Conflicts = %6d. \n", f, p->pSat->stats.conflicts ); } if ( fFirst ) pBmc->nConfMax /= 10; // cleanup Ssw_ClassesCheck( p->ppClasses ); p->timeBmc += Abc_Clock() - clk; return RetValue; } /**Function************************************************************* Synopsis [Returns 1 if one of the targets has failed.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Ssw_FilterUsingSemi( Ssw_Man_t * pMan, int fCheckTargets, int nConfMax, int fVerbose ) { Ssw_Sem_t * p; int RetValue, Frames, Iter; abctime clk = Abc_Clock(); p = Ssw_SemManStart( pMan, nConfMax, fVerbose ); if ( fCheckTargets && Ssw_SemCheckTargets( p ) ) { assert( 0 ); Ssw_SemManStop( p ); return 1; } if ( fVerbose ) { Abc_Print( 1, "AIG : C = %6d. Cl = %6d. Nodes = %6d. ConfMax = %6d. FramesMax = %6d.\n", Ssw_ClassesCand1Num(p->pMan->ppClasses), Ssw_ClassesClassNum(p->pMan->ppClasses), Aig_ManNodeNum(p->pMan->pAig), p->nConfMax, p->nFramesSweep ); } RetValue = 0; for ( Iter = 0; Iter < p->nPatterns; Iter++ ) { clk = Abc_Clock(); pMan->pMSat = Ssw_SatStart( 0 ); Frames = Ssw_ManFilterBmc( p, Iter, fCheckTargets ); if ( fVerbose ) { Abc_Print( 1, "%3d : C = %6d. Cl = %6d. NR = %6d. F = %3d. C = %5d. P = %3d. %s ", Iter, Ssw_ClassesCand1Num(p->pMan->ppClasses), Ssw_ClassesClassNum(p->pMan->ppClasses), Aig_ManNodeNum(p->pMan->pFrames), Frames, (int)p->pMan->pMSat->pSat->stats.conflicts, p->nPatterns, p->pMan->nSatFailsReal? "f" : " " ); ABC_PRT( "T", Abc_Clock() - clk ); } Ssw_ManCleanup( p->pMan ); if ( fCheckTargets && Ssw_SemCheckTargets( p ) ) { Abc_Print( 1, "Target is hit!!!\n" ); RetValue = 1; } if ( p->nPatterns >= p->nPatternsAlloc ) break; } Ssw_SemManStop( p ); pMan->nStrangers = 0; pMan->nSatCalls = 0; pMan->nSatProof = 0; pMan->nSatFailsReal = 0; pMan->nSatCallsUnsat = 0; pMan->nSatCallsSat = 0; pMan->timeSimSat = 0; pMan->timeSat = 0; pMan->timeSatSat = 0; pMan->timeSatUnsat = 0; pMan->timeSatUndec = 0; return RetValue; } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END