summaryrefslogtreecommitdiffstats
path: root/src/map/scl/sclSize.h
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2013-08-09 11:15:20 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2013-08-09 11:15:20 -0700
commit95684b044afb8f3fd1ebcc43483126c10010a353 (patch)
tree2e986c405150d9c0fbf7540aead1c77b04e6d61d /src/map/scl/sclSize.h
parent4be8eba9d91d24cc8137b895e5bf6c0ae2d354e3 (diff)
downloadabc-95684b044afb8f3fd1ebcc43483126c10010a353.tar.gz
abc-95684b044afb8f3fd1ebcc43483126c10010a353.tar.bz2
abc-95684b044afb8f3fd1ebcc43483126c10010a353.zip
Improvements to buffering and sizing.
Diffstat (limited to 'src/map/scl/sclSize.h')
-rw-r--r--src/map/scl/sclSize.h157
1 files changed, 101 insertions, 56 deletions
diff --git a/src/map/scl/sclSize.h b/src/map/scl/sclSize.h
index fad63243..7974c7f8 100644
--- a/src/map/scl/sclSize.h
+++ b/src/map/scl/sclSize.h
@@ -58,6 +58,8 @@ struct SC_Man_
SC_Pair * pSlews; // slews for each gate
SC_Pair * pTimes2; // arrivals for each gate
SC_Pair * pSlews2; // slews for each gate
+ Vec_Flt_t * vTimes2; // backup storage for times
+ Vec_Flt_t * vTimes3; // backup storage for slews
Vec_Flt_t * vLoads2; // backup storage for loads
Vec_Flt_t * vLoads3; // backup storage for loads
float * pSlack; // slacks for each gatt
@@ -116,11 +118,11 @@ static inline float Abc_SclObjGetSlack( SC_Man * p, Abc_Obj_t * pObj, float
static 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); }
static 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); }
static inline float Abc_SclObjSlack( SC_Man * p, Abc_Obj_t * pObj ) { return p->pSlack[Abc_ObjId(pObj)]; }
-static inline float Abc_SclObjLoadAve( SC_Man * p, Abc_Obj_t * pObj ) { return 0.5 * (Abc_SclObjLoad(p, pObj)->rise + Abc_SclObjLoad(p, pObj)->fall); }
+static 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; }
static 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)); }
static inline float Abc_SclObjGain( SC_Man * p, Abc_Obj_t * pObj ) { return 0.5*((Abc_SclObjTime2(p, pObj)->rise - Abc_SclObjTime(p, pObj)->rise) + (Abc_SclObjTime2(p, pObj)->fall - Abc_SclObjTime(p, pObj)->fall)); }
-static inline int Abc_SclObjLegal( SC_Man * p, Abc_Obj_t * pObj, float D ) { return Abc_SclObjTime(p, pObj)->rise <= Abc_SclObjTime2(p, pObj)->rise + Abc_SclObjGetSlackR(p, pObj, D) && Abc_SclObjTime(p, pObj)->fall <= Abc_SclObjTime2(p, pObj)->fall + Abc_SclObjGetSlackF(p, pObj, D); }
+//static inline int Abc_SclObjLegal( SC_Man * p, Abc_Obj_t * pObj, float D ) { return Abc_SclObjTime(p, pObj)->rise <= Abc_SclObjTime2(p, pObj)->rise + Abc_SclObjGetSlackR(p, pObj, D) && Abc_SclObjTime(p, pObj)->fall <= Abc_SclObjTime2(p, pObj)->fall + Abc_SclObjGetSlackF(p, pObj, D); }
static inline double Abc_SclObjLoadFf( SC_Man * p, Abc_Obj_t * pObj, int fRise ) { return SC_LibCapFf( p->pLib, fRise ? Abc_SclObjLoad(p, pObj)->rise : Abc_SclObjLoad(p, pObj)->fall); }
static inline double Abc_SclObjTimePs( SC_Man * p, Abc_Obj_t * pObj, int fRise ) { return SC_LibTimePs(p->pLib, fRise ? Abc_SclObjTime(p, pObj)->rise : Abc_SclObjTime(p, pObj)->fall); }
@@ -168,6 +170,8 @@ static inline SC_Man * Abc_SclManAlloc( SC_Lib * pLib, Abc_Ntk_t * pNtk )
p->vUpdates2 = Vec_IntAlloc( 1000 );
p->vLoads2 = Vec_FltAlloc( 1000 );
p->vLoads3 = Vec_FltAlloc( 1000 );
+ p->vTimes2 = Vec_FltAlloc( 1000 );
+ p->vTimes3 = Vec_FltAlloc( 1000 );
// intermediate data
p->vNode2Gain = Vec_FltStart( p->nObjs );
p->vNode2Gate = Vec_IntStart( p->nObjs );
@@ -185,6 +189,8 @@ static inline void Abc_SclManFree( SC_Man * p )
Vec_FltFreeP( &p->vNode2Gain );
Vec_IntFreeP( &p->vNode2Gate );
// intermediate data
+ Vec_FltFreeP( &p->vTimes2 );
+ Vec_FltFreeP( &p->vTimes3 );
Vec_FltFreeP( &p->vLoads2 );
Vec_FltFreeP( &p->vLoads3 );
Vec_IntFreeP( &p->vUpdates );
@@ -233,7 +239,7 @@ static inline void Abc_SclManCleanTime( SC_Man * p )
/**Function*************************************************************
- Synopsis [Stores/retrivies timing information for the logic cone.]
+ Synopsis [Stores/retrivies information for the logic cone.]
Description []
@@ -242,26 +248,55 @@ static inline void Abc_SclManCleanTime( SC_Man * p )
SeeAlso []
***********************************************************************/
-static inline void Abc_SclConeStore( SC_Man * p, Vec_Int_t * vCone )
+static inline void Abc_SclLoadStore( SC_Man * p, Abc_Obj_t * pObj )
{
- Abc_Obj_t * pObj;
+ Abc_Obj_t * pFanin;
int i;
- Abc_NtkForEachObjVec( vCone, p->pNtk, pObj, i )
+ Vec_FltClear( p->vLoads2 );
+ Abc_ObjForEachFanin( pObj, pFanin, i )
{
- *Abc_SclObjTime2(p, pObj) = *Abc_SclObjTime(p, pObj);
- *Abc_SclObjSlew2(p, pObj) = *Abc_SclObjSlew(p, pObj);
+ Vec_FltPush( p->vLoads2, Abc_SclObjLoad(p, pFanin)->rise );
+ Vec_FltPush( p->vLoads2, Abc_SclObjLoad(p, pFanin)->fall );
}
}
-static inline void Abc_SclConeRestore( SC_Man * p, Vec_Int_t * vCone )
+static inline void Abc_SclLoadRestore( SC_Man * p, Abc_Obj_t * pObj )
{
- Abc_Obj_t * pObj;
+ Abc_Obj_t * pFanin;
+ int i, k = 0;
+ Abc_ObjForEachFanin( pObj, pFanin, i )
+ {
+ Abc_SclObjLoad(p, pFanin)->rise = Vec_FltEntry(p->vLoads2, k++);
+ Abc_SclObjLoad(p, pFanin)->fall = Vec_FltEntry(p->vLoads2, k++);
+ }
+ assert( Vec_FltSize(p->vLoads2) == k );
+}
+
+static inline void Abc_SclLoadStore3( SC_Man * p, Abc_Obj_t * pObj )
+{
+ Abc_Obj_t * pFanin;
int i;
- Abc_NtkForEachObjVec( vCone, p->pNtk, pObj, i )
+ Vec_FltClear( p->vLoads3 );
+ Vec_FltPush( p->vLoads3, Abc_SclObjLoad(p, pObj)->rise );
+ Vec_FltPush( p->vLoads3, Abc_SclObjLoad(p, pObj)->fall );
+ Abc_ObjForEachFanin( pObj, pFanin, i )
{
- *Abc_SclObjTime(p, pObj) = *Abc_SclObjTime2(p, pObj);
- *Abc_SclObjSlew(p, pObj) = *Abc_SclObjSlew2(p, pObj);
+ Vec_FltPush( p->vLoads3, Abc_SclObjLoad(p, pFanin)->rise );
+ Vec_FltPush( p->vLoads3, Abc_SclObjLoad(p, pFanin)->fall );
}
}
+static inline void Abc_SclLoadRestore3( SC_Man * p, Abc_Obj_t * pObj )
+{
+ Abc_Obj_t * pFanin;
+ int i, k = 0;
+ Abc_SclObjLoad(p, pObj)->rise = Vec_FltEntry(p->vLoads3, k++);
+ Abc_SclObjLoad(p, pObj)->fall = Vec_FltEntry(p->vLoads3, k++);
+ Abc_ObjForEachFanin( pObj, pFanin, i )
+ {
+ Abc_SclObjLoad(p, pFanin)->rise = Vec_FltEntry(p->vLoads3, k++);
+ Abc_SclObjLoad(p, pFanin)->fall = Vec_FltEntry(p->vLoads3, k++);
+ }
+ assert( Vec_FltSize(p->vLoads3) == k );
+}
static inline void Abc_SclConeClear( SC_Man * p, Vec_Int_t * vCone )
{
SC_Pair Zero = { 0.0, 0.0 };
@@ -273,66 +308,76 @@ static inline void Abc_SclConeClear( SC_Man * p, Vec_Int_t * vCone )
*Abc_SclObjSlew(p, pObj) = Zero;
}
}
-
-/**Function*************************************************************
-
- Synopsis [Stores/retrivies load information.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-static inline void Abc_SclLoadStore( SC_Man * p, Abc_Obj_t * pObj )
+static inline void Abc_SclConeStore( SC_Man * p, Vec_Int_t * vCone )
{
- Abc_Obj_t * pFanin;
+ Abc_Obj_t * pObj;
int i;
- Vec_FltClear( p->vLoads2 );
- Abc_ObjForEachFanin( pObj, pFanin, i )
+ Vec_FltClear( p->vTimes2 );
+ Abc_NtkForEachObjVec( vCone, p->pNtk, pObj, i )
{
- Vec_FltPush( p->vLoads2, Abc_SclObjLoad(p, pFanin)->rise );
- Vec_FltPush( p->vLoads2, Abc_SclObjLoad(p, pFanin)->fall );
+ Vec_FltPush( p->vTimes2, Abc_SclObjTime(p, pObj)->rise );
+ Vec_FltPush( p->vTimes2, Abc_SclObjTime(p, pObj)->fall );
+ Vec_FltPush( p->vTimes2, Abc_SclObjSlew(p, pObj)->rise );
+ Vec_FltPush( p->vTimes2, Abc_SclObjSlew(p, pObj)->fall );
+ *Abc_SclObjTime2(p, pObj) = *Abc_SclObjTime(p, pObj);
+ *Abc_SclObjSlew2(p, pObj) = *Abc_SclObjSlew(p, pObj);
}
}
-static inline void Abc_SclLoadRestore( SC_Man * p, Abc_Obj_t * pObj )
+static inline void Abc_SclConeRestore( SC_Man * p, Vec_Int_t * vCone )
{
- Abc_Obj_t * pFanin;
- int i;
- assert( Vec_FltSize(p->vLoads2) == 2 * Abc_ObjFaninNum(pObj) );
- Abc_ObjForEachFanin( pObj, pFanin, i )
+ Abc_Obj_t * pObj;
+ int i, k = 0;
+ Abc_NtkForEachObjVec( vCone, p->pNtk, pObj, i )
{
- Abc_SclObjLoad(p, pFanin)->rise = Vec_FltEntry(p->vLoads2, 2*i);
- Abc_SclObjLoad(p, pFanin)->fall = Vec_FltEntry(p->vLoads2, 2*i+1);
+ Abc_SclObjTime(p, pObj)->rise = Vec_FltEntry(p->vTimes2, k++);
+ Abc_SclObjTime(p, pObj)->fall = Vec_FltEntry(p->vTimes2, k++);
+ Abc_SclObjSlew(p, pObj)->rise = Vec_FltEntry(p->vTimes2, k++);
+ Abc_SclObjSlew(p, pObj)->fall = Vec_FltEntry(p->vTimes2, k++);
+ *Abc_SclObjTime(p, pObj) = *Abc_SclObjTime2(p, pObj);
+ *Abc_SclObjSlew(p, pObj) = *Abc_SclObjSlew2(p, pObj);
}
+ assert( Vec_FltSize(p->vTimes2) == k );
}
-
-static inline void Abc_SclLoadStore3( SC_Man * p, Abc_Obj_t * pObj )
+static inline void Abc_SclEvalStore( SC_Man * p, Vec_Int_t * vCone )
{
- Abc_Obj_t * pFanin;
+ Abc_Obj_t * pObj;
int i;
- Vec_FltClear( p->vLoads3 );
- Abc_ObjForEachFanin( pObj, pFanin, i )
+ Vec_FltClear( p->vTimes3 );
+ Abc_NtkForEachObjVec( vCone, p->pNtk, pObj, i )
{
- Vec_FltPush( p->vLoads3, Abc_SclObjLoad(p, pFanin)->rise );
- Vec_FltPush( p->vLoads3, Abc_SclObjLoad(p, pFanin)->fall );
+ Vec_FltPush( p->vTimes3, Abc_SclObjTime(p, pObj)->rise );
+ Vec_FltPush( p->vTimes3, Abc_SclObjTime(p, pObj)->fall );
}
- Vec_FltPush( p->vLoads3, Abc_SclObjLoad(p, pObj)->rise );
- Vec_FltPush( p->vLoads3, Abc_SclObjLoad(p, pObj)->fall );
}
-static inline void Abc_SclLoadRestore3( SC_Man * p, Abc_Obj_t * pObj )
+static inline float Abc_SclEvalPerform( SC_Man * p, Vec_Int_t * vCone )
{
- Abc_Obj_t * pFanin;
- int i;
- assert( Vec_FltSize(p->vLoads3) == 2 * Abc_ObjFaninNum(pObj) + 2 );
- Abc_ObjForEachFanin( pObj, pFanin, i )
+ Abc_Obj_t * pObj;
+ float Diff, Multi = 2.0, Eval = 0;
+ int i, k = 0;
+ Abc_NtkForEachObjVec( vCone, p->pNtk, pObj, i )
+ {
+ Diff = (Vec_FltEntry(p->vTimes3, k++) - Abc_SclObjTime(p, pObj)->rise);
+ Diff += (Vec_FltEntry(p->vTimes3, k++) - Abc_SclObjTime(p, pObj)->fall);
+ Eval += 0.5 * (Diff > 0 ? Diff : Multi * Diff);
+ }
+ assert( Vec_FltSize(p->vTimes3) == k );
+ return Eval / Vec_IntSize(vCone);
+}
+static inline float Abc_SclEvalPerformLegal( SC_Man * p, Vec_Int_t * vCone, float D )
+{
+ Abc_Obj_t * pObj;
+ float Rise, Fall, Eval = 0;
+ int i, k = 0;
+ Abc_NtkForEachObjVec( vCone, p->pNtk, pObj, i )
{
- Abc_SclObjLoad(p, pFanin)->rise = Vec_FltEntry(p->vLoads3, 2*i);
- Abc_SclObjLoad(p, pFanin)->fall = Vec_FltEntry(p->vLoads3, 2*i+1);
+ Rise = Vec_FltEntry(p->vTimes3, k++) - Abc_SclObjTime(p, pObj)->rise;
+ Fall = Vec_FltEntry(p->vTimes3, k++) - Abc_SclObjTime(p, pObj)->fall;
+ if ( Rise + Abc_SclObjGetSlackR(p, pObj, D) < 0 || Fall + Abc_SclObjGetSlackF(p, pObj, D) < 0 )
+ return -1;
+ Eval = 0.5 * Rise + 0.5 * Fall;
}
- Abc_SclObjLoad(p, pObj)->rise = Vec_FltEntry(p->vLoads3, 2*i);
- Abc_SclObjLoad(p, pObj)->fall = Vec_FltEntry(p->vLoads3, 2*i+1);
+ assert( Vec_FltSize(p->vTimes3) == k );
+ return Eval / Vec_IntSize(vCone);
}
/**Function*************************************************************