blob: 73519fd32b62dbc8c7bd13397f8cfa5cb20abf9c [file] [log] [blame]
/**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
//Vec_StrPutI_ne( vStr, Tim_ManBoxIsBlack(p, pBox->iBox) );
}
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, fBlack;
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 );
fBlack = 0;//Vec_StrGetI_ne( p, &iStr );
Tim_ManCreateBox( pMan, curPo, nBoxIns, curPi, nBoxOuts, TableId, fBlack );
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