/**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