diff options
Diffstat (limited to 'src/base/abci/abcMfs.c')
-rw-r--r-- | src/base/abci/abcMfs.c | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/src/base/abci/abcMfs.c b/src/base/abci/abcMfs.c new file mode 100644 index 00000000..ddc91467 --- /dev/null +++ b/src/base/abci/abcMfs.c @@ -0,0 +1,189 @@ +/**CFile**************************************************************** + + FileName [abcMfs.c] + + SystemName [ABC: Logic synthesis and verification system.] + + PackageName [Network and node package.] + + Synopsis [Optimization with don't-cares.] + + Author [Alan Mishchenko] + + Affiliation [UC Berkeley] + + Date [Ver. 1.0. Started - June 20, 2005.] + + Revision [$Id: abcMfs.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] + +***********************************************************************/ + +#include "base/abc/abc.h" +#include "opt/sfm/sfm.h" + +ABC_NAMESPACE_IMPL_START + + +//////////////////////////////////////////////////////////////////////// +/// DECLARATIONS /// +//////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////// +/// FUNCTION DEFINITIONS /// +//////////////////////////////////////////////////////////////////////// + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +Vec_Ptr_t * Abc_NtkAssignIDs( Abc_Ntk_t * pNtk ) +{ + Vec_Ptr_t * vNodes; + Abc_Obj_t * pObj; + int i; + vNodes = Abc_NtkDfs( pNtk, 0 ); + Abc_NtkCleanCopy( pNtk ); + Abc_NtkForEachPi( pNtk, pObj, i ) + pObj->iTemp = i; + Vec_PtrForEachEntry( Abc_Obj_t *, vNodes, pObj, i ) + pObj->iTemp = Abc_NtkPiNum(pNtk) + i; + Abc_NtkForEachPo( pNtk, pObj, i ) + pObj->iTemp = Abc_NtkPiNum(pNtk) + Vec_PtrSize(vNodes) + i; + return vNodes; +} + +/**Function************************************************************* + + Synopsis [Extracts information about the network.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +Sfm_Ntk_t * Abc_NtkExtractMfs( Abc_Ntk_t * pNtk ) +{ + Vec_Ptr_t * vNodes; + Vec_Wec_t * vFanins; + Vec_Str_t * vFixed; + Vec_Wrd_t * vTruths; + Vec_Int_t * vArray; + Abc_Obj_t * pObj, * pFanin; + int i, k, nObjs; + vNodes = Abc_NtkAssignIDs( pNtk ); + nObjs = Abc_NtkPiNum(pNtk) + Vec_PtrSize(vNodes) + Abc_NtkPoNum(pNtk); + vFanins = Vec_WecStart( nObjs ); + vFixed = Vec_StrStart( nObjs ); + vTruths = Vec_WrdStart( nObjs ); + Vec_PtrForEachEntry( Abc_Obj_t *, vNodes, pObj, i ) + { + vArray = Vec_WecEntry( vFanins, pObj->iTemp ); + Vec_IntGrow( vArray, Abc_ObjFaninNum(pObj) ); + Abc_ObjForEachFanin( pObj, pFanin, k ) + Vec_IntPush( vArray, pFanin->iTemp ); + Vec_WrdWriteEntry( vTruths, pObj->iTemp, Abc_SopToTruth((char *)pObj->pData, Abc_ObjFaninNum(pObj)) ); + } + Abc_NtkForEachPo( pNtk, pObj, i ) + { + vArray = Vec_WecEntry( vFanins, pObj->iTemp ); + Vec_IntGrow( vArray, Abc_ObjFaninNum(pObj) ); + Abc_ObjForEachFanin( pObj, pFanin, k ) + Vec_IntPush( vArray, pFanin->iTemp ); + } + Vec_PtrFree( vNodes ); + return Sfm_NtkConstruct( vFanins, Abc_NtkPiNum(pNtk), Abc_NtkPoNum(pNtk), vFixed, vTruths ); +} + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Abc_NtkInsertMfs( Abc_Ntk_t * pNtk, Sfm_Ntk_t * p ) +{ + Vec_Int_t * vMap, * vArray; + Abc_Obj_t * pNode; + int i, k, Fanin; + // map new IDs into old nodes + vMap = Vec_IntStart( Abc_NtkObjNumMax(pNtk) ); + Abc_NtkForEachPi( pNtk, pNode, i ) + Vec_IntWriteEntry( vMap, pNode->iTemp, Abc_ObjId(pNode) ); + Abc_NtkForEachNode( pNtk, pNode, i ) + if ( pNode->iTemp > 0 ) + Vec_IntWriteEntry( vMap, pNode->iTemp, Abc_ObjId(pNode) ); + // remove old fanins + Abc_NtkForEachNode( pNtk, pNode, i ) + Abc_ObjRemoveFanins( pNode ); + // create new fanins + Abc_NtkForEachNode( pNtk, pNode, i ) + if ( pNode->iTemp > 0 && !Sfm_NodeReadFixed(p, pNode->iTemp) ) + { + vArray = Sfm_NodeReadFanins( p, pNode->iTemp ); + Vec_IntForEachEntry( vArray, Fanin, k ) + Abc_ObjAddFanin( pNode, Abc_NtkObj(pNtk, Vec_IntEntry(vMap, Fanin)) ); + pNode->pData = Abc_SopCreateFromTruth( (Mem_Flex_t *)pNtk->pManFunc, Vec_IntSize(vArray), (unsigned *)Sfm_NodeReadTruth(p, pNode->iTemp) ); + } + Vec_IntFree( vMap ); +} + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Abc_NtkPerformMfs( Abc_Ntk_t * pNtk, Sfm_Par_t * pPars ) +{ + Sfm_Ntk_t * p; + int nFaninMax, nNodes; + assert( Abc_NtkIsSopLogic(pNtk) ); + // count fanouts + nFaninMax = Abc_NtkGetFaninMax( pNtk ); + if ( nFaninMax > 6 ) + { + Abc_Print( 1, "Currently \"mfs\" cannot process the network containing nodes with more than 6 fanins.\n" ); + return 0; + } + // collect information + p = Abc_NtkExtractMfs( pNtk ); + // perform optimization + nNodes = Sfm_NtkPerform( p, pPars ); + // call the fast extract procedure + if ( nNodes == 0 ) + Abc_Print( 1, "The networks is not changed by \"mfs\".\n" ); + else + { + Abc_NtkInsertMfs( pNtk, p ); + Abc_Print( 1, "The networks has %d nodes changed by \"mfs\".\n", nNodes ); + } + Sfm_NtkFree( p ); + return 1; +} + +//////////////////////////////////////////////////////////////////////// +/// END OF FILE /// +//////////////////////////////////////////////////////////////////////// + + +ABC_NAMESPACE_IMPL_END + |