21#ifndef ABC__map__scl__sclSize_h
22#define ABC__map__scl__sclSize_h
110static inline int Abc_SclObjCellId(
Abc_Obj_t *
p ) {
return Vec_IntEntry(
p->pNtk->vGates, Abc_ObjId(
p) ); }
111static inline SC_Cell * Abc_SclObjCell(
Abc_Obj_t *
p ) {
int c = Abc_SclObjCellId(
p);
return c == -1 ? NULL:SC_LibCell(Abc_SclObjLib(
p), c); }
112static inline void Abc_SclObjSetCell(
Abc_Obj_t *
p,
SC_Cell * pCell ) { Vec_IntWriteEntry(
p->pNtk->vGates, Abc_ObjId(
p), pCell->
Id ); }
119static inline double Abc_SclObjLoadMax(
SC_Man *
p,
Abc_Obj_t * pObj ) {
return Abc_MaxFloat(Abc_SclObjLoad(
p, pObj)->rise, Abc_SclObjLoad(
p, pObj)->fall); }
120static inline float Abc_SclObjLoadAve(
SC_Man *
p,
Abc_Obj_t * pObj ) {
return 0.5 * Abc_SclObjLoad(
p, pObj)->rise + 0.5 * Abc_SclObjLoad(
p, pObj)->fall; }
121static inline double Abc_SclObjTimeOne(
SC_Man *
p,
Abc_Obj_t * pObj,
int fRise ){
return fRise ? Abc_SclObjTime(
p, pObj)->rise : Abc_SclObjTime(
p, pObj)->fall; }
122static inline float Abc_SclObjTimeMax(
SC_Man *
p,
Abc_Obj_t * pObj ) {
return Abc_MaxFloat(Abc_SclObjTime(
p, pObj)->rise, Abc_SclObjTime(
p, pObj)->fall); }
123static inline double Abc_SclObjSlewMax(
SC_Man *
p,
Abc_Obj_t * pObj ) {
return Abc_MaxFloat(Abc_SclObjSlew(
p, pObj)->rise, Abc_SclObjSlew(
p, pObj)->fall); }
124static inline float Abc_SclObjGetSlackR(
SC_Man *
p,
Abc_Obj_t * pObj,
float D ){
return D - (Abc_SclObjTime(
p, pObj)->rise + Abc_SclObjDept(
p, pObj)->rise); }
125static inline float Abc_SclObjGetSlackF(
SC_Man *
p,
Abc_Obj_t * pObj,
float D ){
return D - (Abc_SclObjTime(
p, pObj)->fall + Abc_SclObjDept(
p, pObj)->fall); }
126static inline float Abc_SclObjGetSlack(
SC_Man *
p,
Abc_Obj_t * pObj,
float D ) {
return D - Abc_MaxFloat(Abc_SclObjTime(
p, pObj)->rise + Abc_SclObjDept(
p, pObj)->rise, Abc_SclObjTime(
p, pObj)->fall + Abc_SclObjDept(
p, pObj)->fall); }
127static inline double Abc_SclObjSlackMax(
SC_Man *
p,
Abc_Obj_t * pObj,
float D ) {
return Abc_SclObjGetSlack(
p, pObj, D); }
128static inline void Abc_SclObjDupFanin(
SC_Man *
p,
Abc_Obj_t * pObj ) {
assert( Abc_ObjIsCo(pObj) ); *Abc_SclObjTime(
p, pObj) = *Abc_SclObjTime(
p, Abc_ObjFanin0(pObj)); }
129static inline float Abc_SclObjInDrive(
SC_Man *
p,
Abc_Obj_t * pObj ) {
return Vec_FltEntry(
p->vInDrive, pObj->
iData ); }
130static inline void Abc_SclObjSetInDrive(
SC_Man *
p,
Abc_Obj_t * pObj,
float c){ Vec_FltWriteEntry(
p->vInDrive, pObj->
iData, c ); }
131static inline void Abc_SclManSetFaninCallBack(
SC_Man *
p,
void * pCallBack ) {
p->pFuncFanin = (float (*)(
void *,
Abc_Obj_t *,
Abc_Obj_t *, int, int))pCallBack; }
155 assert( Abc_NtkHasMapping(pNtk) );
159 p->nObjs = Abc_NtkObjNumMax(pNtk);
164 p->vBestFans = Vec_IntStart(
p->nObjs );
165 p->vTimesOut = Vec_FltStart( Abc_NtkCoNum(pNtk) );
166 p->vQue = Vec_QueAlloc( Abc_NtkCoNum(pNtk) );
167 Vec_QueSetPriority(
p->vQue, Vec_FltArrayP(
p->vTimesOut) );
168 for ( i = 0; i < Abc_NtkCoNum(pNtk); i++ )
169 Vec_QuePush(
p->vQue, i );
170 p->vUpdates = Vec_IntAlloc( 1000 );
171 p->vUpdates2 = Vec_IntAlloc( 1000 );
172 p->vLoads2 = Vec_FltAlloc( 1000 );
173 p->vLoads3 = Vec_FltAlloc( 1000 );
174 p->vTimes2 = Vec_FltAlloc( 1000 );
175 p->vTimes3 = Vec_FltAlloc( 1000 );
177 p->vNode2Gain = Vec_FltStart(
p->nObjs );
178 p->vNode2Gate = Vec_IntStart(
p->nObjs );
179 p->vNodeByGain = Vec_QueAlloc(
p->nObjs );
180 Vec_QueSetPriority(
p->vNodeByGain, Vec_FltArrayP(
p->vNode2Gain) );
181 p->vNodeIter = Vec_IntStartFull(
p->nObjs );
183 p->vChanged = Vec_IntAlloc( 100 );
185 pObj->
Level = Abc_ObjFanin0(pObj)->Level + 1;
193static inline void Abc_SclManFree(
SC_Man *
p )
203 p->pNtk->pSCLib = NULL;
204 Vec_IntFreeP( &
p->pNtk->vGates );
205 Vec_IntFreeP( &
p->vNodeIter );
206 Vec_QueFreeP( &
p->vNodeByGain );
207 Vec_FltFreeP( &
p->vNode2Gain );
208 Vec_IntFreeP( &
p->vNode2Gate );
210 Vec_FltFreeP( &
p->vLoads2 );
211 Vec_FltFreeP( &
p->vLoads3 );
212 Vec_FltFreeP( &
p->vTimes2 );
213 Vec_FltFreeP( &
p->vTimes3 );
214 Vec_IntFreeP( &
p->vUpdates );
215 Vec_IntFreeP( &
p->vUpdates2 );
216 Vec_IntFreeP( &
p->vGatesBest );
217 Vec_WecFreeP( &
p->vLevels );
218 Vec_IntFreeP( &
p->vChanged );
220 Vec_QueCheck(
p->vQue );
221 Vec_QueFreeP( &
p->vQue );
222 Vec_FltFreeP( &
p->vTimesOut );
223 Vec_IntFreeP( &
p->vBestFans );
224 Vec_FltFreeP( &
p->vInDrive );
225 Vec_FltFreeP( &
p->vWireCaps );
257static inline void Abc_SclManCleanTime(
SC_Man *
p )
295 Vec_FltClear(
p->vLoads2 );
298 Vec_FltPush(
p->vLoads2, Abc_SclObjLoad(
p, pFanin)->rise );
299 Vec_FltPush(
p->vLoads2, Abc_SclObjLoad(
p, pFanin)->fall );
308 Abc_SclObjLoad(
p, pFanin)->rise = Vec_FltEntry(
p->vLoads2, k++);
309 Abc_SclObjLoad(
p, pFanin)->fall = Vec_FltEntry(
p->vLoads2, k++);
311 assert( Vec_FltSize(
p->vLoads2) == k );
318 Vec_FltClear(
p->vLoads3 );
319 Vec_FltPush(
p->vLoads3, Abc_SclObjLoad(
p, pObj)->rise );
320 Vec_FltPush(
p->vLoads3, Abc_SclObjLoad(
p, pObj)->fall );
323 Vec_FltPush(
p->vLoads3, Abc_SclObjLoad(
p, pFanin)->rise );
324 Vec_FltPush(
p->vLoads3, Abc_SclObjLoad(
p, pFanin)->fall );
331 Abc_SclObjLoad(
p, pObj)->rise = Vec_FltEntry(
p->vLoads3, k++);
332 Abc_SclObjLoad(
p, pObj)->fall = Vec_FltEntry(
p->vLoads3, k++);
335 Abc_SclObjLoad(
p, pFanin)->rise = Vec_FltEntry(
p->vLoads3, k++);
336 Abc_SclObjLoad(
p, pFanin)->fall = Vec_FltEntry(
p->vLoads3, k++);
338 assert( Vec_FltSize(
p->vLoads3) == k );
344 Vec_FltClear(
p->vTimes2 );
347 Vec_FltPush(
p->vTimes2, Abc_SclObjTime(
p, pObj)->rise );
348 Vec_FltPush(
p->vTimes2, Abc_SclObjTime(
p, pObj)->fall );
349 Vec_FltPush(
p->vTimes2, Abc_SclObjSlew(
p, pObj)->rise );
350 Vec_FltPush(
p->vTimes2, Abc_SclObjSlew(
p, pObj)->fall );
359 Abc_SclObjTime(
p, pObj)->rise = Vec_FltEntry(
p->vTimes2, k++);
360 Abc_SclObjTime(
p, pObj)->fall = Vec_FltEntry(
p->vTimes2, k++);
361 Abc_SclObjSlew(
p, pObj)->rise = Vec_FltEntry(
p->vTimes2, k++);
362 Abc_SclObjSlew(
p, pObj)->fall = Vec_FltEntry(
p->vTimes2, k++);
364 assert( Vec_FltSize(
p->vTimes2) == k );
370 Vec_FltClear(
p->vTimes3 );
373 Vec_FltPush(
p->vTimes3, Abc_SclObjTime(
p, pObj)->rise );
374 Vec_FltPush(
p->vTimes3, Abc_SclObjTime(
p, pObj)->fall );
380 float Diff, Multi = 1.5, Eval = 0;
384 Diff = (Vec_FltEntry(
p->vTimes3, k++) - Abc_SclObjTime(
p, pObj)->rise);
385 Diff += (Vec_FltEntry(
p->vTimes3, k++) - Abc_SclObjTime(
p, pObj)->fall);
386 Eval += 0.5 * (Diff > 0 ? Diff : Multi * Diff);
388 assert( Vec_FltSize(
p->vTimes3) == k );
389 return Eval / Vec_IntSize(vCone);
391static inline float Abc_SclEvalPerformLegal(
SC_Man *
p,
Vec_Int_t * vCone,
float D )
394 float Rise, Fall, Multi = 1.0, Eval = 0;
398 Rise = Vec_FltEntry(
p->vTimes3, k++) - Abc_SclObjTime(
p, pObj)->rise;
399 Fall = Vec_FltEntry(
p->vTimes3, k++) - Abc_SclObjTime(
p, pObj)->fall;
400 if ( Rise + Multi * Abc_SclObjGetSlackR(
p, pObj, D) < 0 || Fall + Multi * Abc_SclObjGetSlackF(
p, pObj, D) < 0 )
402 Eval += 0.5 * Rise + 0.5 * Fall;
404 assert( Vec_FltSize(
p->vTimes3) == k );
405 return Eval / Vec_IntSize(vCone);
414 *Abc_SclObjTime(
p, pObj) = Zero;
415 *Abc_SclObjSlew(
p, pObj) = Zero;
430static inline int Abc_SclGetBufInvCount(
Abc_Ntk_t * pNtk )
435 Count += (Abc_ObjFaninNum(pObj) == 1);
438static inline float Abc_SclGetAverageSize(
Abc_Ntk_t * pNtk )
444 Count++, Total += 100.0*Abc_SclObjCell(pObj)->Order/Abc_SclObjCell(pObj)->nGates;
445 return (
float)(Total / Count);
447static inline float Abc_SclGetTotalArea(
Abc_Ntk_t * pNtk )
453 Area += Abc_SclObjCell(pObj)->area;
456static inline float Abc_SclGetMaxDelay(
SC_Man *
p )
462 fMaxArr = Abc_MaxFloat( fMaxArr, Abc_SclObjTimeMax(
p, pObj) );
465static inline float Abc_SclGetMaxDelayNodeFanins(
SC_Man *
p,
Abc_Obj_t * pNode )
470 assert( Abc_ObjIsNode(pNode) );
472 fMaxArr = Abc_MaxFloat( fMaxArr, Abc_SclObjTimeMax(
p, pObj) );
475static inline float Abc_SclReadMaxDelay(
SC_Man *
p )
477 return Abc_SclObjTimeMax(
p, Abc_NtkCo(
p->pNtk, Vec_QueTop(
p->vQue)) );
493 SC_Cell * pOld = Abc_SclObjCell(pObj);
511static inline void Abc_SclDumpStats(
SC_Man *
p,
char * pFileName,
abctime Time )
513 static char FileNameOld[1000] = {0};
514 static int nNodesOld, nAreaOld, nDelayOld;
517 pTable = fopen( pFileName,
"a+" );
518 if (
strcmp( FileNameOld,
p->pNtk->pName ) )
520 sprintf( FileNameOld,
"%s",
p->pNtk->pName );
521 fprintf( pTable,
"\n" );
523 fprintf( pTable,
"%d ", Abc_NtkPiNum(
p->pNtk) );
524 fprintf( pTable,
"%d ", Abc_NtkPoNum(
p->pNtk) );
525 fprintf( pTable,
"%d ", (nNodesOld = Abc_NtkNodeNum(
p->pNtk)) );
526 fprintf( pTable,
"%d ", (nAreaOld = (
int)
p->SumArea) );
527 fprintf( pTable,
"%d ", (nDelayOld = (
int)
p->ReportDelay) );
532 fprintf( pTable,
" " );
533 fprintf( pTable,
"%.1f ", 100.0 * Abc_NtkNodeNum(
p->pNtk) / nNodesOld );
534 fprintf( pTable,
"%.1f ", 100.0 * (
int)
p->SumArea / nAreaOld );
535 fprintf( pTable,
"%.1f ", 100.0 * (
int)
p->ReportDelay / nDelayOld );
536 fprintf( pTable,
"%.2f", 1.0*(Abc_Clock() - clk)/CLOCKS_PER_SEC );
struct Abc_Obj_t_ Abc_Obj_t
#define Abc_NtkForEachCo(pNtk, pCo, i)
#define Abc_ObjForEachFanin(pObj, pFanin, i)
struct Abc_Ntk_t_ Abc_Ntk_t
#define Abc_NtkForEachNodeNotBarBuf1(pNtk, pNode, i)
ABC_DLL int Abc_NtkLevel(Abc_Ntk_t *pNtk)
#define Abc_NtkForEachCi(pNtk, pCi, i)
#define Abc_NtkForEachObjVec(vIds, pNtk, pObj, i)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
struct SC_SizePars_ SC_SizePars
struct SC_BusPars_ SC_BusPars
struct SC_WireLoad_ SC_WireLoad
STRUCTURE DEFINITIONS ///.
void Abc_SclUpsizePerform(SC_Lib *pLib, Abc_Ntk_t *pNtk, SC_SizePars *pPars, void *pFuncFanin)
float Abc_SclFindWireLoad(Vec_Flt_t *vWireCaps, int nFans)
Abc_Ntk_t * Abc_SclBufferingPerform(Abc_Ntk_t *pNtk, SC_Lib *pLib, SC_BusPars *pPars)
int Abc_SclTimeIncUpdate(SC_Man *p)
Vec_Int_t * Abc_SclExtractBarBufs(Abc_Ntk_t *pNtk)
Abc_Ntk_t * Abc_SclUnBufferPerform(Abc_Ntk_t *pNtk, int fVerbose)
Abc_Ntk_t * Abc_SclBufPerform(Abc_Ntk_t *pNtk, int FanMin, int FanMax, int fBufPis, int fSkipDup, int fVerbose)
void Abc_SclPrintBuffers(SC_Lib *pLib, Abc_Ntk_t *pNtk, int fVerbose)
void Abc_SclTimeCone(SC_Man *p, Vec_Int_t *vCone)
Abc_Ntk_t * Abc_SclUnBufferPhase(Abc_Ntk_t *pNtk, int fVerbose)
void Abc_SclUpdateLoad(SC_Man *p, Abc_Obj_t *pObj, SC_Cell *pOld, SC_Cell *pNew)
void Abc_SclTimeIncInsert(SC_Man *p, Abc_Obj_t *pObj)
void Abc_SclSclGates2MioGates(SC_Lib *pLib, Abc_Ntk_t *p)
void Abc_NodeInvUpdateObjFanoutPolarity(Abc_Obj_t *pObj, Abc_Obj_t *pFanout)
void Abc_NodeInvUpdateFanPolarity(Abc_Obj_t *pObj)
void Abc_SclMioGates2SclGates(SC_Lib *pLib, Abc_Ntk_t *p)
DECLARATIONS ///.
int Abc_SclIsInv(Abc_Obj_t *pObj)
void Abc_SclTimePerform(SC_Lib *pLib, Abc_Ntk_t *pNtk, int nTreeCRatio, int fUseWireLoads, int fShowAll, int fPrintPath, int fDumpStats)
int Abc_SclCheckNtk(Abc_Ntk_t *p, int fVerbose)
void Abc_SclComputeLoad(SC_Man *p)
int Abc_SclCountMinSize(SC_Lib *pLib, Abc_Ntk_t *p, int fUseMax)
void Abc_SclReportDupFanins(Abc_Ntk_t *pNtk)
FUNCTION DEFINITIONS ///.
int Abc_SclCountNearCriticalNodes(SC_Man *p)
void Abc_SclTimeIncUpdateLevel(Abc_Obj_t *pObj)
void Abc_SclDnsizePerform(SC_Lib *pLib, Abc_Ntk_t *pNtk, SC_SizePars *pPars, void *pFuncFanin)
void Abc_SclInsertBarBufs(Abc_Ntk_t *pNtk, Vec_Int_t *vBufs)
Abc_Ntk_t * Abc_SclBufferPhase(Abc_Ntk_t *pNtk, int fVerbose)
Abc_Ntk_t * Abc_SclPerformBuffering(Abc_Ntk_t *p, int DegreeR, int Degree, int fUseInvs, int fVerbose)
Abc_Obj_t * Abc_SclFindCriticalCo(SC_Man *p, int *pfRise)
DECLARATIONS ///.
void Abc_SclPrintGateSizes(SC_Lib *pLib, Abc_Ntk_t *p)
Abc_Obj_t * Abc_SclFindMostCriticalFanin(SC_Man *p, int *pfRise, Abc_Obj_t *pNode)
SC_Man * Abc_SclManStart(SC_Lib *pLib, Abc_Ntk_t *pNtk, int fUseWireLoads, int fDept, float DUser, int nTreeCRatio)
void Abc_SclTimeNtkPrint(SC_Man *p, int fShowAll, int fPrintPath)
void Abc_SclAddWireLoad(SC_Man *p, Abc_Obj_t *pObj, int fSubtr)
void Abc_SclTimeNtkRecompute(SC_Man *p, float *pArea, float *pDelay, int fReverse, float DUser)
void Abc_SclUpdateLoadSplit(SC_Man *p, Abc_Obj_t *pBuffer, Abc_Obj_t *pFanout)
void Abc_SclTransferGates(Abc_Ntk_t *pOld, Abc_Ntk_t *pNew)
typedefABC_NAMESPACE_HEADER_START struct SC_Man_ SC_Man
INCLUDES ///.
void Abc_SclMinsizePerform(SC_Lib *pLib, Abc_Ntk_t *p, int fUseMax, int fVerbose)
Vec_Flt_t * Abc_SclFindWireCaps(SC_WireLoad *pWL, int nFanoutMax)
DECLARATIONS ///.
float(* pFuncFanin)(void *p, Abc_Obj_t *pObj, Abc_Obj_t *pFanin, int iFanin, int fRise)
typedefABC_NAMESPACE_HEADER_START struct Vec_Flt_t_ Vec_Flt_t
INCLUDES ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Que_t_ Vec_Que_t
INCLUDES ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.