/**CFile**************************************************************** FileName [sswSat.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [Inductive prover with constraints.] Synopsis [On-demand uniqueness constraints.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - September 1, 2008.] Revision [$Id: sswSat.c,v 1.00 2008/09/01 00:00:00 alanmi Exp $] ***********************************************************************/ #include "sswInt.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Performs computation of signal correspondence with constraints.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Ssw_UniqueRegisterPairInfo( Ssw_Man_t * p ) { Aig_Obj_t * pObjLo, * pObj0, * pObj1; int i, RetValue, Counter; if ( p->vDiffPairs == NULL ) p->vDiffPairs = Vec_IntAlloc( Saig_ManRegNum(p->pAig) ); Vec_IntClear( p->vDiffPairs ); Saig_ManForEachLo( p->pAig, pObjLo, i ) { pObj0 = Ssw_ObjFrame( p, pObjLo, 0 ); pObj1 = Ssw_ObjFrame( p, pObjLo, 1 ); if ( pObj0 == pObj1 ) Vec_IntPush( p->vDiffPairs, 0 ); else if ( pObj0 == Aig_Not(pObj1) ) Vec_IntPush( p->vDiffPairs, 1 ); // else // Vec_IntPush( p->vDiffPairs, 1 ); else if ( Aig_ObjPhaseReal(pObj0) != Aig_ObjPhaseReal(pObj1) ) Vec_IntPush( p->vDiffPairs, 1 ); else { RetValue = Ssw_NodesAreEquiv( p, Aig_Regular(pObj0), Aig_Regular(pObj1) ); Vec_IntPush( p->vDiffPairs, RetValue!=1 ); } } assert( Vec_IntSize(p->vDiffPairs) == Saig_ManRegNum(p->pAig) ); // count the number of ones Counter = 0; Vec_IntForEachEntry( p->vDiffPairs, RetValue, i ) Counter += RetValue; // Abc_Print( 1, "The number of different register pairs = %d.\n", Counter ); } /**Function************************************************************* Synopsis [Returns 1 if uniqueness constraints can be added.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Ssw_ManUniqueOne( Ssw_Man_t * p, Aig_Obj_t * pRepr, Aig_Obj_t * pObj, int fVerbose ) { Aig_Obj_t * ppObjs[2], * pTemp; int i, k, Value0, Value1, RetValue, fFeasible; assert( p->pPars->nFramesK > 1 ); assert( p->vDiffPairs && Vec_IntSize(p->vDiffPairs) == Saig_ManRegNum(p->pAig) ); // compute the first support in terms of LOs ppObjs[0] = pRepr; ppObjs[1] = pObj; Aig_SupportNodes( p->pAig, ppObjs, 2, p->vCommon ); // keep only LOs RetValue = Vec_PtrSize( p->vCommon ); fFeasible = 0; k = 0; Vec_PtrForEachEntry( Aig_Obj_t *, p->vCommon, pTemp, i ) { assert( Aig_ObjIsCi(pTemp) ); if ( !Saig_ObjIsLo(p->pAig, pTemp) ) continue; assert( Aig_ObjCioId(pTemp) > 0 ); Vec_PtrWriteEntry( p->vCommon, k++, pTemp ); if ( Vec_IntEntry(p->vDiffPairs, Aig_ObjCioId(pTemp) - Saig_ManPiNum(p->pAig)) ) fFeasible = 1; } Vec_PtrShrink( p->vCommon, k ); if ( fVerbose ) Abc_Print( 1, "Node = %5d : Supp = %3d. Regs = %3d. Feasible = %s. ", Aig_ObjId(pObj), RetValue, Vec_PtrSize(p->vCommon), fFeasible? "yes": "no " ); // check the current values RetValue = 1; Vec_PtrForEachEntry( Aig_Obj_t *, p->vCommon, pTemp, i ) { Value0 = Ssw_ManGetSatVarValue( p, pTemp, 0 ); Value1 = Ssw_ManGetSatVarValue( p, pTemp, 1 ); if ( Value0 != Value1 ) RetValue = 0; if ( fVerbose ) Abc_Print( 1, "%d", Value0 ^ Value1 ); } if ( fVerbose ) Abc_Print( 1, "\n" ); return RetValue && fFeasible; } /**Function************************************************************* Synopsis [Returns the output of the uniqueness constraint.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Ssw_ManUniqueAddConstraint( Ssw_Man_t * p, Vec_Ptr_t * vCommon, int f1, int f2 ) { Aig_Obj_t * pObj, * pObj1New, * pObj2New, * pMiter, * pTotal; int i, pLits[2]; // int RetValue; assert( Vec_PtrSize(vCommon) > 0 ); // generate the constraint pTotal = Aig_ManConst0(p->pFrames); Vec_PtrForEachEntry( Aig_Obj_t *, vCommon, pObj, i ) { assert( Saig_ObjIsLo(p->pAig, pObj) ); pObj1New = Ssw_ObjFrame( p, pObj, f1 ); pObj2New = Ssw_ObjFrame( p, pObj, f2 ); pMiter = Aig_Exor( p->pFrames, pObj1New, pObj2New ); pTotal = Aig_Or( p->pFrames, pTotal, pMiter ); } if ( Aig_ObjIsConst1(Aig_Regular(pTotal)) ) { // Abc_Print( 1, "Skipped\n" ); return 0; } // create CNF Ssw_CnfNodeAddToSolver( p->pMSat, Aig_Regular(pTotal) ); // add output constraint pLits[0] = toLitCond( Ssw_ObjSatNum(p->pMSat,Aig_Regular(pTotal)), Aig_IsComplement(pTotal) ); /* RetValue = sat_solver_addclause( p->pSat, pLits, pLits + 1 ); assert( RetValue ); // simplify the solver if ( p->pSat->qtail != p->pSat->qhead ) { RetValue = sat_solver_simplify(p->pSat); assert( RetValue != 0 ); } */ assert( p->iOutputLit == -1 ); p->iOutputLit = pLits[0]; return 1; } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END