Commit f10480f9 by Alan Mishchenko

Parametrizing standard-cell mapper to account for the fanout delay.

parent 8e54792c
...@@ -14391,6 +14391,7 @@ int Abc_CommandMap( Abc_Frame_t * pAbc, int argc, char ** argv ) ...@@ -14391,6 +14391,7 @@ int Abc_CommandMap( Abc_Frame_t * pAbc, int argc, char ** argv )
double DelayTarget; double DelayTarget;
double AreaMulti; double AreaMulti;
double DelayMulti; double DelayMulti;
float LogFan = 0;
float Slew = 200; float Slew = 200;
float Gain = 100; float Gain = 100;
int nGatesMin = 4; int nGatesMin = 4;
...@@ -14400,7 +14401,7 @@ int Abc_CommandMap( Abc_Frame_t * pAbc, int argc, char ** argv ) ...@@ -14400,7 +14401,7 @@ int Abc_CommandMap( Abc_Frame_t * pAbc, int argc, char ** argv )
int fSwitching; int fSwitching;
int fVerbose; int fVerbose;
int c; int c;
extern Abc_Ntk_t * Abc_NtkMap( Abc_Ntk_t * pNtk, double DelayTarget, double AreaMulti, double DelayMulti, float Slew, float Gain, int nGatesMin, int fRecovery, int fSwitching, int fVerbose ); extern Abc_Ntk_t * Abc_NtkMap( Abc_Ntk_t * pNtk, double DelayTarget, double AreaMulti, double DelayMulti, float LogFan, float Slew, float Gain, int nGatesMin, int fRecovery, int fSwitching, int fVerbose );
extern int Abc_NtkFraigSweep( Abc_Ntk_t * pNtk, int fUseInv, int fExdc, int fVerbose, int fVeryVerbose ); extern int Abc_NtkFraigSweep( Abc_Ntk_t * pNtk, int fUseInv, int fExdc, int fVerbose, int fVeryVerbose );
pNtk = Abc_FrameReadNtk(pAbc); pNtk = Abc_FrameReadNtk(pAbc);
...@@ -14414,7 +14415,7 @@ int Abc_CommandMap( Abc_Frame_t * pAbc, int argc, char ** argv ) ...@@ -14414,7 +14415,7 @@ int Abc_CommandMap( Abc_Frame_t * pAbc, int argc, char ** argv )
fSwitching = 0; fSwitching = 0;
fVerbose = 0; fVerbose = 0;
Extra_UtilGetoptReset(); Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "DABSGMarspvh" ) ) != EOF ) while ( ( c = Extra_UtilGetopt( argc, argv, "DABFSGMarspvh" ) ) != EOF )
{ {
switch ( c ) switch ( c )
{ {
...@@ -14447,6 +14448,17 @@ int Abc_CommandMap( Abc_Frame_t * pAbc, int argc, char ** argv ) ...@@ -14447,6 +14448,17 @@ int Abc_CommandMap( Abc_Frame_t * pAbc, int argc, char ** argv )
DelayMulti = (float)atof(argv[globalUtilOptind]); DelayMulti = (float)atof(argv[globalUtilOptind]);
globalUtilOptind++; globalUtilOptind++;
break; break;
case 'F':
if ( globalUtilOptind >= argc )
{
Abc_Print( -1, "Command line switch \"-F\" should be followed by a floating point number.\n" );
goto usage;
}
LogFan = (float)atof(argv[globalUtilOptind]);
globalUtilOptind++;
if ( LogFan < 0.0 )
goto usage;
break;
case 'S': case 'S':
if ( globalUtilOptind >= argc ) if ( globalUtilOptind >= argc )
{ {
...@@ -14528,7 +14540,7 @@ int Abc_CommandMap( Abc_Frame_t * pAbc, int argc, char ** argv ) ...@@ -14528,7 +14540,7 @@ int Abc_CommandMap( Abc_Frame_t * pAbc, int argc, char ** argv )
} }
Abc_Print( 0, "The network was strashed and balanced before mapping.\n" ); Abc_Print( 0, "The network was strashed and balanced before mapping.\n" );
// get the new network // get the new network
pNtkRes = Abc_NtkMap( pNtk, DelayTarget, AreaMulti, DelayMulti, Slew, Gain, nGatesMin, fRecovery, fSwitching, fVerbose ); pNtkRes = Abc_NtkMap( pNtk, DelayTarget, AreaMulti, DelayMulti, LogFan, Slew, Gain, nGatesMin, fRecovery, fSwitching, fVerbose );
if ( pNtkRes == NULL ) if ( pNtkRes == NULL )
{ {
Abc_NtkDelete( pNtk ); Abc_NtkDelete( pNtk );
...@@ -14540,7 +14552,7 @@ int Abc_CommandMap( Abc_Frame_t * pAbc, int argc, char ** argv ) ...@@ -14540,7 +14552,7 @@ int Abc_CommandMap( Abc_Frame_t * pAbc, int argc, char ** argv )
else else
{ {
// get the new network // get the new network
pNtkRes = Abc_NtkMap( pNtk, DelayTarget, AreaMulti, DelayMulti, Slew, Gain, nGatesMin, fRecovery, fSwitching, fVerbose ); pNtkRes = Abc_NtkMap( pNtk, DelayTarget, AreaMulti, DelayMulti, LogFan, Slew, Gain, nGatesMin, fRecovery, fSwitching, fVerbose );
if ( pNtkRes == NULL ) if ( pNtkRes == NULL )
{ {
Abc_Print( -1, "Mapping has failed.\n" ); Abc_Print( -1, "Mapping has failed.\n" );
...@@ -14567,11 +14579,12 @@ usage: ...@@ -14567,11 +14579,12 @@ usage:
sprintf(Buffer, "not used" ); sprintf(Buffer, "not used" );
else else
sprintf(Buffer, "%.3f", DelayTarget ); sprintf(Buffer, "%.3f", DelayTarget );
Abc_Print( -2, "usage: map [-DABSG float] [-M num] [-arspvh]\n" ); Abc_Print( -2, "usage: map [-DABFSG float] [-M num] [-arspvh]\n" );
Abc_Print( -2, "\t performs standard cell mapping of the current network\n" ); Abc_Print( -2, "\t performs standard cell mapping of the current network\n" );
Abc_Print( -2, "\t-D float : sets the global required times [default = %s]\n", Buffer ); Abc_Print( -2, "\t-D float : sets the global required times [default = %s]\n", Buffer );
Abc_Print( -2, "\t-A float : \"area multiplier\" to bias gate selection [default = %.2f]\n", AreaMulti ); Abc_Print( -2, "\t-A float : \"area multiplier\" to bias gate selection [default = %.2f]\n", AreaMulti );
Abc_Print( -2, "\t-B float : \"delay multiplier\" to bias gate selection [default = %.2f]\n", DelayMulti ); Abc_Print( -2, "\t-B float : \"delay multiplier\" to bias gate selection [default = %.2f]\n", DelayMulti );
Abc_Print( -2, "\t-F float : the logarithmic fanout delay parameter [default = %.2f]\n", LogFan );
Abc_Print( -2, "\t-S float : the slew parameter used to generate the library [default = %.2f]\n", Slew ); Abc_Print( -2, "\t-S float : the slew parameter used to generate the library [default = %.2f]\n", Slew );
Abc_Print( -2, "\t-G float : the gain parameter used to generate the library [default = %.2f]\n", Gain ); Abc_Print( -2, "\t-G float : the gain parameter used to generate the library [default = %.2f]\n", Gain );
Abc_Print( -2, "\t-M num : skip gate classes whose size is less than this [default = %d]\n", nGatesMin ); Abc_Print( -2, "\t-M num : skip gate classes whose size is less than this [default = %d]\n", nGatesMin );
...@@ -57,7 +57,7 @@ static Abc_Obj_t * Abc_NodeFromMapSuperChoice_rec( Abc_Ntk_t * pNtkNew, Map_Sup ...@@ -57,7 +57,7 @@ static Abc_Obj_t * Abc_NodeFromMapSuperChoice_rec( Abc_Ntk_t * pNtkNew, Map_Sup
SeeAlso [] SeeAlso []
***********************************************************************/ ***********************************************************************/
Abc_Ntk_t * Abc_NtkMap( Abc_Ntk_t * pNtk, double DelayTarget, double AreaMulti, double DelayMulti, float Slew, float Gain, int nGatesMin, int fRecovery, int fSwitching, int fVerbose ) Abc_Ntk_t * Abc_NtkMap( Abc_Ntk_t * pNtk, double DelayTarget, double AreaMulti, double DelayMulti, float LogFan, float Slew, float Gain, int nGatesMin, int fRecovery, int fSwitching, int fVerbose )
{ {
static int fUseMulti = 0; static int fUseMulti = 0;
int fShowSwitching = 1; int fShowSwitching = 1;
...@@ -125,6 +125,8 @@ Abc_Ntk_t * Abc_NtkMap( Abc_Ntk_t * pNtk, double DelayTarget, double AreaMulti, ...@@ -125,6 +125,8 @@ Abc_Ntk_t * Abc_NtkMap( Abc_Ntk_t * pNtk, double DelayTarget, double AreaMulti,
return NULL; return NULL;
clk = Abc_Clock(); clk = Abc_Clock();
Map_ManSetSwitching( pMan, fSwitching ); Map_ManSetSwitching( pMan, fSwitching );
if ( LogFan != 0 )
Map_ManCreateNodeDelays( pMan, LogFan );
if ( !Map_Mapping( pMan ) ) if ( !Map_Mapping( pMan ) )
{ {
Map_ManFree( pMan ); Map_ManFree( pMan );
......
...@@ -76,6 +76,7 @@ struct Map_TimeStruct_t_ ...@@ -76,6 +76,7 @@ struct Map_TimeStruct_t_
/*=== mapperCreate.c =============================================================*/ /*=== mapperCreate.c =============================================================*/
extern Map_Man_t * Map_ManCreate( int nInputs, int nOutputs, int fVerbose ); extern Map_Man_t * Map_ManCreate( int nInputs, int nOutputs, int fVerbose );
extern Map_Node_t * Map_NodeCreate( Map_Man_t * p, Map_Node_t * p1, Map_Node_t * p2 ); extern Map_Node_t * Map_NodeCreate( Map_Man_t * p, Map_Node_t * p1, Map_Node_t * p2 );
extern void Map_ManCreateNodeDelays( Map_Man_t * p, int LogFan );
extern void Map_ManFree( Map_Man_t * pMan ); extern void Map_ManFree( Map_Man_t * pMan );
extern void Map_ManPrintTimeStats( Map_Man_t * p ); extern void Map_ManPrintTimeStats( Map_Man_t * p );
extern void Map_ManPrintStatsToFile( char * pName, float Area, float Delay, abctime Time ); extern void Map_ManPrintStatsToFile( char * pName, float Area, float Delay, abctime Time );
......
...@@ -264,6 +264,7 @@ void Map_ManFree( Map_Man_t * p ) ...@@ -264,6 +264,7 @@ void Map_ManFree( Map_Man_t * p )
if ( p->pCounters ) ABC_FREE( p->pCounters ); if ( p->pCounters ) ABC_FREE( p->pCounters );
Extra_MmFixedStop( p->mmNodes ); Extra_MmFixedStop( p->mmNodes );
Extra_MmFixedStop( p->mmCuts ); Extra_MmFixedStop( p->mmCuts );
ABC_FREE( p->pNodeDelays );
ABC_FREE( p->pInputArrivals ); ABC_FREE( p->pInputArrivals );
ABC_FREE( p->pOutputRequireds ); ABC_FREE( p->pOutputRequireds );
ABC_FREE( p->pInputs ); ABC_FREE( p->pInputs );
...@@ -276,6 +277,35 @@ void Map_ManFree( Map_Man_t * p ) ...@@ -276,6 +277,35 @@ void Map_ManFree( Map_Man_t * p )
/**Function************************************************************* /**Function*************************************************************
Synopsis [Creates node delays.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void Map_ManCreateNodeDelays( Map_Man_t * p, int LogFan )
{
Map_Node_t * pNode;
int k;
assert( p->pNodeDelays == NULL );
p->pNodeDelays = ABC_CALLOC( float, p->vNodesAll->nSize );
for ( k = 0; k < p->vNodesAll->nSize; k++ )
{
pNode = p->vNodesAll->pArray[k];
if ( pNode->nRefs == 0 )
continue;
p->pNodeDelays[k] = 0.014426 * LogFan * p->pSuperLib->tDelayInv.Worst * log( (double)pNode->nRefs ); // 1.4426 = 1/ln(2)
// printf( "%d = %d (%.2f) ", k, pNode->nRefs, p->pNodeDelays[k] );
}
// printf( "\n" );
}
/**Function*************************************************************
Synopsis [Deallocates the mapping manager.] Synopsis [Deallocates the mapping manager.]
Description [] Description []
......
...@@ -102,6 +102,7 @@ struct Map_ManStruct_t_ ...@@ -102,6 +102,7 @@ struct Map_ManStruct_t_
Map_NodeVec_t * vNodesAll; // the array of all nodes Map_NodeVec_t * vNodesAll; // the array of all nodes
Map_NodeVec_t * vNodesTemp; // the array of all nodes Map_NodeVec_t * vNodesTemp; // the array of all nodes
Map_NodeVec_t * vMapping; // the array of internal nodes used in the mapping Map_NodeVec_t * vMapping; // the array of internal nodes used in the mapping
float * pNodeDelays; // the array of node delays
// info about the original circuit // info about the original circuit
char ** ppOutputNames; // the primary output names char ** ppOutputNames; // the primary output names
......
...@@ -450,6 +450,9 @@ void Map_MappingSetPiArrivalTimes( Map_Man_t * p ) ...@@ -450,6 +450,9 @@ void Map_MappingSetPiArrivalTimes( Map_Man_t * p )
pNode = p->pInputs[i]; pNode = p->pInputs[i];
// set the arrival time of the positive phase // set the arrival time of the positive phase
pNode->tArrival[1] = p->pInputArrivals[i]; pNode->tArrival[1] = p->pInputArrivals[i];
pNode->tArrival[1].Rise += p->pNodeDelays ? p->pNodeDelays[pNode->Num] : 0;
pNode->tArrival[1].Fall += p->pNodeDelays ? p->pNodeDelays[pNode->Num] : 0;
pNode->tArrival[1].Worst += p->pNodeDelays ? p->pNodeDelays[pNode->Num] : 0;
// set the arrival time of the negative phase // set the arrival time of the negative phase
pNode->tArrival[0].Rise = pNode->tArrival[1].Fall + p->pSuperLib->tDelayInv.Rise; pNode->tArrival[0].Rise = pNode->tArrival[1].Fall + p->pSuperLib->tDelayInv.Rise;
pNode->tArrival[0].Fall = pNode->tArrival[1].Rise + p->pSuperLib->tDelayInv.Fall; pNode->tArrival[0].Fall = pNode->tArrival[1].Rise + p->pSuperLib->tDelayInv.Fall;
......
...@@ -100,9 +100,10 @@ float Map_TimeCutComputeArrival( Map_Node_t * pNode, Map_Cut_t * pCut, int fPhas ...@@ -100,9 +100,10 @@ float Map_TimeCutComputeArrival( Map_Node_t * pNode, Map_Cut_t * pCut, int fPhas
Map_Time_t * ptArrRes = &pM->tArrive; Map_Time_t * ptArrRes = &pM->tArrive;
Map_Time_t * ptArrIn; Map_Time_t * ptArrIn;
int fPinPhase; int fPinPhase;
float tDelay; float tDelay, tExtra;
int i; int i;
tExtra = pNode->p->pNodeDelays ? pNode->p->pNodeDelays[pNode->Num] : 0;
ptArrRes->Rise = ptArrRes->Fall = 0.0; ptArrRes->Rise = ptArrRes->Fall = 0.0;
ptArrRes->Worst = MAP_FLOAT_LARGE; ptArrRes->Worst = MAP_FLOAT_LARGE;
for ( i = pCut->nLeaves - 1; i >= 0; i-- ) for ( i = pCut->nLeaves - 1; i >= 0; i-- )
...@@ -114,7 +115,7 @@ float Map_TimeCutComputeArrival( Map_Node_t * pNode, Map_Cut_t * pCut, int fPhas ...@@ -114,7 +115,7 @@ float Map_TimeCutComputeArrival( Map_Node_t * pNode, Map_Cut_t * pCut, int fPhas
// get the rise of the output due to rise of the inputs // get the rise of the output due to rise of the inputs
if ( pSuper->tDelaysR[i].Rise > 0 ) if ( pSuper->tDelaysR[i].Rise > 0 )
{ {
tDelay = ptArrIn->Rise + pSuper->tDelaysR[i].Rise; tDelay = ptArrIn->Rise + pSuper->tDelaysR[i].Rise + tExtra;
if ( tDelay > tWorstLimit ) if ( tDelay > tWorstLimit )
return MAP_FLOAT_LARGE; return MAP_FLOAT_LARGE;
if ( ptArrRes->Rise < tDelay ) if ( ptArrRes->Rise < tDelay )
...@@ -124,7 +125,7 @@ float Map_TimeCutComputeArrival( Map_Node_t * pNode, Map_Cut_t * pCut, int fPhas ...@@ -124,7 +125,7 @@ float Map_TimeCutComputeArrival( Map_Node_t * pNode, Map_Cut_t * pCut, int fPhas
// get the rise of the output due to fall of the inputs // get the rise of the output due to fall of the inputs
if ( pSuper->tDelaysR[i].Fall > 0 ) if ( pSuper->tDelaysR[i].Fall > 0 )
{ {
tDelay = ptArrIn->Fall + pSuper->tDelaysR[i].Fall; tDelay = ptArrIn->Fall + pSuper->tDelaysR[i].Fall + tExtra;
if ( tDelay > tWorstLimit ) if ( tDelay > tWorstLimit )
return MAP_FLOAT_LARGE; return MAP_FLOAT_LARGE;
if ( ptArrRes->Rise < tDelay ) if ( ptArrRes->Rise < tDelay )
...@@ -134,7 +135,7 @@ float Map_TimeCutComputeArrival( Map_Node_t * pNode, Map_Cut_t * pCut, int fPhas ...@@ -134,7 +135,7 @@ float Map_TimeCutComputeArrival( Map_Node_t * pNode, Map_Cut_t * pCut, int fPhas
// get the fall of the output due to rise of the inputs // get the fall of the output due to rise of the inputs
if ( pSuper->tDelaysF[i].Rise > 0 ) if ( pSuper->tDelaysF[i].Rise > 0 )
{ {
tDelay = ptArrIn->Rise + pSuper->tDelaysF[i].Rise; tDelay = ptArrIn->Rise + pSuper->tDelaysF[i].Rise + tExtra;
if ( tDelay > tWorstLimit ) if ( tDelay > tWorstLimit )
return MAP_FLOAT_LARGE; return MAP_FLOAT_LARGE;
if ( ptArrRes->Fall < tDelay ) if ( ptArrRes->Fall < tDelay )
...@@ -144,7 +145,7 @@ float Map_TimeCutComputeArrival( Map_Node_t * pNode, Map_Cut_t * pCut, int fPhas ...@@ -144,7 +145,7 @@ float Map_TimeCutComputeArrival( Map_Node_t * pNode, Map_Cut_t * pCut, int fPhas
// get the fall of the output due to fall of the inputs // get the fall of the output due to fall of the inputs
if ( pSuper->tDelaysF[i].Fall > 0 ) if ( pSuper->tDelaysF[i].Fall > 0 )
{ {
tDelay = ptArrIn->Fall + pSuper->tDelaysF[i].Fall; tDelay = ptArrIn->Fall + pSuper->tDelaysF[i].Fall + tExtra;
if ( tDelay > tWorstLimit ) if ( tDelay > tWorstLimit )
return MAP_FLOAT_LARGE; return MAP_FLOAT_LARGE;
if ( ptArrRes->Fall < tDelay ) if ( ptArrRes->Fall < tDelay )
...@@ -383,10 +384,11 @@ void Map_TimePropagateRequiredPhase( Map_Man_t * p, Map_Node_t * pNode, int fPha ...@@ -383,10 +384,11 @@ void Map_TimePropagateRequiredPhase( Map_Man_t * p, Map_Node_t * pNode, int fPha
Map_Time_t * ptReqIn, * ptReqOut; Map_Time_t * ptReqIn, * ptReqOut;
Map_Cut_t * pCut; Map_Cut_t * pCut;
Map_Super_t * pSuper; Map_Super_t * pSuper;
float tNewReqTime; float tNewReqTime, tExtra;
unsigned uPhase; unsigned uPhase;
int fPinPhase, i; int fPinPhase, i;
tExtra = pNode->p->pNodeDelays ? pNode->p->pNodeDelays[pNode->Num] : 0;
// get the cut to be propagated // get the cut to be propagated
pCut = pNode->pCutBest[fPhase]; pCut = pNode->pCutBest[fPhase];
assert( pCut != NULL ); assert( pCut != NULL );
...@@ -408,7 +410,7 @@ void Map_TimePropagateRequiredPhase( Map_Man_t * p, Map_Node_t * pNode, int fPha ...@@ -408,7 +410,7 @@ void Map_TimePropagateRequiredPhase( Map_Man_t * p, Map_Node_t * pNode, int fPha
// ptArrOut->Rise = ptArrIn->Rise + pSuper->tDelaysR[i].Rise; // ptArrOut->Rise = ptArrIn->Rise + pSuper->tDelaysR[i].Rise;
if ( pSuper->tDelaysR[i].Rise > 0 ) if ( pSuper->tDelaysR[i].Rise > 0 )
{ {
tNewReqTime = ptReqOut->Rise - pSuper->tDelaysR[i].Rise; tNewReqTime = ptReqOut->Rise - pSuper->tDelaysR[i].Rise - tExtra;
ptReqIn->Rise = MAP_MIN( ptReqIn->Rise, tNewReqTime ); ptReqIn->Rise = MAP_MIN( ptReqIn->Rise, tNewReqTime );
} }
...@@ -417,7 +419,7 @@ void Map_TimePropagateRequiredPhase( Map_Man_t * p, Map_Node_t * pNode, int fPha ...@@ -417,7 +419,7 @@ void Map_TimePropagateRequiredPhase( Map_Man_t * p, Map_Node_t * pNode, int fPha
// ptArrOut->Rise = ptArrIn->Fall + pSuper->tDelaysR[i].Fall; // ptArrOut->Rise = ptArrIn->Fall + pSuper->tDelaysR[i].Fall;
if ( pSuper->tDelaysR[i].Fall > 0 ) if ( pSuper->tDelaysR[i].Fall > 0 )
{ {
tNewReqTime = ptReqOut->Rise - pSuper->tDelaysR[i].Fall; tNewReqTime = ptReqOut->Rise - pSuper->tDelaysR[i].Fall - tExtra;
ptReqIn->Fall = MAP_MIN( ptReqIn->Fall, tNewReqTime ); ptReqIn->Fall = MAP_MIN( ptReqIn->Fall, tNewReqTime );
} }
...@@ -426,7 +428,7 @@ void Map_TimePropagateRequiredPhase( Map_Man_t * p, Map_Node_t * pNode, int fPha ...@@ -426,7 +428,7 @@ void Map_TimePropagateRequiredPhase( Map_Man_t * p, Map_Node_t * pNode, int fPha
// ptArrOut->Fall = ptArrIn->Rise + pSuper->tDelaysF[i].Rise; // ptArrOut->Fall = ptArrIn->Rise + pSuper->tDelaysF[i].Rise;
if ( pSuper->tDelaysF[i].Rise > 0 ) if ( pSuper->tDelaysF[i].Rise > 0 )
{ {
tNewReqTime = ptReqOut->Fall - pSuper->tDelaysF[i].Rise; tNewReqTime = ptReqOut->Fall - pSuper->tDelaysF[i].Rise - tExtra;
ptReqIn->Rise = MAP_MIN( ptReqIn->Rise, tNewReqTime ); ptReqIn->Rise = MAP_MIN( ptReqIn->Rise, tNewReqTime );
} }
...@@ -435,7 +437,7 @@ void Map_TimePropagateRequiredPhase( Map_Man_t * p, Map_Node_t * pNode, int fPha ...@@ -435,7 +437,7 @@ void Map_TimePropagateRequiredPhase( Map_Man_t * p, Map_Node_t * pNode, int fPha
// ptArrOut->Fall = ptArrIn->Fall + pSuper->tDelaysF[i].Fall; // ptArrOut->Fall = ptArrIn->Fall + pSuper->tDelaysF[i].Fall;
if ( pSuper->tDelaysF[i].Fall > 0 ) if ( pSuper->tDelaysF[i].Fall > 0 )
{ {
tNewReqTime = ptReqOut->Fall - pSuper->tDelaysF[i].Fall; tNewReqTime = ptReqOut->Fall - pSuper->tDelaysF[i].Fall - tExtra;
ptReqIn->Fall = MAP_MIN( ptReqIn->Fall, tNewReqTime ); ptReqIn->Fall = MAP_MIN( ptReqIn->Fall, tNewReqTime );
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment