blob: d590b7b953a93f48682cdf6c7f3848bf222e0093 [file] [log] [blame]
/**CFile****************************************************************
FileName [amapOutput.c]
SystemName [ABC: Logic synthesis and verification system.]
PackageName [Technology mapper for standard cells.]
Synopsis [Core mapping procedures.]
Author [Alan Mishchenko]
Affiliation [UC Berkeley]
Date [Ver. 1.0. Started - June 20, 2005.]
Revision [$Id: amapOutput.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
***********************************************************************/
#include "amapInt.h"
ABC_NAMESPACE_IMPL_START
////////////////////////////////////////////////////////////////////////
/// DECLARATIONS ///
////////////////////////////////////////////////////////////////////////
static inline char * Amap_OuputStrsav( Aig_MmFlex_t * p, char * pStr )
{ return pStr ? strcpy(Aig_MmFlexEntryFetch(p, strlen(pStr)+1), pStr) : NULL; }
////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
/**Function*************************************************************
Synopsis [Allocates structure for storing one gate.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
Amap_Out_t * Amap_OutputStructAlloc( Aig_MmFlex_t * pMem, Amap_Gat_t * pGate )
{
Amap_Out_t * pRes;
int nFans = pGate? pGate->nPins : 1;
pRes = (Amap_Out_t *)Aig_MmFlexEntryFetch( pMem, sizeof(Amap_Out_t)+sizeof(int)*nFans );
memset( pRes, 0, sizeof(Amap_Out_t) );
memset( pRes->pFans, 0xff, sizeof(int)*nFans );
pRes->pName = pGate? Amap_OuputStrsav( pMem, pGate->pName ) : NULL;
pRes->nFans = nFans;
return pRes;
}
/**Function*************************************************************
Synopsis [Returns mapped network as an array of structures.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
Vec_Ptr_t * Amap_ManProduceMapped( Amap_Man_t * p )
{
Vec_Ptr_t * vNodes;
Aig_MmFlex_t * pMem;
Amap_Obj_t * pObj, * pFanin;
Amap_Gat_t * pGate;
Amap_Out_t * pRes;
int i, k, iFanin, fCompl;
float TotalArea = 0.0;
pMem = Aig_MmFlexStart();
// create mapping object for each node used in the mapping
vNodes = Vec_PtrAlloc( 10 );
Amap_ManForEachObj( p, pObj, i )
{
if ( Amap_ObjIsPi(pObj) )
{
assert( pObj->fPolar == 0 );
pRes = Amap_OutputStructAlloc( pMem, NULL );
pRes->Type = -1;
pRes->nFans = 0;
// save this structure
pObj->iData = Vec_PtrSize( vNodes );
Vec_PtrPush( vNodes, pRes );
// create invertor if needed
if ( pObj->nFouts[1] ) // this PI is used in the neg polarity
{
pRes = Amap_OutputStructAlloc( pMem, p->pLib->pGateInv );
pRes->pFans[0] = pObj->iData;
// save this structure
Vec_PtrPush( vNodes, pRes );
TotalArea += p->pLib->pGateInv->dArea;
}
continue;
}
if ( Amap_ObjIsNode(pObj) )
{
// skip the node that is not used in the mapping
if ( Amap_ObjRefsTotal(pObj) == 0 )
continue;
// get the gate
pGate = Amap_LibGate( p->pLib, pObj->Best.pSet->iGate );
assert( pGate->nPins == pObj->Best.pCut->nFans );
// allocate structure
pRes = Amap_OutputStructAlloc( pMem, pGate );
Amap_MatchForEachFaninCompl( p, &pObj->Best, pFanin, fCompl, k )
{
assert( Amap_ObjRefsTotal(pFanin) );
if ( (int)pFanin->fPolar == fCompl )
pRes->pFans[k] = pFanin->iData;
else
pRes->pFans[k] = pFanin->iData + 1;
}
// save this structure
pObj->iData = Vec_PtrSize( vNodes );
Vec_PtrPush( vNodes, pRes );
TotalArea += pGate->dArea;
// create invertor if needed
if ( pObj->nFouts[!pObj->fPolar] ) // needed in the opposite polarity
{
pRes = Amap_OutputStructAlloc( pMem, p->pLib->pGateInv );
pRes->pFans[0] = pObj->iData;
// save this structure
Vec_PtrPush( vNodes, pRes );
TotalArea += p->pLib->pGateInv->dArea;
}
continue;
}
if ( Amap_ObjIsPo(pObj) )
{
assert( pObj->fPolar == 0 );
pFanin = Amap_ObjFanin0(p, pObj);
assert( Amap_ObjRefsTotal(pFanin) );
if ( Amap_ObjIsConst1(pFanin) )
{ // create constant node
if ( Amap_ObjFaninC0(pObj) )
{
pRes = Amap_OutputStructAlloc( pMem, p->pLib->pGate0 );
TotalArea += p->pLib->pGate0->dArea;
}
else
{
pRes = Amap_OutputStructAlloc( pMem, p->pLib->pGate1 );
TotalArea += p->pLib->pGate1->dArea;
}
// save this structure
iFanin = Vec_PtrSize( vNodes );
Vec_PtrPush( vNodes, pRes );
}
else
{
if ( (int)pFanin->fPolar == Amap_ObjFaninC0(pObj) )
iFanin = pFanin->iData;
else
iFanin = pFanin->iData + 1;
}
// create PO node
pRes = Amap_OutputStructAlloc( pMem, NULL );
pRes->Type = 1;
pRes->pFans[0] = iFanin;
// save this structure
Vec_PtrPush( vNodes, pRes );
}
}
// return memory manager in the last entry of the array
Vec_PtrPush( vNodes, pMem );
return vNodes;
}
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
ABC_NAMESPACE_IMPL_END