mirror of https://github.com/YosysHQ/abc.git
196 lines
6.5 KiB
C
196 lines
6.5 KiB
C
/**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 )
|
|
{
|
|
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
|
|
}
|
|
// 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 )
|
|
{
|
|
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 );
|
|
// 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
|
|
|