diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2012-09-21 22:00:39 -0700 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2012-09-21 22:00:39 -0700 |
commit | fdd043ca341c908bc7dc2ad62fc9974152e4f740 (patch) | |
tree | 0ad9767db7e06ed2b41494ef39d8bed57b8464c0 | |
parent | c1f8baafb86cddf08f56a3bdd7329cad68b5413f (diff) | |
download | abc-fdd043ca341c908bc7dc2ad62fc9974152e4f740.tar.gz abc-fdd043ca341c908bc7dc2ad62fc9974152e4f740.tar.bz2 abc-fdd043ca341c908bc7dc2ad62fc9974152e4f740.zip |
Upgrading hierarchy timing manager.
-rw-r--r-- | abclib.dsp | 24 | ||||
-rw-r--r-- | src/aig/gia/giaAiger.c | 32 | ||||
-rw-r--r-- | src/aig/gia/giaSpeedup.c | 2 | ||||
-rw-r--r-- | src/map/if/if.h | 5 | ||||
-rw-r--r-- | src/map/if/ifUtil.c | 2 | ||||
-rw-r--r-- | src/misc/tim/module.make | 7 | ||||
-rw-r--r-- | src/misc/tim/tim.c | 961 | ||||
-rw-r--r-- | src/misc/tim/tim.h | 63 | ||||
-rw-r--r-- | src/misc/tim/timBox.c | 204 | ||||
-rw-r--r-- | src/misc/tim/timDump.c | 181 | ||||
-rw-r--r-- | src/misc/tim/timInt.h | 151 | ||||
-rw-r--r-- | src/misc/tim/timMan.c | 344 | ||||
-rw-r--r-- | src/misc/tim/timTime.c | 265 | ||||
-rw-r--r-- | src/misc/tim/timTrav.c | 185 | ||||
-rw-r--r-- | src/misc/vec/vecStr.h | 22 | ||||
-rw-r--r-- | src/opt/nwk/nwkDfs.c | 2 | ||||
-rw-r--r-- | src/opt/nwk/nwkTiming.c | 2 |
17 files changed, 1455 insertions, 997 deletions
@@ -2905,6 +2905,30 @@ SOURCE=.\src\misc\tim\tim.c SOURCE=.\src\misc\tim\tim.h # End Source File +# Begin Source File + +SOURCE=.\src\misc\tim\timBox.c +# End Source File +# Begin Source File + +SOURCE=.\src\misc\tim\timDump.c +# End Source File +# Begin Source File + +SOURCE=.\src\misc\tim\timInt.h +# End Source File +# Begin Source File + +SOURCE=.\src\misc\tim\timMan.c +# End Source File +# Begin Source File + +SOURCE=.\src\misc\tim\timTime.c +# End Source File +# Begin Source File + +SOURCE=.\src\misc\tim\timTrav.c +# End Source File # End Group # End Group # Begin Group "ai" diff --git a/src/aig/gia/giaAiger.c b/src/aig/gia/giaAiger.c index 0fbe1ee6..f304c644 100644 --- a/src/aig/gia/giaAiger.c +++ b/src/aig/gia/giaAiger.c @@ -20,6 +20,7 @@ ***********************************************************************/ #include "gia.h" +#include "misc/tim/tim.h" ABC_NAMESPACE_IMPL_START @@ -872,6 +873,17 @@ Gia_Man_t * Gia_ReadAigerFromMemory( char * pContents, int nFileSize, int fSkipS // read switching activity pNew->pSwitching = Gia_ReadSwitching( &pCur, Gia_ManObjNum(pNew) ); } + if ( *pCur == 't' ) + { + Vec_Str_t * vStr; + pCur++; + // read timing manager + vStr = Vec_StrStart( Gia_ReadInt(pCur) ); pCur += 4; + memcpy( Vec_StrArray(vStr), pCur, Vec_StrSize(vStr) ); + pCur += Vec_StrSize(vStr); + pNew->pManTime = Tim_ManLoad( vStr ); + Vec_StrFree( vStr ); + } if ( *pCur == 'c' ) { pCur++; @@ -1046,10 +1058,12 @@ Gia_Man_t * Gia_ReadAigerFromMemory( char * pContents, int nFileSize, int fSkipS if ( Gia_ManHasDangling(pNew) ) { + Tim_Man_t * pManTime; Vec_Int_t * vFlopMap, * vGateMap, * vObjMap; vFlopMap = pNew->vFlopClasses; pNew->vFlopClasses = NULL; vGateMap = pNew->vGateClasses; pNew->vGateClasses = NULL; vObjMap = pNew->vObjClasses; pNew->vObjClasses = NULL; + pManTime = pNew->pManTime; pNew->pManTime = NULL; pNew = Gia_ManCleanup( pTemp = pNew ); if ( (vGateMap || vObjMap) && (Gia_ManObjNum(pNew) < Gia_ManObjNum(pTemp)) ) printf( "Cleanup removed objects after reading. Old gate/object abstraction maps are invalid!\n" ); @@ -1057,6 +1071,7 @@ Gia_Man_t * Gia_ReadAigerFromMemory( char * pContents, int nFileSize, int fSkipS pNew->vFlopClasses = vFlopMap; pNew->vGateClasses = vGateMap; pNew->vObjClasses = vObjMap; + pNew->pManTime = pManTime; } return pNew; } @@ -1377,8 +1392,11 @@ void Gia_WriteAiger( Gia_Man_t * pInit, char * pFileName, int fWriteSymbols, int // create normalized AIG if ( !Gia_ManIsNormalized(pInit) ) { + Tim_Man_t * pManTime; + pManTime = pInit->pManTime; pInit->pManTime = NULL; // printf( "Gia_WriteAiger(): Normalizing AIG for writing.\n" ); p = Gia_ManDupNormalized( pInit ); + p->pManTime = pManTime; } else p = pInit; @@ -1519,7 +1537,7 @@ void Gia_WriteAiger( Gia_Man_t * pInit, char * pFileName, int fWriteSymbols, int fwrite( Buffer, 1, 4, pFile ); fwrite( p->pPlacement, 1, nSize, pFile ); } - // write flop classes + // write switching activity if ( p->pSwitching ) { unsigned char Buffer[10]; @@ -1529,6 +1547,18 @@ void Gia_WriteAiger( Gia_Man_t * pInit, char * pFileName, int fWriteSymbols, int fwrite( Buffer, 1, 4, pFile ); fwrite( p->pSwitching, 1, nSize, pFile ); } + // write timing information + if ( p->pManTime ) + { + Vec_Str_t * vStr = Tim_ManSave( p->pManTime ); + unsigned char Buffer[10]; + int nSize = Vec_StrSize(vStr); + Gia_WriteInt( Buffer, nSize ); + fprintf( pFile, "t" ); + fwrite( Buffer, 1, 4, pFile ); + fwrite( Vec_StrArray(vStr), 1, nSize, pFile ); + Vec_StrFree( vStr ); + } /* // write constraints if ( p->nConstrs ) diff --git a/src/aig/gia/giaSpeedup.c b/src/aig/gia/giaSpeedup.c index be9a8654..835f2c15 100644 --- a/src/aig/gia/giaSpeedup.c +++ b/src/aig/gia/giaSpeedup.c @@ -279,7 +279,7 @@ float Gia_ManDelayTraceLut( Gia_Man_t * p ) if ( p->pManTime ) { Tim_ManIncrementTravId( (Tim_Man_t *)p->pManTime ); - Tim_ManSetCoRequiredAll( (Tim_Man_t *)p->pManTime, tArrival ); + Tim_ManInitPoRequiredAll( (Tim_Man_t *)p->pManTime, tArrival ); } else { diff --git a/src/map/if/if.h b/src/map/if/if.h index 37cea625..f74a59da 100644 --- a/src/map/if/if.h +++ b/src/map/if/if.h @@ -128,7 +128,6 @@ struct If_Par_t_ int fUseSops; // use local SOPs as a cost function int fUseCnfs; // use local CNFs as a cost function int fUseMv; // use local MV-SOPs as a cost function - int fUseAdders; // timing model for adders int nLatchesCi; // the number of latches among the CIs int nLatchesCo; // the number of latches among the COs int nLatchesCiBox; // the number of white box outputs among the CIs @@ -531,8 +530,8 @@ extern int If_ManCountSpecialPos( If_Man_t * p ); extern int If_CutDelayRecCost(If_Man_t* p, If_Cut_t* pCut, If_Obj_t * pObj); extern int If_CutDelayRecCost2(If_Man_t* p, If_Cut_t* pCut, If_Obj_t * pObj); /*=== abcRec2.c ============================================================*/ -extern int Abc_NtkRecIsRunning(); -extern int Abc_NtkRecIsRunning2(); +extern ABC_DLL int Abc_NtkRecIsRunning(); +extern ABC_DLL int Abc_NtkRecIsRunning2(); // othe packages extern int Bat_ManCellFuncLookup( unsigned * pTruth, int nVars, int nLeaves ); diff --git a/src/map/if/ifUtil.c b/src/map/if/ifUtil.c index ccbb258e..4d904613 100644 --- a/src/map/if/ifUtil.c +++ b/src/map/if/ifUtil.c @@ -286,7 +286,7 @@ void If_ManComputeRequired( If_Man_t * p ) } else { - Tim_ManSetCoRequiredAll( p->pManTim, p->RequiredGlo ); + Tim_ManInitPoRequiredAll( p->pManTim, p->RequiredGlo ); // If_ManForEachCo( p, pObj, i ) // Tim_ManSetCoRequired( p->pManTim, pObj->IdPio, p->RequiredGlo ); } diff --git a/src/misc/tim/module.make b/src/misc/tim/module.make index 62a3ede5..00609901 100644 --- a/src/misc/tim/module.make +++ b/src/misc/tim/module.make @@ -1 +1,6 @@ -SRC += src/misc/tim/tim.c +SRC += src/misc/tim/tim.c \ + src/misc/tim/timBox.c \ + src/misc/tim/timDump.c \ + src/misc/tim/timMan.c \ + src/misc/tim/timTime.c \ + src/misc/tim/timTrav.c diff --git a/src/misc/tim/tim.c b/src/misc/tim/tim.c index 4e60c216..ebbbaf02 100644 --- a/src/misc/tim/tim.c +++ b/src/misc/tim/tim.c @@ -4,7 +4,7 @@ SystemName [ABC: Logic synthesis and verification system.] - PackageName [A timing manager.] + PackageName [Hierarchy/timing manager.] Synopsis [Representation of timing information.] @@ -18,975 +18,18 @@ ***********************************************************************/ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <assert.h> - -#include "misc/vec/vec.h" -#include "misc/mem/mem.h" -#include "tim.h" +#include "timInt.h" ABC_NAMESPACE_IMPL_START - //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// -typedef struct Tim_Box_t_ Tim_Box_t; -typedef struct Tim_Obj_t_ Tim_Obj_t; - -// timing manager -struct Tim_Man_t_ -{ - Vec_Ptr_t * vBoxes; // the timing boxes - Vec_Ptr_t * vDelayTables; // pointers to the delay tables - Mem_Flex_t * pMemObj; // memory manager for boxes - int nTravIds; // traversal ID of the manager - int fUseTravId; // enables the use of traversal ID - int nCis; // the number of PIs - int nCos; // the number of POs - Tim_Obj_t * pCis; // timing info for the PIs - Tim_Obj_t * pCos; // timing info for the POs -}; - -// timing box -struct Tim_Box_t_ -{ - int iBox; // the unique ID of this box - int TravId; // traversal ID of this box - int nInputs; // the number of box inputs (POs) - int nOutputs; // the number of box outputs (PIs) - float * pDelayTable; // delay for each input->output path - int Inouts[0]; // the int numbers of PIs and POs -}; - -// timing object -struct Tim_Obj_t_ -{ - int Id; // the ID of this object - int TravId; // traversal ID of this object - int iObj2Box; // mapping of the object into its box - int iObj2Num; // mapping of the object into its number in the box - float timeArr; // arrival time of the object - float timeReq; // required time of the object -}; - -static inline Tim_Obj_t * Tim_ManCi( Tim_Man_t * p, int i ) { assert( i < p->nCis ); return p->pCis + i; } -static inline Tim_Obj_t * Tim_ManCo( Tim_Man_t * p, int i ) { assert( i < p->nCos ); return p->pCos + i; } -static inline Tim_Box_t * Tim_ManBox( Tim_Man_t * p, int i ) { return (Tim_Box_t *)Vec_PtrEntry(p->vBoxes, i); } - -static inline Tim_Box_t * Tim_ManCiBox( Tim_Man_t * p, int i ) { return Tim_ManCi(p,i)->iObj2Box < 0 ? NULL : (Tim_Box_t *)Vec_PtrEntry( p->vBoxes, Tim_ManCi(p,i)->iObj2Box ); } -static inline Tim_Box_t * Tim_ManCoBox( Tim_Man_t * p, int i ) { return Tim_ManCo(p,i)->iObj2Box < 0 ? NULL : (Tim_Box_t *)Vec_PtrEntry( p->vBoxes, Tim_ManCo(p,i)->iObj2Box ); } - -static inline Tim_Obj_t * Tim_ManBoxInput( Tim_Man_t * p, Tim_Box_t * pBox, int i ) { assert( i < pBox->nInputs ); return p->pCos + pBox->Inouts[i]; } -static inline Tim_Obj_t * Tim_ManBoxOutput( Tim_Man_t * p, Tim_Box_t * pBox, int i ) { assert( i < pBox->nOutputs ); return p->pCis + pBox->Inouts[pBox->nInputs+i]; } - -#define Tim_ManBoxForEachInput( p, pBox, pObj, i ) \ - for ( i = 0; (i < (pBox)->nInputs) && ((pObj) = Tim_ManBoxInput(p, pBox, i)); i++ ) -#define Tim_ManBoxForEachOutput( p, pBox, pObj, i ) \ - for ( i = 0; (i < (pBox)->nOutputs) && ((pObj) = Tim_ManBoxOutput(p, pBox, i)); i++ ) - -#define Tim_ManForEachCi( p, pObj, i ) \ - for ( i = 0; (i < (p)->nCis) && ((pObj) = (p)->pCis + i); i++ ) \ - if ( pObj->iObj2Box >= 0 ) {} else -#define Tim_ManForEachCo( p, pObj, i ) \ - for ( i = 0; (i < (p)->nCos) && ((pObj) = (p)->pCos + i); i++ ) \ - if ( pObj->iObj2Box >= 0 ) {} else -#define Tim_ManForEachBox( p, pBox, i ) \ - Vec_PtrForEachEntry( Tim_Box_t *, p->vBoxes, pBox, i ) - //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// -/**Function************************************************************* - - Synopsis [Starts the timing manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Tim_Man_t * Tim_ManStart( int nCis, int nCos ) -{ - Tim_Man_t * p; - int i; - p = ABC_ALLOC( Tim_Man_t, 1 ); - memset( p, 0, sizeof(Tim_Man_t) ); - p->pMemObj = Mem_FlexStart(); - p->vBoxes = Vec_PtrAlloc( 100 ); - p->nCis = nCis; - p->nCos = nCos; - p->pCis = ABC_ALLOC( Tim_Obj_t, nCis ); - memset( p->pCis, 0, sizeof(Tim_Obj_t) * nCis ); - p->pCos = ABC_ALLOC( Tim_Obj_t, nCos ); - memset( p->pCos, 0, sizeof(Tim_Obj_t) * nCos ); - for ( i = 0; i < nCis; i++ ) - { - p->pCis[i].Id = i; - p->pCis[i].iObj2Box = p->pCis[i].iObj2Num = -1; - p->pCis[i].timeReq = TIM_ETERNITY; - p->pCis[i].timeArr = 0.0; - p->pCis[i].TravId = 0; - } - for ( i = 0; i < nCos; i++ ) - { - p->pCos[i].Id = i; - p->pCos[i].iObj2Box = p->pCos[i].iObj2Num = -1; - p->pCos[i].timeReq = TIM_ETERNITY; - p->pCos[i].timeArr = 0.0; - p->pCos[i].TravId = 0; - } - p->fUseTravId = 1; - return p; -} - -/**Function************************************************************* - - Synopsis [Duplicates the timing manager.] - - Description [Derives discrete-delay-model timing manager. - Useful for AIG optimization with approximate timing information.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Tim_Man_t * Tim_ManDup( Tim_Man_t * p, int fDiscrete ) -{ - Tim_Man_t * pNew; - Tim_Box_t * pBox; - float * pDelayTableNew; - int i, k; - pNew = Tim_ManStart( p->nCis, p->nCos ); - memcpy( pNew->pCis, p->pCis, sizeof(Tim_Obj_t) * p->nCis ); - memcpy( pNew->pCos, p->pCos, sizeof(Tim_Obj_t) * p->nCos ); - for ( k = 0; k < p->nCis; k++ ) - pNew->pCis[k].TravId = 0; - for ( k = 0; k < p->nCos; k++ ) - pNew->pCos[k].TravId = 0; - if ( fDiscrete ) - { - for ( k = 0; k < p->nCis; k++ ) - pNew->pCis[k].timeArr = 0.0; // modify here - // modify the required times - } - pNew->vDelayTables = Vec_PtrAlloc( 100 ); - Tim_ManForEachBox( p, pBox, i ) - { -//printf( "%d %d\n", pBox->nInputs, pBox->nOutputs ); - pDelayTableNew = ABC_ALLOC( float, pBox->nInputs * pBox->nOutputs ); - Vec_PtrPush( pNew->vDelayTables, pDelayTableNew ); - if ( fDiscrete ) - { - for ( k = 0; k < pBox->nInputs * pBox->nOutputs; k++ ) - pDelayTableNew[k] = 1.0; // modify here - -///// begin part of improved CIN/COUT propagation - for ( k = 0; k < pBox->nInputs; k++ ) // fill in the first row - pDelayTableNew[k] = 0.5; - for ( k = 0; k < pBox->nOutputs; k++ ) // fill in the first column - pDelayTableNew[k*pBox->nInputs] = 0.5; - pDelayTableNew[0] = 0.0; // fill in the first entry -///// end part of improved CIN/COUT propagation - - /// change -// pDelayTableNew[0] = 0.0; - /// change - } - else - memcpy( pDelayTableNew, pBox->pDelayTable, sizeof(float) * pBox->nInputs * pBox->nOutputs ); - Tim_ManCreateBoxFirst( pNew, pBox->Inouts[0], pBox->nInputs, - pBox->Inouts[pBox->nInputs], pBox->nOutputs, pDelayTableNew ); - } - return pNew; -} - -/**Function************************************************************* - - Synopsis [Duplicates the timing manager.] - - Description [Derives unit-delay-model timing manager. - Useful for levelizing the network.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Tim_Man_t * Tim_ManDupUnit( Tim_Man_t * p ) -{ - Tim_Man_t * pNew; - Tim_Box_t * pBox; - float * pDelayTableNew; - int i, k; - pNew = Tim_ManStart( p->nCis, p->nCos ); - memcpy( pNew->pCis, p->pCis, sizeof(Tim_Obj_t) * p->nCis ); - memcpy( pNew->pCos, p->pCos, sizeof(Tim_Obj_t) * p->nCos ); - for ( k = 0; k < p->nCis; k++ ) - { - pNew->pCis[k].TravId = 0; - pNew->pCis[k].timeArr = 0.0; - } - for ( k = 0; k < p->nCos; k++ ) - pNew->pCos[k].TravId = 0; - pNew->vDelayTables = Vec_PtrAlloc( 100 ); - Tim_ManForEachBox( p, pBox, i ) - { - pDelayTableNew = ABC_ALLOC( float, pBox->nInputs * pBox->nOutputs ); - Vec_PtrPush( pNew->vDelayTables, pDelayTableNew ); - for ( k = 0; k < pBox->nInputs * pBox->nOutputs; k++ ) - pDelayTableNew[k] = 1.0; - Tim_ManCreateBoxFirst( pNew, pBox->Inouts[0], pBox->nInputs, - pBox->Inouts[pBox->nInputs], pBox->nOutputs, pDelayTableNew ); - } - return pNew; -} - -/**Function************************************************************* - - Synopsis [Duplicates the timing manager.] - - Description [Derives the approximate timing manager with realistic delays - but without white-boxes.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Tim_Man_t * Tim_ManDupApprox( Tim_Man_t * p ) -{ - Tim_Man_t * pNew; - int k; - pNew = Tim_ManStart( p->nCis, p->nCos ); - for ( k = 0; k < p->nCis; k++ ) - if ( p->pCis[k].iObj2Box == -1 ) - pNew->pCis[k].timeArr = p->pCis[k].timeArr; - else - pNew->pCis[k].timeArr = p->pCis[k].timeReq; - for ( k = 0; k < p->nCos; k++ ) - pNew->pCos[k].timeReq = p->pCos[k].timeReq; - return pNew; -} - -/**Function************************************************************* - - Synopsis [Stops the timing manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Tim_ManStop( Tim_Man_t * p ) -{ - float * pTable; - int i; - if ( p->vDelayTables ) - { - Vec_PtrForEachEntry( float *, p->vDelayTables, pTable, i ) - ABC_FREE( pTable ); - Vec_PtrFree( p->vDelayTables ); - } - Vec_PtrFree( p->vBoxes ); - Mem_FlexStop( p->pMemObj, 0 ); - ABC_FREE( p->pCis ); - ABC_FREE( p->pCos ); - ABC_FREE( p ); -} - -/**Function************************************************************* - - Synopsis [Stops the timing manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Tim_ManStopP( Tim_Man_t ** p ) -{ - if ( *p == NULL ) - return; - Tim_ManStop( *p ); - *p = NULL; -} - -/**Function************************************************************* - - Synopsis [Stops the timing manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Tim_ManPrint( Tim_Man_t * p ) -{ - Tim_Box_t * pBox; - Tim_Obj_t * pObj; - int i; - printf( "TIMING INFORMATION:\n" ); - Tim_ManForEachCi( p, pObj, i ) - printf( "pi%5d : arr = %5.3f req = %5.3f\n", i, pObj->timeArr, pObj->timeReq ); - Tim_ManForEachCo( p, pObj, i ) - printf( "po%5d : arr = %5.3f req = %5.3f\n", i, pObj->timeArr, pObj->timeReq ); - Tim_ManForEachBox( p, pBox, i ) - { - printf( "*** Box %3d : Ins = %d. Outs = %d.\n", i, pBox->nInputs, pBox->nOutputs ); - printf( "Delay table:" ); - for ( i = 0; i < pBox->nInputs * pBox->nOutputs; i++ ) - printf( " %5.3f", pBox->pDelayTable[i] ); - printf( "\n" ); - Tim_ManBoxForEachInput( p, pBox, pObj, i ) - printf( "box-inp%3d : arr = %5.3f req = %5.3f\n", i, pObj->timeArr, pObj->timeReq ); - Tim_ManBoxForEachOutput( p, pBox, pObj, i ) - printf( "box-out%3d : arr = %5.3f req = %5.3f\n", i, pObj->timeArr, pObj->timeReq ); - } - printf( "\n" ); -} - -/**Function************************************************************* - - Synopsis [Disables the use of the traversal ID.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Tim_ManTravIdDisable( Tim_Man_t * p ) -{ - p->fUseTravId = 0; -} - -/**Function************************************************************* - - Synopsis [Enables the use of the traversal ID.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Tim_ManTravIdEnable( Tim_Man_t * p ) -{ - p->fUseTravId = 1; -} - -/**Function************************************************************* - - Synopsis [Label box inputs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Tim_ManSetCurrentTravIdBoxInputs( Tim_Man_t * p, int iBox ) -{ - Tim_Box_t * pBox; - Tim_Obj_t * pObj; - int i; - pBox = Tim_ManBox( p, iBox ); - Tim_ManBoxForEachInput( p, pBox, pObj, i ) - pObj->TravId = p->nTravIds; -} - -/**Function************************************************************* - - Synopsis [Label box outputs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Tim_ManSetCurrentTravIdBoxOutputs( Tim_Man_t * p, int iBox ) -{ - Tim_Box_t * pBox; - Tim_Obj_t * pObj; - int i; - pBox = Tim_ManBox( p, iBox ); - Tim_ManBoxForEachOutput( p, pBox, pObj, i ) - pObj->TravId = p->nTravIds; -} - -/**Function************************************************************* - - Synopsis [Label box inputs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Tim_ManSetPreviousTravIdBoxInputs( Tim_Man_t * p, int iBox ) -{ - Tim_Box_t * pBox; - Tim_Obj_t * pObj; - int i; - pBox = Tim_ManBox( p, iBox ); - Tim_ManBoxForEachInput( p, pBox, pObj, i ) - pObj->TravId = p->nTravIds - 1; -} - -/**Function************************************************************* - - Synopsis [Label box outputs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Tim_ManSetPreviousTravIdBoxOutputs( Tim_Man_t * p, int iBox ) -{ - Tim_Box_t * pBox; - Tim_Obj_t * pObj; - int i; - pBox = Tim_ManBox( p, iBox ); - Tim_ManBoxForEachOutput( p, pBox, pObj, i ) - pObj->TravId = p->nTravIds - 1; -} - -/**Function************************************************************* - - Synopsis [Updates required time of the PO.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Tim_ManIsCiTravIdCurrent( Tim_Man_t * p, int iCi ) -{ - assert( iCi < p->nCis ); - assert( p->fUseTravId ); - return p->pCis[iCi].TravId == p->nTravIds; -} - -/**Function************************************************************* - - Synopsis [Updates required time of the PO.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Tim_ManIsCoTravIdCurrent( Tim_Man_t * p, int iCo ) -{ - assert( iCo < p->nCos ); - assert( p->fUseTravId ); - return p->pCos[iCo].TravId == p->nTravIds; -} - -/**Function************************************************************* - - Synopsis [Sets the vector of timing tables associated with the manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Tim_ManSetDelayTables( Tim_Man_t * p, Vec_Ptr_t * vDelayTables ) -{ - assert( p->vDelayTables == NULL ); - p->vDelayTables = vDelayTables; -} - -/**Function************************************************************* - - Synopsis [Creates the new timing box.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Tim_ManCreateBox( Tim_Man_t * p, int * pIns, int nIns, int * pOuts, int nOuts, float * pDelayTable ) -{ - Tim_Box_t * pBox; - int i; - pBox = (Tim_Box_t *)Mem_FlexEntryFetch( p->pMemObj, sizeof(Tim_Box_t) + sizeof(int) * (nIns+nOuts) ); - memset( pBox, 0, sizeof(Tim_Box_t) ); - pBox->iBox = Vec_PtrSize( p->vBoxes ); - Vec_PtrPush( p->vBoxes, pBox ); - pBox->pDelayTable = pDelayTable; - pBox->nInputs = nIns; - pBox->nOutputs = nOuts; - for ( i = 0; i < nIns; i++ ) - { - assert( pIns[i] < p->nCos ); - pBox->Inouts[i] = pIns[i]; - p->pCos[pIns[i]].iObj2Box = pBox->iBox; - p->pCos[pIns[i]].iObj2Num = i; - } - for ( i = 0; i < nOuts; i++ ) - { - assert( pOuts[i] < p->nCis ); - pBox->Inouts[nIns+i] = pOuts[i]; - p->pCis[pOuts[i]].iObj2Box = pBox->iBox; - p->pCis[pOuts[i]].iObj2Num = i; - } -} - -/**Function************************************************************* - - Synopsis [Creates the new timing box.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Tim_ManCreateBoxFirst( Tim_Man_t * p, int firstIn, int nIns, int firstOut, int nOuts, float * pDelayTable ) -{ - Tim_Box_t * pBox; - int i; -// printf( "Creating %d x %d box with first inputs (%d and %d).\n", nIns, nOuts, firstIn, firstOut ); - - pBox = (Tim_Box_t *)Mem_FlexEntryFetch( p->pMemObj, sizeof(Tim_Box_t) + sizeof(int) * (nIns+nOuts) ); - memset( pBox, 0, sizeof(Tim_Box_t) ); - pBox->iBox = Vec_PtrSize( p->vBoxes ); - Vec_PtrPush( p->vBoxes, pBox ); - pBox->pDelayTable = pDelayTable; - pBox->nInputs = nIns; - pBox->nOutputs = nOuts; - for ( i = 0; i < nIns; i++ ) - { - assert( firstIn+i < p->nCos ); - pBox->Inouts[i] = firstIn+i; - p->pCos[firstIn+i].iObj2Box = pBox->iBox; - p->pCos[firstIn+i].iObj2Num = i; - } - for ( i = 0; i < nOuts; i++ ) - { - assert( firstOut+i < p->nCis ); - pBox->Inouts[nIns+i] = firstOut+i; - p->pCis[firstOut+i].iObj2Box = pBox->iBox; - p->pCis[firstOut+i].iObj2Num = i; - } -// if ( pBox->iBox < 50 ) -// printf( "%4d %4d %4d %4d \n", firstIn, nIns, firstOut, nOuts ); -} - - - -/**Function************************************************************* - - Synopsis [Increments the trav ID of the manager.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Tim_ManIncrementTravId( Tim_Man_t * p ) -{ - int i; - if ( p->nTravIds >= (1<<30)-1 ) - { - p->nTravIds = 0; - for ( i = 0; i < p->nCis; i++ ) - p->pCis[i].TravId = 0; - for ( i = 0; i < p->nCos; i++ ) - p->pCos[i].TravId = 0; - } - assert( p->nTravIds < (1<<30)-1 ); - p->nTravIds++; -} - -/**Function************************************************************* - - Synopsis [Initializes arrival time of the PI.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Tim_ManInitCiArrival( Tim_Man_t * p, int iCi, float Delay ) -{ - assert( iCi < p->nCis ); - p->pCis[iCi].timeArr = Delay; -} - -/**Function************************************************************* - - Synopsis [Initializes required time of the PO.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Tim_ManInitCoRequired( Tim_Man_t * p, int iCo, float Delay ) -{ - assert( iCo < p->nCos ); - p->pCos[iCo].timeReq = Delay; -} - -/**Function************************************************************* - - Synopsis [Updates required time of the PO.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Tim_ManSetCoArrival( Tim_Man_t * p, int iCo, float Delay ) -{ - assert( iCo < p->nCos ); - assert( !p->fUseTravId || p->pCos[iCo].TravId != p->nTravIds ); - p->pCos[iCo].timeArr = Delay; - p->pCos[iCo].TravId = p->nTravIds; -} - -/**Function************************************************************* - - Synopsis [Updates arrival time of the PI.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Tim_ManSetCiRequired( Tim_Man_t * p, int iCi, float Delay ) -{ - assert( iCi < p->nCis ); - assert( !p->fUseTravId || p->pCis[iCi].TravId != p->nTravIds ); - p->pCis[iCi].timeReq = Delay; - p->pCis[iCi].TravId = p->nTravIds; -} - -/**Function************************************************************* - - Synopsis [Updates required time of the PO.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Tim_ManSetCoRequired( Tim_Man_t * p, int iCo, float Delay ) -{ - assert( iCo < p->nCos ); - assert( !p->fUseTravId || p->pCos[iCo].TravId != p->nTravIds ); - p->pCos[iCo].timeReq = Delay; - p->pCos[iCo].TravId = p->nTravIds; -} - -/**Function************************************************************* - - Synopsis [Sets the correct required times for all POs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Tim_ManSetCiArrivalAll( Tim_Man_t * p, float Delay ) -{ - Tim_Obj_t * pObj; - int i; - Tim_ManForEachCi( p, pObj, i ) - Tim_ManInitCiArrival( p, i, Delay ); -} - -/**Function************************************************************* - - Synopsis [Sets the correct required times for all POs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Tim_ManSetCoRequiredAll( Tim_Man_t * p, float Delay ) -{ - Tim_Obj_t * pObj; - int i; - Tim_ManForEachCo( p, pObj, i ) - { - Tim_ManSetCoRequired( p, i, Delay ); -//printf( "%d ", i ); - } -} - - -/**Function************************************************************* - - Synopsis [Returns PI arrival time.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -float Tim_ManGetCiArrival( Tim_Man_t * p, int iCi ) -{ - Tim_Box_t * pBox; - Tim_Obj_t * pObjThis, * pObj, * pObjRes; - float * pDelays, DelayBest; - int i, k; - // consider the already processed PI - pObjThis = Tim_ManCi( p, iCi ); - if ( p->fUseTravId && pObjThis->TravId == p->nTravIds ) - return pObjThis->timeArr; - pObjThis->TravId = p->nTravIds; - // consider the main PI - pBox = Tim_ManCiBox( p, iCi ); - if ( pBox == NULL ) - return pObjThis->timeArr; - // update box timing - pBox->TravId = p->nTravIds; - // get the arrival times of the inputs of the box (POs) - if ( p->fUseTravId ) - Tim_ManBoxForEachInput( p, pBox, pObj, i ) - if ( pObj->TravId != p->nTravIds ) - printf( "Tim_ManGetCiArrival(): Input arrival times of the box are not up to date!\n" ); - // compute the arrival times for each output of the box (PIs) - Tim_ManBoxForEachOutput( p, pBox, pObjRes, i ) - { - pDelays = pBox->pDelayTable + i * pBox->nInputs; - DelayBest = -TIM_ETERNITY; - Tim_ManBoxForEachInput( p, pBox, pObj, k ) - DelayBest = Abc_MaxInt( DelayBest, pObj->timeArr + pDelays[k] ); - pObjRes->timeArr = DelayBest; - pObjRes->TravId = p->nTravIds; - } - return pObjThis->timeArr; -} - -/**Function************************************************************* - - Synopsis [Returns PO required time.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -float Tim_ManGetCoRequired( Tim_Man_t * p, int iCo ) -{ - Tim_Box_t * pBox; - Tim_Obj_t * pObjThis, * pObj, * pObjRes; - float * pDelays, DelayBest; - int i, k; - // consider the already processed PO - pObjThis = Tim_ManCo( p, iCo ); - if ( p->fUseTravId && pObjThis->TravId == p->nTravIds ) - return pObjThis->timeReq; - pObjThis->TravId = p->nTravIds; - // consider the main PO - pBox = Tim_ManCoBox( p, iCo ); - if ( pBox == NULL ) - return pObjThis->timeReq; - // update box timing - pBox->TravId = p->nTravIds; - // get the required times of the outputs of the box (PIs) - if ( p->fUseTravId ) - Tim_ManBoxForEachOutput( p, pBox, pObj, i ) - if ( pObj->TravId != p->nTravIds ) - printf( "Tim_ManGetCoRequired(): Output required times of output %d the box %d are not up to date!\n", i, pBox->iBox ); - // compute the required times for each input of the box (POs) - Tim_ManBoxForEachInput( p, pBox, pObjRes, i ) - { - DelayBest = TIM_ETERNITY; - Tim_ManBoxForEachOutput( p, pBox, pObj, k ) - { - pDelays = pBox->pDelayTable + k * pBox->nInputs; - DelayBest = Abc_MinFloat( DelayBest, pObj->timeReq - pDelays[i] ); - } - pObjRes->timeReq = DelayBest; - pObjRes->TravId = p->nTravIds; - } - return pObjThis->timeReq; -} - -/**Function************************************************************* - - Synopsis [Returns the box number for the given input.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Tim_ManBoxForCi( Tim_Man_t * p, int iCi ) -{ - if ( iCi >= p->nCis ) - return -1; - return p->pCis[iCi].iObj2Box; -} - -/**Function************************************************************* - - Synopsis [Returns the box number for the given output.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Tim_ManBoxForCo( Tim_Man_t * p, int iCo ) -{ - if ( iCo >= p->nCos ) - return -1; - return p->pCos[iCo].iObj2Box; -} - -/**Function************************************************************* - - Synopsis [Returns the first input of the box.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Tim_ManBoxInputFirst( Tim_Man_t * p, int iBox ) -{ - Tim_Box_t * pBox = (Tim_Box_t *)Vec_PtrEntry( p->vBoxes, iBox ); - return pBox->Inouts[0]; -} - -/**Function************************************************************* - - Synopsis [Returns the first input of the box.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Tim_ManBoxOutputFirst( Tim_Man_t * p, int iBox ) -{ - Tim_Box_t * pBox = (Tim_Box_t *)Vec_PtrEntry( p->vBoxes, iBox ); - return pBox->Inouts[pBox->nInputs]; -} - -/**Function************************************************************* - - Synopsis [Returns the first input of the box.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Tim_ManBoxInputNum( Tim_Man_t * p, int iBox ) -{ - Tim_Box_t * pBox = (Tim_Box_t *)Vec_PtrEntry( p->vBoxes, iBox ); - return pBox->nInputs; -} - -/**Function************************************************************* - - Synopsis [Returns the first input of the box.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Tim_ManBoxOutputNum( Tim_Man_t * p, int iBox ) -{ - Tim_Box_t * pBox = (Tim_Box_t *)Vec_PtrEntry( p->vBoxes, iBox ); - return pBox->nOutputs; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Tim_ManChangeForAdders( Tim_Man_t * p ) -{ - Tim_Box_t * pBox; - int i; - Tim_ManForEachBox( p, pBox, i ) - pBox->pDelayTable[0] = 0.0; -} - - //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// diff --git a/src/misc/tim/tim.h b/src/misc/tim/tim.h index 9a7667d5..1eb1de78 100644 --- a/src/misc/tim/tim.h +++ b/src/misc/tim/tim.h @@ -4,7 +4,7 @@ SystemName [ABC: Logic synthesis and verification system.] - PackageName [A timing manager.] + PackageName [Hierarchy/timing manager.] Synopsis [External declarations.] @@ -30,10 +30,7 @@ /// PARAMETERS /// //////////////////////////////////////////////////////////////////////// - - ABC_NAMESPACE_HEADER_START - //////////////////////////////////////////////////////////////////////// /// BASIC TYPES /// @@ -59,43 +56,51 @@ typedef struct Tim_Man_t_ Tim_Man_t; /// FUNCTION DECLARATIONS /// //////////////////////////////////////////////////////////////////////// -/*=== time.c ===========================================================*/ +/*=== timBox.c ===========================================================*/ +extern void Tim_ManCreateBox( Tim_Man_t * p, int firstIn, int nIns, int firstOut, int nOuts, int iDelayTable ); +extern int Tim_ManBoxForCi( Tim_Man_t * p, int iCo ); +extern int Tim_ManBoxForCo( Tim_Man_t * p, int iCi ); +extern int Tim_ManBoxInputFirst( Tim_Man_t * p, int iBox ); +extern int Tim_ManBoxOutputFirst( Tim_Man_t * p, int iBox ); +extern int Tim_ManBoxInputNum( Tim_Man_t * p, int iBox ); +extern int Tim_ManBoxOutputNum( Tim_Man_t * p, int iBox ); +extern float * Tim_ManBoxDelayTable( Tim_Man_t * p, int iBox ); +/*=== timDump.c ===========================================================*/ +extern Vec_Str_t * Tim_ManSave( Tim_Man_t * p ); +extern Tim_Man_t * Tim_ManLoad( Vec_Str_t * p ); +/*=== timMan.c ===========================================================*/ extern Tim_Man_t * Tim_ManStart( int nCis, int nCos ); -extern Tim_Man_t * Tim_ManDup( Tim_Man_t * p, int fDiscrete ); -extern Tim_Man_t * Tim_ManDupUnit( Tim_Man_t * p ); -extern Tim_Man_t * Tim_ManDupApprox( Tim_Man_t * p ); +extern Tim_Man_t * Tim_ManDup( Tim_Man_t * p, int fUnitDelay ); extern void Tim_ManStop( Tim_Man_t * p ); extern void Tim_ManStopP( Tim_Man_t ** p ); extern void Tim_ManPrint( Tim_Man_t * p ); +extern int Tim_ManCiNum( Tim_Man_t * p ); +extern int Tim_ManCoNum( Tim_Man_t * p ); +extern int Tim_ManPiNum( Tim_Man_t * p ); +extern int Tim_ManPoNum( Tim_Man_t * p ); +extern int Tim_ManBoxNum( Tim_Man_t * p ); +extern int Tim_ManDelayTableNum( Tim_Man_t * p ); +extern void Tim_ManSetDelayTables( Tim_Man_t * p, Vec_Ptr_t * vDelayTables ); extern void Tim_ManTravIdDisable( Tim_Man_t * p ); extern void Tim_ManTravIdEnable( Tim_Man_t * p ); +/*=== timTime.c ===========================================================*/ +extern void Tim_ManInitPiArrival( Tim_Man_t * p, int iPi, float Delay ); +extern void Tim_ManInitPoRequired( Tim_Man_t * p, int iPo, float Delay ); +extern void Tim_ManInitPiArrivalAll( Tim_Man_t * p, float Delay ); +extern void Tim_ManInitPoRequiredAll( Tim_Man_t * p, float Delay ); +extern void Tim_ManSetCoArrival( Tim_Man_t * p, int iCo, float Delay ); +extern void Tim_ManSetCiRequired( Tim_Man_t * p, int iCi, float Delay ); +extern void Tim_ManSetCoRequired( Tim_Man_t * p, int iCo, float Delay ); +extern float Tim_ManGetCiArrival( Tim_Man_t * p, int iCi ); +extern float Tim_ManGetCoRequired( Tim_Man_t * p, int iCo ); +/*=== timTrav.c ===========================================================*/ +extern void Tim_ManIncrementTravId( Tim_Man_t * p ); extern void Tim_ManSetCurrentTravIdBoxInputs( Tim_Man_t * p, int iBox ); extern void Tim_ManSetCurrentTravIdBoxOutputs( Tim_Man_t * p, int iBox ); extern void Tim_ManSetPreviousTravIdBoxInputs( Tim_Man_t * p, int iBox ); extern void Tim_ManSetPreviousTravIdBoxOutputs( Tim_Man_t * p, int iBox ); extern int Tim_ManIsCiTravIdCurrent( Tim_Man_t * p, int iCi ); extern int Tim_ManIsCoTravIdCurrent( Tim_Man_t * p, int iCo ); -extern void Tim_ManSetDelayTables( Tim_Man_t * p, Vec_Ptr_t * vDelayTables ); -extern void Tim_ManCreateBox( Tim_Man_t * p, int * pIns, int nIns, int * pOuts, int nOuts, float * pDelayTable ); -extern void Tim_ManCreateBoxFirst( Tim_Man_t * p, int firstIn, int nIns, int firstOut, int nOuts, float * pDelayTable ); -extern void Tim_ManIncrementTravId( Tim_Man_t * p ); -extern void Tim_ManInitCiArrival( Tim_Man_t * p, int iCi, float Delay ); -extern void Tim_ManInitCoRequired( Tim_Man_t * p, int iCo, float Delay ); -extern void Tim_ManSetCoArrival( Tim_Man_t * p, int iCo, float Delay ); -extern void Tim_ManSetCiRequired( Tim_Man_t * p, int iCi, float Delay ); -extern void Tim_ManSetCoRequired( Tim_Man_t * p, int iCo, float Delay ); -extern void Tim_ManSetCiArrivalAll( Tim_Man_t * p, float Delay ); -extern void Tim_ManSetCoRequiredAll( Tim_Man_t * p, float Delay ); -extern float Tim_ManGetCiArrival( Tim_Man_t * p, int iCi ); -extern float Tim_ManGetCoRequired( Tim_Man_t * p, int iCo ); -extern int Tim_ManBoxForCi( Tim_Man_t * p, int iCo ); -extern int Tim_ManBoxForCo( Tim_Man_t * p, int iCi ); -extern int Tim_ManBoxInputFirst( Tim_Man_t * p, int iBox ); -extern int Tim_ManBoxOutputFirst( Tim_Man_t * p, int iBox ); -extern int Tim_ManBoxInputNum( Tim_Man_t * p, int iBox ); -extern int Tim_ManBoxOutputNum( Tim_Man_t * p, int iBox ); -extern void Tim_ManChangeForAdders( Tim_Man_t * p ); - ABC_NAMESPACE_HEADER_END diff --git a/src/misc/tim/timBox.c b/src/misc/tim/timBox.c new file mode 100644 index 00000000..65b0ae6e --- /dev/null +++ b/src/misc/tim/timBox.c @@ -0,0 +1,204 @@ +/**CFile**************************************************************** + + FileName [timBox.c] + + SystemName [ABC: Logic synthesis and verification system.] + + PackageName [Hierarchy/timing manager.] + + Synopsis [Manipulation of timing boxes.] + + Author [Alan Mishchenko] + + Affiliation [UC Berkeley] + + Date [Ver. 1.0. Started - April 28, 2007.] + + Revision [$Id: timBox.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] + +***********************************************************************/ + +#include "timInt.h" + +ABC_NAMESPACE_IMPL_START + +//////////////////////////////////////////////////////////////////////// +/// DECLARATIONS /// +//////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////// +/// FUNCTION DEFINITIONS /// +//////////////////////////////////////////////////////////////////////// + +/**Function************************************************************* + + Synopsis [Creates the new timing box.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManCreateBox( Tim_Man_t * p, int firstIn, int nIns, int firstOut, int nOuts, int iDelayTable ) +{ + Tim_Box_t * pBox; + int i; + if ( p->vBoxes == NULL ) + p->vBoxes = Vec_PtrAlloc( 100 ); + pBox = (Tim_Box_t *)Mem_FlexEntryFetch( p->pMemObj, sizeof(Tim_Box_t) + sizeof(int) * (nIns+nOuts) ); + memset( pBox, 0, sizeof(Tim_Box_t) ); + pBox->iBox = Vec_PtrSize( p->vBoxes ); + Vec_PtrPush( p->vBoxes, pBox ); + pBox->iDelayTable = iDelayTable; + pBox->nInputs = nIns; + pBox->nOutputs = nOuts; + for ( i = 0; i < nIns; i++ ) + { + assert( firstIn+i < p->nCos ); + pBox->Inouts[i] = firstIn+i; + p->pCos[firstIn+i].iObj2Box = pBox->iBox; + p->pCos[firstIn+i].iObj2Num = i; + } + for ( i = 0; i < nOuts; i++ ) + { + assert( firstOut+i < p->nCis ); + pBox->Inouts[nIns+i] = firstOut+i; + p->pCis[firstOut+i].iObj2Box = pBox->iBox; + p->pCis[firstOut+i].iObj2Num = i; + } +// if ( pBox->iBox < 20 ) +// printf( "%4d %4d %4d %4d \n", firstIn, nIns, firstOut, nOuts ); +} + +/**Function************************************************************* + + Synopsis [Returns the box number for the given input.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Tim_ManBoxForCi( Tim_Man_t * p, int iCi ) +{ + if ( iCi >= p->nCis ) + return -1; + return p->pCis[iCi].iObj2Box; +} + +/**Function************************************************************* + + Synopsis [Returns the box number for the given output.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Tim_ManBoxForCo( Tim_Man_t * p, int iCo ) +{ + if ( iCo >= p->nCos ) + return -1; + return p->pCos[iCo].iObj2Box; +} + +/**Function************************************************************* + + Synopsis [Returns the first input of the box.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Tim_ManBoxInputFirst( Tim_Man_t * p, int iBox ) +{ + Tim_Box_t * pBox = (Tim_Box_t *)Vec_PtrEntry( p->vBoxes, iBox ); + return pBox->Inouts[0]; +} + +/**Function************************************************************* + + Synopsis [Returns the first input of the box.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Tim_ManBoxOutputFirst( Tim_Man_t * p, int iBox ) +{ + Tim_Box_t * pBox = (Tim_Box_t *)Vec_PtrEntry( p->vBoxes, iBox ); + return pBox->Inouts[pBox->nInputs]; +} + +/**Function************************************************************* + + Synopsis [Returns the first input of the box.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Tim_ManBoxInputNum( Tim_Man_t * p, int iBox ) +{ + Tim_Box_t * pBox = (Tim_Box_t *)Vec_PtrEntry( p->vBoxes, iBox ); + return pBox->nInputs; +} + +/**Function************************************************************* + + Synopsis [Returns the first input of the box.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Tim_ManBoxOutputNum( Tim_Man_t * p, int iBox ) +{ + Tim_Box_t * pBox = (Tim_Box_t *)Vec_PtrEntry( p->vBoxes, iBox ); + return pBox->nOutputs; +} + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +float * Tim_ManBoxDelayTable( Tim_Man_t * p, int iBox ) +{ + Tim_Box_t * pBox = (Tim_Box_t *)Vec_PtrEntry( p->vBoxes, iBox ); + if ( pBox->iDelayTable < 0 ) + return NULL; + return (float *)Vec_PtrEntry( p->vDelayTables, pBox->iDelayTable ); +} + +//////////////////////////////////////////////////////////////////////// +/// END OF FILE /// +//////////////////////////////////////////////////////////////////////// + + +ABC_NAMESPACE_IMPL_END + diff --git a/src/misc/tim/timDump.c b/src/misc/tim/timDump.c new file mode 100644 index 00000000..031ef5fc --- /dev/null +++ b/src/misc/tim/timDump.c @@ -0,0 +1,181 @@ +/**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, and delay table ID + 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, pBox->iDelayTable ); // can be -1 if delay table is not given + } + // save the number of delay tables + Vec_StrPutI_ne( vStr, Tim_ManDelayTableNum(p) ); + // save the delay tables + Vec_PtrForEachEntry( float *, p->vDelayTables, 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; + int VerNum, nCis, nCos, nPis, nPos; + int nBoxes, nBoxIns, nBoxOuts; + 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 ); + 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 ); + Tim_ManCreateBox( pMan, curPo, nBoxIns, curPi, nBoxOuts, TableId ); + 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 ); + pMan->vDelayTables = Vec_PtrAlloc( nTables ); + // read delay tables + assert( Vec_PtrSize(pMan->vDelayTables) == 0 ); + 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( Vec_PtrSize(pMan->vDelayTables) == nTables ); +// Tim_ManPrint( pMan ); + return pMan; +} + +//////////////////////////////////////////////////////////////////////// +/// END OF FILE /// +//////////////////////////////////////////////////////////////////////// + + +ABC_NAMESPACE_IMPL_END + diff --git a/src/misc/tim/timInt.h b/src/misc/tim/timInt.h new file mode 100644 index 00000000..9d8b7389 --- /dev/null +++ b/src/misc/tim/timInt.h @@ -0,0 +1,151 @@ +/**CFile**************************************************************** + + FileName [timInt.h] + + SystemName [ABC: Logic synthesis and verification system.] + + PackageName [Hierarchy/timing manager.] + + Synopsis [Internal declarations.] + + Author [Alan Mishchenko] + + Affiliation [UC Berkeley] + + Date [Ver. 1.0. Started - April 28, 2007.] + + Revision [$Id: timInt.h,v 1.00 2007/04/28 00:00:00 alanmi Exp $] + +***********************************************************************/ + +#ifndef ABC__aig__tim__timInt_h +#define ABC__aig__tim__timInt_h + + +//////////////////////////////////////////////////////////////////////// +/// INCLUDES /// +//////////////////////////////////////////////////////////////////////// + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> + +#include "misc/vec/vec.h" +#include "misc/mem/mem.h" +#include "tim.h" + +//////////////////////////////////////////////////////////////////////// +/// PARAMETERS /// +//////////////////////////////////////////////////////////////////////// + +ABC_NAMESPACE_HEADER_START + +//////////////////////////////////////////////////////////////////////// +/// BASIC TYPES /// +//////////////////////////////////////////////////////////////////////// + +typedef struct Tim_Box_t_ Tim_Box_t; +typedef struct Tim_Obj_t_ Tim_Obj_t; + +// timing manager +struct Tim_Man_t_ +{ + Vec_Ptr_t * vBoxes; // the timing boxes + Vec_Ptr_t * vDelayTables; // pointers to the delay tables + Mem_Flex_t * pMemObj; // memory manager for boxes + int nTravIds; // traversal ID of the manager + int fUseTravId; // enables the use of traversal ID + int nCis; // the number of PIs + int nCos; // the number of POs + Tim_Obj_t * pCis; // timing info for the PIs + Tim_Obj_t * pCos; // timing info for the POs +}; + +// timing box +struct Tim_Box_t_ +{ + int iBox; // the unique ID of this box + int TravId; // traversal ID of this box + int nInputs; // the number of box inputs (POs) + int nOutputs; // the number of box outputs (PIs) + int iDelayTable; // index of the delay table + int Inouts[0]; // the int numbers of PIs and POs +}; + +// timing object +struct Tim_Obj_t_ +{ + int Id; // the ID of this object + int TravId; // traversal ID of this object + int iObj2Box; // mapping of the object into its box + int iObj2Num; // mapping of the object into its number in the box + float timeArr; // arrival time of the object + float timeReq; // required time of the object +}; + +/* + A delay table is a one-dimensional array of floats whose size is: 3 + nInputs * nOutputs. + The first entry is the delay table ID used by the boxes to refer to the table. + The second and third entris are nInputs and nOutputs. + The following entries list the delay numbers for per output, + that is, the first nInputs entries give delay of the first output, etc. +*/ + +//////////////////////////////////////////////////////////////////////// +/// MACRO DEFINITIONS /// +//////////////////////////////////////////////////////////////////////// + +static inline Tim_Obj_t * Tim_ManCi( Tim_Man_t * p, int i ) { assert( i < p->nCis ); return p->pCis + i; } +static inline Tim_Obj_t * Tim_ManCo( Tim_Man_t * p, int i ) { assert( i < p->nCos ); return p->pCos + i; } +static inline Tim_Box_t * Tim_ManBox( Tim_Man_t * p, int i ) { return (Tim_Box_t *)Vec_PtrEntry(p->vBoxes, i); } + +static inline Tim_Box_t * Tim_ManCiBox( Tim_Man_t * p, int i ) { return Tim_ManCi(p,i)->iObj2Box < 0 ? NULL : (Tim_Box_t *)Vec_PtrEntry( p->vBoxes, Tim_ManCi(p,i)->iObj2Box ); } +static inline Tim_Box_t * Tim_ManCoBox( Tim_Man_t * p, int i ) { return Tim_ManCo(p,i)->iObj2Box < 0 ? NULL : (Tim_Box_t *)Vec_PtrEntry( p->vBoxes, Tim_ManCo(p,i)->iObj2Box ); } + +static inline Tim_Obj_t * Tim_ManBoxInput( Tim_Man_t * p, Tim_Box_t * pBox, int i ) { assert( i < pBox->nInputs ); return p->pCos + pBox->Inouts[i]; } +static inline Tim_Obj_t * Tim_ManBoxOutput( Tim_Man_t * p, Tim_Box_t * pBox, int i ) { assert( i < pBox->nOutputs ); return p->pCis + pBox->Inouts[pBox->nInputs+i]; } + +//////////////////////////////////////////////////////////////////////// +/// ITERATORS /// +//////////////////////////////////////////////////////////////////////// + +#define Tim_ManForEachCi( p, pObj, i ) \ + for ( i = 0; (i < (p)->nCis) && ((pObj) = (p)->pCis + i); i++ ) +#define Tim_ManForEachCo( p, pObj, i ) \ + for ( i = 0; (i < (p)->nCos) && ((pObj) = (p)->pCos + i); i++ ) + +#define Tim_ManForEachPi( p, pObj, i ) \ + Tim_ManForEachCi( p, pObj, i ) if ( pObj->iObj2Box >= 0 ) {} else +#define Tim_ManForEachPo( p, pObj, i ) \ + Tim_ManForEachCo( p, pObj, i ) if ( pObj->iObj2Box >= 0 ) {} else + +#define Tim_ManForEachBox( p, pBox, i ) \ + Vec_PtrForEachEntry( Tim_Box_t *, p->vBoxes, pBox, i ) + +#define Tim_ManBoxForEachInput( p, pBox, pObj, i ) \ + for ( i = 0; (i < (pBox)->nInputs) && ((pObj) = Tim_ManBoxInput(p, pBox, i)); i++ ) +#define Tim_ManBoxForEachOutput( p, pBox, pObj, i ) \ + for ( i = 0; (i < (pBox)->nOutputs) && ((pObj) = Tim_ManBoxOutput(p, pBox, i)); i++ ) + +//////////////////////////////////////////////////////////////////////// +/// SEQUENTIAL ITERATORS /// +//////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////// +/// FUNCTION DECLARATIONS /// +//////////////////////////////////////////////////////////////////////// + +/*=== time.c ===========================================================*/ + + +ABC_NAMESPACE_HEADER_END + + + +#endif + +//////////////////////////////////////////////////////////////////////// +/// END OF FILE /// +//////////////////////////////////////////////////////////////////////// + diff --git a/src/misc/tim/timMan.c b/src/misc/tim/timMan.c new file mode 100644 index 00000000..5340ad9e --- /dev/null +++ b/src/misc/tim/timMan.c @@ -0,0 +1,344 @@ +/**CFile**************************************************************** + + FileName [timMan.c] + + SystemName [ABC: Logic synthesis and verification system.] + + PackageName [Hierarchy/timing manager.] + + Synopsis [Manipulation of manager data-structure.] + + Author [Alan Mishchenko] + + Affiliation [UC Berkeley] + + Date [Ver. 1.0. Started - April 28, 2007.] + + Revision [$Id: timMan.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] + +***********************************************************************/ + +#include "timInt.h" + +ABC_NAMESPACE_IMPL_START + +//////////////////////////////////////////////////////////////////////// +/// DECLARATIONS /// +//////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////// +/// FUNCTION DEFINITIONS /// +//////////////////////////////////////////////////////////////////////// + +/**Function************************************************************* + + Synopsis [Starts the timing manager.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +Tim_Man_t * Tim_ManStart( int nCis, int nCos ) +{ + Tim_Man_t * p; + Tim_Obj_t * pObj; + int i; + p = ABC_ALLOC( Tim_Man_t, 1 ); + memset( p, 0, sizeof(Tim_Man_t) ); + p->pMemObj = Mem_FlexStart(); + p->nCis = nCis; + p->nCos = nCos; + p->pCis = ABC_ALLOC( Tim_Obj_t, nCis ); + memset( p->pCis, 0, sizeof(Tim_Obj_t) * nCis ); + p->pCos = ABC_ALLOC( Tim_Obj_t, nCos ); + memset( p->pCos, 0, sizeof(Tim_Obj_t) * nCos ); + Tim_ManForEachCi( p, pObj, i ) + { + pObj->Id = i; + pObj->iObj2Box = pObj->iObj2Num = -1; + pObj->timeReq = TIM_ETERNITY; + } + Tim_ManForEachCo( p, pObj, i ) + { + pObj->Id = i; + pObj->iObj2Box = pObj->iObj2Num = -1; + pObj->timeReq = TIM_ETERNITY; + } + p->fUseTravId = 1; + return p; +} + +/**Function************************************************************* + + Synopsis [Duplicates the timing manager.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +Tim_Man_t * Tim_ManDup( Tim_Man_t * p, int fUnitDelay ) +{ + Tim_Man_t * pNew; + Tim_Box_t * pBox; + Tim_Obj_t * pObj; + float * pDelayTable, * pDelayTableNew; + int i, k, nInputs, nOutputs; + // create new manager + pNew = Tim_ManStart( p->nCis, p->nCos ); + // copy box connectivity information + memcpy( pNew->pCis, p->pCis, sizeof(Tim_Obj_t) * p->nCis ); + memcpy( pNew->pCos, p->pCos, sizeof(Tim_Obj_t) * p->nCos ); + // clear traversal IDs + Tim_ManForEachCi( p, pObj, i ) + pObj->TravId = 0; + Tim_ManForEachCo( p, pObj, i ) + pObj->TravId = 0; + if ( fUnitDelay ) + { + // discretize PI arrival times +// Tim_ManForEachPi( pNew, pObj, k ) +// pObj->timeArr = (int)pObj->timeArr; + // discretize PO required times +// Tim_ManForEachPo( pNew, pObj, k ) +// pObj->timeReq = 1 + (int)pObj->timeReq; + // clear PI arrival and PO required + Tim_ManInitPiArrivalAll( p, 0.0 ); + Tim_ManInitPoRequiredAll( p, (float)TIM_ETERNITY ); + } + // duplicate delay tables + pNew->vDelayTables = Vec_PtrAlloc( Vec_PtrSize(p->vDelayTables) ); + Vec_PtrForEachEntry( float *, p->vDelayTables, pDelayTable, i ) + { + assert( i == (int)pDelayTable[0] ); + nInputs = (int)pDelayTable[1]; + nOutputs = (int)pDelayTable[2]; + pDelayTableNew = ABC_ALLOC( float, 3 + nInputs * nOutputs ); + pDelayTableNew[0] = (int)pDelayTable[0]; + pDelayTableNew[1] = (int)pDelayTable[1]; + pDelayTableNew[2] = (int)pDelayTable[2]; + for ( k = 0; k < nInputs * nOutputs; k++ ) + pDelayTableNew[3+k] = fUnitDelay ? 1.0 : pDelayTable[3+k]; + assert( (int)pDelayTableNew[0] == Vec_PtrSize(pNew->vDelayTables) ); + Vec_PtrPush( pNew->vDelayTables, pDelayTableNew ); + } + // duplicate boxes + Tim_ManForEachBox( p, pBox, i ) + Tim_ManCreateBox( pNew, pBox->Inouts[0], pBox->nInputs, + pBox->Inouts[pBox->nInputs], pBox->nOutputs, pBox->iDelayTable ); + return pNew; +} + +/**Function************************************************************* + + Synopsis [Stops the timing manager.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManStop( Tim_Man_t * p ) +{ + float * pTable; + int i; + if ( p->vDelayTables ) + { + Vec_PtrForEachEntry( float *, p->vDelayTables, pTable, i ) + ABC_FREE( pTable ); + Vec_PtrFree( p->vDelayTables ); + } + Vec_PtrFree( p->vBoxes ); + Mem_FlexStop( p->pMemObj, 0 ); + ABC_FREE( p->pCis ); + ABC_FREE( p->pCos ); + ABC_FREE( p ); +} +void Tim_ManStopP( Tim_Man_t ** p ) +{ + if ( *p == NULL ) + return; + Tim_ManStop( *p ); + *p = NULL; +} + +/**Function************************************************************* + + Synopsis [Prints the timing manager.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManPrint( Tim_Man_t * p ) +{ + Tim_Box_t * pBox; + Tim_Obj_t * pObj, * pPrev; + float * pTable; + int i, k; + printf( "TIMING INFORMATION:\n" ); + + // print CI info + pPrev = p->pCis; + Tim_ManForEachPi( p, pObj, i ) + if ( pPrev->timeArr != pObj->timeArr || pPrev->timeReq != pObj->timeReq ) + break; + if ( i == Tim_ManCiNum(p) ) + printf( "All PIs : arr = %5.3f req = %5.3f\n", pPrev->timeArr, pPrev->timeReq ); + else + Tim_ManForEachPi( p, pObj, i ) + printf( "PI%5d : arr = %5.3f req = %5.3f\n", i, pObj->timeArr, pObj->timeReq ); + + // print CO info + pPrev = p->pCos; + Tim_ManForEachPo( p, pObj, i ) + if ( pPrev->timeArr != pObj->timeArr || pPrev->timeReq != pObj->timeReq ) + break; + if ( i == Tim_ManCoNum(p) ) + printf( "All POs : arr = %5.3f req = %5.3f\n", pPrev->timeArr, pPrev->timeReq ); + else + Tim_ManForEachPo( p, pObj, i ) + printf( "PO%5d : arr = %5.3f req = %5.3f\n", i, pObj->timeArr, pObj->timeReq ); + + // print box info + Tim_ManForEachBox( p, pBox, i ) + { + printf( "*** Box %3d : Ins = %d. Outs = %d.\n", i, pBox->nInputs, pBox->nOutputs ); + printf( "Delay table:\n" ); + pTable = Tim_ManBoxDelayTable( p, pBox->iBox ); + for ( i = 0; i < pBox->nOutputs; i++, printf( "\n" ) ) + for ( k = 0; k < pBox->nInputs; k++ ) + if ( pTable[3+i*pBox->nInputs+k] == -ABC_INFINITY ) + printf( "%5s", "-" ); + else + printf( "%5.0f", pTable[3+i*pBox->nInputs+k] ); + printf( "\n" ); + + // print box inputs + pPrev = Tim_ManBoxInput( p, pBox, 0 ); + Tim_ManBoxForEachInput( p, pBox, pObj, i ) + if ( pPrev->timeArr != pObj->timeArr || pPrev->timeReq != pObj->timeReq ) + break; + if ( i == Tim_ManBoxInputNum(p, pBox->iBox) ) + printf( "Box inputs : arr = %5.3f req = %5.3f\n", pPrev->timeArr, pPrev->timeReq ); + else + Tim_ManBoxForEachInput( p, pBox, pObj, i ) + printf( "box-inp%3d : arr = %5.3f req = %5.3f\n", i, pObj->timeArr, pObj->timeReq ); + + // print box outputs + pPrev = Tim_ManBoxOutput( p, pBox, 0 ); + Tim_ManBoxForEachOutput( p, pBox, pObj, i ) + if ( pPrev->timeArr != pObj->timeArr || pPrev->timeReq != pObj->timeReq ) + break; + if ( i == Tim_ManBoxOutputNum(p, pBox->iBox) ) + printf( "Box outputs : arr = %5.3f req = %5.3f\n", pPrev->timeArr, pPrev->timeReq ); + else + Tim_ManBoxForEachOutput( p, pBox, pObj, i ) + printf( "box-out%3d : arr = %5.3f req = %5.3f\n", i, pObj->timeArr, pObj->timeReq ); + } + printf( "\n" ); +} + +/**Function************************************************************* + + Synopsis [Read parameters.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Tim_ManCiNum( Tim_Man_t * p ) +{ + return p->nCis; +} +int Tim_ManCoNum( Tim_Man_t * p ) +{ + return p->nCos; +} +int Tim_ManPiNum( Tim_Man_t * p ) +{ + return Tim_ManBoxOutputFirst(p, 0); +} +int Tim_ManPoNum( Tim_Man_t * p ) +{ + int iLastBoxId = Tim_ManBoxNum(p) - 1; + return Tim_ManCoNum(p) - (Tim_ManBoxInputFirst(p, iLastBoxId) + Tim_ManBoxInputNum(p, iLastBoxId)); +} +int Tim_ManBoxNum( Tim_Man_t * p ) +{ + return Vec_PtrSize(p->vBoxes); +} +int Tim_ManDelayTableNum( Tim_Man_t * p ) +{ + return Vec_PtrSize(p->vDelayTables); +} + +/**Function************************************************************* + + Synopsis [Sets the vector of timing tables associated with the manager.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManSetDelayTables( Tim_Man_t * p, Vec_Ptr_t * vDelayTables ) +{ + assert( p->vDelayTables == NULL ); + p->vDelayTables = vDelayTables; +} + +/**Function************************************************************* + + Synopsis [Disables the use of the traversal ID.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManTravIdDisable( Tim_Man_t * p ) +{ + p->fUseTravId = 0; +} + +/**Function************************************************************* + + Synopsis [Enables the use of the traversal ID.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManTravIdEnable( Tim_Man_t * p ) +{ + p->fUseTravId = 1; +} + +//////////////////////////////////////////////////////////////////////// +/// END OF FILE /// +//////////////////////////////////////////////////////////////////////// + + +ABC_NAMESPACE_IMPL_END + diff --git a/src/misc/tim/timTime.c b/src/misc/tim/timTime.c new file mode 100644 index 00000000..ddec4c62 --- /dev/null +++ b/src/misc/tim/timTime.c @@ -0,0 +1,265 @@ +/**CFile**************************************************************** + + FileName [timTime.c] + + SystemName [ABC: Logic synthesis and verification system.] + + PackageName [Hierarchy/timing manager.] + + Synopsis [Setting and resetting timing information of the boxes.] + + Author [Alan Mishchenko] + + Affiliation [UC Berkeley] + + Date [Ver. 1.0. Started - April 28, 2007.] + + Revision [$Id: timTime.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] + +***********************************************************************/ + +#include "timInt.h" + +ABC_NAMESPACE_IMPL_START + +//////////////////////////////////////////////////////////////////////// +/// DECLARATIONS /// +//////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////// +/// FUNCTION DEFINITIONS /// +//////////////////////////////////////////////////////////////////////// + +/**Function************************************************************* + + Synopsis [Initializes arrival time of the PI.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManInitPiArrival( Tim_Man_t * p, int iPi, float Delay ) +{ + assert( iPi < p->nCis ); + p->pCis[iPi].timeArr = Delay; +} + +/**Function************************************************************* + + Synopsis [Initializes required time of the PO.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManInitPoRequired( Tim_Man_t * p, int iPo, float Delay ) +{ + assert( iPo < p->nCos ); + p->pCos[iPo].timeReq = Delay; +} + +/**Function************************************************************* + + Synopsis [Sets arrival times of all PIs.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManInitPiArrivalAll( Tim_Man_t * p, float Delay ) +{ + Tim_Obj_t * pObj; + int i; + Tim_ManForEachPi( p, pObj, i ) + Tim_ManInitPiArrival( p, i, Delay ); +} + +/**Function************************************************************* + + Synopsis [Sets required times of all POs.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManInitPoRequiredAll( Tim_Man_t * p, float Delay ) +{ + Tim_Obj_t * pObj; + int i; + Tim_ManForEachPo( p, pObj, i ) + Tim_ManSetCoRequired( p, i, Delay ); +} + +/**Function************************************************************* + + Synopsis [Updates arrival time of the CO.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManSetCoArrival( Tim_Man_t * p, int iCo, float Delay ) +{ + assert( iCo < p->nCos ); + assert( !p->fUseTravId || p->pCos[iCo].TravId != p->nTravIds ); + p->pCos[iCo].timeArr = Delay; + p->pCos[iCo].TravId = p->nTravIds; +} + +/**Function************************************************************* + + Synopsis [Updates required time of the CI.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManSetCiRequired( Tim_Man_t * p, int iCi, float Delay ) +{ + assert( iCi < p->nCis ); + assert( !p->fUseTravId || p->pCis[iCi].TravId != p->nTravIds ); + p->pCis[iCi].timeReq = Delay; + p->pCis[iCi].TravId = p->nTravIds; +} + +/**Function************************************************************* + + Synopsis [Updates required time of the CO.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManSetCoRequired( Tim_Man_t * p, int iCo, float Delay ) +{ + assert( iCo < p->nCos ); + assert( !p->fUseTravId || p->pCos[iCo].TravId != p->nTravIds ); + p->pCos[iCo].timeReq = Delay; + p->pCos[iCo].TravId = p->nTravIds; +} + + +/**Function************************************************************* + + Synopsis [Returns CO arrival time.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +float Tim_ManGetCiArrival( Tim_Man_t * p, int iCi ) +{ + Tim_Box_t * pBox; + Tim_Obj_t * pObjThis, * pObj, * pObjRes; + float * pTable, * pDelays, DelayBest; + int i, k; + // consider the already processed PI + pObjThis = Tim_ManCi( p, iCi ); + if ( p->fUseTravId && pObjThis->TravId == p->nTravIds ) + return pObjThis->timeArr; + pObjThis->TravId = p->nTravIds; + // consider the main PI + pBox = Tim_ManCiBox( p, iCi ); + if ( pBox == NULL ) + return pObjThis->timeArr; + // update box timing + pBox->TravId = p->nTravIds; + // get the arrival times of the inputs of the box (POs) + if ( p->fUseTravId ) + Tim_ManBoxForEachInput( p, pBox, pObj, i ) + if ( pObj->TravId != p->nTravIds ) + printf( "Tim_ManGetCiArrival(): Input arrival times of the box are not up to date!\n" ); + // compute the arrival times for each output of the box (PIs) + pTable = Tim_ManBoxDelayTable( p, pBox->iBox ); + Tim_ManBoxForEachOutput( p, pBox, pObjRes, i ) + { + pDelays = pTable + 3 + i * pBox->nInputs; + DelayBest = -TIM_ETERNITY; + Tim_ManBoxForEachInput( p, pBox, pObj, k ) + DelayBest = Abc_MaxInt( DelayBest, pObj->timeArr + pDelays[k] ); + pObjRes->timeArr = DelayBest; + pObjRes->TravId = p->nTravIds; + } + return pObjThis->timeArr; +} + +/**Function************************************************************* + + Synopsis [Returns CO required time.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +float Tim_ManGetCoRequired( Tim_Man_t * p, int iCo ) +{ + Tim_Box_t * pBox; + Tim_Obj_t * pObjThis, * pObj, * pObjRes; + float * pTable, * pDelays, DelayBest; + int i, k; + // consider the already processed PO + pObjThis = Tim_ManCo( p, iCo ); + if ( p->fUseTravId && pObjThis->TravId == p->nTravIds ) + return pObjThis->timeReq; + pObjThis->TravId = p->nTravIds; + // consider the main PO + pBox = Tim_ManCoBox( p, iCo ); + if ( pBox == NULL ) + return pObjThis->timeReq; + // update box timing + pBox->TravId = p->nTravIds; + // get the required times of the outputs of the box (PIs) + if ( p->fUseTravId ) + Tim_ManBoxForEachOutput( p, pBox, pObj, i ) + if ( pObj->TravId != p->nTravIds ) + printf( "Tim_ManGetCoRequired(): Output required times of output %d the box %d are not up to date!\n", i, pBox->iBox ); + // compute the required times for each input of the box (POs) + pTable = Tim_ManBoxDelayTable( p, pBox->iBox ); + Tim_ManBoxForEachInput( p, pBox, pObjRes, i ) + { + DelayBest = TIM_ETERNITY; + Tim_ManBoxForEachOutput( p, pBox, pObj, k ) + { + pDelays = pTable + 3 + k * pBox->nInputs; + DelayBest = Abc_MinFloat( DelayBest, pObj->timeReq - pDelays[i] ); + } + pObjRes->timeReq = DelayBest; + pObjRes->TravId = p->nTravIds; + } + return pObjThis->timeReq; +} + +//////////////////////////////////////////////////////////////////////// +/// END OF FILE /// +//////////////////////////////////////////////////////////////////////// + + +ABC_NAMESPACE_IMPL_END + diff --git a/src/misc/tim/timTrav.c b/src/misc/tim/timTrav.c new file mode 100644 index 00000000..4c3f64ad --- /dev/null +++ b/src/misc/tim/timTrav.c @@ -0,0 +1,185 @@ +/**CFile**************************************************************** + + FileName [timTrav.c] + + SystemName [ABC: Logic synthesis and verification system.] + + PackageName [Hierarchy/timing manager.] + + Synopsis [Manipulation of traversal IDs.] + + Author [Alan Mishchenko] + + Affiliation [UC Berkeley] + + Date [Ver. 1.0. Started - April 28, 2007.] + + Revision [$Id: timTrav.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] + +***********************************************************************/ + +#include "timInt.h" + +ABC_NAMESPACE_IMPL_START + +//////////////////////////////////////////////////////////////////////// +/// DECLARATIONS /// +//////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////// +/// FUNCTION DEFINITIONS /// +//////////////////////////////////////////////////////////////////////// + +/**Function************************************************************* + + Synopsis [Increments the trav ID of the manager.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManIncrementTravId( Tim_Man_t * p ) +{ + int i; + if ( p->nTravIds >= (1<<30)-1 ) + { + p->nTravIds = 0; + for ( i = 0; i < p->nCis; i++ ) + p->pCis[i].TravId = 0; + for ( i = 0; i < p->nCos; i++ ) + p->pCos[i].TravId = 0; + } + assert( p->nTravIds < (1<<30)-1 ); + p->nTravIds++; +} + +/**Function************************************************************* + + Synopsis [Label box inputs.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManSetCurrentTravIdBoxInputs( Tim_Man_t * p, int iBox ) +{ + Tim_Box_t * pBox; + Tim_Obj_t * pObj; + int i; + pBox = Tim_ManBox( p, iBox ); + Tim_ManBoxForEachInput( p, pBox, pObj, i ) + pObj->TravId = p->nTravIds; +} + +/**Function************************************************************* + + Synopsis [Label box outputs.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManSetCurrentTravIdBoxOutputs( Tim_Man_t * p, int iBox ) +{ + Tim_Box_t * pBox; + Tim_Obj_t * pObj; + int i; + pBox = Tim_ManBox( p, iBox ); + Tim_ManBoxForEachOutput( p, pBox, pObj, i ) + pObj->TravId = p->nTravIds; +} + +/**Function************************************************************* + + Synopsis [Label box inputs.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManSetPreviousTravIdBoxInputs( Tim_Man_t * p, int iBox ) +{ + Tim_Box_t * pBox; + Tim_Obj_t * pObj; + int i; + pBox = Tim_ManBox( p, iBox ); + Tim_ManBoxForEachInput( p, pBox, pObj, i ) + pObj->TravId = p->nTravIds - 1; +} + +/**Function************************************************************* + + Synopsis [Label box outputs.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManSetPreviousTravIdBoxOutputs( Tim_Man_t * p, int iBox ) +{ + Tim_Box_t * pBox; + Tim_Obj_t * pObj; + int i; + pBox = Tim_ManBox( p, iBox ); + Tim_ManBoxForEachOutput( p, pBox, pObj, i ) + pObj->TravId = p->nTravIds - 1; +} + +/**Function************************************************************* + + Synopsis [Updates required time of the CI.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Tim_ManIsCiTravIdCurrent( Tim_Man_t * p, int iCi ) +{ + assert( iCi < p->nCis ); + assert( p->fUseTravId ); + return p->pCis[iCi].TravId == p->nTravIds; +} + +/**Function************************************************************* + + Synopsis [Updates required time of the CO.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Tim_ManIsCoTravIdCurrent( Tim_Man_t * p, int iCo ) +{ + assert( iCo < p->nCos ); + assert( p->fUseTravId ); + return p->pCos[iCo].TravId == p->nTravIds; +} + +//////////////////////////////////////////////////////////////////////// +/// END OF FILE /// +//////////////////////////////////////////////////////////////////////// + + +ABC_NAMESPACE_IMPL_END + diff --git a/src/misc/vec/vecStr.h b/src/misc/vec/vecStr.h index d64fea65..238fe451 100644 --- a/src/misc/vec/vecStr.h +++ b/src/misc/vec/vecStr.h @@ -638,6 +638,28 @@ static inline void Vec_StrReverseOrder( Vec_Str_t * p ) /**Function************************************************************* + Synopsis [Compares two strings.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +static inline int Vec_StrEqual( Vec_Str_t * p1, Vec_Str_t * p2 ) +{ + int i; + if ( p1->nSize != p2->nSize ) + return 0; + for ( i = 0; i < p1->nSize; i++ ) + if ( p1->pArray[i] != p2->pArray[i] ) + return 0; + return 1; +} + +/**Function************************************************************* + Synopsis [Comparison procedure for two clauses.] Description [] diff --git a/src/opt/nwk/nwkDfs.c b/src/opt/nwk/nwkDfs.c index 59752c59..c230787d 100644 --- a/src/opt/nwk/nwkDfs.c +++ b/src/opt/nwk/nwkDfs.c @@ -110,7 +110,7 @@ int Nwk_ManLevelBackup( Nwk_Man_t * pNtk ) Nwk_ObjSetLevel( pObj, 0 ); // perform level computation LevelMax = 0; - pManTimeUnit = pNtk->pManTime ? Tim_ManDupUnit( pNtk->pManTime ) : NULL; + pManTimeUnit = pNtk->pManTime ? Tim_ManDup( pNtk->pManTime, 1 ) : NULL; if ( pManTimeUnit ) Tim_ManIncrementTravId( pManTimeUnit ); Nwk_ManForEachObj( pNtk, pObj, i ) diff --git a/src/opt/nwk/nwkTiming.c b/src/opt/nwk/nwkTiming.c index 9419c175..d62696b1 100644 --- a/src/opt/nwk/nwkTiming.c +++ b/src/opt/nwk/nwkTiming.c @@ -373,7 +373,7 @@ float Nwk_ManDelayTraceLut( Nwk_Man_t * pNtk ) if ( pNtk->pManTime ) { Tim_ManIncrementTravId( pNtk->pManTime ); - Tim_ManSetCoRequiredAll( pNtk->pManTime, tArrival ); + Tim_ManInitPoRequiredAll( pNtk->pManTime, tArrival ); } else { |