blob: fd5e8255469e231b374f6b340b150c7ae717b830 [file] [log] [blame]
/**CFile****************************************************************
FileName [absRpmOld.c]
SystemName [ABC: Logic synthesis and verification system.]
PackageName [Scalable AIG package.]
Synopsis [Old min-cut-based reparametrization.]
Author [Alan Mishchenko]
Affiliation [UC Berkeley]
Date [Ver. 1.0. Started - June 20, 2005.]
Revision [$Id: absRpmOld.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
***********************************************************************/
#include "abs.h"
ABC_NAMESPACE_IMPL_START
////////////////////////////////////////////////////////////////////////
/// DECLARATIONS ///
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
/**Function*************************************************************
Synopsis [Specialized duplication.]
Description [Replaces registers by PIs/POs and PIs by registers.]
SideEffects []
SeeAlso []
***********************************************************************/
Gia_Man_t * Gia_ManDupIn2Ff( Gia_Man_t * p )
{
Vec_Int_t * vPiOuts;
Gia_Man_t * pNew;
Gia_Obj_t * pObj;
int i;
vPiOuts = Vec_IntAlloc( Gia_ManPiNum(p) );
pNew = Gia_ManStart( Gia_ManObjNum(p) + 2 * Gia_ManPiNum(p) );
pNew->pName = Abc_UtilStrsav( p->pName );
pNew->pSpec = Abc_UtilStrsav( p->pSpec );
Gia_ManFillValue( p );
Gia_ManConst0(p)->Value = 0;
Gia_ManForEachPi( p, pObj, i )
Vec_IntPush( vPiOuts, Gia_ManAppendCi(pNew) );
Gia_ManForEachRo( p, pObj, i )
pObj->Value = Gia_ManAppendCi( pNew );
Gia_ManForEachPi( p, pObj, i )
pObj->Value = Gia_ManAppendCi( pNew );
Gia_ManForEachAnd( p, pObj, i )
pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
Gia_ManForEachPo( p, pObj, i )
pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
Gia_ManForEachRi( p, pObj, i )
pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
Gia_ManForEachPi( p, pObj, i )
Gia_ManAppendCo( pNew, Vec_IntEntry(vPiOuts, i) );
Gia_ManSetRegNum( pNew, Gia_ManPiNum(p) );
Vec_IntFree( vPiOuts );
return pNew;
}
/**Function*************************************************************
Synopsis [Reverses the above step.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int Gia_ManDupFf2In_rec( Gia_Man_t * pNew, Gia_Obj_t * pObj )
{
if ( pObj->Value != ~0 )
return pObj->Value;
assert( Gia_ObjIsAnd(pObj) );
Gia_ManDupFf2In_rec( pNew, Gia_ObjFanin0(pObj) );
Gia_ManDupFf2In_rec( pNew, Gia_ObjFanin1(pObj) );
return pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
}
/**Function*************************************************************
Synopsis [Reverses the above step.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
Gia_Man_t * Gia_ManDupFf2In( Gia_Man_t * p, int nFlopsOld )
{
Gia_Man_t * pNew;
Gia_Obj_t * pObj;
int i;
pNew = Gia_ManStart( Gia_ManObjNum(p) );
pNew->pName = Abc_UtilStrsav( p->pName );
pNew->pSpec = Abc_UtilStrsav( p->pSpec );
Gia_ManFillValue( p );
Gia_ManConst0(p)->Value = 0;
Gia_ManForEachRo( p, pObj, i )
pObj->Value = Gia_ManAppendCi( pNew );
for ( i = Gia_ManPiNum(p) - nFlopsOld; i < Gia_ManPiNum(p); i++ )
Gia_ManPi(p, i)->Value = Gia_ManAppendCi( pNew );
Gia_ManForEachPo( p, pObj, i )
Gia_ManDupFf2In_rec( pNew, Gia_ObjFanin0(pObj) );
Gia_ManForEachPo( p, pObj, i )
Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
Gia_ManSetRegNum( pNew, nFlopsOld );
return pNew;
}
/**Function*************************************************************
Synopsis [Reparameterized to get rid of useless primary inputs.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
Gia_Man_t * Abs_RpmPerformOld( Gia_Man_t * p, int fVerbose )
{
// extern Aig_Man_t * Saig_ManRetimeMinArea( Aig_Man_t * p, int nMaxIters, int fForwardOnly, int fBackwardOnly, int fInitial, int fVerbose );
Aig_Man_t * pMan, * pTemp;
Gia_Man_t * pNew, * pTmp;
int nFlopsOld = Gia_ManRegNum(p);
if ( fVerbose )
{
printf( "Original AIG:\n" );
Gia_ManPrintStats( p, NULL );
}
// perform input trimming
pNew = Gia_ManDupTrimmed( p, 1, 0, 0, -1 );
if ( fVerbose )
{
printf( "After PI trimming:\n" );
Gia_ManPrintStats( pNew, NULL );
}
// transform GIA
pNew = Gia_ManDupIn2Ff( pTmp = pNew );
Gia_ManStop( pTmp );
if ( fVerbose )
{
printf( "After PI-2-FF transformation:\n" );
Gia_ManPrintStats( pNew, NULL );
}
// derive AIG
pMan = Gia_ManToAigSimple( pNew );
Gia_ManStop( pNew );
// perform min-reg retiming
pMan = Saig_ManRetimeMinArea( pTemp = pMan, 10, 0, 0, 1, 0 );
Aig_ManStop( pTemp );
// derive GIA
pNew = Gia_ManFromAigSimple( pMan );
Aig_ManStop( pMan );
if ( fVerbose )
{
printf( "After min-area retiming:\n" );
Gia_ManPrintStats( pNew, NULL );
}
// transform back
pNew = Gia_ManDupFf2In( pTmp = pNew, nFlopsOld );
Gia_ManStop( pTmp );
if ( fVerbose )
{
printf( "After FF-2-PI tranformation:\n" );
Gia_ManPrintStats( pNew, NULL );
}
return pNew;
}
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
ABC_NAMESPACE_IMPL_END