/**CFile**************************************************************** FileName [timDump.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [Hierarchy/timing manager.] Synopsis [Saving and loading the hierarchy timing manager.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - April 28, 2007.] Revision [$Id: timDump.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] ***********************************************************************/ #include "timInt.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// #define TIM_DUMP_VER_NUM 1 //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Transform the timing manager into the char stream.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Vec_Str_t * Tim_ManSave( Tim_Man_t * p, int fHieOnly ) { Tim_Box_t * pBox; Tim_Obj_t * pObj; Vec_Str_t * vStr; float * pDelayTable; int i, k, TableSize; // create output stream vStr = Vec_StrAlloc( 10000 ); // dump version number Vec_StrPutI_ne( vStr, TIM_DUMP_VER_NUM ); // save CI/CO counts Vec_StrPutI_ne( vStr, Tim_ManCiNum(p) ); Vec_StrPutI_ne( vStr, Tim_ManCoNum(p) ); // save PI/PO counts Vec_StrPutI_ne( vStr, Tim_ManPiNum(p) ); Vec_StrPutI_ne( vStr, Tim_ManPoNum(p) ); // save number of boxes Vec_StrPutI_ne( vStr, Tim_ManBoxNum(p) ); // for each box, save num_inputs, num_outputs, delay table ID, and copy field if ( Tim_ManBoxNum(p) > 0 ) Tim_ManForEachBox( p, pBox, i ) { Vec_StrPutI_ne( vStr, Tim_ManBoxInputNum(p, pBox->iBox) ); Vec_StrPutI_ne( vStr, Tim_ManBoxOutputNum(p, pBox->iBox) ); Vec_StrPutI_ne( vStr, Tim_ManBoxDelayTableId(p, pBox->iBox) ); // can be -1 if delay table is not given Vec_StrPutI_ne( vStr, Tim_ManBoxCopy(p, pBox->iBox) ); // can be -1 if the copy is node defined } if ( fHieOnly ) return vStr; // save the number of delay tables Vec_StrPutI_ne( vStr, Tim_ManDelayTableNum(p) ); // save the delay tables if ( Tim_ManDelayTableNum(p) > 0 ) Tim_ManForEachTable( p, pDelayTable, i ) { assert( (int)pDelayTable[0] == i ); // save table ID and dimensions (inputs x outputs) Vec_StrPutI_ne( vStr, (int)pDelayTable[0] ); Vec_StrPutI_ne( vStr, (int)pDelayTable[1] ); Vec_StrPutI_ne( vStr, (int)pDelayTable[2] ); // save table contents TableSize = (int)pDelayTable[1] * (int)pDelayTable[2]; for ( k = 0; k < TableSize; k++ ) Vec_StrPutF( vStr, pDelayTable[k+3] ); } // save PI arrival times Tim_ManForEachPi( p, pObj, i ) Vec_StrPutF( vStr, Tim_ManGetCiArrival(p, pObj->Id) ); // save PO required times Tim_ManForEachPo( p, pObj, i ) Vec_StrPutF( vStr, Tim_ManGetCoRequired(p, pObj->Id) ); return vStr; } /**Function************************************************************* Synopsis [Restores the timing manager from the char stream.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Tim_Man_t * Tim_ManLoad( Vec_Str_t * p, int fHieOnly ) { Tim_Man_t * pMan; Tim_Obj_t * pObj; int VerNum, nCis, nCos, nPis, nPos; int nBoxes, nBoxIns, nBoxOuts, CopyBox; int TableId, nTables, TableSize, TableX, TableY; int i, k, curPi, curPo, iStr = 0; float * pDelayTable; // get version number VerNum = Vec_StrGetI_ne( p, &iStr ); assert( VerNum == TIM_DUMP_VER_NUM ); // get the number of CIs/COs nCis = Vec_StrGetI_ne( p, &iStr ); nCos = Vec_StrGetI_ne( p, &iStr ); // get the number of PIs/POs nPis = Vec_StrGetI_ne( p, &iStr ); nPos = Vec_StrGetI_ne( p, &iStr ); // start the timing manager pMan = Tim_ManStart( nCis, nCos ); // start boxes nBoxes = Vec_StrGetI_ne( p, &iStr ); assert( pMan->vBoxes == NULL ); if ( nBoxes > 0 ) pMan->vBoxes = Vec_PtrAlloc( nBoxes ); // create boxes curPi = nPis; curPo = 0; for ( i = 0; i < nBoxes; i++ ) { nBoxIns = Vec_StrGetI_ne( p, &iStr ); nBoxOuts = Vec_StrGetI_ne( p, &iStr ); TableId = Vec_StrGetI_ne( p, &iStr ); CopyBox = Vec_StrGetI_ne( p, &iStr ); Tim_ManCreateBox( pMan, curPo, nBoxIns, curPi, nBoxOuts, TableId ); Tim_ManBoxSetCopy( pMan, i, CopyBox ); curPi += nBoxOuts; curPo += nBoxIns; } curPo += nPos; assert( curPi == nCis ); assert( curPo == nCos ); if ( fHieOnly ) return pMan; // create delay tables nTables = Vec_StrGetI_ne( p, &iStr ); assert( pMan->vDelayTables == NULL ); if ( nTables > 0 ) pMan->vDelayTables = Vec_PtrAlloc( nTables ); // read delay tables for ( i = 0; i < nTables; i++ ) { // read table ID and dimensions TableId = Vec_StrGetI_ne( p, &iStr ); TableX = Vec_StrGetI_ne( p, &iStr ); TableY = Vec_StrGetI_ne( p, &iStr ); assert( TableId == i ); // create new table TableSize = TableX * TableY; pDelayTable = ABC_ALLOC( float, TableSize + 3 ); pDelayTable[0] = TableId; pDelayTable[1] = TableX; pDelayTable[2] = TableY; // read table contents for ( k = 0; k < TableSize; k++ ) pDelayTable[k+3] = Vec_StrGetF( p, &iStr ); assert( Vec_PtrSize(pMan->vDelayTables) == TableId ); Vec_PtrPush( pMan->vDelayTables, pDelayTable ); } assert( Tim_ManDelayTableNum(pMan) == nTables ); // read PI arrival times Tim_ManForEachPi( pMan, pObj, i ) Tim_ManInitPiArrival( pMan, i, Vec_StrGetF(p, &iStr) ); // read PO required times Tim_ManForEachPo( pMan, pObj, i ) Tim_ManInitPoRequired( pMan, i, Vec_StrGetF(p, &iStr) ); assert( Vec_StrSize(p) == iStr ); // Tim_ManPrint( pMan ); return pMan; } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END