/**CFile**************************************************************** FileName [gia.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [Scalable AIG package.] Synopsis [] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 20, 2005.] Revision [$Id: gia.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] ***********************************************************************/ #include "gia.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// typedef struct Slv_Man_t_ Slv_Man_t; struct Slv_Man_t_ { Vec_Int_t vCis; Vec_Int_t vCos; Vec_Int_t vFanins; Vec_Int_t vFanoutN; Vec_Int_t vFanout0; Vec_Str_t vValues; Vec_Int_t vCopies; }; static inline int Slv_ManObjNum ( Slv_Man_t * p ) { return Vec_IntSize(&p->vFanins)/2; } static inline int Slv_ObjFaninLit ( Slv_Man_t * p, int iObj, int f ) { return Vec_IntEntry(&p->vFanins, Abc_Var2Lit(iObj, f)); } static inline int Slv_ObjFanin ( Slv_Man_t * p, int iObj, int f ) { return Abc_Lit2Var(Slv_ObjFaninLit(p, iObj, f)); } static inline int Slv_ObjFaninC ( Slv_Man_t * p, int iObj, int f ) { return Abc_LitIsCompl(Slv_ObjFaninLit(p, iObj, f)); } static inline int Slv_ObjIsCi ( Slv_Man_t * p, int iObj ) { return !Slv_ObjFaninLit(p, iObj, 0) && Slv_ObjFaninLit(p, iObj, 1); } static inline int Slv_ObjIsCo ( Slv_Man_t * p, int iObj ) { return Slv_ObjFaninLit(p, iObj, 0) && !Slv_ObjFaninLit(p, iObj, 1); } static inline int Slv_ObjIsAnd ( Slv_Man_t * p, int iObj ) { return Slv_ObjFaninLit(p, iObj, 0) && Slv_ObjFaninLit(p, iObj, 1); } static inline int Slv_ObjFanout0 ( Slv_Man_t * p, int iObj ) { return Vec_IntEntry(&p->vFanout0, iObj); } static inline void Slv_ObjSetFanout0 ( Slv_Man_t * p, int iObj, int iLit ) { Vec_IntWriteEntry(&p->vFanout0, iObj, iLit); } static inline int Slv_ObjNextFanout ( Slv_Man_t * p, int iLit ) { return Vec_IntEntry(&p->vFanoutN, iLit); } static inline void Slv_ObjSetNextFanout( Slv_Man_t * p, int iLit, int iLitF ) { Vec_IntWriteEntry(&p->vFanoutN, iLit, iLitF); } static inline int Slv_ObjCopyLit ( Slv_Man_t * p, int iObj ) { return Vec_IntEntry(&p->vCopies, iObj); } static inline void Slv_ObjSetCopyLit ( Slv_Man_t * p, int iObj, int iLit ) { Vec_IntWriteEntry(&p->vCopies, iObj, iLit); } #define Slv_ManForEachObj( p, iObj ) \ for ( iObj = 1; iObj < Slv_ManObjNum(p); iObj++ ) #define Slv_ObjForEachFanout( p, iObj, iFanLit ) \ for ( iFanLit = Slv_ObjFanout0(p, iObj); iFanLit; iFanLit = Slv_ObjNextFanout(p, iFanLit) ) //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Slv_Man_t * Slv_ManAlloc( int nObjs ) { Slv_Man_t * p = ABC_CALLOC( Slv_Man_t, 1 ); Vec_IntGrow( &p->vCis, 100 ); Vec_IntGrow( &p->vCos, 100 ); Vec_IntGrow( &p->vFanins, 2*nObjs ); Vec_IntGrow( &p->vFanoutN, 2*nObjs ); Vec_IntGrow( &p->vFanout0, nObjs ); Vec_StrGrow( &p->vValues, nObjs ); // constant node Vec_IntFill( &p->vFanins, 2, 0 ); Vec_IntFill( &p->vFanoutN, 2, 0 ); Vec_IntFill( &p->vFanout0, 1, 0 ); return p; } void Slv_ManFree( Slv_Man_t * p ) { Vec_IntErase( &p->vCis ); Vec_IntErase( &p->vCos ); Vec_IntErase( &p->vFanins ); Vec_IntErase( &p->vFanoutN ); Vec_IntErase( &p->vFanout0 ); Vec_StrErase( &p->vValues ); Vec_IntErase( &p->vCopies ); ABC_FREE( p ); } void Slv_ManPrintFanouts( Slv_Man_t * p ) { int iObj, iFanLit; Slv_ManForEachObj( p, iObj ) { printf( "Fanouts of node %d: ", iObj ); Slv_ObjForEachFanout( p, iObj, iFanLit ) printf( "%d ", Abc_Lit2Var(iFanLit) ); printf( "\n" ); } } static inline int Slv_ManAppendObj( Slv_Man_t * p, int iLit0, int iLit1 ) { int iObj = Slv_ManObjNum(p); Vec_StrPush( &p->vValues, 0 ); Vec_IntPush( &p->vFanout0, 0 ); Vec_IntPushTwo( &p->vFanoutN, 0, 0 ); if ( !iLit0 ) // primary input assert(!iLit1), iLit1 = Vec_IntSize(&p->vCis)+1, Vec_IntPush(&p->vCis, iObj); else if ( !iLit1 ) // primary output assert(iLit0), Vec_IntPush(&p->vCos, iObj); else { Slv_ObjSetNextFanout( p, Abc_Var2Lit(iObj, 0), Slv_ObjFanout0(p, Abc_Lit2Var(iLit0)) ); Slv_ObjSetNextFanout( p, Abc_Var2Lit(iObj, 1), Slv_ObjFanout0(p, Abc_Lit2Var(iLit1)) ); Slv_ObjSetFanout0( p, Abc_Lit2Var(iLit0), Abc_Var2Lit(iObj, 0) ); Slv_ObjSetFanout0( p, Abc_Lit2Var(iLit1), Abc_Var2Lit(iObj, 1) ); } Vec_IntPushTwo( &p->vFanins, iLit0, iLit1 ); return Abc_Var2Lit( iObj, 0 ); } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Slv_Man_t * Slv_ManFromGia( Gia_Man_t * p ) { Gia_Obj_t * pObj; int i; Slv_Man_t * pNew = Slv_ManAlloc( Gia_ManObjNum(p) ); Gia_ManConst0(p)->Value = 0; Gia_ManForEachObj1( p, pObj, i ) { if ( Gia_ObjIsAnd(pObj) ) pObj->Value = Slv_ManAppendObj( pNew, Abc_LitNotCond(Gia_ObjFanin0(pObj)->Value, Gia_ObjFaninC0(pObj)), Abc_LitNotCond(Gia_ObjFanin1(pObj)->Value, Gia_ObjFaninC1(pObj)) ); else if ( Gia_ObjIsCo(pObj) ) pObj->Value = Slv_ManAppendObj( pNew, Abc_LitNotCond(Gia_ObjFanin0(pObj)->Value, Gia_ObjFaninC0(pObj)), 0 ); else if ( Gia_ObjIsCi(pObj) ) pObj->Value = Slv_ManAppendObj( pNew, 0, 0 ); else assert( 0 ); } assert( Gia_ManObjNum(p) == Slv_ManObjNum(pNew) ); return pNew; } Gia_Man_t * Slv_ManToGia( Slv_Man_t * p ) { int iObj; Gia_Man_t * pNew = Gia_ManStart( Slv_ManObjNum(p) ); Vec_IntFill( &p->vCopies, Slv_ManObjNum(p), 0 ); Slv_ManForEachObj( p, iObj ) if ( Slv_ObjIsCi(p, iObj) ) Slv_ObjSetCopyLit( p, iObj, Gia_ManAppendCi(pNew) ); else if ( Slv_ObjIsCo(p, iObj) ) { int iLit0 = Abc_LitNotCond( Slv_ObjCopyLit(p, Slv_ObjFanin(p, iObj, 0)), Slv_ObjFaninC(p, iObj, 0) ); Slv_ObjSetCopyLit( p, iObj, Gia_ManAppendCo(pNew, iLit0) ); } else if ( Slv_ObjIsAnd(p, iObj) ) { int iLit0 = Abc_LitNotCond( Slv_ObjCopyLit(p, Slv_ObjFanin(p, iObj, 0)), Slv_ObjFaninC(p, iObj, 0) ); int iLit1 = Abc_LitNotCond( Slv_ObjCopyLit(p, Slv_ObjFanin(p, iObj, 1)), Slv_ObjFaninC(p, iObj, 1) ); Slv_ObjSetCopyLit( p, iObj, Gia_ManAppendAnd(pNew, iLit0, iLit1) ); } else assert(0); assert( Gia_ManObjNum(pNew) == Slv_ManObjNum(p) ); return pNew; } Gia_Man_t * Slv_ManToAig( Gia_Man_t * pGia ) { Slv_Man_t * p = Slv_ManFromGia( pGia ); Gia_Man_t * pNew = Slv_ManToGia( p ); pNew->pName = Abc_UtilStrsav( pGia->pName ); pNew->pSpec = Abc_UtilStrsav( pGia->pSpec ); Slv_ManPrintFanouts( p ); Slv_ManFree( p ); return pNew; } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END