blob: 8f18f69c4c8adfd921989e4dfadf84bb75557c80 [file] [log] [blame]
/**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