/**CFile**************************************************************** FileName [sswAig.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [Inductive prover with constraints.] Synopsis [AIG manipulation.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - September 1, 2008.] Revision [$Id: sswAig.c,v 1.00 2008/09/01 00:00:00 alanmi Exp $] ***********************************************************************/ #include "sswInt.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Starts the SAT manager.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Ssw_Frm_t * Ssw_FrmStart( Aig_Man_t * pAig ) { Ssw_Frm_t * p; p = ABC_ALLOC( Ssw_Frm_t, 1 ); memset( p, 0, sizeof(Ssw_Frm_t) ); p->pAig = pAig; p->nObjs = Aig_ManObjNumMax( pAig ); p->nFrames = 0; p->pFrames = NULL; p->vAig2Frm = Vec_PtrAlloc( 0 ); Vec_PtrFill( p->vAig2Frm, 2 * p->nObjs, NULL ); return p; } /**Function************************************************************* Synopsis [Starts the SAT manager.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Ssw_FrmStop( Ssw_Frm_t * p ) { if ( p->pFrames ) Aig_ManStop( p->pFrames ); Vec_PtrFree( p->vAig2Frm ); ABC_FREE( p ); } /**Function************************************************************* Synopsis [Performs speculative reduction for one node.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline void Ssw_FramesConstrainNode( Ssw_Man_t * p, Aig_Man_t * pFrames, Aig_Man_t * pAig, Aig_Obj_t * pObj, int iFrame, int fTwoPos ) { Aig_Obj_t * pObjNew, * pObjNew2, * pObjRepr, * pObjReprNew, * pMiter; // skip nodes without representative pObjRepr = Aig_ObjRepr(pAig, pObj); if ( pObjRepr == NULL ) return; p->nConstrTotal++; assert( pObjRepr->Id < pObj->Id ); // get the new node pObjNew = Ssw_ObjFrame( p, pObj, iFrame ); // get the new node of the representative pObjReprNew = Ssw_ObjFrame( p, pObjRepr, iFrame ); // if this is the same node, no need to add constraints if ( pObj->fPhase == pObjRepr->fPhase ) { assert( pObjNew != Aig_Not(pObjReprNew) ); if ( pObjNew == pObjReprNew ) return; } else { assert( pObjNew != pObjReprNew ); if ( pObjNew == Aig_Not(pObjReprNew) ) return; } p->nConstrReduced++; // these are different nodes - perform speculative reduction pObjNew2 = Aig_NotCond( pObjReprNew, pObj->fPhase ^ pObjRepr->fPhase ); // set the new node Ssw_ObjSetFrame( p, pObj, iFrame, pObjNew2 ); // add the constraint if ( fTwoPos ) { Aig_ObjCreateCo( pFrames, pObjNew2 ); Aig_ObjCreateCo( pFrames, pObjNew ); } else { pMiter = Aig_Exor( pFrames, pObjNew, pObjNew2 ); Aig_ObjCreateCo( pFrames, Aig_NotCond(pMiter, Aig_ObjPhaseReal(pMiter)) ); } } /**Function************************************************************* Synopsis [Prepares the inductive case with speculative reduction.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Aig_Man_t * Ssw_FramesWithClasses( Ssw_Man_t * p ) { Aig_Man_t * pFrames; Aig_Obj_t * pObj, * pObjLi, * pObjLo, * pObjNew; int i, f, iLits; assert( p->pFrames == NULL ); assert( Aig_ManRegNum(p->pAig) > 0 ); assert( Aig_ManRegNum(p->pAig) < Aig_ManCiNum(p->pAig) ); p->nConstrTotal = p->nConstrReduced = 0; // start the fraig package pFrames = Aig_ManStart( Aig_ManObjNumMax(p->pAig) * p->nFrames ); // create latches for the first frame Saig_ManForEachLo( p->pAig, pObj, i ) Ssw_ObjSetFrame( p, pObj, 0, Aig_ObjCreateCi(pFrames) ); // add timeframes iLits = 0; for ( f = 0; f < p->pPars->nFramesK; f++ ) { // map constants and PIs Ssw_ObjSetFrame( p, Aig_ManConst1(p->pAig), f, Aig_ManConst1(pFrames) ); Saig_ManForEachPi( p->pAig, pObj, i ) { pObjNew = Aig_ObjCreateCi(pFrames); pObjNew->fPhase = (p->vInits != NULL) && Vec_IntEntry(p->vInits, iLits++); Ssw_ObjSetFrame( p, pObj, f, pObjNew ); } // set the constraints on the latch outputs Saig_ManForEachLo( p->pAig, pObj, i ) Ssw_FramesConstrainNode( p, pFrames, p->pAig, pObj, f, 1 ); // add internal nodes of this frame Aig_ManForEachNode( p->pAig, pObj, i ) { pObjNew = Aig_And( pFrames, Ssw_ObjChild0Fra(p, pObj, f), Ssw_ObjChild1Fra(p, pObj, f) ); Ssw_ObjSetFrame( p, pObj, f, pObjNew ); Ssw_FramesConstrainNode( p, pFrames, p->pAig, pObj, f, 1 ); } // transfer to the primary outputs Aig_ManForEachCo( p->pAig, pObj, i ) Ssw_ObjSetFrame( p, pObj, f, Ssw_ObjChild0Fra(p, pObj,f) ); // transfer latch input to the latch outputs Saig_ManForEachLiLo( p->pAig, pObjLi, pObjLo, i ) Ssw_ObjSetFrame( p, pObjLo, f+1, Ssw_ObjFrame(p, pObjLi,f) ); } assert( p->vInits == NULL || Vec_IntSize(p->vInits) == iLits + Saig_ManPiNum(p->pAig) ); // add the POs for the latch outputs of the last frame Saig_ManForEachLo( p->pAig, pObj, i ) Aig_ObjCreateCo( pFrames, Ssw_ObjFrame( p, pObj, p->pPars->nFramesK ) ); // remove dangling nodes Aig_ManCleanup( pFrames ); // make sure the satisfying assignment is node assigned assert( pFrames->pData == NULL ); //Aig_ManShow( pFrames, 0, NULL ); return pFrames; } /**Function************************************************************* Synopsis [Prepares the inductive case with speculative reduction.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Aig_Man_t * Ssw_SpeculativeReduction( Ssw_Man_t * p ) { Aig_Man_t * pFrames; Aig_Obj_t * pObj, * pObjNew; int i; assert( p->pFrames == NULL ); assert( Aig_ManRegNum(p->pAig) > 0 ); assert( Aig_ManRegNum(p->pAig) < Aig_ManCiNum(p->pAig) ); p->nConstrTotal = p->nConstrReduced = 0; // start the fraig package pFrames = Aig_ManStart( Aig_ManObjNumMax(p->pAig) * p->nFrames ); pFrames->pName = Abc_UtilStrsav( p->pAig->pName ); // map constants and PIs Ssw_ObjSetFrame( p, Aig_ManConst1(p->pAig), 0, Aig_ManConst1(pFrames) ); Saig_ManForEachPi( p->pAig, pObj, i ) Ssw_ObjSetFrame( p, pObj, 0, Aig_ObjCreateCi(pFrames) ); // create latches for the first frame Saig_ManForEachLo( p->pAig, pObj, i ) Ssw_ObjSetFrame( p, pObj, 0, Aig_ObjCreateCi(pFrames) ); // set the constraints on the latch outputs Saig_ManForEachLo( p->pAig, pObj, i ) Ssw_FramesConstrainNode( p, pFrames, p->pAig, pObj, 0, 0 ); // add internal nodes of this frame Aig_ManForEachNode( p->pAig, pObj, i ) { pObjNew = Aig_And( pFrames, Ssw_ObjChild0Fra(p, pObj, 0), Ssw_ObjChild1Fra(p, pObj, 0) ); Ssw_ObjSetFrame( p, pObj, 0, pObjNew ); Ssw_FramesConstrainNode( p, pFrames, p->pAig, pObj, 0, 0 ); } // add the POs for the latch outputs of the last frame Saig_ManForEachLi( p->pAig, pObj, i ) Aig_ObjCreateCo( pFrames, Ssw_ObjChild0Fra(p, pObj,0) ); // remove dangling nodes Aig_ManCleanup( pFrames ); Aig_ManSetRegNum( pFrames, Aig_ManRegNum(p->pAig) ); // Abc_Print( 1, "SpecRed: Total constraints = %d. Reduced constraints = %d.\n", // p->nConstrTotal, p->nConstrReduced ); return pFrames; } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END