Commit c158dd5a by Alan Mishchenko

Migrating to using 32-bit timing representation in &nf.

parent 19ad75f1
...@@ -41,7 +41,6 @@ ABC_NAMESPACE_IMPL_START ...@@ -41,7 +41,6 @@ ABC_NAMESPACE_IMPL_START
#define NF_CUT_MAX 32 #define NF_CUT_MAX 32
#define NF_NO_LEAF 31 #define NF_NO_LEAF 31
#define NF_NO_FUNC 0x3FFFFFF #define NF_NO_FUNC 0x3FFFFFF
#define NF_INFINITY (~(word)0)
typedef struct Nf_Cut_t_ Nf_Cut_t; typedef struct Nf_Cut_t_ Nf_Cut_t;
struct Nf_Cut_t_ struct Nf_Cut_t_
...@@ -69,7 +68,7 @@ struct Nf_Mat_t_ ...@@ -69,7 +68,7 @@ struct Nf_Mat_t_
unsigned fCompl : 1; // complemented unsigned fCompl : 1; // complemented
unsigned fBest : 1; // best cut unsigned fBest : 1; // best cut
Nf_Cfg_t Cfg; // input literals Nf_Cfg_t Cfg; // input literals
word D; // delay int D; // delay
float F; // area float F; // area
}; };
typedef struct Nf_Obj_t_ Nf_Obj_t; typedef struct Nf_Obj_t_ Nf_Obj_t;
...@@ -94,7 +93,7 @@ struct Nf_Man_t_ ...@@ -94,7 +93,7 @@ struct Nf_Man_t_
Vec_Int_t vCutSets; // cut offsets Vec_Int_t vCutSets; // cut offsets
Vec_Int_t vMapRefs; // mapping refs (2x) Vec_Int_t vMapRefs; // mapping refs (2x)
Vec_Flt_t vFlowRefs; // flow refs (2x) Vec_Flt_t vFlowRefs; // flow refs (2x)
Vec_Wrd_t vRequired; // required times (2x) Vec_Int_t vRequired; // required times (2x)
Vec_Flt_t vCutFlows; // temporary cut area Vec_Flt_t vCutFlows; // temporary cut area
Vec_Int_t vCutDelays; // temporary cut delay Vec_Int_t vCutDelays; // temporary cut delay
Vec_Int_t vBackup; // backup literals Vec_Int_t vBackup; // backup literals
...@@ -102,7 +101,7 @@ struct Nf_Man_t_ ...@@ -102,7 +101,7 @@ struct Nf_Man_t_
int Iter; // mapping iterations int Iter; // mapping iterations
int fUseEla; // use exact area int fUseEla; // use exact area
int nInvs; // the inverter count int nInvs; // the inverter count
word InvDelay; // inverter delay int InvDelayI; // inverter delay
word InvAreaW; // inverter delay word InvAreaW; // inverter delay
float InvAreaF; // inverter area float InvAreaF; // inverter area
// statistics // statistics
...@@ -114,9 +113,6 @@ struct Nf_Man_t_ ...@@ -114,9 +113,6 @@ struct Nf_Man_t_
static inline int Nf_Cfg2Int( Nf_Cfg_t Mat ) { union { int x; Nf_Cfg_t y; } v; v.y = Mat; return v.x; } static inline int Nf_Cfg2Int( Nf_Cfg_t Mat ) { union { int x; Nf_Cfg_t y; } v; v.y = Mat; return v.x; }
static inline Nf_Cfg_t Nf_Int2Cfg( int Int ) { union { int x; Nf_Cfg_t y; } v; v.x = Int; return v.y; } static inline Nf_Cfg_t Nf_Int2Cfg( int Int ) { union { int x; Nf_Cfg_t y; } v; v.x = Int; return v.y; }
static inline word Nf_Flt2Wrd( float w ) { return MIO_NUM*w; }
static inline float Nf_Wrd2Flt( word w ) { return MIO_NUMINV*(unsigned)(w&0x3FFFFFFF) + MIO_NUMINV*(1<<30)*(unsigned)(w>>30); }
static inline Nf_Obj_t * Nf_ManObj( Nf_Man_t * p, int i ) { return p->pNfObjs + i; } static inline Nf_Obj_t * Nf_ManObj( Nf_Man_t * p, int i ) { return p->pNfObjs + i; }
static inline Mio_Cell2_t* Nf_ManCell( Nf_Man_t * p, int i ) { return p->pCells + i; } static inline Mio_Cell2_t* Nf_ManCell( Nf_Man_t * p, int i ) { return p->pCells + i; }
static inline int * Nf_ManCutSet( Nf_Man_t * p, int i ) { return (int *)Vec_PtrEntry(&p->vPages, i >> 16) + (i & 0xFFFF); } static inline int * Nf_ManCutSet( Nf_Man_t * p, int i ) { return (int *)Vec_PtrEntry(&p->vPages, i >> 16) + (i & 0xFFFF); }
...@@ -135,9 +131,9 @@ static inline int Nf_ObjMapRefNum( Nf_Man_t * p, int i, int c ) ...@@ -135,9 +131,9 @@ static inline int Nf_ObjMapRefNum( Nf_Man_t * p, int i, int c )
static inline int Nf_ObjMapRefInc( Nf_Man_t * p, int i, int c ) { return (*Vec_IntEntryP(&p->vMapRefs, Abc_Var2Lit(i,c)))++; } static inline int Nf_ObjMapRefInc( Nf_Man_t * p, int i, int c ) { return (*Vec_IntEntryP(&p->vMapRefs, Abc_Var2Lit(i,c)))++; }
static inline int Nf_ObjMapRefDec( Nf_Man_t * p, int i, int c ) { return --(*Vec_IntEntryP(&p->vMapRefs, Abc_Var2Lit(i,c))); } static inline int Nf_ObjMapRefDec( Nf_Man_t * p, int i, int c ) { return --(*Vec_IntEntryP(&p->vMapRefs, Abc_Var2Lit(i,c))); }
static inline float Nf_ObjFlowRefs( Nf_Man_t * p, int i, int c ) { return Vec_FltEntry(&p->vFlowRefs, Abc_Var2Lit(i,c)); } static inline float Nf_ObjFlowRefs( Nf_Man_t * p, int i, int c ) { return Vec_FltEntry(&p->vFlowRefs, Abc_Var2Lit(i,c)); }
static inline word Nf_ObjRequired( Nf_Man_t * p, int i, int c ) { return Vec_WrdEntry(&p->vRequired, Abc_Var2Lit(i,c)); } static inline int Nf_ObjRequired( Nf_Man_t * p, int i, int c ) { return Vec_IntEntry(&p->vRequired, Abc_Var2Lit(i,c)); }
static inline void Nf_ObjSetRequired( Nf_Man_t * p,int i, int c, word f ) { Vec_WrdWriteEntry(&p->vRequired, Abc_Var2Lit(i,c), f); } static inline void Nf_ObjSetRequired( Nf_Man_t * p,int i, int c, int f ) { Vec_IntWriteEntry(&p->vRequired, Abc_Var2Lit(i,c), f); }
static inline void Nf_ObjUpdateRequired( Nf_Man_t * p,int i, int c, word f ) { if (Nf_ObjRequired(p, i, c) > f) Nf_ObjSetRequired(p, i, c, f); } static inline void Nf_ObjUpdateRequired( Nf_Man_t * p,int i, int c, int f ) { if (Nf_ObjRequired(p, i, c) > f) Nf_ObjSetRequired(p, i, c, f); }
static inline Nf_Mat_t * Nf_ObjMatchD( Nf_Man_t * p, int i, int c ) { return &Nf_ManObj(p, i)->M[c][0]; } static inline Nf_Mat_t * Nf_ObjMatchD( Nf_Man_t * p, int i, int c ) { return &Nf_ManObj(p, i)->M[c][0]; }
static inline Nf_Mat_t * Nf_ObjMatchA( Nf_Man_t * p, int i, int c ) { return &Nf_ManObj(p, i)->M[c][1]; } static inline Nf_Mat_t * Nf_ObjMatchA( Nf_Man_t * p, int i, int c ) { return &Nf_ManObj(p, i)->M[c][1]; }
...@@ -172,17 +168,17 @@ static inline int Nf_CfgCompl( Nf_Cfg_t Cfg, int i ) ...@@ -172,17 +168,17 @@ static inline int Nf_CfgCompl( Nf_Cfg_t Cfg, int i )
SeeAlso [] SeeAlso []
***********************************************************************/ ***********************************************************************/
int Nf_StoCellIsDominated( Mio_Cell2_t * pCell, int * pFans, word * pProf ) int Nf_StoCellIsDominated( Mio_Cell2_t * pCell, int * pFans, int * pProf )
{ {
int k; int k;
if ( pCell->AreaW < pProf[0] ) if ( pCell->AreaF < Abc_Int2Float(pProf[0]) )
return 0; return 0;
for ( k = 0; k < (int)pCell->nFanins; k++ ) for ( k = 0; k < (int)pCell->nFanins; k++ )
if ( pCell->Delays[Abc_Lit2Var(pFans[k])] < pProf[k+1] ) if ( pCell->iDelays[Abc_Lit2Var(pFans[k])] < pProf[k+1] )
return 0; return 0;
return 1; // pCell is dominated return 1; // pCell is dominated
} }
void Nf_StoCreateGateAdd( Nf_Man_t * pMan, word uTruth, int * pFans, int nFans, int CellId, Vec_Wec_t * vProfs, Vec_Wrd_t * vStore ) void Nf_StoCreateGateAdd( Nf_Man_t * pMan, word uTruth, int * pFans, int nFans, int CellId, Vec_Wec_t * vProfs, Vec_Int_t * vStore )
{ {
Vec_Int_t * vArray, * vArrayProfs = NULL; Vec_Int_t * vArray, * vArrayProfs = NULL;
Mio_Cell2_t * pCell = Nf_ManCell( pMan, CellId ); Mio_Cell2_t * pCell = Nf_ManCell( pMan, CellId );
...@@ -216,7 +212,7 @@ void Nf_StoCreateGateAdd( Nf_Man_t * pMan, word uTruth, int * pFans, int nFans, ...@@ -216,7 +212,7 @@ void Nf_StoCreateGateAdd( Nf_Man_t * pMan, word uTruth, int * pFans, int nFans,
if ( Nf_Int2Cfg(Entry).Phase == Mat.Phase && Nf_Int2Cfg(Entry).fCompl == Mat.fCompl ) if ( Nf_Int2Cfg(Entry).Phase == Mat.Phase && Nf_Int2Cfg(Entry).fCompl == Mat.fCompl )
{ {
int Offset = Vec_IntEntry(vArrayProfs, i/2); int Offset = Vec_IntEntry(vArrayProfs, i/2);
word * pProf = Vec_WrdEntryP(vStore, Offset); int * pProf = Vec_IntEntryP(vStore, Offset);
if ( Nf_StoCellIsDominated(pCell, pFans, pProf) ) if ( Nf_StoCellIsDominated(pCell, pFans, pProf) )
return; return;
} }
...@@ -243,13 +239,13 @@ void Nf_StoCreateGateAdd( Nf_Man_t * pMan, word uTruth, int * pFans, int nFans, ...@@ -243,13 +239,13 @@ void Nf_StoCreateGateAdd( Nf_Man_t * pMan, word uTruth, int * pFans, int nFans,
// add delay profile // add delay profile
if ( pMan->pPars->fPinFilter ) if ( pMan->pPars->fPinFilter )
{ {
Vec_IntPush( vArrayProfs, Vec_WrdSize(vStore) ); Vec_IntPush( vArrayProfs, Vec_IntSize(vStore) );
Vec_WrdPush( vStore, pCell->AreaW ); Vec_IntPush( vStore, Abc_Float2Int(pCell->AreaF) );
for ( k = 0; k < nFans; k++ ) for ( k = 0; k < nFans; k++ )
Vec_WrdPush( vStore, pCell->Delays[Abc_Lit2Var(pFans[k])] ); Vec_IntPush( vStore, pCell->iDelays[Abc_Lit2Var(pFans[k])] );
} }
} }
void Nf_StoCreateGateMaches( Nf_Man_t * pMan, Mio_Cell2_t * pCell, int ** pComp, int ** pPerm, int * pnPerms, Vec_Wec_t * vProfs, Vec_Wrd_t * vStore ) void Nf_StoCreateGateMaches( Nf_Man_t * pMan, Mio_Cell2_t * pCell, int ** pComp, int ** pPerm, int * pnPerms, Vec_Wec_t * vProfs, Vec_Int_t * vStore )
{ {
int Perm[NF_LEAF_MAX], * Perm1, * Perm2; int Perm[NF_LEAF_MAX], * Perm1, * Perm2;
int nPerms = pnPerms[pCell->nFanins]; int nPerms = pnPerms[pCell->nFanins];
...@@ -286,7 +282,7 @@ void Nf_StoDeriveMatches( Nf_Man_t * p, int fVerbose ) ...@@ -286,7 +282,7 @@ void Nf_StoDeriveMatches( Nf_Man_t * p, int fVerbose )
{ {
// abctime clk = Abc_Clock(); // abctime clk = Abc_Clock();
Vec_Wec_t * vProfs = Vec_WecAlloc( 1000 ); Vec_Wec_t * vProfs = Vec_WecAlloc( 1000 );
Vec_Wrd_t * vStore = Vec_WrdAlloc( 10000 ); Vec_Int_t * vStore = Vec_IntAlloc( 10000 );
int * pComp[7], * pPerm[7], nPerms[7], i; int * pComp[7], * pPerm[7], nPerms[7], i;
Vec_WecPushLevel( vProfs ); Vec_WecPushLevel( vProfs );
Vec_WecPushLevel( vProfs ); Vec_WecPushLevel( vProfs );
...@@ -304,7 +300,7 @@ void Nf_StoDeriveMatches( Nf_Man_t * p, int fVerbose ) ...@@ -304,7 +300,7 @@ void Nf_StoDeriveMatches( Nf_Man_t * p, int fVerbose )
for ( i = 1; i <= 6; i++ ) for ( i = 1; i <= 6; i++ )
ABC_FREE( pPerm[i] ); ABC_FREE( pPerm[i] );
Vec_WecFree( vProfs ); Vec_WecFree( vProfs );
Vec_WrdFree( vStore ); Vec_IntFree( vStore );
// Abc_PrintTime( 1, "Time", Abc_Clock() - clk ); // Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
} }
//void Nf_StoPrintOne( Nf_Man_t * p, int Count, int t, int i, int GateId, Pf_Mat_t Mat ) //void Nf_StoPrintOne( Nf_Man_t * p, int Count, int t, int i, int GateId, Pf_Mat_t Mat )
...@@ -387,7 +383,7 @@ Nf_Man_t * Nf_StoCreate( Gia_Man_t * pGia, Jf_Par_t * pPars ) ...@@ -387,7 +383,7 @@ Nf_Man_t * Nf_StoCreate( Gia_Man_t * pGia, Jf_Par_t * pPars )
Vec_PtrGrow( &p->vPages, 256 ); // cut memory Vec_PtrGrow( &p->vPages, 256 ); // cut memory
Vec_IntFill( &p->vMapRefs, 2*Gia_ManObjNum(pGia), 0 ); // mapping refs (2x) Vec_IntFill( &p->vMapRefs, 2*Gia_ManObjNum(pGia), 0 ); // mapping refs (2x)
Vec_FltFill( &p->vFlowRefs, 2*Gia_ManObjNum(pGia), 0 ); // flow refs (2x) Vec_FltFill( &p->vFlowRefs, 2*Gia_ManObjNum(pGia), 0 ); // flow refs (2x)
Vec_WrdFill( &p->vRequired, 2*Gia_ManObjNum(pGia), NF_INFINITY ); // required times (2x) Vec_IntFill( &p->vRequired, 2*Gia_ManObjNum(pGia), SCL_INFINITY ); // required times (2x)
Vec_IntFill( &p->vCutSets, Gia_ManObjNum(pGia), 0 ); // cut offsets Vec_IntFill( &p->vCutSets, Gia_ManObjNum(pGia), 0 ); // cut offsets
Vec_FltFill( &p->vCutFlows, Gia_ManObjNum(pGia), 0 ); // cut area Vec_FltFill( &p->vCutFlows, Gia_ManObjNum(pGia), 0 ); // cut area
Vec_IntFill( &p->vCutDelays,Gia_ManObjNum(pGia), 0 ); // cut delay Vec_IntFill( &p->vCutDelays,Gia_ManObjNum(pGia), 0 ); // cut delay
...@@ -408,7 +404,7 @@ Nf_Man_t * Nf_StoCreate( Gia_Man_t * pGia, Jf_Par_t * pPars ) ...@@ -408,7 +404,7 @@ Nf_Man_t * Nf_StoCreate( Gia_Man_t * pGia, Jf_Par_t * pPars )
Vec_WecPushLevel( p->vTt2Match ); Vec_WecPushLevel( p->vTt2Match );
assert( Vec_WecSize(p->vTt2Match) == Vec_MemEntryNum(p->vTtMem) ); assert( Vec_WecSize(p->vTt2Match) == Vec_MemEntryNum(p->vTtMem) );
Nf_StoDeriveMatches( p, 0 );//pPars->fVerbose ); Nf_StoDeriveMatches( p, 0 );//pPars->fVerbose );
p->InvDelay = p->pCells[3].Delays[0]; p->InvDelayI = p->pCells[3].iDelays[0];
p->InvAreaW = p->pCells[3].AreaW; p->InvAreaW = p->pCells[3].AreaW;
p->InvAreaF = p->pCells[3].AreaF; p->InvAreaF = p->pCells[3].AreaF;
Nf_ObjMatchD(p, 0, 0)->Gate = 0; Nf_ObjMatchD(p, 0, 0)->Gate = 0;
...@@ -996,7 +992,7 @@ void Nf_ManPrintStats( Nf_Man_t * p, char * pTitle ) ...@@ -996,7 +992,7 @@ void Nf_ManPrintStats( Nf_Man_t * p, char * pTitle )
if ( !p->pPars->fVerbose ) if ( !p->pPars->fVerbose )
return; return;
printf( "%s : ", pTitle ); printf( "%s : ", pTitle );
printf( "Delay =%8.2f ", Nf_Wrd2Flt(p->pPars->WordMapDelay) ); printf( "Delay =%8.2f ", Scl_Flt2Int(p->pPars->MapDelay) );
printf( "Area =%12.2f ", p->pPars->MapAreaF ); printf( "Area =%12.2f ", p->pPars->MapAreaF );
printf( "Gate =%6d ", (int)p->pPars->Area ); printf( "Gate =%6d ", (int)p->pPars->Area );
printf( "Inv =%6d ", (int)p->nInvs ); printf( "Inv =%6d ", (int)p->nInvs );
...@@ -1076,7 +1072,7 @@ void Nf_ManCutMatchPrint( Nf_Man_t * p, int iObj, char * pStr, Nf_Mat_t * pM ) ...@@ -1076,7 +1072,7 @@ void Nf_ManCutMatchPrint( Nf_Man_t * p, int iObj, char * pStr, Nf_Mat_t * pM )
} }
pCell = Nf_ManCell( p, pM->Gate ); pCell = Nf_ManCell( p, pM->Gate );
pCut = Nf_CutFromHandle( Nf_ObjCutSet(p, iObj), pM->CutH ); pCut = Nf_CutFromHandle( Nf_ObjCutSet(p, iObj), pM->CutH );
printf( "D =%6.2f ", Nf_Wrd2Flt(pM->D) ); printf( "D =%6.2f ", Scl_Flt2Int(pM->D) );
printf( "A =%6.2f ", pM->F ); printf( "A =%6.2f ", pM->F );
printf( "C = %d ", pM->fCompl ); printf( "C = %d ", pM->fCompl );
// printf( "B = %d ", pM->fBest ); // printf( "B = %d ", pM->fBest );
...@@ -1091,7 +1087,7 @@ void Nf_ManCutMatchPrint( Nf_Man_t * p, int iObj, char * pStr, Nf_Mat_t * pM ) ...@@ -1091,7 +1087,7 @@ void Nf_ManCutMatchPrint( Nf_Man_t * p, int iObj, char * pStr, Nf_Mat_t * pM )
printf( "%d ", pCell->nFanins ); printf( "%d ", pCell->nFanins );
printf( "{" ); printf( "{" );
for ( i = 0; i < (int)pCell->nFanins; i++ ) for ( i = 0; i < (int)pCell->nFanins; i++ )
printf( "%6.2f ", Nf_Wrd2Flt(pCell->Delays[i]) ); printf( "%6.2f ", Scl_Flt2Int(pCell->iDelays[i]) );
for ( ; i < 6; i++ ) for ( ; i < 6; i++ )
printf( " " ); printf( " " );
printf( " } " ); printf( " } " );
...@@ -1110,7 +1106,7 @@ void Nf_ManCutMatchOne( Nf_Man_t * p, int iObj, int * pCut, int * pCutSet ) ...@@ -1110,7 +1106,7 @@ void Nf_ManCutMatchOne( Nf_Man_t * p, int iObj, int * pCut, int * pCutSet )
int fComplExt = Abc_LitIsCompl(iFuncLit); int fComplExt = Abc_LitIsCompl(iFuncLit);
Vec_Int_t * vArr = Vec_WecEntry( p->vTt2Match, Abc_Lit2Var(iFuncLit) ); Vec_Int_t * vArr = Vec_WecEntry( p->vTt2Match, Abc_Lit2Var(iFuncLit) );
int i, k, c, Info, Offset, iFanin, fComplF; int i, k, c, Info, Offset, iFanin, fComplF;
word ArrivalD, ArrivalA; int ArrivalD, ArrivalA;
Nf_Mat_t * pD, * pA; Nf_Mat_t * pD, * pA;
// assign fanins matches // assign fanins matches
Nf_Obj_t * pBestF[NF_LEAF_MAX]; Nf_Obj_t * pBestF[NF_LEAF_MAX];
...@@ -1140,26 +1136,25 @@ void Nf_ManCutMatchOne( Nf_Man_t * p, int iObj, int * pCut, int * pCutSet ) ...@@ -1140,26 +1136,25 @@ void Nf_ManCutMatchOne( Nf_Man_t * p, int iObj, int * pCut, int * pCutSet )
Nf_Cfg_t Cfg = Nf_Int2Cfg(Offset); Nf_Cfg_t Cfg = Nf_Int2Cfg(Offset);
Mio_Cell2_t*pC = Nf_ManCell( p, Info ); Mio_Cell2_t*pC = Nf_ManCell( p, Info );
int fCompl = Cfg.fCompl ^ fComplExt; int fCompl = Cfg.fCompl ^ fComplExt;
word Required = Nf_ObjRequired( p, iObj, fCompl ); int Required = Nf_ObjRequired( p, iObj, fCompl ), Delay = 0;
Nf_Mat_t * pD = &pBest->M[fCompl][0]; Nf_Mat_t * pD = &pBest->M[fCompl][0];
Nf_Mat_t * pA = &pBest->M[fCompl][1]; Nf_Mat_t * pA = &pBest->M[fCompl][1];
float AreaF = pC->AreaF; float AreaF = pC->AreaF;
word Delay = 0;
assert( nFans == (int)pC->nFanins ); assert( nFans == (int)pC->nFanins );
Nf_CfgForEachVarCompl( Cfg, nFans, iFanin, fComplF, k ) Nf_CfgForEachVarCompl( Cfg, nFans, iFanin, fComplF, k )
{ {
ArrivalD = pBestF[iFanin]->M[fComplF][0].D; ArrivalD = pBestF[iFanin]->M[fComplF][0].D;
ArrivalA = pBestF[iFanin]->M[fComplF][1].D; ArrivalA = pBestF[iFanin]->M[fComplF][1].D;
if ( ArrivalA + pC->Delays[k] <= Required && Required != NF_INFINITY ) if ( ArrivalA + pC->iDelays[k] <= Required && Required != SCL_INFINITY )
{ {
Delay = Abc_MaxWord( Delay, ArrivalA + pC->Delays[k] ); Delay = Abc_MaxInt( Delay, ArrivalA + pC->iDelays[k] );
AreaF += pBestF[iFanin]->M[fComplF][1].F; AreaF += pBestF[iFanin]->M[fComplF][1].F;
} }
else else
{ {
if ( pD->D < NF_INFINITY && pA->D < NF_INFINITY && ArrivalD + pC->Delays[k] > Required ) if ( pD->D < SCL_INFINITY && pA->D < SCL_INFINITY && ArrivalD + pC->iDelays[k] > Required )
break; break;
Delay = Abc_MaxWord( Delay, ArrivalD + pC->Delays[k] ); Delay = Abc_MaxInt( Delay, ArrivalD + pC->iDelays[k] );
AreaF += pBestF[iFanin]->M[fComplF][0].F; AreaF += pBestF[iFanin]->M[fComplF][0].F;
} }
} }
...@@ -1187,7 +1182,7 @@ void Nf_ManCutMatchOne( Nf_Man_t * p, int iObj, int * pCut, int * pCutSet ) ...@@ -1187,7 +1182,7 @@ void Nf_ManCutMatchOne( Nf_Man_t * p, int iObj, int * pCut, int * pCutSet )
} }
} }
} }
static inline void Nf_ObjPrepareCi( Nf_Man_t * p, int iObj, word Time ) static inline void Nf_ObjPrepareCi( Nf_Man_t * p, int iObj, int Time )
{ {
Nf_Mat_t * pD0 = Nf_ObjMatchD( p, iObj, 0 ); Nf_Mat_t * pD0 = Nf_ObjMatchD( p, iObj, 0 );
Nf_Mat_t * pA0 = Nf_ObjMatchA( p, iObj, 0 ); Nf_Mat_t * pA0 = Nf_ObjMatchA( p, iObj, 0 );
...@@ -1195,10 +1190,10 @@ static inline void Nf_ObjPrepareCi( Nf_Man_t * p, int iObj, word Time ) ...@@ -1195,10 +1190,10 @@ static inline void Nf_ObjPrepareCi( Nf_Man_t * p, int iObj, word Time )
Nf_Mat_t * pA = Nf_ObjMatchA( p, iObj, 1 ); Nf_Mat_t * pA = Nf_ObjMatchA( p, iObj, 1 );
pD0->D = pA0->D = pD->D = pA->D = Time; pD0->D = pA0->D = pD->D = pA->D = Time;
pD->fCompl = 1; pD->fCompl = 1;
pD->D += p->InvDelay; pD->D += p->InvDelayI;
pD->F = p->InvAreaF; pD->F = p->InvAreaF;
pA->fCompl = 1; pA->fCompl = 1;
pA->D += p->InvDelay; pA->D += p->InvDelayI;
pA->F = p->InvAreaF; pA->F = p->InvAreaF;
Nf_ObjMatchD( p, iObj, 0 )->fBest = 1; Nf_ObjMatchD( p, iObj, 0 )->fBest = 1;
Nf_ObjMatchD( p, iObj, 1 )->fBest = 1; Nf_ObjMatchD( p, iObj, 1 )->fBest = 1;
...@@ -1222,33 +1217,33 @@ static inline void Nf_ObjPrepareBuf( Nf_Man_t * p, Gia_Obj_t * pObj ) ...@@ -1222,33 +1217,33 @@ static inline void Nf_ObjPrepareBuf( Nf_Man_t * p, Gia_Obj_t * pObj )
pDp->F = pAp->F = pDf->F; // do not pass flow??? pDp->F = pAp->F = pDf->F; // do not pass flow???
pDp->fBest = 1; pDp->fBest = 1;
// set the inverted phase // set the inverted phase
pDn->D = pAn->D = pDf->D + p->InvDelay; pDn->D = pAn->D = pDf->D + p->InvDelayI;
pDn->F = pAn->F = pDf->F + p->InvAreaF; pDn->F = pAn->F = pDf->F + p->InvAreaF;
pDn->fCompl = pAn->fCompl = 1; pDn->fCompl = pAn->fCompl = 1;
pDn->fBest = 1; pDn->fBest = 1;
} }
static inline word Nf_CutRequired( Nf_Man_t * p, Nf_Mat_t * pM, int * pCutSet ) static inline int Nf_CutRequired( Nf_Man_t * p, Nf_Mat_t * pM, int * pCutSet )
{ {
Mio_Cell2_t * pCell = Nf_ManCell( p, pM->Gate ); Mio_Cell2_t * pCell = Nf_ManCell( p, pM->Gate );
int * pCut = Nf_CutFromHandle( pCutSet, pM->CutH ); int * pCut = Nf_CutFromHandle( pCutSet, pM->CutH );
int i, iVar, fCompl; int i, iVar, fCompl;
word Arr, Req, Arrival = 0, Required = 0; int Arr, Req, Arrival = 0, Required = 0;
Nf_CutForEachVarCompl( pCut, pM->Cfg, iVar, fCompl, i ) Nf_CutForEachVarCompl( pCut, pM->Cfg, iVar, fCompl, i )
{ {
Arr = Nf_ManObj(p, iVar)->M[fCompl][0].D + pCell->Delays[i]; Arr = Nf_ManObj(p, iVar)->M[fCompl][0].D + pCell->iDelays[i];
Req = Nf_ObjRequired(p, iVar, fCompl); Req = Nf_ObjRequired(p, iVar, fCompl);
Arrival = Abc_MaxWord( Arrival, Arr ); Arrival = Abc_MaxInt( Arrival, Arr );
if ( Req < NF_INFINITY ) if ( Req < SCL_INFINITY )
Required = Abc_MaxWord( Required, Req + pCell->Delays[i] ); Required = Abc_MaxInt( Required, Req + pCell->iDelays[i] );
} }
return Abc_MaxWord( Required + p->pPars->nReqTimeFlex*p->InvDelay, Arrival ); return Abc_MaxInt( Required + p->pPars->nReqTimeFlex*p->InvDelayI, Arrival );
} }
static inline void Nf_ObjComputeRequired( Nf_Man_t * p, int iObj ) static inline void Nf_ObjComputeRequired( Nf_Man_t * p, int iObj )
{ {
Nf_Obj_t * pBest = Nf_ManObj(p, iObj); Nf_Obj_t * pBest = Nf_ManObj(p, iObj);
int c, * pCutSet = Nf_ObjCutSet( p, iObj ); int c, * pCutSet = Nf_ObjCutSet( p, iObj );
for ( c = 0; c < 2; c++ ) for ( c = 0; c < 2; c++ )
if ( Nf_ObjRequired(p, iObj, c) == NF_INFINITY ) if ( Nf_ObjRequired(p, iObj, c) == SCL_INFINITY )
Nf_ObjSetRequired( p, iObj, c, Nf_CutRequired(p, &pBest->M[c][0], pCutSet) ); Nf_ObjSetRequired( p, iObj, c, Nf_CutRequired(p, &pBest->M[c][0], pCutSet) );
} }
void Nf_ManCutMatch( Nf_Man_t * p, int iObj ) void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
...@@ -1263,7 +1258,7 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj ) ...@@ -1263,7 +1258,7 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
float FlowRefPf = Nf_ObjFlowRefs(p, iObj, 0); float FlowRefPf = Nf_ObjFlowRefs(p, iObj, 0);
float FlowRefNf = Nf_ObjFlowRefs(p, iObj, 1); float FlowRefNf = Nf_ObjFlowRefs(p, iObj, 1);
int i, * pCut, * pCutSet = Nf_ObjCutSet( p, iObj ); int i, * pCut, * pCutSet = Nf_ObjCutSet( p, iObj );
word Required[2] = {0}; int Required[2] = {0};
if ( p->Iter ) if ( p->Iter )
{ {
Nf_ObjComputeRequired( p, iObj ); Nf_ObjComputeRequired( p, iObj );
...@@ -1271,10 +1266,10 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj ) ...@@ -1271,10 +1266,10 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
Required[1] = Nf_ObjRequired( p, iObj, 1 ); Required[1] = Nf_ObjRequired( p, iObj, 1 );
} }
memset( pBest, 0, sizeof(Nf_Obj_t) ); memset( pBest, 0, sizeof(Nf_Obj_t) );
pDp->D = NF_INFINITY; pDp->F = FLT_MAX; pDp->D = SCL_INFINITY; pDp->F = FLT_MAX;
pDn->D = NF_INFINITY; pDn->F = FLT_MAX; pDn->D = SCL_INFINITY; pDn->F = FLT_MAX;
pAp->D = NF_INFINITY; pAp->F = FLT_MAX; pAp->D = SCL_INFINITY; pAp->F = FLT_MAX;
pAn->D = NF_INFINITY; pAn->F = FLT_MAX; pAn->D = SCL_INFINITY; pAn->F = FLT_MAX;
Nf_SetForEachCut( pCutSet, pCut, i ) Nf_SetForEachCut( pCutSet, pCut, i )
{ {
if ( Abc_Lit2Var(Nf_CutFunc(pCut)) >= Vec_WecSize(p->vTt2Match) ) if ( Abc_Lit2Var(Nf_CutFunc(pCut)) >= Vec_WecSize(p->vTt2Match) )
...@@ -1288,7 +1283,7 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj ) ...@@ -1288,7 +1283,7 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
/* /*
if ( 461 == iObj && p->Iter == 0 ) if ( 461 == iObj && p->Iter == 0 )
{ {
printf( "\nObj %6d (%.2f %.2f):\n", iObj, Nf_Wrd2Flt(Required[0]), Nf_Wrd2Flt(Required[1]) ); printf( "\nObj %6d (%.2f %.2f):\n", iObj, Scl_Flt2Int(Required[0]), Scl_Flt2Int(Required[1]) );
Nf_ManCutMatchPrint( p, iObj, "Dp", &pBest->M[0][0] ); Nf_ManCutMatchPrint( p, iObj, "Dp", &pBest->M[0][0] );
Nf_ManCutMatchPrint( p, iObj, "Dn", &pBest->M[1][0] ); Nf_ManCutMatchPrint( p, iObj, "Dn", &pBest->M[1][0] );
Nf_ManCutMatchPrint( p, iObj, "Ap", &pBest->M[0][1] ); Nf_ManCutMatchPrint( p, iObj, "Ap", &pBest->M[0][1] );
...@@ -1303,71 +1298,71 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj ) ...@@ -1303,71 +1298,71 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
pAn->F = pAn->F / FlowRefNf; pAn->F = pAn->F / FlowRefNf;
// add the inverters // add the inverters
assert( pDp->D < NF_INFINITY || pDn->D < NF_INFINITY ); assert( pDp->D < SCL_INFINITY || pDn->D < SCL_INFINITY );
if ( pDp->D > pDn->D + p->InvDelay ) if ( pDp->D > pDn->D + p->InvDelayI )
{ {
*pDp = *pDn; *pDp = *pDn;
pDp->D += p->InvDelay; pDp->D += p->InvDelayI;
pDp->F += p->InvAreaF; pDp->F += p->InvAreaF;
pDp->fCompl = 1; pDp->fCompl = 1;
if ( pAp->D == NF_INFINITY ) if ( pAp->D == SCL_INFINITY )
*pAp = *pDp; *pAp = *pDp;
//printf( "Using inverter to improve delay at node %d in phase %d.\n", iObj, 1 ); //printf( "Using inverter to improve delay at node %d in phase %d.\n", iObj, 1 );
} }
else if ( pDn->D > pDp->D + p->InvDelay ) else if ( pDn->D > pDp->D + p->InvDelayI )
{ {
*pDn = *pDp; *pDn = *pDp;
pDn->D += p->InvDelay; pDn->D += p->InvDelayI;
pDn->F += p->InvAreaF; pDn->F += p->InvAreaF;
pDn->fCompl = 1; pDn->fCompl = 1;
if ( pAn->D == NF_INFINITY ) if ( pAn->D == SCL_INFINITY )
*pAn = *pDn; *pAn = *pDn;
//printf( "Using inverter to improve delay at node %d in phase %d.\n", iObj, 0 ); //printf( "Using inverter to improve delay at node %d in phase %d.\n", iObj, 0 );
} }
//assert( pAp->A < NF_INFINITY || pAn->A < NF_INFINITY ); //assert( pAp->F < FLT_MAX || pAn->F < FLT_MAX );
// try replacing pos with neg // try replacing pos with neg
if ( pAp->D == NF_INFINITY || (pAp->F > pAn->F + p->InvAreaF && pAn->D + p->InvDelay <= Required[0]) ) if ( pAp->D == SCL_INFINITY || (pAp->F > pAn->F + p->InvAreaF && pAn->D + p->InvDelayI <= Required[0]) )
{ {
assert( p->Iter > 0 ); assert( p->Iter > 0 );
*pAp = *pAn; *pAp = *pAn;
pAp->D += p->InvDelay; pAp->D += p->InvDelayI;
pAp->F += p->InvAreaF; pAp->F += p->InvAreaF;
pAp->fCompl = 1; pAp->fCompl = 1;
if ( pDp->D == NF_INFINITY ) if ( pDp->D == SCL_INFINITY )
*pDp = *pAp; *pDp = *pAp;
//printf( "Using inverter to improve area at node %d in phase %d.\n", iObj, 1 ); //printf( "Using inverter to improve area at node %d in phase %d.\n", iObj, 1 );
} }
// try replacing neg with pos // try replacing neg with pos
else if ( pAn->D == NF_INFINITY || (pAn->F > pAp->F + p->InvAreaF && pAp->D + p->InvDelay <= Required[1]) ) else if ( pAn->D == SCL_INFINITY || (pAn->F > pAp->F + p->InvAreaF && pAp->D + p->InvDelayI <= Required[1]) )
{ {
assert( p->Iter > 0 ); assert( p->Iter > 0 );
*pAn = *pAp; *pAn = *pAp;
pAn->D += p->InvDelay; pAn->D += p->InvDelayI;
pAn->F += p->InvAreaF; pAn->F += p->InvAreaF;
pAn->fCompl = 1; pAn->fCompl = 1;
if ( pDn->D == NF_INFINITY ) if ( pDn->D == SCL_INFINITY )
*pDn = *pAn; *pDn = *pAn;
//printf( "Using inverter to improve area at node %d in phase %d.\n", iObj, 0 ); //printf( "Using inverter to improve area at node %d in phase %d.\n", iObj, 0 );
} }
if ( pDp->D == NF_INFINITY ) if ( pDp->D == SCL_INFINITY )
printf( "Object %d has pDp unassigned.\n", iObj ); printf( "Object %d has pDp unassigned.\n", iObj );
if ( pDn->D == NF_INFINITY ) if ( pDn->D == SCL_INFINITY )
printf( "Object %d has pDn unassigned.\n", iObj ); printf( "Object %d has pDn unassigned.\n", iObj );
if ( pAp->D == NF_INFINITY ) if ( pAp->D == SCL_INFINITY )
printf( "Object %d has pAp unassigned.\n", iObj ); printf( "Object %d has pAp unassigned.\n", iObj );
if ( pAn->D == NF_INFINITY ) if ( pAn->D == SCL_INFINITY )
printf( "Object %d has pAn unassigned.\n", iObj ); printf( "Object %d has pAn unassigned.\n", iObj );
/* /*
pDp->A = Abc_MinWord( pDp->A, NF_INFINITY/MIO_NUM ); pDp->F = Abc_MinFloat( pDp->F, FLT_MAX/MIO_NUM );
pDn->A = Abc_MinWord( pDn->A, NF_INFINITY/MIO_NUM ); pDn->F = Abc_MinFloat( pDn->F, FLT_MAX/MIO_NUM );
pAp->A = Abc_MinWord( pAp->A, NF_INFINITY/MIO_NUM ); pAp->F = Abc_MinFloat( pAp->F, FLT_MAX/MIO_NUM );
pAn->A = Abc_MinWord( pAn->A, NF_INFINITY/MIO_NUM ); pAn->F = Abc_MinFloat( pAn->F, FLT_MAX/MIO_NUM );
*/ */
assert( pDp->D < NF_INFINITY ); assert( pDp->D < SCL_INFINITY );
assert( pDn->D < NF_INFINITY ); assert( pDn->D < SCL_INFINITY );
assert( pAp->D < NF_INFINITY ); assert( pAp->D < SCL_INFINITY );
assert( pAn->D < NF_INFINITY ); assert( pAn->D < SCL_INFINITY );
assert( pDp->F < FLT_MAX ); assert( pDp->F < FLT_MAX );
assert( pDn->F < FLT_MAX ); assert( pDn->F < FLT_MAX );
...@@ -1378,14 +1373,14 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj ) ...@@ -1378,14 +1373,14 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
if ( p->Iter && (pDp->D > Required[0] || pDn->D > Required[1]) ) if ( p->Iter && (pDp->D > Required[0] || pDn->D > Required[1]) )
{ {
printf( "%5d : ", iObj ); printf( "%5d : ", iObj );
printf( "Dp = %6.2f ", Nf_Wrd2Flt(pDp->D) ); printf( "Dp = %6.2f ", Scl_Flt2Int(pDp->D) );
printf( "Dn = %6.2f ", Nf_Wrd2Flt(pDn->D) ); printf( "Dn = %6.2f ", Scl_Flt2Int(pDn->D) );
printf( " " ); printf( " " );
printf( "Ap = %6.2f ", Nf_Wrd2Flt(pAp->D) ); printf( "Ap = %6.2f ", Scl_Flt2Int(pAp->D) );
printf( "An = %6.2f ", Nf_Wrd2Flt(pAn->D) ); printf( "An = %6.2f ", Scl_Flt2Int(pAn->D) );
printf( " " ); printf( " " );
printf( "Rp = %6.2f ", Nf_Wrd2Flt(Required[0]) ); printf( "Rp = %6.2f ", Scl_Flt2Int(Required[0]) );
printf( "Rn = %6.2f ", Nf_Wrd2Flt(Required[1]) ); printf( "Rn = %6.2f ", Scl_Flt2Int(Required[1]) );
printf( "\n" ); printf( "\n" );
} }
*/ */
...@@ -1427,38 +1422,38 @@ static inline Nf_Mat_t * Nf_ObjMatchBest( Nf_Man_t * p, int i, int c ) ...@@ -1427,38 +1422,38 @@ static inline Nf_Mat_t * Nf_ObjMatchBest( Nf_Man_t * p, int i, int c )
void Nf_ManSetOutputRequireds( Nf_Man_t * p, int fPropCompl ) void Nf_ManSetOutputRequireds( Nf_Man_t * p, int fPropCompl )
{ {
Gia_Obj_t * pObj; Gia_Obj_t * pObj;
word Required = 0, WordMapDelayOld = p->pPars->WordMapDelay; int Required = 0, MapDelayOld = p->pPars->MapDelay;
int fUseConMan = Scl_ConIsRunning() && Scl_ConHasOutReqs(); int fUseConMan = Scl_ConIsRunning() && Scl_ConHasOutReqs();
int i, iObj, fCompl, nLits = 2*Gia_ManObjNum(p->pGia); int i, iObj, fCompl, nLits = 2*Gia_ManObjNum(p->pGia);
Vec_WrdFill( &p->vRequired, nLits, NF_INFINITY ); Vec_IntFill( &p->vRequired, nLits, SCL_INFINITY );
// compute delay // compute delay
p->pPars->WordMapDelay = 0; p->pPars->MapDelay = 0;
Gia_ManForEachCo( p->pGia, pObj, i ) Gia_ManForEachCo( p->pGia, pObj, i )
{ {
Required = Nf_ObjMatchD( p, Gia_ObjFaninId0p(p->pGia, pObj), Gia_ObjFaninC0(pObj) )->D; Required = Nf_ObjMatchD( p, Gia_ObjFaninId0p(p->pGia, pObj), Gia_ObjFaninC0(pObj) )->D;
p->pPars->WordMapDelay = Abc_MaxWord( p->pPars->WordMapDelay, Required ); p->pPars->MapDelay = Abc_MaxInt( p->pPars->MapDelay, Required );
} }
if ( p->Iter && WordMapDelayOld < p->pPars->WordMapDelay && p->pGia->vOutReqs == NULL ) if ( p->Iter && MapDelayOld < p->pPars->MapDelay && p->pGia->vOutReqs == NULL )
printf( "******** Critical delay violation %.2f -> %.2f ********\n", Nf_Wrd2Flt(WordMapDelayOld), Nf_Wrd2Flt(p->pPars->WordMapDelay) ); printf( "******** Critical delay violation %.2f -> %.2f ********\n", Scl_Flt2Int(MapDelayOld), Scl_Flt2Int(p->pPars->MapDelay) );
p->pPars->WordMapDelay = Abc_MaxWord( p->pPars->WordMapDelay, WordMapDelayOld ); p->pPars->MapDelay = Abc_MaxInt( p->pPars->MapDelay, MapDelayOld );
// check delay target // check delay target
if ( p->pPars->WordMapDelayTarget == 0 && p->pPars->nRelaxRatio ) if ( p->pPars->MapDelayTarget == 0 && p->pPars->nRelaxRatio )
p->pPars->WordMapDelayTarget = p->pPars->WordMapDelay * (100 + p->pPars->nRelaxRatio) / 100; p->pPars->MapDelayTarget = p->pPars->MapDelay * (100 + p->pPars->nRelaxRatio) / 100;
if ( p->pPars->WordMapDelayTarget > 0 ) if ( p->pPars->MapDelayTarget > 0 )
{ {
if ( p->pPars->WordMapDelay < p->pPars->WordMapDelayTarget ) if ( p->pPars->MapDelay < p->pPars->MapDelayTarget )
p->pPars->WordMapDelay = p->pPars->WordMapDelayTarget; p->pPars->MapDelay = p->pPars->MapDelayTarget;
else if ( p->pPars->nRelaxRatio == 0 ) else if ( p->pPars->nRelaxRatio == 0 )
Abc_Print( 0, "Relaxing user-specified delay target from %.2f to %.2f.\n", Nf_Wrd2Flt(p->pPars->WordMapDelayTarget), Nf_Wrd2Flt(p->pPars->WordMapDelay) ); Abc_Print( 0, "Relaxing user-specified delay target from %.2f to %.2f.\n", Scl_Flt2Int(p->pPars->MapDelayTarget), Scl_Flt2Int(p->pPars->MapDelay) );
} }
//assert( p->pPars->WordMapDelayTarget == 0 ); //assert( p->pPars->MapDelayTarget == 0 );
// set required times // set required times
Gia_ManForEachCo( p->pGia, pObj, i ) Gia_ManForEachCo( p->pGia, pObj, i )
{ {
iObj = Gia_ObjFaninId0p(p->pGia, pObj); iObj = Gia_ObjFaninId0p(p->pGia, pObj);
fCompl = Gia_ObjFaninC0(pObj); fCompl = Gia_ObjFaninC0(pObj);
Required = Nf_ObjMatchD(p, iObj, fCompl)->D; Required = Nf_ObjMatchD(p, iObj, fCompl)->D;
Required = p->pPars->fDoAverage ? Required * (100 + p->pPars->nRelaxRatio) / 100 : p->pPars->WordMapDelay; Required = p->pPars->fDoAverage ? Required * (100 + p->pPars->nRelaxRatio) / 100 : p->pPars->MapDelay;
// if external required time can be achieved, use it // if external required time can be achieved, use it
if ( fUseConMan ) if ( fUseConMan )
{ {
...@@ -1467,8 +1462,8 @@ void Nf_ManSetOutputRequireds( Nf_Man_t * p, int fPropCompl ) ...@@ -1467,8 +1462,8 @@ void Nf_ManSetOutputRequireds( Nf_Man_t * p, int fPropCompl )
} }
else else
{ {
if ( p->pGia->vOutReqs && Vec_FltEntry(p->pGia->vOutReqs, i) > 0 && Required <= Nf_Flt2Wrd(Vec_FltEntry(p->pGia->vOutReqs, i)) ) if ( p->pGia->vOutReqs && Vec_FltEntry(p->pGia->vOutReqs, i) > 0 && Required <= Scl_Flt2Int(Vec_FltEntry(p->pGia->vOutReqs, i)) )
Required = Abc_MinWord( 2*Required, Nf_Flt2Wrd(Vec_FltEntry(p->pGia->vOutReqs, i)) ); Required = Abc_MinInt( 2*Required, Scl_Flt2Int(Vec_FltEntry(p->pGia->vOutReqs, i)) );
} }
// if external required cannot be achieved, set the earliest possible arrival time // if external required cannot be achieved, set the earliest possible arrival time
// else if ( p->pGia->vOutReqs && Vec_FltEntry(p->pGia->vOutReqs, i) > 0 && Required > Vec_FltEntry(p->pGia->vOutReqs, i) ) // else if ( p->pGia->vOutReqs && Vec_FltEntry(p->pGia->vOutReqs, i) > 0 && Required > Vec_FltEntry(p->pGia->vOutReqs, i) )
...@@ -1476,11 +1471,11 @@ void Nf_ManSetOutputRequireds( Nf_Man_t * p, int fPropCompl ) ...@@ -1476,11 +1471,11 @@ void Nf_ManSetOutputRequireds( Nf_Man_t * p, int fPropCompl )
// otherwise, set the global required time // otherwise, set the global required time
Nf_ObjUpdateRequired( p, iObj, fCompl, Required ); Nf_ObjUpdateRequired( p, iObj, fCompl, Required );
if ( fPropCompl && iObj > 0 && Nf_ObjMatchBest(p, iObj, fCompl)->fCompl ) if ( fPropCompl && iObj > 0 && Nf_ObjMatchBest(p, iObj, fCompl)->fCompl )
Nf_ObjUpdateRequired( p, iObj, !fCompl, Required - p->InvDelay ); Nf_ObjUpdateRequired( p, iObj, !fCompl, Required - p->InvDelayI );
//Nf_ObjMapRefInc( p, Gia_ObjFaninId0p(p->pGia, pObj), Gia_ObjFaninC0(pObj)); //Nf_ObjMapRefInc( p, Gia_ObjFaninId0p(p->pGia, pObj), Gia_ObjFaninC0(pObj));
} }
} }
void Nf_ManSetMapRefsGate( Nf_Man_t * p, int iObj, word Required, Nf_Mat_t * pM ) void Nf_ManSetMapRefsGate( Nf_Man_t * p, int iObj, int Required, Nf_Mat_t * pM )
{ {
int k, iVar, fCompl; int k, iVar, fCompl;
Mio_Cell2_t * pCell = Nf_ManCell( p, pM->Gate ); Mio_Cell2_t * pCell = Nf_ManCell( p, pM->Gate );
...@@ -1488,7 +1483,7 @@ void Nf_ManSetMapRefsGate( Nf_Man_t * p, int iObj, word Required, Nf_Mat_t * pM ...@@ -1488,7 +1483,7 @@ void Nf_ManSetMapRefsGate( Nf_Man_t * p, int iObj, word Required, Nf_Mat_t * pM
Nf_CutForEachVarCompl( pCut, pM->Cfg, iVar, fCompl, k ) Nf_CutForEachVarCompl( pCut, pM->Cfg, iVar, fCompl, k )
{ {
Nf_ObjMapRefInc( p, iVar, fCompl ); Nf_ObjMapRefInc( p, iVar, fCompl );
Nf_ObjUpdateRequired( p, iVar, fCompl, Required - pCell->Delays[k] ); Nf_ObjUpdateRequired( p, iVar, fCompl, Required - pCell->iDelays[k] );
} }
assert( Nf_CutSize(pCut) == (int)pCell->nFanins ); assert( Nf_CutSize(pCut) == (int)pCell->nFanins );
// update global stats // update global stats
...@@ -1510,11 +1505,11 @@ void Nf_ManPrintMatches( Nf_Man_t * p ) ...@@ -1510,11 +1505,11 @@ void Nf_ManPrintMatches( Nf_Man_t * p )
Nf_Mat_t * pAn = Nf_ObjMatchA( p, i, 1 ); Nf_Mat_t * pAn = Nf_ObjMatchA( p, i, 1 );
printf( "%5d : ", i ); printf( "%5d : ", i );
printf( "Dp = %6.2f ", Nf_Wrd2Flt(pDp->D) ); printf( "Dp = %6.2f ", Scl_Flt2Int(pDp->D) );
printf( "Dn = %6.2f ", Nf_Wrd2Flt(pDn->D) ); printf( "Dn = %6.2f ", Scl_Flt2Int(pDn->D) );
printf( " " ); printf( " " );
printf( "Ap = %6.2f ", Nf_Wrd2Flt(pAp->D) ); printf( "Ap = %6.2f ", Scl_Flt2Int(pAp->D) );
printf( "An = %6.2f ", Nf_Wrd2Flt(pAn->D) ); printf( "An = %6.2f ", Scl_Flt2Int(pAn->D) );
printf( " " ); printf( " " );
printf( "Dp = %8s ", Nf_ManCell(p, pDp->Gate)->pName ); printf( "Dp = %8s ", Nf_ManCell(p, pDp->Gate)->pName );
printf( "Dn = %8s ", Nf_ManCell(p, pDn->Gate)->pName ); printf( "Dn = %8s ", Nf_ManCell(p, pDn->Gate)->pName );
...@@ -1526,8 +1521,7 @@ void Nf_ManPrintMatches( Nf_Man_t * p ) ...@@ -1526,8 +1521,7 @@ void Nf_ManPrintMatches( Nf_Man_t * p )
} }
int Nf_ManSetMapRefs( Nf_Man_t * p ) int Nf_ManSetMapRefs( Nf_Man_t * p )
{ {
// float Coef = 1.0 / (1.0 + (p->Iter + 1) * (p->Iter + 1)); float Coef = 1.0 / (1.0 + (p->Iter + 1) * (p->Iter + 1));
float Coef = 0.25;
float * pFlowRefs = Vec_FltArray( &p->vFlowRefs ); float * pFlowRefs = Vec_FltArray( &p->vFlowRefs );
int * pMapRefs = Vec_IntArray( &p->vMapRefs ); int * pMapRefs = Vec_IntArray( &p->vMapRefs );
int nLits = 2*Gia_ManObjNum(p->pGia); int nLits = 2*Gia_ManObjNum(p->pGia);
...@@ -1535,7 +1529,7 @@ int Nf_ManSetMapRefs( Nf_Man_t * p ) ...@@ -1535,7 +1529,7 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
Gia_Obj_t * pObj; Gia_Obj_t * pObj;
Nf_Mat_t * pD, * pA, * pM; Nf_Mat_t * pD, * pA, * pM;
Nf_Mat_t * pDs[2], * pAs[2], * pMs[2]; Nf_Mat_t * pDs[2], * pAs[2], * pMs[2];
word Required = 0, Requireds[2]; int Required = 0, Requireds[2];
assert( !p->fUseEla ); assert( !p->fUseEla );
// if ( p->Iter == 0 ) // if ( p->Iter == 0 )
// Nf_ManPrintMatches( p ); // Nf_ManPrintMatches( p );
...@@ -1556,7 +1550,7 @@ int Nf_ManSetMapRefs( Nf_Man_t * p ) ...@@ -1556,7 +1550,7 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
if ( Nf_ObjMapRefNum(p, i, 1) ) if ( Nf_ObjMapRefNum(p, i, 1) )
{ {
Nf_ObjMapRefInc( p, i, 0 ); Nf_ObjMapRefInc( p, i, 0 );
Nf_ObjUpdateRequired( p, i, 0, Nf_ObjRequired(p, i, 1) - p->InvDelay ); Nf_ObjUpdateRequired( p, i, 0, Nf_ObjRequired(p, i, 1) - p->InvDelayI );
p->pPars->MapAreaF += p->InvAreaF; p->pPars->MapAreaF += p->InvAreaF;
p->pPars->Edge++; p->pPars->Edge++;
p->pPars->Area++; p->pPars->Area++;
...@@ -1579,7 +1573,7 @@ int Nf_ManSetMapRefs( Nf_Man_t * p ) ...@@ -1579,7 +1573,7 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
for ( c = 0; c < 2; c++ ) for ( c = 0; c < 2; c++ )
{ {
Requireds[c] = Nf_ObjRequired( p, i, c ); Requireds[c] = Nf_ObjRequired( p, i, c );
//assert( Requireds[c] < NF_INFINITY ); //assert( Requireds[c] < SCL_INFINITY );
pDs[c] = Nf_ObjMatchD( p, i, c ); pDs[c] = Nf_ObjMatchD( p, i, c );
pAs[c] = Nf_ObjMatchA( p, i, c ); pAs[c] = Nf_ObjMatchA( p, i, c );
pMs[c] = (pAs[c]->D <= Requireds[c]) ? pAs[c] : pDs[c]; pMs[c] = (pAs[c]->D <= Requireds[c]) ? pAs[c] : pDs[c];
...@@ -1613,10 +1607,10 @@ int Nf_ManSetMapRefs( Nf_Man_t * p ) ...@@ -1613,10 +1607,10 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
Required = Requireds[c]; Required = Requireds[c];
// update opposite phase // update opposite phase
Nf_ObjMapRefInc( p, i, !c ); Nf_ObjMapRefInc( p, i, !c );
Nf_ObjUpdateRequired( p, i, !c, Required - p->InvDelay ); Nf_ObjUpdateRequired( p, i, !c, Required - p->InvDelayI );
// select opposite phase // select opposite phase
Required = Nf_ObjRequired( p, i, !c ); Required = Nf_ObjRequired( p, i, !c );
//assert( Required < NF_INFINITY ); //assert( Required < SCL_INFINITY );
pD = Nf_ObjMatchD( p, i, !c ); pD = Nf_ObjMatchD( p, i, !c );
pA = Nf_ObjMatchA( p, i, !c ); pA = Nf_ObjMatchA( p, i, !c );
pM = (pA->D <= Required) ? pA : pD; pM = (pA->D <= Required) ? pA : pD;
...@@ -1636,7 +1630,7 @@ int Nf_ManSetMapRefs( Nf_Man_t * p ) ...@@ -1636,7 +1630,7 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
assert( nRefs[c] && !nRefs[!c] ); assert( nRefs[c] && !nRefs[!c] );
// consider this phase // consider this phase
Required = Nf_ObjRequired( p, i, c ); Required = Nf_ObjRequired( p, i, c );
//assert( Required < NF_INFINITY ); //assert( Required < SCL_INFINITY );
pD = Nf_ObjMatchD( p, i, c ); pD = Nf_ObjMatchD( p, i, c );
pA = Nf_ObjMatchA( p, i, c ); pA = Nf_ObjMatchA( p, i, c );
pM = (pA->D <= Required) ? pA : pD; pM = (pA->D <= Required) ? pA : pD;
...@@ -1647,10 +1641,10 @@ int Nf_ManSetMapRefs( Nf_Man_t * p ) ...@@ -1647,10 +1641,10 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
pM->fBest = 1; pM->fBest = 1;
// update opposite phase // update opposite phase
Nf_ObjMapRefInc( p, i, !c ); Nf_ObjMapRefInc( p, i, !c );
Nf_ObjUpdateRequired( p, i, !c, Required - p->InvDelay ); Nf_ObjUpdateRequired( p, i, !c, Required - p->InvDelayI );
// select opposite phase // select opposite phase
Required = Nf_ObjRequired( p, i, !c ); Required = Nf_ObjRequired( p, i, !c );
//assert( Required < NF_INFINITY ); //assert( Required < SCL_INFINITY );
pD = Nf_ObjMatchD( p, i, !c ); pD = Nf_ObjMatchD( p, i, !c );
pA = Nf_ObjMatchA( p, i, !c ); pA = Nf_ObjMatchA( p, i, !c );
pM = (pA->D <= Required) ? pA : pD; pM = (pA->D <= Required) ? pA : pD;
...@@ -1672,7 +1666,7 @@ int Nf_ManSetMapRefs( Nf_Man_t * p ) ...@@ -1672,7 +1666,7 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
if ( Nf_ObjMapRefNum(p, Id, 1) ) if ( Nf_ObjMapRefNum(p, Id, 1) )
{ {
Nf_ObjMapRefInc( p, Id, 0 ); Nf_ObjMapRefInc( p, Id, 0 );
Nf_ObjUpdateRequired( p, Id, 0, Required - p->InvDelay ); Nf_ObjUpdateRequired( p, Id, 0, Required - p->InvDelayI );
p->pPars->MapAreaF += p->InvAreaF; p->pPars->MapAreaF += p->InvAreaF;
p->pPars->Edge++; p->pPars->Edge++;
p->pPars->Area++; p->pPars->Area++;
...@@ -1721,15 +1715,16 @@ word Nf_MatchDeref_rec( Nf_Man_t * p, int i, int c, Nf_Mat_t * pM ) ...@@ -1721,15 +1715,16 @@ word Nf_MatchDeref_rec( Nf_Man_t * p, int i, int c, Nf_Mat_t * pM )
} }
return Area + Nf_ManCell(p, pM->Gate)->AreaW; return Area + Nf_ManCell(p, pM->Gate)->AreaW;
} }
word Nf_MatchRef_rec( Nf_Man_t * p, int i, int c, Nf_Mat_t * pM, word Required, Vec_Int_t * vBackup ) word Nf_MatchRef_rec( Nf_Man_t * p, int i, int c, Nf_Mat_t * pM, int Required, Vec_Int_t * vBackup )
{ {
word Area = 0, ReqFanin; word Area = 0;
int ReqFanin;
int k, iVar, fCompl, * pCut; int k, iVar, fCompl, * pCut;
assert( pM->fBest ); assert( pM->fBest );
assert( pM->D <= Required ); assert( pM->D <= Required );
if ( pM->fCompl ) if ( pM->fCompl )
{ {
ReqFanin = Required - p->InvDelay; ReqFanin = Required - p->InvDelayI;
if ( vBackup ) if ( vBackup )
Vec_IntPush( vBackup, Abc_Var2Lit(i, !c) ); Vec_IntPush( vBackup, Abc_Var2Lit(i, !c) );
assert( Nf_ObjMapRefNum(p, i, !c) >= 0 ); assert( Nf_ObjMapRefNum(p, i, !c) >= 0 );
...@@ -1742,7 +1737,7 @@ word Nf_MatchRef_rec( Nf_Man_t * p, int i, int c, Nf_Mat_t * pM, word Required, ...@@ -1742,7 +1737,7 @@ word Nf_MatchRef_rec( Nf_Man_t * p, int i, int c, Nf_Mat_t * pM, word Required,
pCut = Nf_CutFromHandle( Nf_ObjCutSet(p, i), pM->CutH ); pCut = Nf_CutFromHandle( Nf_ObjCutSet(p, i), pM->CutH );
Nf_CutForEachVarCompl( pCut, pM->Cfg, iVar, fCompl, k ) Nf_CutForEachVarCompl( pCut, pM->Cfg, iVar, fCompl, k )
{ {
ReqFanin = Required - Nf_ManCell(p, pM->Gate)->Delays[k]; ReqFanin = Required - Nf_ManCell(p, pM->Gate)->iDelays[k];
if ( vBackup ) if ( vBackup )
Vec_IntPush( vBackup, Abc_Var2Lit(iVar, fCompl) ); Vec_IntPush( vBackup, Abc_Var2Lit(iVar, fCompl) );
assert( Nf_ObjMapRefNum(p, iVar, fCompl) >= 0 ); assert( Nf_ObjMapRefNum(p, iVar, fCompl) >= 0 );
...@@ -1751,7 +1746,7 @@ word Nf_MatchRef_rec( Nf_Man_t * p, int i, int c, Nf_Mat_t * pM, word Required, ...@@ -1751,7 +1746,7 @@ word Nf_MatchRef_rec( Nf_Man_t * p, int i, int c, Nf_Mat_t * pM, word Required,
} }
return Area + Nf_ManCell(p, pM->Gate)->AreaW; return Area + Nf_ManCell(p, pM->Gate)->AreaW;
} }
word Nf_MatchRefArea( Nf_Man_t * p, int i, int c, Nf_Mat_t * pM, word Required ) word Nf_MatchRefArea( Nf_Man_t * p, int i, int c, Nf_Mat_t * pM, int Required )
{ {
word Area; int iLit, k; word Area; int iLit, k;
Vec_IntClear( &p->vBackup ); Vec_IntClear( &p->vBackup );
...@@ -1763,7 +1758,7 @@ word Nf_MatchRefArea( Nf_Man_t * p, int i, int c, Nf_Mat_t * pM, word Required ) ...@@ -1763,7 +1758,7 @@ word Nf_MatchRefArea( Nf_Man_t * p, int i, int c, Nf_Mat_t * pM, word Required )
} }
return Area; return Area;
} }
void Nf_ManElaBestMatchOne( Nf_Man_t * p, int iObj, int c, int * pCut, int * pCutSet, Nf_Mat_t * pRes, word Required ) void Nf_ManElaBestMatchOne( Nf_Man_t * p, int iObj, int c, int * pCut, int * pCutSet, Nf_Mat_t * pRes, int Required )
{ {
Nf_Mat_t Mb,*pMb = &Mb, * pMd; Nf_Mat_t Mb,*pMb = &Mb, * pMd;
int * pFans = Nf_CutLeaves(pCut); int * pFans = Nf_CutLeaves(pCut);
...@@ -1778,7 +1773,7 @@ void Nf_ManElaBestMatchOne( Nf_Man_t * p, int iObj, int c, int * pCut, int * pCu ...@@ -1778,7 +1773,7 @@ void Nf_ManElaBestMatchOne( Nf_Man_t * p, int iObj, int c, int * pCut, int * pCu
pBestF[i] = Nf_ManObj( p, pFans[i] ); pBestF[i] = Nf_ManObj( p, pFans[i] );
// consider matches of this function // consider matches of this function
memset( pMb, 0, sizeof(Nf_Mat_t) ); memset( pMb, 0, sizeof(Nf_Mat_t) );
pMb->D = NF_INFINITY; pMb->F = FLT_MAX; pMb->D = SCL_INFINITY; pMb->F = FLT_MAX;
// special cases // special cases
if ( nFans == 0 ) if ( nFans == 0 )
{ {
...@@ -1803,7 +1798,7 @@ void Nf_ManElaBestMatchOne( Nf_Man_t * p, int iObj, int c, int * pCut, int * pCu ...@@ -1803,7 +1798,7 @@ void Nf_ManElaBestMatchOne( Nf_Man_t * p, int iObj, int c, int * pCut, int * pCu
Nf_Cfg_t Cfg = Nf_Int2Cfg(Offset); Nf_Cfg_t Cfg = Nf_Int2Cfg(Offset);
Mio_Cell2_t*pC = Nf_ManCell( p, Info ); Mio_Cell2_t*pC = Nf_ManCell( p, Info );
int fCompl = Cfg.fCompl ^ fComplExt; int fCompl = Cfg.fCompl ^ fComplExt;
word Delay = 0; int Delay = 0;
assert( nFans == (int)pC->nFanins ); assert( nFans == (int)pC->nFanins );
if ( fCompl != c ) if ( fCompl != c )
continue; continue;
...@@ -1811,7 +1806,7 @@ void Nf_ManElaBestMatchOne( Nf_Man_t * p, int iObj, int c, int * pCut, int * pCu ...@@ -1811,7 +1806,7 @@ void Nf_ManElaBestMatchOne( Nf_Man_t * p, int iObj, int c, int * pCut, int * pCu
{ {
pMd = &pBestF[iFanin]->M[fComplF][0]; pMd = &pBestF[iFanin]->M[fComplF][0];
assert( pMd->fBest ); assert( pMd->fBest );
Delay = Abc_MaxWord( Delay, pMd->D + pC->Delays[k] ); Delay = Abc_MaxInt( Delay, pMd->D + pC->iDelays[k] );
if ( Delay > Required ) if ( Delay > Required )
break; break;
} }
...@@ -1833,11 +1828,11 @@ void Nf_ManElaBestMatchOne( Nf_Man_t * p, int iObj, int c, int * pCut, int * pCu ...@@ -1833,11 +1828,11 @@ void Nf_ManElaBestMatchOne( Nf_Man_t * p, int iObj, int c, int * pCut, int * pCu
*pRes = *pMb; *pRes = *pMb;
} }
} }
void Nf_ManElaBestMatch( Nf_Man_t * p, int iObj, int c, Nf_Mat_t * pRes, word Required ) void Nf_ManElaBestMatch( Nf_Man_t * p, int iObj, int c, Nf_Mat_t * pRes, int Required )
{ {
int k, * pCut, * pCutSet = Nf_ObjCutSet( p, iObj ); int k, * pCut, * pCutSet = Nf_ObjCutSet( p, iObj );
memset( pRes, 0, sizeof(Nf_Mat_t) ); memset( pRes, 0, sizeof(Nf_Mat_t) );
pRes->D = NF_INFINITY; pRes->F = FLT_MAX; pRes->D = SCL_INFINITY; pRes->F = FLT_MAX;
Nf_SetForEachCut( pCutSet, pCut, k ) Nf_SetForEachCut( pCutSet, pCut, k )
{ {
if ( Abc_Lit2Var(Nf_CutFunc(pCut)) >= Vec_WecSize(p->vTt2Match) ) if ( Abc_Lit2Var(Nf_CutFunc(pCut)) >= Vec_WecSize(p->vTt2Match) )
...@@ -1845,9 +1840,9 @@ void Nf_ManElaBestMatch( Nf_Man_t * p, int iObj, int c, Nf_Mat_t * pRes, word Re ...@@ -1845,9 +1840,9 @@ void Nf_ManElaBestMatch( Nf_Man_t * p, int iObj, int c, Nf_Mat_t * pRes, word Re
Nf_ManElaBestMatchOne( p, iObj, c, pCut, pCutSet, pRes, Required ); Nf_ManElaBestMatchOne( p, iObj, c, pCut, pCutSet, pRes, Required );
} }
} }
word Nf_ManComputeArrival( Nf_Man_t * p, Nf_Mat_t * pM, int * pCutSet ) int Nf_ManComputeArrival( Nf_Man_t * p, Nf_Mat_t * pM, int * pCutSet )
{ {
word Delay = 0; int Delay = 0;
Nf_Mat_t * pMfan; Nf_Mat_t * pMfan;
int iVar, fCompl, k; int iVar, fCompl, k;
Mio_Cell2_t * pCell = Nf_ManCell( p, pM->Gate ); Mio_Cell2_t * pCell = Nf_ManCell( p, pM->Gate );
...@@ -1856,16 +1851,16 @@ word Nf_ManComputeArrival( Nf_Man_t * p, Nf_Mat_t * pM, int * pCutSet ) ...@@ -1856,16 +1851,16 @@ word Nf_ManComputeArrival( Nf_Man_t * p, Nf_Mat_t * pM, int * pCutSet )
Nf_CutForEachVarCompl( pCut, pM->Cfg, iVar, fCompl, k ) Nf_CutForEachVarCompl( pCut, pM->Cfg, iVar, fCompl, k )
{ {
pMfan = Nf_ObjMatchBest( p, iVar, fCompl ); pMfan = Nf_ObjMatchBest( p, iVar, fCompl );
Delay = Abc_MaxWord( Delay, pMfan->D + pCell->Delays[k] ); Delay = Abc_MaxInt( Delay, pMfan->D + pCell->iDelays[k] );
} }
//if ( pM->fCompl ) Delay += p->InvDelay; //if ( pM->fCompl ) Delay += p->InvDelayI;
return Delay; return Delay;
} }
void Nf_ManResetMatches( Nf_Man_t * p, int Round ) void Nf_ManResetMatches( Nf_Man_t * p, int Round )
{ {
Gia_Obj_t * pObj; Gia_Obj_t * pObj;
Nf_Mat_t * pDc, * pAc, * pMfan, * pM[2]; Nf_Mat_t * pDc, * pAc, * pMfan, * pM[2];
word Arrival; int i, c; int i, c, Arrival;
// go through matches in the topo order // go through matches in the topo order
Gia_ManForEachAnd( p->pGia, pObj, i ) Gia_ManForEachAnd( p->pGia, pObj, i )
{ {
...@@ -1877,7 +1872,7 @@ void Nf_ManResetMatches( Nf_Man_t * p, int Round ) ...@@ -1877,7 +1872,7 @@ void Nf_ManResetMatches( Nf_Man_t * p, int Round )
pDc = Nf_ObjMatchD( p, i, c ); pDc = Nf_ObjMatchD( p, i, c );
pAc = Nf_ObjMatchA( p, i, c ); pAc = Nf_ObjMatchA( p, i, c );
pDc->F = pAc->F = 0; pDc->F = pAc->F = 0;
pDc->D = pMfan->D + (c ? p->InvDelay : 0); pDc->D = pMfan->D + (c ? p->InvDelayI : 0);
assert( pDc->fBest ); assert( pDc->fBest );
assert( !pAc->fBest ); assert( !pAc->fBest );
assert( c==0 || pDc->fCompl ); assert( c==0 || pDc->fCompl );
...@@ -1941,7 +1936,7 @@ void Nf_ManResetMatches( Nf_Man_t * p, int Round ) ...@@ -1941,7 +1936,7 @@ void Nf_ManResetMatches( Nf_Man_t * p, int Round )
// consider complemented match // consider complemented match
Arrival = pM[!c]->D; Arrival = pM[!c]->D;
*pM[!c] = *pM[c]; *pM[!c] = *pM[c];
pM[!c]->D += p->InvDelay; pM[!c]->D += p->InvDelayI;
pM[!c]->fCompl = 1; pM[!c]->fCompl = 1;
//if ( Nf_ObjMapRefNum(p, i, !c) ) //if ( Nf_ObjMapRefNum(p, i, !c) )
// assert( Round || pM[!c]->D <= Arrival ); // assert( Round || pM[!c]->D <= Arrival );
...@@ -1954,8 +1949,9 @@ void Nf_ManComputeMappingEla( Nf_Man_t * p ) ...@@ -1954,8 +1949,9 @@ void Nf_ManComputeMappingEla( Nf_Man_t * p )
Gia_Obj_t * pObj; Gia_Obj_t * pObj;
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, Required, Gain = 0; word AreaBef, AreaAft, Gain = 0;
int i, c, iVar, Id, fCompl, k, * pCut; int i, c, iVar, Id, fCompl, k, * pCut;
int Required;
Nf_ManSetOutputRequireds( p, 1 ); Nf_ManSetOutputRequireds( p, 1 );
Nf_ManResetMatches( p, p->Iter - p->pPars->nRounds ); Nf_ManResetMatches( p, p->Iter - p->pPars->nRounds );
Gia_ManForEachAndReverse( p->pGia, pObj, i ) Gia_ManForEachAndReverse( p->pGia, pObj, i )
...@@ -1963,7 +1959,7 @@ void Nf_ManComputeMappingEla( Nf_Man_t * p ) ...@@ -1963,7 +1959,7 @@ void Nf_ManComputeMappingEla( Nf_Man_t * p )
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->InvDelay ); 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) ); Nf_ObjUpdateRequired( p, Gia_ObjFaninId0(pObj, i), Gia_ObjFaninC0(pObj), Nf_ObjRequired(p, i, 0) );
continue; continue;
} }
...@@ -1988,10 +1984,10 @@ void Nf_ManComputeMappingEla( Nf_Man_t * p ) ...@@ -1988,10 +1984,10 @@ void Nf_ManComputeMappingEla( Nf_Man_t * p )
printf( "%4d (%d) ", i, c ); printf( "%4d (%d) ", i, c );
printf( "%8s ->%8s ", Nf_ManCell(p, pM->Gate)->pName, Nf_ManCell(p, pMb->Gate)->pName ); printf( "%8s ->%8s ", Nf_ManCell(p, pM->Gate)->pName, Nf_ManCell(p, pMb->Gate)->pName );
printf( "%d -> %d ", Nf_ManCell(p, pM->Gate)->nFanins, Nf_ManCell(p, pMb->Gate)->nFanins ); printf( "%d -> %d ", Nf_ManCell(p, pM->Gate)->nFanins, Nf_ManCell(p, pMb->Gate)->nFanins );
printf( "D: %7.2f -> %7.2f ", Nf_Wrd2Flt(pM->D), Nf_Wrd2Flt(pMb->D) ); printf( "D: %7.2f -> %7.2f ", Scl_Flt2Int(pM->D), Scl_Flt2Int(pMb->D) );
printf( "R: %7.2f ", Required == NF_INFINITY ? 9999.99 : Nf_Wrd2Flt(Required) ); printf( "R: %7.2f ", Required == SCL_INFINITY ? 9999.99 : Scl_Flt2Int(Required) );
printf( "A: %7.2f -> %7.2f ", Nf_Wrd2Flt(AreaBef), Nf_Wrd2Flt(AreaAft) ); printf( "A: %7.2f -> %7.2f ", MIO_NUMINV * (ABC_INT64_T)AreaBef, MIO_NUMINV * (ABC_INT64_T)AreaAft );
printf( "G: %7.2f (%7.2f) ", AreaBef >= AreaAft ? Nf_Wrd2Flt(AreaBef - AreaAft) : -Nf_Wrd2Flt(AreaAft - AreaBef), Nf_Wrd2Flt(Gain) ); printf( "G: %7.2f (%7.2f) ", AreaBef >= AreaAft ? MIO_NUMINV * (ABC_INT64_T)(AreaBef - AreaAft) : -MIO_NUMINV * (ABC_INT64_T)(AreaAft - AreaBef), MIO_NUMINV * (ABC_INT64_T)(Gain) );
printf( "\n" ); printf( "\n" );
} }
// set best match // set best match
...@@ -2006,13 +2002,13 @@ void Nf_ManComputeMappingEla( Nf_Man_t * p ) ...@@ -2006,13 +2002,13 @@ void Nf_ManComputeMappingEla( Nf_Man_t * p )
Nf_CutForEachVarCompl( pCut, pMb->Cfg, iVar, fCompl, k ) Nf_CutForEachVarCompl( pCut, pMb->Cfg, iVar, fCompl, k )
{ {
pM = Nf_ObjMatchBest( p, iVar, fCompl ); pM = Nf_ObjMatchBest( p, iVar, fCompl );
assert( pM->D <= Required - pCell->Delays[k] ); assert( pM->D <= Required - pCell->iDelays[k] );
Nf_ObjUpdateRequired( p, iVar, fCompl, Required - pCell->Delays[k] ); Nf_ObjUpdateRequired( p, iVar, fCompl, Required - pCell->iDelays[k] );
if ( pM->fCompl ) if ( pM->fCompl )
{ {
pM = Nf_ObjMatchBest( p, iVar, !fCompl ); pM = Nf_ObjMatchBest( p, iVar, !fCompl );
assert( pM->D <= Required - pCell->Delays[k] - p->InvDelay ); assert( pM->D <= Required - pCell->iDelays[k] - p->InvDelayI );
Nf_ObjUpdateRequired( p, iVar, !fCompl, Required - pCell->Delays[k] - p->InvDelay ); Nf_ObjUpdateRequired( p, iVar, !fCompl, Required - pCell->iDelays[k] - p->InvDelayI );
} }
} }
} }
...@@ -2021,7 +2017,7 @@ void Nf_ManComputeMappingEla( Nf_Man_t * p ) ...@@ -2021,7 +2017,7 @@ void Nf_ManComputeMappingEla( Nf_Man_t * p )
if ( Nf_ObjMapRefNum(p, Id, 1) ) if ( Nf_ObjMapRefNum(p, Id, 1) )
{ {
Required = Nf_ObjRequired( p, i, 1 ); Required = Nf_ObjRequired( p, i, 1 );
Nf_ObjUpdateRequired( p, Id, 0, Required - p->InvDelay ); Nf_ObjUpdateRequired( p, Id, 0, Required - p->InvDelayI );
} }
} }
...@@ -2172,7 +2168,7 @@ void Nf_ManSetDefaultPars( Jf_Par_t * pPars ) ...@@ -2172,7 +2168,7 @@ void Nf_ManSetDefaultPars( Jf_Par_t * pPars )
pPars->fVeryVerbose = 0; pPars->fVeryVerbose = 0;
pPars->nLutSizeMax = NF_LEAF_MAX; pPars->nLutSizeMax = NF_LEAF_MAX;
pPars->nCutNumMax = NF_CUT_MAX; pPars->nCutNumMax = NF_CUT_MAX;
pPars->WordMapDelayTarget = 0; pPars->MapDelayTarget = 0;
} }
Gia_Man_t * Nf_ManPerformMapping( Gia_Man_t * pGia, Jf_Par_t * pPars ) Gia_Man_t * Nf_ManPerformMapping( Gia_Man_t * pGia, Jf_Par_t * pPars )
{ {
...@@ -2200,7 +2196,8 @@ Gia_Man_t * Nf_ManPerformMapping( Gia_Man_t * pGia, Jf_Par_t * pPars ) ...@@ -2200,7 +2196,8 @@ Gia_Man_t * Nf_ManPerformMapping( Gia_Man_t * pGia, Jf_Par_t * pPars )
else else
{ {
Gia_ManForEachCiId( p->pGia, Id, i ) Gia_ManForEachCiId( p->pGia, Id, i )
Nf_ObjPrepareCi( p, Id, Nf_Flt2Wrd(p->pGia->vInArrs ? Abc_MaxFloat(0.0, Vec_FltEntry(p->pGia->vInArrs, i)) : 0.0) ); // Nf_ObjPrepareCi( p, Id, Scl_Flt2Int(p->pGia->vInArrs ? Abc_MaxFloat(0.0, Vec_FltEntry(p->pGia->vInArrs, i)) : 0.0) );
Nf_ObjPrepareCi( p, Id, Scl_Flt2Int(p->pGia->vInArrs ? Vec_FltEntry(p->pGia->vInArrs, i) : 0.0) );
} }
for ( p->Iter = 0; p->Iter < p->pPars->nRounds; p->Iter++ ) for ( p->Iter = 0; p->Iter < p->pPars->nRounds; p->Iter++ )
{ {
......
...@@ -65,8 +65,8 @@ struct Mio_Cell2_t_ ...@@ -65,8 +65,8 @@ struct Mio_Cell2_t_
float AreaF; // area float AreaF; // area
word AreaW; // area word AreaW; // area
word uTruth; // truth table word uTruth; // truth table
word DelayAve; // average delay int iDelayAve; // average delay
word Delays[6]; // delay int iDelays[6]; // delay
void * pMioGate; // gate pointer void * pMioGate; // gate pointer
}; };
......
...@@ -635,9 +635,9 @@ static inline int Mio_CompareTwo2( Mio_Cell2_t * pCell1, Mio_Cell2_t * pCell2 ) ...@@ -635,9 +635,9 @@ static inline int Mio_CompareTwo2( Mio_Cell2_t * pCell1, Mio_Cell2_t * pCell2 )
if ( pCell1->AreaW < pCell2->AreaW ) if ( pCell1->AreaW < pCell2->AreaW )
return 0; return 0;
// compare delays // compare delays
if ( pCell1->DelayAve > pCell2->DelayAve ) if ( pCell1->iDelayAve > pCell2->iDelayAve )
return 1; return 1;
if ( pCell1->DelayAve < pCell2->DelayAve ) if ( pCell1->iDelayAve < pCell2->iDelayAve )
return 0; return 0;
// compare names // compare names
Comp = strcmp( pCell1->pName, pCell2->pName ); Comp = strcmp( pCell1->pName, pCell2->pName );
...@@ -658,14 +658,14 @@ static inline void Mio_CollectCopy2( Mio_Cell2_t * pCell, Mio_Gate_t * pGate ) ...@@ -658,14 +658,14 @@ static inline void Mio_CollectCopy2( Mio_Cell2_t * pCell, Mio_Gate_t * pGate )
pCell->AreaW = (word)(MIO_NUM * pGate->dArea); pCell->AreaW = (word)(MIO_NUM * pGate->dArea);
pCell->nFanins = pGate->nInputs; pCell->nFanins = pGate->nInputs;
pCell->pMioGate = pGate; pCell->pMioGate = pGate;
pCell->DelayAve = 0; pCell->iDelayAve = 0;
for ( k = 0, pPin = pGate->pPins; pPin; pPin = pPin->pNext, k++ ) for ( k = 0, pPin = pGate->pPins; pPin; pPin = pPin->pNext, k++ )
{ {
pCell->Delays[k] = (word)(MIO_NUM/2 * pPin->dDelayBlockRise + MIO_NUM/2 * pPin->dDelayBlockFall); pCell->iDelays[k] = (int)(MIO_NUM/2 * pPin->dDelayBlockRise + MIO_NUM/2 * pPin->dDelayBlockFall);
pCell->DelayAve += pCell->Delays[k]; pCell->iDelayAve += pCell->iDelays[k];
} }
if ( pCell->nFanins ) if ( pCell->nFanins )
pCell->DelayAve /= pCell->nFanins; pCell->iDelayAve /= pCell->nFanins;
} }
Mio_Cell2_t * Mio_CollectRootsNew2( Mio_Library_t * pLib, int nInputs, int * pnGates, int fVerbose ) Mio_Cell2_t * Mio_CollectRootsNew2( Mio_Library_t * pLib, int nInputs, int * pnGates, int fVerbose )
...@@ -758,7 +758,7 @@ Mio_Cell2_t * Mio_CollectRootsNew2( Mio_Library_t * pLib, int nInputs, int * pnG ...@@ -758,7 +758,7 @@ Mio_Cell2_t * Mio_CollectRootsNew2( Mio_Library_t * pLib, int nInputs, int * pnG
printf( "None\n" ); printf( "None\n" );
else else
printf( "%-20s In = %d N = %3d A = %12.6f D = %12.6f\n", printf( "%-20s In = %d N = %3d A = %12.6f D = %12.6f\n",
pCell->pName, pCell->nFanins, pCounts[i], pCell->AreaF, MIO_NUMINV*(unsigned)pCell->DelayAve ); pCell->pName, pCell->nFanins, pCounts[i], pCell->AreaF, MIO_NUMINV*pCell->iDelayAve );
} }
ABC_FREE( pCounts ); ABC_FREE( pCounts );
} }
......
...@@ -33,18 +33,18 @@ struct Scl_Con_t_ ...@@ -33,18 +33,18 @@ struct Scl_Con_t_
char * pFileName; // constraint file name char * pFileName; // constraint file name
char * pModelName; // current design name char * pModelName; // current design name
char * pInCellDef; // default input driving gate char * pInCellDef; // default input driving gate
word tInArrDef; // default input arrival time int tInArrDef; // default input arrival time
word tInSlewDef; // default input slew int tInSlewDef; // default input slew
word tInLoadDef; // default input load int tInLoadDef; // default input load
word tOutReqDef; // default output required time int tOutReqDef; // default output required time
word tOutLoadDef; // default output load int tOutLoadDef; // default output load
Vec_Ptr_t vInCells; // input driving gate names Vec_Ptr_t vInCells; // input driving gate names
Vec_Ptr_t vInCellsPtr; // input driving gates Vec_Ptr_t vInCellsPtr; // input driving gates
Vec_Wrd_t vInArrs; // input arrival times Vec_Int_t vInArrs; // input arrival times
Vec_Wrd_t vInSlews; // input slews Vec_Int_t vInSlews; // input slews
Vec_Wrd_t vInLoads; // input loads Vec_Int_t vInLoads; // input loads
Vec_Wrd_t vOutReqs; // output required times Vec_Int_t vOutReqs; // output required times
Vec_Wrd_t vOutLoads; // output loads Vec_Int_t vOutLoads; // output loads
Abc_Nam_t * pNamI; // input names Abc_Nam_t * pNamI; // input names
Abc_Nam_t * pNamO; // output names Abc_Nam_t * pNamO; // output names
}; };
...@@ -61,10 +61,10 @@ struct Scl_Con_t_ ...@@ -61,10 +61,10 @@ struct Scl_Con_t_
#define SCL_NUM 1000 #define SCL_NUM 1000
#define SCL_NUMINV 0.001 #define SCL_NUMINV 0.001
#define SCL_INFINITY (~(word)0) #define SCL_INFINITY (0x3FFFFFFF)
static inline word Scl_Flt2Wrd( float w ) { return SCL_NUM*w; } static inline int Scl_Flt2Int( float w ) { return SCL_NUM*w; }
static inline float Scl_Wrd2Flt( word w ) { return SCL_NUMINV*(unsigned)(w&0x3FFFFFFF) + SCL_NUMINV*(1<<30)*(unsigned)(w>>30); } static inline float Scl_Int2Flt( int i ) { return SCL_NUMINV*i; }
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS /// /// FUNCTION DEFINITIONS ///
...@@ -95,11 +95,11 @@ static inline Scl_Con_t * Scl_ConAlloc( char * pFileName, Abc_Nam_t * pNamI, Abc ...@@ -95,11 +95,11 @@ static inline Scl_Con_t * Scl_ConAlloc( char * pFileName, Abc_Nam_t * pNamI, Abc
p->tOutReqDef = SCL_INFINITY; p->tOutReqDef = SCL_INFINITY;
p->tOutLoadDef = SCL_INFINITY; p->tOutLoadDef = SCL_INFINITY;
Vec_PtrFill( &p->vInCells, Abc_NamObjNumMax(pNamI)-1, NULL ); Vec_PtrFill( &p->vInCells, Abc_NamObjNumMax(pNamI)-1, NULL );
Vec_WrdFill( &p->vInArrs, Abc_NamObjNumMax(pNamI)-1, SCL_INFINITY ); Vec_IntFill( &p->vInArrs, Abc_NamObjNumMax(pNamI)-1, SCL_INFINITY );
Vec_WrdFill( &p->vInSlews, Abc_NamObjNumMax(pNamI)-1, SCL_INFINITY ); Vec_IntFill( &p->vInSlews, Abc_NamObjNumMax(pNamI)-1, SCL_INFINITY );
Vec_WrdFill( &p->vInLoads, Abc_NamObjNumMax(pNamI)-1, SCL_INFINITY ); Vec_IntFill( &p->vInLoads, Abc_NamObjNumMax(pNamI)-1, SCL_INFINITY );
Vec_WrdFill( &p->vOutReqs, Abc_NamObjNumMax(pNamO)-1, SCL_INFINITY ); Vec_IntFill( &p->vOutReqs, Abc_NamObjNumMax(pNamO)-1, SCL_INFINITY );
Vec_WrdFill( &p->vOutLoads, Abc_NamObjNumMax(pNamO)-1, SCL_INFINITY ); Vec_IntFill( &p->vOutLoads, Abc_NamObjNumMax(pNamO)-1, SCL_INFINITY );
return p; return p;
} }
static inline void Scl_ConFree( Scl_Con_t * p ) static inline void Scl_ConFree( Scl_Con_t * p )
...@@ -107,11 +107,11 @@ static inline void Scl_ConFree( Scl_Con_t * p ) ...@@ -107,11 +107,11 @@ static inline void Scl_ConFree( Scl_Con_t * p )
Vec_PtrErase( &p->vInCellsPtr ); Vec_PtrErase( &p->vInCellsPtr );
Vec_PtrFreeData( &p->vInCells ); Vec_PtrFreeData( &p->vInCells );
Vec_PtrErase( &p->vInCells ); Vec_PtrErase( &p->vInCells );
Vec_WrdErase( &p->vInArrs ); Vec_IntErase( &p->vInArrs );
Vec_WrdErase( &p->vInSlews ); Vec_IntErase( &p->vInSlews );
Vec_WrdErase( &p->vInLoads ); Vec_IntErase( &p->vInLoads );
Vec_WrdErase( &p->vOutReqs ); Vec_IntErase( &p->vOutReqs );
Vec_WrdErase( &p->vOutLoads ); Vec_IntErase( &p->vOutLoads );
Abc_NamDeref( p->pNamI ); Abc_NamDeref( p->pNamI );
Abc_NamDeref( p->pNamO ); Abc_NamDeref( p->pNamO );
ABC_FREE( p->pInCellDef ); ABC_FREE( p->pInCellDef );
...@@ -136,7 +136,7 @@ static inline int Scl_ConParse( Scl_Con_t * p, Abc_Nam_t * pNamI, Abc_Nam_t * pN ...@@ -136,7 +136,7 @@ static inline int Scl_ConParse( Scl_Con_t * p, Abc_Nam_t * pNamI, Abc_Nam_t * pN
{ {
char Buffer[1000]; char Buffer[1000];
char * pToken, * pToken2, * pToken3, * pName; char * pToken, * pToken2, * pToken3, * pName;
int i, Num = -1, nLines = 0; word Value; int i, Num = -1, nLines = 0; int Value;
FILE * pFile = fopen( p->pFileName, "rb" ); FILE * pFile = fopen( p->pFileName, "rb" );
while ( fgets( Buffer, 1000, pFile ) ) while ( fgets( Buffer, 1000, pFile ) )
{ {
...@@ -153,18 +153,18 @@ static inline int Scl_ConParse( Scl_Con_t * p, Abc_Nam_t * pNamI, Abc_Nam_t * pN ...@@ -153,18 +153,18 @@ static inline int Scl_ConParse( Scl_Con_t * p, Abc_Nam_t * pNamI, Abc_Nam_t * pN
pToken3 = strtok( NULL, " \t\r\n" ); pToken3 = strtok( NULL, " \t\r\n" );
if ( !strcmp(pToken, ".model") ) p->pModelName = Abc_UtilStrsav(pToken2); if ( !strcmp(pToken, ".model") ) p->pModelName = Abc_UtilStrsav(pToken2);
else if ( !strcmp(pToken, SCL_DEF_DIRECTIVE(SCL_INPUT_CELL)) ) p->pInCellDef = Abc_UtilStrsav(pToken2); else if ( !strcmp(pToken, SCL_DEF_DIRECTIVE(SCL_INPUT_CELL)) ) p->pInCellDef = Abc_UtilStrsav(pToken2);
else if ( !strcmp(pToken, SCL_DEF_DIRECTIVE(SCL_INPUT_ARR)) ) p->tInArrDef = Scl_Flt2Wrd(atof(pToken2)); else if ( !strcmp(pToken, SCL_DEF_DIRECTIVE(SCL_INPUT_ARR)) ) p->tInArrDef = Scl_Flt2Int(atof(pToken2));
else if ( !strcmp(pToken, SCL_DEF_DIRECTIVE(SCL_INPUT_SLEW)) ) p->tInSlewDef = Scl_Flt2Wrd(atof(pToken2)); else if ( !strcmp(pToken, SCL_DEF_DIRECTIVE(SCL_INPUT_SLEW)) ) p->tInSlewDef = Scl_Flt2Int(atof(pToken2));
else if ( !strcmp(pToken, SCL_DEF_DIRECTIVE(SCL_INPUT_LOAD)) ) p->tInLoadDef = Scl_Flt2Wrd(atof(pToken2)); else if ( !strcmp(pToken, SCL_DEF_DIRECTIVE(SCL_INPUT_LOAD)) ) p->tInLoadDef = Scl_Flt2Int(atof(pToken2));
else if ( !strcmp(pToken, SCL_DEF_DIRECTIVE(SCL_OUTPUT_REQ)) ) p->tOutReqDef = Scl_Flt2Wrd(atof(pToken2)); else if ( !strcmp(pToken, SCL_DEF_DIRECTIVE(SCL_OUTPUT_REQ)) ) p->tOutReqDef = Scl_Flt2Int(atof(pToken2));
else if ( !strcmp(pToken, SCL_DEF_DIRECTIVE(SCL_OUTPUT_LOAD))) p->tOutLoadDef = Scl_Flt2Wrd(atof(pToken2)); else if ( !strcmp(pToken, SCL_DEF_DIRECTIVE(SCL_OUTPUT_LOAD))) p->tOutLoadDef = Scl_Flt2Int(atof(pToken2));
else if ( pToken3 == NULL ) { printf( "Directive %s should be followed by two arguments.\n", pToken ); continue; } else if ( pToken3 == NULL ) { printf( "Directive %s should be followed by two arguments.\n", pToken ); continue; }
else if ( !strcmp(pToken, SCL_DIRECTIVE(SCL_INPUT_CELL)) ) if ( (Num = Abc_NamStrFind(pNamI, pToken2)) > 0 ) Vec_PtrWriteEntry( &p->vInCells, Num-1, Abc_UtilStrsav(pToken3) ); else printf( "Line %d: Cannot find input \"%s\".\n", nLines, pToken2 ); else if ( !strcmp(pToken, SCL_DIRECTIVE(SCL_INPUT_CELL)) ) if ( (Num = Abc_NamStrFind(pNamI, pToken2)) > 0 ) Vec_PtrWriteEntry( &p->vInCells, Num-1, Abc_UtilStrsav(pToken3) ); else printf( "Line %d: Cannot find input \"%s\".\n", nLines, pToken2 );
else if ( !strcmp(pToken, SCL_DIRECTIVE(SCL_INPUT_ARR)) ) if ( (Num = Abc_NamStrFind(pNamI, pToken2)) > 0 ) Vec_WrdWriteEntry( &p->vInArrs, Num-1, Scl_Flt2Wrd(atof(pToken3)) ); else printf( "Line %d: Cannot find input \"%s\".\n", nLines, pToken2 ); else if ( !strcmp(pToken, SCL_DIRECTIVE(SCL_INPUT_ARR)) ) if ( (Num = Abc_NamStrFind(pNamI, pToken2)) > 0 ) Vec_IntWriteEntry( &p->vInArrs, Num-1, Scl_Flt2Int(atof(pToken3)) ); else printf( "Line %d: Cannot find input \"%s\".\n", nLines, pToken2 );
else if ( !strcmp(pToken, SCL_DIRECTIVE(SCL_INPUT_SLEW)) ) if ( (Num = Abc_NamStrFind(pNamI, pToken2)) > 0 ) Vec_WrdWriteEntry( &p->vInSlews, Num-1, Scl_Flt2Wrd(atof(pToken3)) ); else printf( "Line %d: Cannot find input \"%s\".\n", nLines, pToken2 ); else if ( !strcmp(pToken, SCL_DIRECTIVE(SCL_INPUT_SLEW)) ) if ( (Num = Abc_NamStrFind(pNamI, pToken2)) > 0 ) Vec_IntWriteEntry( &p->vInSlews, Num-1, Scl_Flt2Int(atof(pToken3)) ); else printf( "Line %d: Cannot find input \"%s\".\n", nLines, pToken2 );
else if ( !strcmp(pToken, SCL_DIRECTIVE(SCL_INPUT_LOAD)) ) if ( (Num = Abc_NamStrFind(pNamI, pToken2)) > 0 ) Vec_WrdWriteEntry( &p->vInLoads, Num-1, Scl_Flt2Wrd(atof(pToken3)) ); else printf( "Line %d: Cannot find input \"%s\".\n", nLines, pToken2 ); else if ( !strcmp(pToken, SCL_DIRECTIVE(SCL_INPUT_LOAD)) ) if ( (Num = Abc_NamStrFind(pNamI, pToken2)) > 0 ) Vec_IntWriteEntry( &p->vInLoads, Num-1, Scl_Flt2Int(atof(pToken3)) ); else printf( "Line %d: Cannot find input \"%s\".\n", nLines, pToken2 );
else if ( !strcmp(pToken, SCL_DIRECTIVE(SCL_OUTPUT_REQ)) ) if ( (Num = Abc_NamStrFind(pNamO, pToken2)) > 0 ) Vec_WrdWriteEntry( &p->vOutReqs, Num-1, Scl_Flt2Wrd(atof(pToken3)) ); else printf( "Line %d: Cannot find output \"%s\".\n", nLines, pToken2 ); else if ( !strcmp(pToken, SCL_DIRECTIVE(SCL_OUTPUT_REQ)) ) if ( (Num = Abc_NamStrFind(pNamO, pToken2)) > 0 ) Vec_IntWriteEntry( &p->vOutReqs, Num-1, Scl_Flt2Int(atof(pToken3)) ); else printf( "Line %d: Cannot find output \"%s\".\n", nLines, pToken2 );
else if ( !strcmp(pToken, SCL_DIRECTIVE(SCL_OUTPUT_LOAD)) ) if ( (Num = Abc_NamStrFind(pNamO, pToken2)) > 0 ) Vec_WrdWriteEntry( &p->vOutLoads, Num-1, Scl_Flt2Wrd(atof(pToken3)) ); else printf( "Line %d: Cannot find output \"%s\".\n", nLines, pToken2 ); else if ( !strcmp(pToken, SCL_DIRECTIVE(SCL_OUTPUT_LOAD)) ) if ( (Num = Abc_NamStrFind(pNamO, pToken2)) > 0 ) Vec_IntWriteEntry( &p->vOutLoads, Num-1, Scl_Flt2Int(atof(pToken3)) ); else printf( "Line %d: Cannot find output \"%s\".\n", nLines, pToken2 );
else printf( "Line %d: Skipping unrecognized directive \"%s\".\n", nLines, pToken ); else printf( "Line %d: Skipping unrecognized directive \"%s\".\n", nLines, pToken );
} }
// set missing defaults // set missing defaults
...@@ -177,11 +177,11 @@ static inline int Scl_ConParse( Scl_Con_t * p, Abc_Nam_t * pNamI, Abc_Nam_t * pN ...@@ -177,11 +177,11 @@ static inline int Scl_ConParse( Scl_Con_t * p, Abc_Nam_t * pNamI, Abc_Nam_t * pN
// set individual defaults // set individual defaults
if ( p->pInCellDef ) if ( p->pInCellDef )
Vec_PtrForEachEntry(char *, &p->vInCells, pName, i) if ( pName == NULL ) Vec_PtrWriteEntry( &p->vInCells, i, Abc_UtilStrsav(p->pInCellDef) ); Vec_PtrForEachEntry(char *, &p->vInCells, pName, i) if ( pName == NULL ) Vec_PtrWriteEntry( &p->vInCells, i, Abc_UtilStrsav(p->pInCellDef) );
Vec_WrdForEachEntry( &p->vInArrs, Value, i ) if ( Value == SCL_INFINITY ) Vec_WrdWriteEntry( &p->vInArrs, i, p->tInArrDef ); Vec_IntForEachEntry( &p->vInArrs, Value, i ) if ( Value == SCL_INFINITY ) Vec_IntWriteEntry( &p->vInArrs, i, p->tInArrDef );
Vec_WrdForEachEntry( &p->vInSlews, Value, i ) if ( Value == SCL_INFINITY ) Vec_WrdWriteEntry( &p->vInSlews, i, p->tInSlewDef ); Vec_IntForEachEntry( &p->vInSlews, Value, i ) if ( Value == SCL_INFINITY ) Vec_IntWriteEntry( &p->vInSlews, i, p->tInSlewDef );
Vec_WrdForEachEntry( &p->vInLoads, Value, i ) if ( Value == SCL_INFINITY ) Vec_WrdWriteEntry( &p->vInLoads, i, p->tInLoadDef ); Vec_IntForEachEntry( &p->vInLoads, Value, i ) if ( Value == SCL_INFINITY ) Vec_IntWriteEntry( &p->vInLoads, i, p->tInLoadDef );
Vec_WrdForEachEntry( &p->vOutReqs, Value, i ) if ( Value == SCL_INFINITY ) Vec_WrdWriteEntry( &p->vOutReqs, i, p->tOutReqDef ); Vec_IntForEachEntry( &p->vOutReqs, Value, i ) if ( Value == SCL_INFINITY ) Vec_IntWriteEntry( &p->vOutReqs, i, p->tOutReqDef );
Vec_WrdForEachEntry( &p->vOutLoads, Value, i ) if ( Value == SCL_INFINITY ) Vec_WrdWriteEntry( &p->vOutLoads, i, p->tOutLoadDef ); Vec_IntForEachEntry( &p->vOutLoads, Value, i ) if ( Value == SCL_INFINITY ) Vec_IntWriteEntry( &p->vOutLoads, i, p->tOutLoadDef );
fclose( pFile ); fclose( pFile );
return 1; return 1;
...@@ -196,7 +196,7 @@ static inline Scl_Con_t * Scl_ConRead( char * pFileName, Abc_Nam_t * pNamI, Abc_ ...@@ -196,7 +196,7 @@ static inline Scl_Con_t * Scl_ConRead( char * pFileName, Abc_Nam_t * pNamI, Abc_
} }
static inline void Scl_ConWrite( Scl_Con_t * p, char * pFileName ) static inline void Scl_ConWrite( Scl_Con_t * p, char * pFileName )
{ {
char * pName; word Value; int i; char * pName; int Value; int i;
FILE * pFile = pFileName ? fopen( pFileName, "wb" ) : stdout; FILE * pFile = pFileName ? fopen( pFileName, "wb" ) : stdout;
if ( pFile == NULL ) if ( pFile == NULL )
{ {
...@@ -206,18 +206,18 @@ static inline void Scl_ConWrite( Scl_Con_t * p, char * pFileName ) ...@@ -206,18 +206,18 @@ static inline void Scl_ConWrite( Scl_Con_t * p, char * pFileName )
fprintf( pFile, ".model %s\n", p->pModelName ); fprintf( pFile, ".model %s\n", p->pModelName );
if ( p->pInCellDef ) fprintf( pFile, ".default_%s %s\n", SCL_INPUT_CELL, p->pInCellDef ); if ( p->pInCellDef ) fprintf( pFile, ".default_%s %s\n", SCL_INPUT_CELL, p->pInCellDef );
if ( p->tInArrDef != 0 ) fprintf( pFile, ".default_%s %.2f\n", SCL_INPUT_ARR, Scl_Wrd2Flt(p->tInArrDef) ); if ( p->tInArrDef != 0 ) fprintf( pFile, ".default_%s %.2f\n", SCL_INPUT_ARR, Scl_Int2Flt(p->tInArrDef) );
if ( p->tInSlewDef != 0 ) fprintf( pFile, ".default_%s %.2f\n", SCL_INPUT_SLEW, Scl_Wrd2Flt(p->tInSlewDef) ); if ( p->tInSlewDef != 0 ) fprintf( pFile, ".default_%s %.2f\n", SCL_INPUT_SLEW, Scl_Int2Flt(p->tInSlewDef) );
if ( p->tInLoadDef != 0 ) fprintf( pFile, ".default_%s %.2f\n", SCL_INPUT_LOAD, Scl_Wrd2Flt(p->tInLoadDef) ); if ( p->tInLoadDef != 0 ) fprintf( pFile, ".default_%s %.2f\n", SCL_INPUT_LOAD, Scl_Int2Flt(p->tInLoadDef) );
if ( p->tOutReqDef != 0 ) fprintf( pFile, ".default_%s %.2f\n", SCL_OUTPUT_REQ, Scl_Wrd2Flt(p->tOutReqDef) ); if ( p->tOutReqDef != 0 ) fprintf( pFile, ".default_%s %.2f\n", SCL_OUTPUT_REQ, Scl_Int2Flt(p->tOutReqDef) );
if ( p->tOutLoadDef != 0 ) fprintf( pFile, ".default_%s %.2f\n", SCL_OUTPUT_LOAD, Scl_Wrd2Flt(p->tOutLoadDef) ); if ( p->tOutLoadDef != 0 ) fprintf( pFile, ".default_%s %.2f\n", SCL_OUTPUT_LOAD, Scl_Int2Flt(p->tOutLoadDef) );
Vec_PtrForEachEntry(char *, &p->vInCells, pName, i) if ( pName ) fprintf( pFile, ".%s %s %s\n", SCL_INPUT_CELL, Abc_NamStr(p->pNamI, i+1), pName ); Vec_PtrForEachEntry(char *, &p->vInCells, pName, i) if ( pName ) fprintf( pFile, ".%s %s %s\n", SCL_INPUT_CELL, Abc_NamStr(p->pNamI, i+1), pName );
Vec_WrdForEachEntry( &p->vInArrs, Value, i ) if ( Value != p->tInArrDef ) fprintf( pFile, ".%s %s %.2f\n", SCL_INPUT_ARR, Abc_NamStr(p->pNamI, i+1), Scl_Wrd2Flt(Value) ); Vec_IntForEachEntry( &p->vInArrs, Value, i ) if ( Value != p->tInArrDef ) fprintf( pFile, ".%s %s %.2f\n", SCL_INPUT_ARR, Abc_NamStr(p->pNamI, i+1), Scl_Int2Flt(Value) );
Vec_WrdForEachEntry( &p->vInSlews, Value, i ) if ( Value != p->tInSlewDef ) fprintf( pFile, ".%s %s %.2f\n", SCL_INPUT_SLEW, Abc_NamStr(p->pNamI, i+1), Scl_Wrd2Flt(Value) ); Vec_IntForEachEntry( &p->vInSlews, Value, i ) if ( Value != p->tInSlewDef ) fprintf( pFile, ".%s %s %.2f\n", SCL_INPUT_SLEW, Abc_NamStr(p->pNamI, i+1), Scl_Int2Flt(Value) );
Vec_WrdForEachEntry( &p->vInLoads, Value, i ) if ( Value != p->tInLoadDef ) fprintf( pFile, ".%s %s %.2f\n", SCL_INPUT_LOAD, Abc_NamStr(p->pNamI, i+1), Scl_Wrd2Flt(Value) ); Vec_IntForEachEntry( &p->vInLoads, Value, i ) if ( Value != p->tInLoadDef ) fprintf( pFile, ".%s %s %.2f\n", SCL_INPUT_LOAD, Abc_NamStr(p->pNamI, i+1), Scl_Int2Flt(Value) );
Vec_WrdForEachEntry( &p->vOutReqs, Value, i ) if ( Value != p->tOutReqDef ) fprintf( pFile, ".%s %s %.2f\n", SCL_OUTPUT_REQ, Abc_NamStr(p->pNamO, i+1), Scl_Wrd2Flt(Value) ); Vec_IntForEachEntry( &p->vOutReqs, Value, i ) if ( Value != p->tOutReqDef ) fprintf( pFile, ".%s %s %.2f\n", SCL_OUTPUT_REQ, Abc_NamStr(p->pNamO, i+1), Scl_Int2Flt(Value) );
Vec_WrdForEachEntry( &p->vOutLoads, Value, i ) if ( Value != p->tOutLoadDef ) fprintf( pFile, ".%s %s %.2f\n", SCL_OUTPUT_LOAD, Abc_NamStr(p->pNamO, i+1), Scl_Wrd2Flt(Value) ); Vec_IntForEachEntry( &p->vOutLoads, Value, i ) if ( Value != p->tOutLoadDef ) fprintf( pFile, ".%s %s %.2f\n", SCL_OUTPUT_LOAD, Abc_NamStr(p->pNamO, i+1), Scl_Int2Flt(Value) );
if ( pFile != stdout ) if ( pFile != stdout )
fclose ( pFile ); fclose ( pFile );
...@@ -235,18 +235,18 @@ static inline void Scl_ConWrite( Scl_Con_t * p, char * pFileName ) ...@@ -235,18 +235,18 @@ static inline void Scl_ConWrite( Scl_Con_t * p, char * pFileName )
***********************************************************************/ ***********************************************************************/
static inline int Scl_ConHasInCells_( Scl_Con_t * p ) { return Vec_PtrCountZero(&p->vInCells) != Vec_PtrSize(&p->vInCells); } static inline int Scl_ConHasInCells_( Scl_Con_t * p ) { return Vec_PtrCountZero(&p->vInCells) != Vec_PtrSize(&p->vInCells); }
static inline int Scl_ConHasInArrs_( Scl_Con_t * p ) { return Vec_WrdCountZero(&p->vInArrs) != Vec_WrdSize(&p->vInArrs); } static inline int Scl_ConHasInArrs_( Scl_Con_t * p ) { return Vec_IntCountZero(&p->vInArrs) != Vec_IntSize(&p->vInArrs); }
static inline int Scl_ConHasInSlews_( Scl_Con_t * p ) { return Vec_WrdCountZero(&p->vInSlews) != Vec_WrdSize(&p->vInSlews); } static inline int Scl_ConHasInSlews_( Scl_Con_t * p ) { return Vec_IntCountZero(&p->vInSlews) != Vec_IntSize(&p->vInSlews); }
static inline int Scl_ConHasInLoads_( Scl_Con_t * p ) { return Vec_WrdCountZero(&p->vInLoads) != Vec_WrdSize(&p->vInLoads); } static inline int Scl_ConHasInLoads_( Scl_Con_t * p ) { return Vec_IntCountZero(&p->vInLoads) != Vec_IntSize(&p->vInLoads); }
static inline int Scl_ConHasOutReqs_( Scl_Con_t * p ) { return Vec_WrdCountZero(&p->vOutReqs) != Vec_WrdSize(&p->vOutReqs); } static inline int Scl_ConHasOutReqs_( Scl_Con_t * p ) { return Vec_IntCountZero(&p->vOutReqs) != Vec_IntSize(&p->vOutReqs); }
static inline int Scl_ConHasOutLoads_( Scl_Con_t * p ) { return Vec_WrdCountZero(&p->vOutLoads) != Vec_WrdSize(&p->vOutLoads); } static inline int Scl_ConHasOutLoads_( Scl_Con_t * p ) { return Vec_IntCountZero(&p->vOutLoads) != Vec_IntSize(&p->vOutLoads); }
static inline char * Scl_ConGetInCell_( Scl_Con_t * p, int i ) { return (char*)Vec_PtrEntry( &p->vInCells, i ); } static inline char * Scl_ConGetInCell_( Scl_Con_t * p, int i ) { return (char*)Vec_PtrEntry( &p->vInCells, i ); }
static inline word Scl_ConGetInArr_( Scl_Con_t * p, int i ) { return Vec_WrdEntry( &p->vInArrs, i ); } static inline int Scl_ConGetInArr_( Scl_Con_t * p, int i ) { return Vec_IntEntry( &p->vInArrs, i ); }
static inline word Scl_ConGetInSlew_( Scl_Con_t * p, int i ) { return Vec_WrdEntry( &p->vInSlews, i ); } static inline int Scl_ConGetInSlew_( Scl_Con_t * p, int i ) { return Vec_IntEntry( &p->vInSlews, i ); }
static inline word Scl_ConGetInLoad_( Scl_Con_t * p, int i ) { return Vec_WrdEntry( &p->vInLoads, i ); } static inline int Scl_ConGetInLoad_( Scl_Con_t * p, int i ) { return Vec_IntEntry( &p->vInLoads, i ); }
static inline word Scl_ConGetOutReq_( Scl_Con_t * p, int i ) { return Vec_WrdEntry( &p->vOutReqs, i ); } static inline int Scl_ConGetOutReq_( Scl_Con_t * p, int i ) { return Vec_IntEntry( &p->vOutReqs, i ); }
static inline word Scl_ConGetOutLoad_( Scl_Con_t * p, int i ) { return Vec_WrdEntry( &p->vOutLoads, i ); } static inline int Scl_ConGetOutLoad_( Scl_Con_t * p, int i ) { return Vec_IntEntry( &p->vOutLoads, i ); }
/**Function************************************************************* /**Function*************************************************************
...@@ -271,17 +271,17 @@ static inline int Scl_ConHasOutReqs() { return Scl_ConHasOutReqs ...@@ -271,17 +271,17 @@ static inline int Scl_ConHasOutReqs() { return Scl_ConHasOutReqs
static inline int Scl_ConHasOutLoads() { return Scl_ConHasOutLoads_( Scl_ConReadMan() ); } static inline int Scl_ConHasOutLoads() { return Scl_ConHasOutLoads_( Scl_ConReadMan() ); }
static inline char * Scl_ConGetInCell( int i ) { return Scl_ConGetInCell_ ( Scl_ConReadMan(), i ); } static inline char * Scl_ConGetInCell( int i ) { return Scl_ConGetInCell_ ( Scl_ConReadMan(), i ); }
static inline word Scl_ConGetInArr( int i ) { return Scl_ConGetInArr_ ( Scl_ConReadMan(), i ); } static inline int Scl_ConGetInArr( int i ) { return Scl_ConGetInArr_ ( Scl_ConReadMan(), i ); }
static inline word Scl_ConGetInSlew( int i ) { return Scl_ConGetInSlew_ ( Scl_ConReadMan(), i ); } static inline int Scl_ConGetInSlew( int i ) { return Scl_ConGetInSlew_ ( Scl_ConReadMan(), i ); }
static inline word Scl_ConGetInLoad( int i ) { return Scl_ConGetInLoad_ ( Scl_ConReadMan(), i ); } static inline int Scl_ConGetInLoad( int i ) { return Scl_ConGetInLoad_ ( Scl_ConReadMan(), i ); }
static inline word Scl_ConGetOutReq( int i ) { return Scl_ConGetOutReq_ ( Scl_ConReadMan(), i ); } static inline int Scl_ConGetOutReq( int i ) { return Scl_ConGetOutReq_ ( Scl_ConReadMan(), i ); }
static inline word Scl_ConGetOutLoad( int i ) { return Scl_ConGetOutLoad_( Scl_ConReadMan(), i ); } static inline int Scl_ConGetOutLoad( int i ) { return Scl_ConGetOutLoad_( Scl_ConReadMan(), i ); }
static inline float Scl_ConGetInArrFloat( int i ) { return Scl_Wrd2Flt( Scl_ConGetInArr(i) ); } static inline float Scl_ConGetInArrFloat( int i ) { return Scl_Int2Flt( Scl_ConGetInArr(i) ); }
static inline float Scl_ConGetInSlewFloat( int i ) { return Scl_Wrd2Flt( Scl_ConGetInSlew(i) ); } static inline float Scl_ConGetInSlewFloat( int i ) { return Scl_Int2Flt( Scl_ConGetInSlew(i) ); }
static inline float Scl_ConGetInLoadFloat( int i ) { return Scl_Wrd2Flt( Scl_ConGetInLoad(i) ); } static inline float Scl_ConGetInLoadFloat( int i ) { return Scl_Int2Flt( Scl_ConGetInLoad(i) ); }
static inline float Scl_ConGetOutReqFloat( int i ) { return Scl_Wrd2Flt( Scl_ConGetOutReq(i) ); } static inline float Scl_ConGetOutReqFloat( int i ) { return Scl_Int2Flt( Scl_ConGetOutReq(i) ); }
static inline float Scl_ConGetOutLoadFloat( int i ) { return Scl_Wrd2Flt( Scl_ConGetOutLoad(i) ); } static inline float Scl_ConGetOutLoadFloat( int i ) { return Scl_Int2Flt( Scl_ConGetOutLoad(i) ); }
ABC_NAMESPACE_HEADER_END ABC_NAMESPACE_HEADER_END
......
...@@ -290,14 +290,14 @@ void Sfm_LibTruth8Two( Mio_Cell2_t * pCellBot, Mio_Cell2_t * pCellTop, int InTop ...@@ -290,14 +290,14 @@ void Sfm_LibTruth8Two( Mio_Cell2_t * pCellBot, Mio_Cell2_t * pCellTop, int InTop
***********************************************************************/ ***********************************************************************/
void Sfm_LibCellProfile( Mio_Cell2_t * pCellBot, Mio_Cell2_t * pCellTop, int InTop, int nFanins, int * Perm, int * pProf ) void Sfm_LibCellProfile( Mio_Cell2_t * pCellBot, Mio_Cell2_t * pCellTop, int InTop, int nFanins, int * Perm, int * pProf )
{ {
int i, DelayAdd = (int)(pCellTop ? pCellTop->Delays[InTop] : 0); int i, DelayAdd = pCellTop ? pCellTop->iDelays[InTop] : 0;
for ( i = 0; i < nFanins; i++ ) for ( i = 0; i < nFanins; i++ )
if ( Perm[i] < (int)pCellBot->nFanins ) if ( Perm[i] < (int)pCellBot->nFanins )
pProf[i] = (int)pCellBot->Delays[Perm[i]] + DelayAdd; pProf[i] = pCellBot->iDelays[Perm[i]] + DelayAdd;
else if ( Perm[i] < (int)pCellBot->nFanins + InTop ) else if ( Perm[i] < (int)pCellBot->nFanins + InTop )
pProf[i] = (int)pCellTop->Delays[Perm[i] - (int)pCellBot->nFanins]; pProf[i] = pCellTop->iDelays[Perm[i] - (int)pCellBot->nFanins];
else // if ( Perm[i] >= (int)pCellBot->nFanins + InTop ) else // if ( Perm[i] >= (int)pCellBot->nFanins + InTop )
pProf[i] = (int)pCellTop->Delays[Perm[i] - (int)pCellBot->nFanins + 1]; pProf[i] = pCellTop->iDelays[Perm[i] - (int)pCellBot->nFanins + 1];
} }
static inline int Sfm_LibNewIsContained( Sfm_Fun_t * pObj, int * pProf, int Area, int * pProfNew, int nFanins ) static inline int Sfm_LibNewIsContained( Sfm_Fun_t * pObj, int * pProf, int Area, int * pProfNew, int nFanins )
{ {
......
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