blob: 7faa5d779b09799d6c8e5439ee03e15a245a928a [file] [log] [blame]
/**CFile****************************************************************
FileName [abcPlace.c]
SystemName [ABC: Logic synthesis and verification system.]
PackageName [Network and node package.]
Synopsis [Interface with a placer.]
Author [Alan Mishchenko]
Affiliation [UC Berkeley]
Date [Ver. 1.0. Started - June 20, 2005.]
Revision [$Id: abcPlace.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
***********************************************************************/
#include "base/abc/abc.h"
// placement includes
#include "phys/place/place_base.h"
ABC_NAMESPACE_IMPL_START
////////////////////////////////////////////////////////////////////////
/// DECLARATIONS ///
////////////////////////////////////////////////////////////////////////
AbstractCell *abstractCells = NULL;
ConcreteCell *cells = NULL;
ConcreteNet *nets = NULL;
int nAllocSize = 0;
////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
/**Function*************************************************************
Synopsis [Creates a new cell.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static inline void Abc_PlaceCreateCell( Abc_Obj_t * pObj, int fAnd )
{
assert( cells[pObj->Id].m_id == 0 );
cells[pObj->Id].m_id = pObj->Id;
cells[pObj->Id].m_label = "";
cells[pObj->Id].m_parent = &(abstractCells[fAnd]);
cells[pObj->Id].m_fixed = 0;
addConcreteCell(&(cells[pObj->Id]));
}
/**Function*************************************************************
Synopsis [Updates the net.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static inline void Abc_PlaceUpdateNet( Abc_Obj_t * pObj )
{
Abc_Obj_t * pFanout;
int k;
// free the old array of net terminals
if ( nets[pObj->Id].m_terms )
free( nets[pObj->Id].m_terms );
// fill in the net with the new information
nets[pObj->Id].m_id = pObj->Id;
nets[pObj->Id].m_weight = 1.0;
nets[pObj->Id].m_numTerms = Abc_ObjFanoutNum(pObj); //fanout
nets[pObj->Id].m_terms = ALLOC(ConcreteCell*, Abc_ObjFanoutNum(pObj));
Abc_ObjForEachFanout( pObj, pFanout, k )
nets[pObj->Id].m_terms[k] = &(cells[pFanout->Id]);
addConcreteNet(&(nets[pObj->Id]));
}
/**Function*************************************************************
Synopsis [Returns the placement cost of the cut.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
float Abc_PlaceEvaluateCut( Abc_Obj_t * pRoot, Vec_Ptr_t * vFanins )
{
Abc_Obj_t * pObj;
// double x, y;
int i;
Vec_PtrForEachEntry( Abc_Obj_t *, vFanins, pObj, i )
{
// pObj->Id
}
return 0.0;
}
/**Function*************************************************************
Synopsis [Updates placement after one step of rewriting.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void Abc_PlaceUpdate( Vec_Ptr_t * vAddedCells, Vec_Ptr_t * vUpdatedNets )
{
Abc_Obj_t * pObj, * pFanin;
int i, k;
Vec_Ptr_t * vCells, * vNets;
// start the arrays of new cells and nets
vCells = Vec_PtrAlloc( 16 );
vNets = Vec_PtrAlloc( 32 );
// go through the new nodes
Vec_PtrForEachEntry( Abc_Obj_t *, vAddedCells, pObj, i )
{
assert( !Abc_ObjIsComplement(pObj) );
Abc_PlaceCreateCell( pObj, 1 );
Abc_PlaceUpdateNet( pObj );
// add the new cell and its fanin nets to temporary storage
Vec_PtrPush( vCells, &(cells[pObj->Id]) );
Abc_ObjForEachFanin( pObj, pFanin, k )
Vec_PtrPushUnique( vNets, &(nets[pFanin->Id]) );
}
// go through the modified nets
Vec_PtrForEachEntry( Abc_Obj_t *, vUpdatedNets, pObj, i )
{
assert( !Abc_ObjIsComplement(pObj) );
if ( Abc_ObjType(pObj) == ABC_OBJ_NONE ) // dead node
continue;
Abc_PlaceUpdateNet( pObj );
}
// update the placement
// fastPlace( Vec_PtrSize(vCells), (ConcreteCell **)Vec_PtrArray(vCells),
// Vec_PtrSize(vNets), (ConcreteNet **)Vec_PtrArray(vNets) );
// clean up
Vec_PtrFree( vCells );
Vec_PtrFree( vNets );
}
/**Function*************************************************************
Synopsis [This procedure is called before the writing start.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void Abc_PlaceBegin( Abc_Ntk_t * pNtk )
{
Abc_Obj_t * pObj;
int i;
// allocate and clean internal storage
nAllocSize = 5 * Abc_NtkObjNumMax(pNtk);
cells = REALLOC(ConcreteCell, cells, nAllocSize);
nets = REALLOC(ConcreteNet, nets, nAllocSize);
memset( cells, 0, sizeof(ConcreteCell) * nAllocSize );
memset( nets, 0, sizeof(ConcreteNet) * nAllocSize );
// create AbstractCells
// 1: pad
// 2: and
if (!abstractCells)
abstractCells = ALLOC(AbstractCell,2);
abstractCells[0].m_height = 1.0;
abstractCells[0].m_width = 1.0;
abstractCells[0].m_label = "pio";
abstractCells[0].m_pad = 1;
abstractCells[1].m_height = 1.0;
abstractCells[1].m_width = 1.0;
abstractCells[1].m_label = "and";
abstractCells[1].m_pad = 0;
// input pads
Abc_NtkForEachCi( pNtk, pObj, i )
Abc_PlaceCreateCell( pObj, 0 );
// ouput pads
Abc_NtkForEachCo( pNtk, pObj, i )
Abc_PlaceCreateCell( pObj, 0 );
// AND nodes
Abc_AigForEachAnd( pNtk, pObj, i )
Abc_PlaceCreateCell( pObj, 1 );
// all nets
Abc_NtkForEachObj( pNtk, pObj, i )
{
if ( !Abc_ObjIsCi(pObj) && !Abc_ObjIsNode(pObj) )
continue;
Abc_PlaceUpdateNet( pObj );
}
globalPreplace((float)0.8);
globalPlace();
}
/**Function*************************************************************
Synopsis [This procedure is called after the writing completes.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void Abc_PlaceEnd( Abc_Ntk_t * pNtk )
{
int i;
// clean up
for ( i = 0; i < nAllocSize; i++ )
FREE( nets[i].m_terms );
FREE( abstractCells );
FREE( cells );
FREE( nets );
}
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
ABC_NAMESPACE_IMPL_END