Fixing timing propagation bug in &nf with boxes.

This commit is contained in:
Alan Mishchenko 2025-02-12 18:41:12 -08:00
parent aa9630e169
commit 775dee4de9
1 changed files with 33 additions and 11 deletions

View File

@ -1620,8 +1620,7 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
p->pPars->Area++; p->pPars->Area++;
p->nInvs++; p->nInvs++;
} }
reqTime = Abc_MinInt( Nf_ObjRequired(p, i, 0), Nf_ObjRequired(p, i, 1) ); Tim_ManSetCiRequired( p->pManTim, Gia_ObjCioId(pObj), Nf_ObjRequired(p, i, 0) );
Tim_ManSetCiRequired( p->pManTim, Gia_ObjCioId(pObj), reqTime );
continue; continue;
} }
if ( Gia_ObjIsCo(pObj) ) if ( Gia_ObjIsCo(pObj) )
@ -1933,7 +1932,9 @@ void Nf_ManResetMatches( Nf_Man_t * p, int Round )
Nf_Mat_t * pDc, * pAc, * pMfan, * pM[2]; Nf_Mat_t * pDc, * pAc, * pMfan, * pM[2];
int i, c, Arrival; int i, c, Arrival;
// go through matches in the topo order // go through matches in the topo order
Gia_ManForEachAnd( p->pGia, pObj, i ) if ( p->pManTim )
Tim_ManIncrementTravId( p->pManTim );
Gia_ManForEachObjWithBoxes( p->pGia, pObj, i )
{ {
if ( Gia_ObjIsBuf(pObj) ) if ( Gia_ObjIsBuf(pObj) )
{ {
@ -1950,6 +1951,18 @@ void Nf_ManResetMatches( Nf_Man_t * p, int Round )
} }
continue; continue;
} }
if ( Gia_ObjIsCi(pObj) )
{
Arrival = Tim_ManGetCiArrival( p->pManTim, Gia_ObjCioId(pObj) );
Nf_ObjPrepareCi( p, i, Arrival );
continue;
}
if ( Gia_ObjIsCo(pObj) )
{
Arrival = Nf_ObjMatchD( p, Gia_ObjFaninId0(pObj, i), Gia_ObjFaninC0(pObj) )->D;
Tim_ManSetCoArrival( p->pManTim, Gia_ObjCioId(pObj), Arrival );
continue;
}
// select the best match for each phase // select the best match for each phase
for ( c = 0; c < 2; c++ ) for ( c = 0; c < 2; c++ )
{ {
@ -2022,29 +2035,38 @@ void Nf_ManComputeMappingEla( Nf_Man_t * p )
Mio_Cell2_t * pCell; Mio_Cell2_t * pCell;
Nf_Mat_t Mb, * pMb = &Mb, * pM; Nf_Mat_t Mb, * pMb = &Mb, * pM;
word AreaBef, AreaAft, Gain = 0; word AreaBef, AreaAft, Gain = 0;
int i, c, iVar, Id, fCompl, k, * pCut, reqTime; int i, c, iVar, Id, fCompl, k, * pCut, Required;
int Required;
Nf_ManSetOutputRequireds( p, 1 );
Nf_ManResetMatches( p, p->Iter - p->pPars->nRounds ); Nf_ManResetMatches( p, p->Iter - p->pPars->nRounds );
Nf_ManSetOutputRequireds( p, 1 );
Gia_ManForEachObjReverseWithBoxes( p->pGia, pObj, i ) Gia_ManForEachObjReverseWithBoxes( p->pGia, pObj, i )
{ {
if ( Gia_ObjIsBuf(pObj) ) if ( Gia_ObjIsBuf(pObj) )
{ {
if ( Nf_ObjMapRefNum(p, i, 1) ) if ( Nf_ObjMapRefNum(p, i, 1) )
Nf_ObjUpdateRequired( p, i, 0, Nf_ObjRequired(p, i, 1) - p->InvDelayI ); Nf_ObjUpdateRequired( p, i, 0, Nf_ObjRequired(p, i, 1) - p->InvDelayI );
Nf_ObjUpdateRequired( p, Gia_ObjFaninId0(pObj, i), Gia_ObjFaninC0(pObj), Nf_ObjRequired(p, i, 0) ); int reqTime = Nf_ObjRequired(p, i, 0);
int iObj = Gia_ObjFaninId0p(p->pGia, pObj);
int fCompl = Gia_ObjFaninC0(pObj);
Nf_ObjUpdateRequired( p, iObj, fCompl, reqTime );
if ( iObj > 0 && Nf_ObjMatchBest(p, iObj, fCompl)->fCompl )
Nf_ObjUpdateRequired( p, iObj, !fCompl, reqTime - p->InvDelayI );
continue; continue;
} }
if ( Gia_ObjIsCi(pObj) ) if ( Gia_ObjIsCi(pObj) )
{ {
reqTime = Abc_MinInt( Nf_ObjRequired(p, i, 0), Nf_ObjRequired(p, i, 1) ); if ( Nf_ObjMapRefNum(p, i, 1) )
Tim_ManSetCiRequired( p->pManTim, Gia_ObjCioId(pObj), reqTime ); Nf_ObjUpdateRequired( p, i, 0, Nf_ObjRequired(p, i, 1) - p->InvDelayI );
Tim_ManSetCiRequired( p->pManTim, Gia_ObjCioId(pObj), Nf_ObjRequired(p, i, 0) );
continue; continue;
} }
if ( Gia_ObjIsCo(pObj) ) if ( Gia_ObjIsCo(pObj) )
{ {
reqTime = Tim_ManGetCoRequired( p->pManTim, Gia_ObjCioId(pObj) ); int reqTime = Tim_ManGetCoRequired( p->pManTim, Gia_ObjCioId(pObj) );
Nf_ObjUpdateRequired( p, Gia_ObjFaninId0(pObj, i), Gia_ObjFaninC0(pObj), reqTime ); int iObj = Gia_ObjFaninId0p(p->pGia, pObj);
int fCompl = Gia_ObjFaninC0(pObj);
Nf_ObjUpdateRequired( p, iObj, fCompl, reqTime );
if ( iObj > 0 && Nf_ObjMatchBest(p, iObj, fCompl)->fCompl )
Nf_ObjUpdateRequired( p, iObj, !fCompl, reqTime - p->InvDelayI );
continue; continue;
} }
for ( c = 0; c < 2; c++ ) for ( c = 0; c < 2; c++ )