summaryrefslogtreecommitdiffstats
path: root/src/base/acb/acbUtil.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2017-03-28 14:29:56 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2017-03-28 14:29:56 -0700
commitfdfb8888911220cbd7e6774dda1f90f3c9637fd5 (patch)
tree97224cb817f3690838484328b52e390c02e0580f /src/base/acb/acbUtil.c
parent2ccd0f9b85cb42d3e6e894a71cd8e962b2d3bd12 (diff)
downloadabc-fdfb8888911220cbd7e6774dda1f90f3c9637fd5.tar.gz
abc-fdfb8888911220cbd7e6774dda1f90f3c9637fd5.tar.bz2
abc-fdfb8888911220cbd7e6774dda1f90f3c9637fd5.zip
Experiments with don't-cares.
Diffstat (limited to 'src/base/acb/acbUtil.c')
-rw-r--r--src/base/acb/acbUtil.c250
1 files changed, 103 insertions, 147 deletions
diff --git a/src/base/acb/acbUtil.c b/src/base/acb/acbUtil.c
index ab9bf44c..cc8b9f11 100644
--- a/src/base/acb/acbUtil.c
+++ b/src/base/acb/acbUtil.c
@@ -33,38 +33,7 @@ ABC_NAMESPACE_IMPL_START
/**Function*************************************************************
- Synopsis []
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-void Acb_ObjAddFanout( Acb_Ntk_t * p, int iObj )
-{
- int k, iFanin, * pFanins;
- Acb_ObjForEachFaninFast( p, iObj, pFanins, iFanin, k )
- Vec_IntPush( Vec_WecEntry(&p->vFanouts, iFanin), iObj );
-}
-void Acb_ObjRemoveFanout( Acb_Ntk_t * p, int iObj )
-{
- int k, iFanin, * pFanins;
- Acb_ObjForEachFaninFast( p, iObj, pFanins, iFanin, k )
- Vec_IntRemove( Vec_WecEntry(&p->vFanouts, iFanin), iObj );
-}
-void Acb_NtkCreateFanout( Acb_Ntk_t * p )
-{
- int iObj;
- Vec_WecInit( &p->vFanouts, Acb_NtkObjNumMax(p) );
- Acb_NtkForEachObj( p, iObj )
- Acb_ObjAddFanout( p, iObj );
-}
-
-/**Function*************************************************************
-
- Synopsis []
+ Synopsis [Collecting TFI and TFO.]
Description []
@@ -86,9 +55,14 @@ void Acb_ObjCollectTfi_rec( Acb_Ntk_t * p, int iObj, int fTerm )
}
Vec_Int_t * Acb_ObjCollectTfi( Acb_Ntk_t * p, int iObj, int fTerm )
{
+ int i;
Vec_IntClear( &p->vArray0 );
Acb_NtkIncTravId( p );
- Acb_ObjCollectTfi_rec( p, iObj, fTerm );
+ if ( iObj > 0 )
+ Acb_ObjCollectTfi_rec( p, iObj, fTerm );
+ else
+ Acb_NtkForEachCo( p, iObj, i )
+ Acb_ObjCollectTfi_rec( p, iObj, fTerm );
return &p->vArray0;
}
@@ -105,16 +79,20 @@ void Acb_ObjCollectTfo_rec( Acb_Ntk_t * p, int iObj, int fTerm )
}
Vec_Int_t * Acb_ObjCollectTfo( Acb_Ntk_t * p, int iObj, int fTerm )
{
+ int i;
Vec_IntClear( &p->vArray1 );
Acb_NtkIncTravId( p );
- Acb_ObjCollectTfo_rec( p, iObj, fTerm );
+ if ( iObj > 0 )
+ Acb_ObjCollectTfo_rec( p, iObj, fTerm );
+ else
+ Acb_NtkForEachCi( p, iObj, i )
+ Acb_ObjCollectTfo_rec( p, iObj, fTerm );
return &p->vArray1;
}
-
/**Function*************************************************************
- Synopsis []
+ Synopsis [Computing and updating direct and reverse logic level.]
Description []
@@ -132,19 +110,12 @@ int Acb_ObjComputeLevelD( Acb_Ntk_t * p, int iObj )
}
int Acb_NtkComputeLevelD( Acb_Ntk_t * p, Vec_Int_t * vTfo )
{
+ // it is assumed that vTfo contains CO nodes and level of new nodes was already updated
int i, iObj, Level = 0;
- if ( vTfo == NULL )
- {
+ if ( !Acb_NtkHasObjLevelD( p ) )
Acb_NtkCleanObjLevelD( p );
- Acb_NtkForEachObj( p, iObj )
- Acb_ObjComputeLevelD( p, iObj );
- }
- else
- {
- // it is assumed that vTfo contains CO nodes and level of new nodes was already updated
- Vec_IntForEachEntry( vTfo, iObj, i )
- Acb_ObjComputeLevelD( p, iObj );
- }
+ Vec_IntForEachEntryReverse( vTfo, iObj, i )
+ Acb_ObjComputeLevelD( p, iObj );
Acb_NtkForEachCo( p, iObj, i )
Level = Abc_MaxInt( Level, Acb_ObjLevelD(p, iObj) );
p->LevelMax = Level;
@@ -160,28 +131,27 @@ int Acb_ObjComputeLevelR( Acb_Ntk_t * p, int iObj )
}
int Acb_NtkComputeLevelR( Acb_Ntk_t * p, Vec_Int_t * vTfi )
{
+ // it is assumed that vTfi contains CI nodes
int i, iObj, Level = 0;
- if ( vTfi == NULL )
- {
- Acb_NtkCleanObjLevelR( p );
- Acb_NtkForEachObjReverse( p, iObj )
- Acb_ObjComputeLevelR( p, iObj );
- }
- else
- {
- // it is assumed that vTfi contains CI nodes
- Vec_IntForEachEntryReverse( vTfi, iObj, i )
- Acb_ObjComputeLevelR( p, iObj );
- }
+ if ( !Acb_NtkHasObjLevelD( p ) )
+ Acb_NtkCleanObjLevelD( p );
+ Vec_IntForEachEntryReverse( vTfi, iObj, i )
+ Acb_ObjComputeLevelR( p, iObj );
Acb_NtkForEachCi( p, iObj, i )
Level = Abc_MaxInt( Level, Acb_ObjLevelR(p, iObj) );
assert( p->LevelMax == Level );
return Level;
}
+void Acb_NtkUpdateLevelD( Acb_Ntk_t * p, int Pivot )
+{
+ Vec_Int_t * vTfo = Acb_ObjCollectTfo( p, Pivot, 1 );
+ Acb_NtkComputeLevelD( p, vTfo );
+}
+
/**Function*************************************************************
- Synopsis []
+ Synopsis [Computing and updating direct and reverse path count.]
Description []
@@ -192,9 +162,11 @@ int Acb_NtkComputeLevelR( Acb_Ntk_t * p, Vec_Int_t * vTfi )
***********************************************************************/
int Acb_ObjSlack( Acb_Ntk_t * p, int iObj )
{
- assert( !Acb_ObjIsCio(p, iObj) + p->LevelMax >= Acb_ObjLevelD(p, iObj) + Acb_ObjLevelR(p, iObj) );
- return !Acb_ObjIsCio(p, iObj) + p->LevelMax - Acb_ObjLevelD(p, iObj) - Acb_ObjLevelR(p, iObj);
+ int LevelSum = Acb_ObjLevelD(p, iObj) + Acb_ObjLevelR(p, iObj);
+ assert( !Acb_ObjIsCio(p, iObj) + p->LevelMax >= LevelSum );
+ return !Acb_ObjIsCio(p, iObj) + p->LevelMax - LevelSum;
}
+
int Acb_ObjComputePathD( Acb_Ntk_t * p, int iObj )
{
int * pFanins, iFanin, k, Path = 0;
@@ -207,26 +179,13 @@ int Acb_ObjComputePathD( Acb_Ntk_t * p, int iObj )
int Acb_NtkComputePathsD( Acb_Ntk_t * p, Vec_Int_t * vTfo )
{
int i, iObj, Path = 0;
- if ( vTfo == NULL )
- {
- Acb_NtkCleanObjPathD( p );
- Acb_NtkForEachCi( p, iObj, i )
- if ( Acb_ObjLevelR(p, iObj) == p->LevelMax )
- Acb_ObjSetPathD( p, iObj, 1 );
- Acb_NtkForEachObj( p, iObj )
- if ( !Acb_ObjIsCi(p, iObj) && !Acb_ObjSlack(p, iObj) )
- Acb_ObjComputePathD( p, iObj );
- }
- else
- {
- // it is assumed that vTfo contains CO nodes
- assert( Acb_ObjSlack(p, Vec_IntEntry(vTfo, 0)) );
- Vec_IntForEachEntry( vTfo, iObj, i )
- if ( !Acb_ObjSlack(p, iObj) )
- Acb_ObjComputePathD( p, iObj );
- else
- Acb_ObjSetPathD( p, iObj, 0 );
- }
+ // it is assumed that vTfo contains CO nodes
+ //assert( Acb_ObjSlack(p, Vec_IntEntry(vTfo, 0)) );
+ Vec_IntForEachEntryReverse( vTfo, iObj, i )
+ if ( !Acb_ObjSlack(p, iObj) )
+ Acb_ObjComputePathD( p, iObj );
+ else
+ Acb_ObjSetPathD( p, iObj, 0 );
Acb_NtkForEachCo( p, iObj, i )
Path += Acb_ObjPathD(p, iObj);
p->nPaths = Path;
@@ -245,55 +204,39 @@ int Acb_ObjComputePathR( Acb_Ntk_t * p, int iObj )
int Acb_NtkComputePathsR( Acb_Ntk_t * p, Vec_Int_t * vTfi )
{
int i, iObj, Path = 0;
- if ( vTfi == NULL )
- {
- Acb_NtkCleanObjPathR( p );
- Acb_NtkForEachCo( p, iObj, i )
- if ( Acb_ObjLevelD(p, iObj) == p->LevelMax )
- Acb_ObjSetPathR( p, iObj, 1 );
- Acb_NtkForEachObjReverse( p, iObj )
- if ( !Acb_ObjIsCo(p, iObj) && !Acb_ObjSlack(p, iObj) )
- Acb_ObjComputePathR( p, iObj );
- }
- else
- {
- // it is assumed that vTfi contains CI nodes
- assert( Acb_ObjSlack(p, Vec_IntEntry(vTfi, 0)) );
- Vec_IntForEachEntryReverse( vTfi, iObj, i )
- if ( !Acb_ObjSlack(p, iObj) )
- Acb_ObjComputePathR( p, iObj );
- else
- Acb_ObjSetPathR( p, iObj, 0 );
- }
+ // it is assumed that vTfi contains CI nodes
+ //assert( Acb_ObjSlack(p, Vec_IntEntry(vTfi, 0)) );
+ Vec_IntForEachEntryReverse( vTfi, iObj, i )
+ if ( !Acb_ObjSlack(p, iObj) )
+ Acb_ObjComputePathR( p, iObj );
+ else
+ Acb_ObjSetPathR( p, iObj, 0 );
Acb_NtkForEachCi( p, iObj, i )
Path += Acb_ObjPathR(p, iObj);
assert( p->nPaths == Path );
return Path;
}
-
int Acb_NtkComputePaths( Acb_Ntk_t * p )
{
- Acb_NtkComputeLevelD( p, NULL );
- Acb_NtkComputeLevelR( p, NULL );
- Acb_NtkComputePathsD( p, NULL );
- Acb_NtkComputePathsR( p, NULL );
+ Vec_Int_t * vTfi = Acb_ObjCollectTfi( p, -1, 1 );
+ Vec_Int_t * vTfo = Acb_ObjCollectTfo( p, -1, 1 );
+ Acb_NtkComputeLevelD( p, vTfi );
+ Acb_NtkComputeLevelR( p, vTfo );
+ Acb_NtkComputePathsD( p, vTfi );
+ Acb_NtkComputePathsR( p, vTfo );
return p->nPaths;
}
-
void Abc_NtkComputePaths( Abc_Ntk_t * p )
{
extern Acb_Ntk_t * Acb_NtkFromAbc( Abc_Ntk_t * p );
Acb_Ntk_t * pNtk = Acb_NtkFromAbc( p );
-
Acb_NtkCreateFanout( pNtk );
printf( "Computed %d paths.\n", Acb_NtkComputePaths(pNtk) );
-
Acb_ManFree( pNtk->pDesign );
}
-
/**Function*************************************************************
Synopsis []
@@ -305,42 +248,47 @@ void Abc_NtkComputePaths( Abc_Ntk_t * p )
SeeAlso []
***********************************************************************/
-int Acb_ObjPath( Acb_Ntk_t * p, int iObj )
-{
- return Acb_ObjPathD(p, iObj) + Acb_ObjPathR(p, iObj);
-}
-void Acb_ObjUpdateTiming( Acb_Ntk_t * p, int iObj )
-{
-}
-void Acb_NtkUpdateTiming( Acb_Ntk_t * p, int iObj )
+void Acb_ObjUpdatePriority( Acb_Ntk_t * p, int iObj )
{
- int i, Entry;
- if ( iObj > 0 )
+ int nPaths;
+ if ( p->vQue == NULL )
{
- // assuming that level of the new nodes is up to date
- Vec_Int_t * vTfi = Acb_ObjCollectTfi( p, iObj, 1 );
- Vec_Int_t * vTfo = Acb_ObjCollectTfo( p, iObj, 1 );
- Acb_NtkComputeLevelD( p, vTfo );
- Acb_NtkComputeLevelR( p, vTfi );
- Acb_NtkComputePathsD( p, vTfo );
- Acb_NtkComputePathsR( p, vTfi );
- Vec_IntForEachEntry( vTfi, Entry, i )
- Acb_ObjUpdateTiming( p, Entry );
- Vec_IntForEachEntry( vTfo, Entry, i )
- Acb_ObjUpdateTiming( p, Entry );
+ Acb_NtkCleanObjCounts( p );
+ p->vQue = Vec_QueAlloc( 1000 );
+ Vec_QueSetPriority( p->vQue, Vec_FltArrayP(&p->vCounts) );
}
+ nPaths = Acb_ObjPathD(p, iObj) + Acb_ObjPathR(p, iObj);
+ if ( nPaths == 0 )
+ return;
+ Acb_ObjSetCounts( p, iObj, (float)nPaths );
+ if ( Vec_QueIsMember( p->vQue, iObj ) )
+ Vec_QueUpdate( p->vQue, iObj );
else
+ Vec_QuePush( p->vQue, iObj );
+}
+void Acb_NtkUpdateTiming( Acb_Ntk_t * p, int iObj )
+{
+ int i, Entry, LevelMax = p->LevelMax;
+ // assuming that level of the new nodes is up to date
+ Vec_Int_t * vTfi = Acb_ObjCollectTfi( p, iObj, 1 );
+ Vec_Int_t * vTfo = Acb_ObjCollectTfo( p, iObj, 1 );
+ Acb_NtkComputeLevelD( p, vTfo );
+ Acb_NtkComputeLevelR( p, vTfi );
+ if ( iObj > 0 && LevelMax > p->LevelMax ) // reduced level
{
- Acb_NtkComputeLevelD( p, NULL );
- Acb_NtkComputeLevelR( p, NULL );
- Acb_NtkComputePathsD( p, NULL );
- Acb_NtkComputePathsR( p, NULL );
- Acb_NtkForEachNode( p, Entry )
- Acb_ObjUpdateTiming( p, Entry );
+ vTfi = Acb_ObjCollectTfi( p, -1, 1 );
+ vTfo = Acb_ObjCollectTfo( p, -1, 1 );
+ Vec_QueClear( p->vQue );
+ // add backup here
}
+ Acb_NtkComputePathsD( p, vTfo );
+ Acb_NtkComputePathsR( p, vTfi );
+ Vec_IntForEachEntry( vTfi, Entry, i )
+ Acb_ObjUpdatePriority( p, Entry );
+ Vec_IntForEachEntry( vTfo, Entry, i )
+ Acb_ObjUpdatePriority( p, Entry );
}
-
/**Function*************************************************************
Synopsis []
@@ -352,20 +300,28 @@ void Acb_NtkUpdateTiming( Acb_Ntk_t * p, int iObj )
SeeAlso []
***********************************************************************/
+void Acb_NtkCreateNode( Acb_Ntk_t * p, word uTruth, Vec_Int_t * vSupp )
+{
+ int Pivot = Acb_ObjAlloc( p, ABC_OPER_LUT, Vec_IntSize(vSupp), 0 );
+ Acb_ObjSetTruth( p, Pivot, uTruth );
+ Acb_ObjAddFanins( p, Pivot, vSupp );
+ Acb_ObjAddFaninFanout( p, Pivot );
+ Acb_ObjComputeLevelD( p, Pivot );
+}
void Acb_NtkUpdateNode( Acb_Ntk_t * p, int Pivot, word uTruth, Vec_Int_t * vSupp )
{
- int i, iFanin;
Vec_WrdSetEntry( &p->vObjTruth, Pivot, uTruth );
- Acb_ObjRemoveFanout( p, Pivot );
- Acb_ObjRemoveFanins( p, Pivot );
- Vec_IntForEachEntry( vSupp, iFanin, i )
- Acb_ObjAddFanin( p, Pivot, iFanin );
- Acb_ObjAddFanout( p, Pivot );
- Acb_NtkUpdateTiming( p, Pivot );
Vec_IntErase( Vec_WecEntry(&p->vCnfs, Pivot) );
+ Acb_ObjRemoveFaninFanout( p, Pivot );
+ Acb_ObjRemoveFanins( p, Pivot );
+ Acb_ObjAddFanins( p, Pivot, vSupp );
+ Acb_ObjAddFaninFanout( p, Pivot );
+ if ( p->vQue == NULL )
+ Acb_NtkUpdateLevelD( p, Pivot );
+ else
+ Acb_NtkUpdateTiming( p, Pivot );
}
-
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////