summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2011-12-28 21:15:19 +0700
committerAlan Mishchenko <alanmi@berkeley.edu>2011-12-28 21:15:19 +0700
commitafc8553f8976724149185b3199eb5264a4d603e7 (patch)
tree1d86c0c4f751fcd13c5ccd40de295ad3f3f8a007
parentc59e2e9c962590540c2e78ec26f991c0251a47d5 (diff)
downloadabc-afc8553f8976724149185b3199eb5264a4d603e7.tar.gz
abc-afc8553f8976724149185b3199eb5264a4d603e7.tar.bz2
abc-afc8553f8976724149185b3199eb5264a4d603e7.zip
Experiments with flattening hierarchy.
-rw-r--r--src/base/abc/abcHieCec.c296
1 files changed, 288 insertions, 8 deletions
diff --git a/src/base/abc/abcHieCec.c b/src/base/abc/abcHieCec.c
index 151badfb..4e49aea2 100644
--- a/src/base/abc/abcHieCec.c
+++ b/src/base/abc/abcHieCec.c
@@ -285,7 +285,7 @@ Gia_Man_t * Abc_NtkDeriveFlatGia( Abc_Ntk_t * pNtk )
/**Function*************************************************************
- Synopsis [Count the number of instances and I/O pins in the hierarchy.]
+ Synopsis [Counts the total number of AIG nodes before flattening.]
Description []
@@ -294,17 +294,262 @@ Gia_Man_t * Abc_NtkDeriveFlatGia( Abc_Ntk_t * pNtk )
SeeAlso []
***********************************************************************/
-void Abc_NtkCountInstances_rec( Abc_Ntk_t * pNtk, int * pCountInst, int * pCountPins )
+int Abc_NtkCountAndNodes( Vec_Ptr_t * vOrder )
{
- Vec_Ptr_t * vOrder = (Vec_Ptr_t *)pNtk->pData;
+ Gia_Man_t * pGiaBox;
+ Abc_Ntk_t * pNtkModel;
+ Abc_Obj_t * pObj;
+ int i, Counter = 0;
+ Vec_PtrForEachEntry( Abc_Obj_t *, vOrder, pObj, i )
+ {
+ if ( Abc_ObjIsNode(pObj) )
+ {
+ Counter++;
+ continue;
+ }
+ assert( Abc_ObjIsBox(pObj) );
+ pNtkModel = (Abc_Ntk_t *)pObj->pData;
+ pGiaBox = (Gia_Man_t *)pNtkModel->pData;
+ Counter += Gia_ManAndNum(pGiaBox);
+ }
+ return Counter;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Flattens the logic hierarchy of the netlist.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+Gia_Man_t * Abc_NtkDeriveFlatGia2Derive( Abc_Ntk_t * pNtk, Vec_Ptr_t * vOrder )
+{
+ int gFanins[16];
+ Abc_Ntk_t * pNtkModel;
+ Gia_Man_t * pGiaBox, * pGia = NULL;
+ Gia_Obj_t * pGiaObj;
+ Abc_Obj_t * pTerm, * pObj;
+ int i, k;
+
+ assert( Abc_NtkIsNetlist(pNtk) );
+ assert( !Abc_NtkLatchNum(pNtk) );
+ Abc_NtkFillTemp( pNtk );
+
+ // start the network
+ pGia = Gia_ManStart( (1<<15) );
+ pGia->pName = Gia_UtilStrsav( Abc_NtkName(pNtk) );
+ Gia_ManHashAlloc( pGia );
+ // create PIs
+ Abc_NtkForEachPi( pNtk, pTerm, i )
+ Abc_ObjFanout0(pTerm)->iTemp = Gia_ManAppendCi( pGia );
+ // recursively flatten hierarchy
+ Vec_PtrForEachEntry( Abc_Obj_t *, vOrder, pObj, i )
+ {
+ if ( Abc_ObjIsNode(pObj) )
+ {
+ char * pSop = (char *)pObj->pData;
+ assert( Abc_ObjFaninNum(pObj) <= 16 );
+ assert( Abc_ObjFaninNum(pObj) == Abc_SopGetVarNum(pSop) );
+ Abc_ObjForEachFanin( pObj, pTerm, k )
+ {
+ gFanins[k] = pTerm->iTemp;
+ assert( gFanins[k] >= 0 );
+ }
+ Abc_ObjFanout0(pObj)->iTemp = Abc_NtkDeriveFlatGiaSop( pGia, gFanins, pSop );
+ continue;
+ }
+ assert( Abc_ObjIsBox(pObj) );
+ pNtkModel = (Abc_Ntk_t *)pObj->pData;
+ // check the match between the number of actual and formal parameters
+ assert( Abc_ObjFaninNum(pObj) == Abc_NtkPiNum(pNtkModel) );
+ assert( Abc_ObjFanoutNum(pObj) == Abc_NtkPoNum(pNtkModel) );
+/*
+ // assign PIs
+ Abc_ObjForEachFanin( pObj, pTerm, k )
+ Abc_ObjFanout0( Abc_NtkPi(pNtkModel, k) )->iTemp = Abc_ObjFanin0(pTerm)->iTemp;
+ // call recursively
+ Abc_NtkDeriveFlatGia_rec( pGia, pNtkModel );
+ // assign POs
+ Abc_ObjForEachFanout( pObj, pTerm, k )
+ Abc_ObjFanout0(pTerm)->iTemp = Abc_ObjFanin0( Abc_NtkPo(pNtkModel, k) )->iTemp;
+*/
+ // duplicate the AIG
+ pGiaBox = (Gia_Man_t *)pNtkModel->pData;
+ assert( Abc_ObjFaninNum(pObj) == Gia_ManPiNum(pGiaBox) );
+ assert( Abc_ObjFanoutNum(pObj) == Gia_ManPoNum(pGiaBox) );
+ Gia_ManFillValue( pGiaBox );
+ Gia_ManConst0(pGiaBox)->Value = 0;
+ Abc_ObjForEachFanin( pObj, pTerm, k )
+ Gia_ManPi(pGiaBox, k)->Value = Abc_ObjFanin0(pTerm)->iTemp;
+ Gia_ManForEachAnd( pGiaBox, pGiaObj, k )
+ pGiaObj->Value = Gia_ManHashAnd( pGia, Gia_ObjFanin0Copy(pGiaObj), Gia_ObjFanin1Copy(pGiaObj) );
+ Abc_ObjForEachFanout( pObj, pTerm, k )
+ Abc_ObjFanout0(pTerm)->iTemp = Gia_ObjFanin0Copy(Gia_ManPo(pGiaBox, k));
+ }
+ // create POs
+ Abc_NtkForEachPo( pNtk, pTerm, i )
+ Gia_ManAppendCo( pGia, Abc_ObjFanin0(pTerm)->iTemp );
+ // prepare return value
+ Gia_ManHashStop( pGia );
+ Gia_ManSetRegNum( pGia, 0 );
+ pGia = Gia_ManCleanup( pGiaBox = pGia );
+ Gia_ManStop( pGiaBox );
+
+ printf( "%8d -> ", Abc_NtkCountAndNodes(vOrder) );
+ Gia_ManPrintStats( pGia, 0 );
+ return pGia;
+}
+/*
+void Abc_NtkDeriveFlatGia2_rec( Abc_Ntk_t * pNtk )
+{
+ Vec_Ptr_t * vOrder;
Abc_Obj_t * pObj;
int i;
- *pCountInst += 1;
- *pCountPins += Abc_NtkPiNum(pNtk) + Abc_NtkPoNum(pNtk);
+ if ( pNtk->pData != NULL )
+ return;
+ vOrder = Abc_NtkDfsBoxes( pNtk );
Vec_PtrForEachEntry( Abc_Obj_t *, vOrder, pObj, i )
if ( Abc_ObjIsBox(pObj) )
- Abc_NtkCountInstances_rec( (Abc_Ntk_t *)pObj->pData, pCountInst, pCountPins );
+ Abc_NtkDeriveFlatGia2_rec( (Abc_Ntk_t *)pObj->pData );
+ pNtk->pData = Abc_NtkDeriveFlatGia2Derive( pNtk, vOrder );
+ Vec_PtrFree( vOrder );
+}
+
+Gia_Man_t * Abc_NtkDeriveFlatGia2( Abc_Ntk_t * pNtk )
+{
+ Vec_Ptr_t * vMods;
+ Abc_Ntk_t * pModel;
+ Gia_Man_t * pGia = NULL;
+ int i;
+
+ assert( Abc_NtkIsNetlist(pNtk) );
+ assert( !Abc_NtkLatchNum(pNtk) );
+
+ vMods = pNtk->pDesign->vModules;
+ Vec_PtrForEachEntry( Abc_Ntk_t *, vMods, pModel, i )
+ pModel->pData = NULL;
+
+ Abc_NtkDeriveFlatGia2_rec( pNtk );
+ pGia = pNtk->pData; pNtk->pData = NULL;
+
+ Vec_PtrForEachEntry( Abc_Ntk_t *, vMods, pModel, i )
+ Gia_ManStopP( (Gia_Man_t **)&pModel->pData );
+
+ return pGia;
}
+*/
+Gia_Man_t * Abc_NtkDeriveFlatGia2( Abc_Ntk_t * pNtk, Vec_Ptr_t * vModels )
+{
+ Abc_Ntk_t * pModel;
+ Vec_Ptr_t * vOrder;
+ Gia_Man_t * pGia = NULL;
+ int i;
+
+ Vec_PtrForEachEntry( Abc_Ntk_t *, vModels, pModel, i )
+ {
+ vOrder = Abc_NtkDfsBoxes( pModel );
+ pModel->pData = Abc_NtkDeriveFlatGia2Derive( pModel, vOrder );
+ Vec_PtrFree( vOrder );
+ }
+
+ pGia = pModel->pData; pModel->pData = NULL;
+
+ Vec_PtrForEachEntry( Abc_Ntk_t *, vModels, pModel, i )
+ Gia_ManStopP( (Gia_Man_t **)&pModel->pData );
+
+ return pGia;
+}
+
+
+/**Function*************************************************************
+
+ Synopsis [Collect models in the DFS order.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Abc_NtkCollectHie_rec( Abc_Ntk_t * pNtk, Vec_Ptr_t * vModels )
+{
+ Vec_Ptr_t * vOrder;
+ Abc_Obj_t * pObj;
+ int i;
+ if ( pNtk->iStep >= 0 )
+ return;
+ vOrder = Abc_NtkDfsBoxes( pNtk );
+ Vec_PtrForEachEntry( Abc_Obj_t *, vOrder, pObj, i )
+ if ( Abc_ObjIsBox(pObj) )
+ Abc_NtkCollectHie_rec( (Abc_Ntk_t *)pObj->pData, vModels );
+ Vec_PtrFree( vOrder );
+ pNtk->iStep = Vec_PtrSize(vModels);
+ Vec_PtrPush( vModels, pNtk );
+}
+
+Vec_Ptr_t * Abc_NtkCollectHie( Abc_Ntk_t * pNtk )
+{
+ Vec_Ptr_t * vMods, * vResult;
+ Abc_Ntk_t * pModel;
+ int i;
+
+ assert( Abc_NtkIsNetlist(pNtk) );
+ assert( !Abc_NtkLatchNum(pNtk) );
+
+ vMods = pNtk->pDesign->vModules;
+ Vec_PtrForEachEntry( Abc_Ntk_t *, vMods, pModel, i )
+ pModel->iStep = -1;
+
+ vResult = Vec_PtrAlloc( 1000 );
+ Abc_NtkCollectHie_rec( pNtk, vResult );
+ return vResult;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Counts the number of intstances.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Abc_NtkCountInst_rec( Abc_Ntk_t * pNtk )
+{
+ Vec_Ptr_t * vOrder;
+ Abc_Obj_t * pObj;
+ int i, Counter = 0;
+ if ( pNtk->iStep >= 0 )
+ return pNtk->iStep;
+ vOrder = Abc_NtkDfsBoxes( pNtk );
+ Vec_PtrForEachEntry( Abc_Obj_t *, vOrder, pObj, i )
+ if ( Abc_ObjIsBox(pObj) )
+ Counter += Abc_NtkCountInst_rec( (Abc_Ntk_t *)pObj->pData );
+ Vec_PtrFree( vOrder );
+ return pNtk->iStep = 1 + Counter;
+}
+
+void Abc_NtkCountInst( Abc_Ntk_t * pNtk )
+{
+ Vec_Ptr_t * vMods;
+ Abc_Ntk_t * pModel;
+ int i, Counter;
+
+ vMods = pNtk->pDesign->vModules;
+ Vec_PtrForEachEntry( Abc_Ntk_t *, vMods, pModel, i )
+ pModel->iStep = -1;
+
+ Counter = Abc_NtkCountInst_rec( pNtk );
+ printf( "Instances = %10d.\n", Counter );
+}
+
/**Function*************************************************************
@@ -317,6 +562,18 @@ void Abc_NtkCountInstances_rec( Abc_Ntk_t * pNtk, int * pCountInst, int * pCount
SeeAlso []
***********************************************************************/
+void Abc_NtkCountInstances_rec( Abc_Ntk_t * pNtk, int * pCountInst, int * pCountPins )
+{
+ Vec_Ptr_t * vOrder = (Vec_Ptr_t *)pNtk->pData;
+ Abc_Obj_t * pObj;
+ int i;
+ *pCountInst += 1;
+ *pCountPins += Abc_NtkPiNum(pNtk) + Abc_NtkPoNum(pNtk);
+ Vec_PtrForEachEntry( Abc_Obj_t *, vOrder, pObj, i )
+ if ( Abc_ObjIsBox(pObj) )
+ Abc_NtkCountInstances_rec( (Abc_Ntk_t *)pObj->pData, pCountInst, pCountPins );
+}
+
void Abc_NtkCountInstances( Abc_Ntk_t * pNtk )
{
int CountInst = 0, CountPins = 0;
@@ -327,6 +584,7 @@ void Abc_NtkCountInstances( Abc_Ntk_t * pNtk )
printf( "Instances = %10d. I/O pins = %10d.\n", CountInst, CountPins );
}
+
/**Function*************************************************************
Synopsis [Performs hierarchical equivalence checking.]
@@ -341,7 +599,7 @@ void Abc_NtkCountInstances( Abc_Ntk_t * pNtk )
Gia_Man_t * Abc_NtkHieCecTest( char * pFileName, int fVerbose )
{
int fCheck = 1;
- Vec_Ptr_t * vMods;
+ Vec_Ptr_t * vMods, * vOrder;
Abc_Ntk_t * pNtk, * pModel;
Gia_Man_t * pGia;
int i, clk = clock();
@@ -361,10 +619,27 @@ Gia_Man_t * Abc_NtkHieCecTest( char * pFileName, int fVerbose )
}
Abc_PrintTime( 1, "Reading file", clock() - clk );
+ assert( Abc_NtkIsNetlist(pNtk) );
+ assert( !Abc_NtkLatchNum(pNtk) );
+
// print stats
if ( fVerbose )
Abc_NtkPrintBoxInfo( pNtk );
+ clk = clock();
+ vOrder = Abc_NtkCollectHie( pNtk );
+ Abc_PrintTime( 1, "Collect DFS ", clock() - clk );
+
+ // derive GIA
+ clk = clock();
+ pGia = Abc_NtkDeriveFlatGia2( pNtk, vOrder );
+ Abc_PrintTime( 1, "Deriving GIA", clock() - clk );
+ Gia_ManPrintStats( pGia, 0 );
+// Gia_ManStop( pGia );
+
+ Vec_PtrFree( vOrder );
+
+/*
// order nodes/boxes of all models
vMods = pNtk->pDesign->vModules;
Vec_PtrForEachEntry( Abc_Ntk_t *, vMods, pModel, i )
@@ -374,6 +649,7 @@ Gia_Man_t * Abc_NtkHieCecTest( char * pFileName, int fVerbose )
clk = clock();
pGia = Abc_NtkDeriveFlatGia( pNtk );
Abc_PrintTime( 1, "Deriving GIA", clock() - clk );
+ Gia_ManPrintStats( pGia, 0 );
clk = clock();
Abc_NtkCountInstances( pNtk );
@@ -382,8 +658,12 @@ Gia_Man_t * Abc_NtkHieCecTest( char * pFileName, int fVerbose )
// clean nodes/boxes of all nodes
Vec_PtrForEachEntry( Abc_Ntk_t *, vMods, pModel, i )
Vec_PtrFree( (Vec_Ptr_t *)pModel->pData );
- Abc_NtkDelete( pNtk );
+*/
+ clk = clock();
+ Abc_NtkCountInst( pNtk );
+ Abc_PrintTime( 1, "Gather stats", clock() - clk );
+ Abc_NtkDelete( pNtk );
return pGia;
}