diff options
Diffstat (limited to 'src/base/abci/abcFxu.c')
-rw-r--r-- | src/base/abci/abcFxu.c | 260 |
1 files changed, 0 insertions, 260 deletions
diff --git a/src/base/abci/abcFxu.c b/src/base/abci/abcFxu.c deleted file mode 100644 index 45515dd1..00000000 --- a/src/base/abci/abcFxu.c +++ /dev/null @@ -1,260 +0,0 @@ -/**CFile**************************************************************** - - FileName [abcFxu.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Interface with the fast extract package.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: abcFxu.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "fxu.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static bool Abc_NtkFxuCheck( Abc_Ntk_t * pNtk ); -static void Abc_NtkFxuCollectInfo( Abc_Ntk_t * pNtk, Fxu_Data_t * p ); -static void Abc_NtkFxuReconstruct( Abc_Ntk_t * pNtk, Fxu_Data_t * p ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - - -/**Function************************************************************* - - Synopsis [Performs fast_extract on the current network.] - - Description [Takes the network and the maximum number of nodes to extract. - Uses the concurrent double-cube and single cube divisor extraction procedure. - Modifies the network in the end, after extracting all nodes. Note that - Ntk_NetworkSweep() may increase the performance of this procedure because - the single-literal nodes will not be created in the sparse matrix. Returns 1 - if the network has been changed.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -bool Abc_NtkFastExtract( Abc_Ntk_t * pNtk, Fxu_Data_t * p ) -{ - assert( Abc_NtkIsLogic(pNtk) ); - // if the network is already in the SOP form, it may come from BLIF file - // and it may not be SCC-free, in which case FXU will not work correctly - if ( Abc_NtkIsSopLogic(pNtk) ) - { // to make sure the SOPs are SCC-free -// Abc_NtkSopToBdd(pNtk); -// Abc_NtkBddToSop(pNtk); - } - // get the network in the SOP form - if ( !Abc_NtkToSop(pNtk, 0) ) - { - printf( "Abc_NtkFastExtract(): Converting to SOPs has failed.\n" ); - return 0; - } - // check if the network meets the requirements - if ( !Abc_NtkFxuCheck(pNtk) ) - { - printf( "Abc_NtkFastExtract: Nodes have duplicated or complemented fanins. FXU is not performed.\n" ); - return 0; - } - // sweep removes useless nodes - Abc_NtkCleanup( pNtk, 0 ); - // collect information about the covers - Abc_NtkFxuCollectInfo( pNtk, p ); - // call the fast extract procedure - if ( Fxu_FastExtract(p) > 0 ) - { - // update the network - Abc_NtkFxuReconstruct( pNtk, p ); - // make sure everything is okay - if ( !Abc_NtkCheck( pNtk ) ) - printf( "Abc_NtkFastExtract: The network check has failed.\n" ); - return 1; - } - else - printf( "Warning: The network has not been changed by \"fx\".\n" ); - return 0; -} - - -/**Function************************************************************* - - Synopsis [Makes sure the nodes do not have complemented and duplicated fanins.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -bool Abc_NtkFxuCheck( Abc_Ntk_t * pNtk ) -{ - Abc_Obj_t * pNode, * pFanin1, * pFanin2; - int n, i, k; - Abc_NtkForEachNode( pNtk, pNode, n ) - { - Abc_ObjForEachFanin( pNode, pFanin1, i ) - { - if ( i < 2 && Abc_ObjFaninC(pNode, i) ) - return 0; - Abc_ObjForEachFanin( pNode, pFanin2, k ) - { - if ( i == k ) - continue; - if ( pFanin1 == pFanin2 ) - return 0; - } - } - } - return 1; -} - -/**Function************************************************************* - - Synopsis [Collect information about the network for fast_extract.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkFxuCollectInfo( Abc_Ntk_t * pNtk, Fxu_Data_t * p ) -{ - Abc_Obj_t * pNode; - int i; - // add information to the manager - p->pManSop = pNtk->pManFunc; - p->vSops = Vec_PtrAlloc(0); - p->vFanins = Vec_PtrAlloc(0); - p->vSopsNew = Vec_PtrAlloc(0); - p->vFaninsNew = Vec_PtrAlloc(0); - Vec_PtrFill( p->vSops, Abc_NtkObjNumMax(pNtk), NULL ); - Vec_PtrFill( p->vFanins, Abc_NtkObjNumMax(pNtk), NULL ); - Vec_PtrFill( p->vSopsNew, Abc_NtkObjNumMax(pNtk) + p->nNodesExt, NULL ); - Vec_PtrFill( p->vFaninsNew, Abc_NtkObjNumMax(pNtk) + p->nNodesExt, NULL ); - // add SOPs and fanin array - Abc_NtkForEachNode( pNtk, pNode, i ) - { - if ( Abc_SopGetVarNum(pNode->pData) < 2 ) - continue; - if ( Abc_SopGetCubeNum(pNode->pData) < 1 ) - continue; - p->vSops->pArray[i] = pNode->pData; - p->vFanins->pArray[i] = &pNode->vFanins; - } - p->nNodesOld = Abc_NtkObjNumMax(pNtk); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkFxuFreeInfo( Fxu_Data_t * p ) -{ - int i; - // free the arrays of new fanins - if ( p->vFaninsNew ) - for ( i = 0; i < p->vFaninsNew->nSize; i++ ) - if ( p->vFaninsNew->pArray[i] ) - Vec_IntFree( p->vFaninsNew->pArray[i] ); - // free the arrays - if ( p->vSops ) Vec_PtrFree( p->vSops ); - if ( p->vSopsNew ) Vec_PtrFree( p->vSopsNew ); - if ( p->vFanins ) Vec_PtrFree( p->vFanins ); - if ( p->vFaninsNew ) Vec_PtrFree( p->vFaninsNew ); - FREE( p ); -} - -/**Function************************************************************* - - Synopsis [Recostructs the network after FX.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Abc_NtkFxuReconstruct( Abc_Ntk_t * pNtk, Fxu_Data_t * p ) -{ - Vec_Int_t * vFanins; - Abc_Obj_t * pNode, * pFanin; - int i, k; - - assert( p->vFanins->nSize < p->vFaninsNew->nSize ); - // create the new nodes - for ( i = p->vFanins->nSize; i < p->vFanins->nSize + p->nNodesNew; i++ ) - { - // start the node - pNode = Abc_NtkCreateNode( pNtk ); - assert( i == (int)pNode->Id ); - } - // update the old nodes - for ( i = 0; i < p->vFanins->nSize; i++ ) - { - // the new array of fanins - vFanins = p->vFaninsNew->pArray[i]; - if ( vFanins == NULL ) - continue; - // remove old fanins - pNode = Abc_NtkObj( pNtk, i ); - Abc_ObjRemoveFanins( pNode ); - // add new fanins - vFanins = p->vFaninsNew->pArray[i]; - for ( k = 0; k < vFanins->nSize; k++ ) - { - pFanin = Abc_NtkObj( pNtk, vFanins->pArray[k] ); - Abc_ObjAddFanin( pNode, pFanin ); - } - pNode->pData = p->vSopsNew->pArray[i]; - assert( pNode->pData != NULL ); - } - // set up the new nodes - for ( i = p->vFanins->nSize; i < p->vFanins->nSize + p->nNodesNew; i++ ) - { - // get the new node - pNode = Abc_NtkObj( pNtk, i ); - // add the fanins - vFanins = p->vFaninsNew->pArray[i]; - for ( k = 0; k < vFanins->nSize; k++ ) - { - pFanin = Abc_NtkObj( pNtk, vFanins->pArray[k] ); - Abc_ObjAddFanin( pNode, pFanin ); - } - pNode->pData = p->vSopsNew->pArray[i]; - assert( pNode->pData != NULL ); - } -} - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - |