diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2014-03-16 21:56:28 -0700 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2014-03-16 21:56:28 -0700 |
commit | 89eed1aaf95ae9f2682c7b801d02954e5e3b8c7b (patch) | |
tree | ce68b5961cc29b7a362892f31fdfcd0f66f499bc /src | |
parent | 7a3e57a4cb174325f7d78cedecb75da6f2b87fc5 (diff) | |
download | abc-89eed1aaf95ae9f2682c7b801d02954e5e3b8c7b.tar.gz abc-89eed1aaf95ae9f2682c7b801d02954e5e3b8c7b.tar.bz2 abc-89eed1aaf95ae9f2682c7b801d02954e5e3b8c7b.zip |
Adding barrier buffers.
Diffstat (limited to 'src')
-rw-r--r-- | src/base/abc/abc.h | 7 | ||||
-rw-r--r-- | src/base/abc/abcBarBuf.c | 353 | ||||
-rw-r--r-- | src/base/abc/abcUtil.c | 24 | ||||
-rw-r--r-- | src/base/abc/module.make | 1 | ||||
-rw-r--r-- | src/base/abci/abc.c | 22 | ||||
-rw-r--r-- | src/base/cmd/cmd.c | 4 | ||||
-rw-r--r-- | src/base/io/io.c | 44 | ||||
-rw-r--r-- | src/base/io/ioAbc.h | 2 | ||||
-rw-r--r-- | src/base/io/ioUtil.c | 26 |
9 files changed, 445 insertions, 38 deletions
diff --git a/src/base/abc/abc.h b/src/base/abc/abc.h index 8d72cd5e..2c371ce6 100644 --- a/src/base/abc/abc.h +++ b/src/base/abc/abc.h @@ -171,6 +171,7 @@ struct Abc_Ntk_t_ int nObjCounts[ABC_OBJ_NUMBER]; // the number of objects by type int nObjs; // the number of live objs int nConstrs; // the number of constraints + int nBarBufs; // the number of barrier buffers // the backup network and the step number Abc_Ntk_t * pNetBackup; // the pointer to the previous backup network int iStep; // the generation number for the given network @@ -330,6 +331,7 @@ static inline Vec_Int_t * Abc_ObjFaninVec( Abc_Obj_t * pObj ) { return &p static inline Vec_Int_t * Abc_ObjFanoutVec( Abc_Obj_t * pObj ) { return &pObj->vFanouts; } static inline Abc_Obj_t * Abc_ObjCopy( Abc_Obj_t * pObj ) { return pObj->pCopy; } static inline Abc_Ntk_t * Abc_ObjNtk( Abc_Obj_t * pObj ) { return pObj->pNtk; } +static inline Abc_Ntk_t * Abc_ObjModel( Abc_Obj_t * pObj ) { assert( pObj->Type == ABC_OBJ_WHITEBOX ); return (Abc_Ntk_t *)pObj->pData; } static inline void * Abc_ObjData( Abc_Obj_t * pObj ) { return pObj->pData; } static inline Abc_Obj_t * Abc_ObjEquiv( Abc_Obj_t * pObj ) { return (Abc_Obj_t *)pObj->pData; } static inline Abc_Obj_t * Abc_ObjCopyCond( Abc_Obj_t * pObj ) { return Abc_ObjRegular(pObj)->pCopy? Abc_ObjNotCond(Abc_ObjRegular(pObj)->pCopy, Abc_ObjIsComplement(pObj)) : NULL; } @@ -552,6 +554,9 @@ extern ABC_DLL void Abc_AigUpdateStop( Abc_Aig_t * pMan ); extern ABC_DLL void Abc_AigUpdateReset( Abc_Aig_t * pMan ); /*=== abcAttach.c ==========================================================*/ extern ABC_DLL int Abc_NtkAttach( Abc_Ntk_t * pNtk ); +/*=== abcBarBuf.c ==========================================================*/ +extern ABC_DLL Abc_Ntk_t * Abc_NtkToBarBufs( Abc_Ntk_t * pNtk ); +extern ABC_DLL Abc_Ntk_t * Abc_NtkFromBarBufs( Abc_Ntk_t * pNtkBase, Abc_Ntk_t * pNtk ); /*=== abcBlifMv.c ==========================================================*/ extern ABC_DLL void Abc_NtkStartMvVars( Abc_Ntk_t * pNtk ); extern ABC_DLL void Abc_NtkFreeMvVars( Abc_Ntk_t * pNtk ); @@ -945,12 +950,14 @@ extern ABC_DLL int Abc_NtkGetFaninMax( Abc_Ntk_t * pNtk ); extern ABC_DLL int Abc_NtkGetFanoutMax( Abc_Ntk_t * pNtk ); extern ABC_DLL int Abc_NtkGetTotalFanins( Abc_Ntk_t * pNtk ); extern ABC_DLL void Abc_NtkCleanCopy( Abc_Ntk_t * pNtk ); +extern ABC_DLL void Abc_NtkCleanCopy_rec( Abc_Ntk_t * pNtk ); extern ABC_DLL void Abc_NtkCleanData( Abc_Ntk_t * pNtk ); extern ABC_DLL void Abc_NtkFillTemp( Abc_Ntk_t * pNtk ); extern ABC_DLL int Abc_NtkCountCopy( Abc_Ntk_t * pNtk ); extern ABC_DLL Vec_Ptr_t * Abc_NtkSaveCopy( Abc_Ntk_t * pNtk ); extern ABC_DLL void Abc_NtkLoadCopy( Abc_Ntk_t * pNtk, Vec_Ptr_t * vCopies ); extern ABC_DLL void Abc_NtkCleanNext( Abc_Ntk_t * pNtk ); +extern ABC_DLL void Abc_NtkCleanNext_rec( Abc_Ntk_t * pNtk ); extern ABC_DLL void Abc_NtkCleanMarkA( Abc_Ntk_t * pNtk ); extern ABC_DLL void Abc_NtkCleanMarkB( Abc_Ntk_t * pNtk ); extern ABC_DLL void Abc_NtkCleanMarkC( Abc_Ntk_t * pNtk ); diff --git a/src/base/abc/abcBarBuf.c b/src/base/abc/abcBarBuf.c new file mode 100644 index 00000000..856b9f96 --- /dev/null +++ b/src/base/abc/abcBarBuf.c @@ -0,0 +1,353 @@ +/**CFile**************************************************************** + + FileName [abcHie.c] + + SystemName [ABC: Logic synthesis and verification system.] + + PackageName [Network and node package.] + + Synopsis [Procedures to handle hierarchy.] + + Author [Alan Mishchenko] + + Affiliation [UC Berkeley] + + Date [Ver. 1.0. Started - June 20, 2005.] + + Revision [$Id: abcHie.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] + +***********************************************************************/ + +#include "abc.h" + +ABC_NAMESPACE_IMPL_START + + +//////////////////////////////////////////////////////////////////////// +/// DECLARATIONS /// +//////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////// +/// FUNCTION DEFINITIONS /// +//////////////////////////////////////////////////////////////////////// + +/**Function************************************************************* + + Synopsis [Checks the the hie design has no duplicated networks.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Abc_NtkCheckSingleInstance( Abc_Ntk_t * pNtk ) +{ + Abc_Ntk_t * pTemp, * pModel; + Abc_Obj_t * pBox; + int i, k, RetValue = 1; + if ( pNtk->pDesign == NULL ) + return 1; + Vec_PtrForEachEntry( Abc_Ntk_t *, pNtk->pDesign->vModules, pTemp, i ) + pTemp->fHieVisited = 0; + Vec_PtrForEachEntry( Abc_Ntk_t *, pNtk->pDesign->vModules, pTemp, i ) + Abc_NtkForEachBox( pTemp, pBox, k ) + { + pModel = (Abc_Ntk_t *)pBox->pData; + if ( pModel == NULL ) + continue; + if ( Abc_NtkLatchNum(pModel) > 0 ) + { + printf( "Network \"%s\" contains %d flops.\n", + Abc_NtkName(pNtk), Abc_NtkLatchNum(pModel) ); + RetValue = 0; + } + if ( pModel->fHieVisited ) + { + printf( "Network \"%s\" contains box \"%s\" whose model \"%s\" is instantiated more than once.\n", + Abc_NtkName(pNtk), Abc_ObjName(pBox), Abc_NtkName(pModel) ); + RetValue = 0; + } + pModel->fHieVisited = 1; + } + Vec_PtrForEachEntry( Abc_Ntk_t *, pNtk->pDesign->vModules, pTemp, i ) + pTemp->fHieVisited = 0; + return RetValue; +} + +/**Function************************************************************* + + Synopsis [Collect PIs and POs of internal networks in the topo order.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Abc_NtkCollectPiPos_rec( Abc_Obj_t * pNet, Vec_Ptr_t * vPiPos ) +{ + extern void Abc_NtkCollectPiPos_int( Abc_Ntk_t * pNtk, Vec_Ptr_t * vPiPos, int fAdd ); + Abc_Obj_t * pObj, * pFanin; int i; + assert( Abc_ObjIsNet(pNet) ); + if ( Abc_NodeIsTravIdCurrent( pNet ) ) + return; + Abc_NodeSetTravIdCurrent( pNet ); + pObj = Abc_ObjFanin0(pNet); + assert( Abc_ObjIsNode(pObj) || Abc_ObjIsBox(pObj) ); + Abc_ObjForEachFanin( pObj, pFanin, i ) + Abc_NtkCollectPiPos_rec( pFanin, vPiPos ); + if ( Abc_ObjIsBox(pObj) ) + Abc_NtkCollectPiPos_int( (Abc_Ntk_t *)pObj->pData, vPiPos, 1 ); +} +void Abc_NtkCollectPiPos_int( Abc_Ntk_t * pNtk, Vec_Ptr_t * vPiPos, int fAdd ) +{ + Abc_Obj_t * pObj; int i; + // mark primary inputs + Abc_NtkIncrementTravId( pNtk ); + Abc_NtkForEachPi( pNtk, pObj, i ) + Abc_NodeSetTravIdCurrent( Abc_ObjFanout0(pObj) ); + // add primary inputs + if ( fAdd ) + Abc_NtkForEachPi( pNtk, pObj, i ) + Vec_PtrPush( vPiPos, pObj ); + // visit primary outputs + Abc_NtkForEachPo( pNtk, pObj, i ) + Abc_NtkCollectPiPos_rec( Abc_ObjFanin0(pObj), vPiPos ); + // add primary outputs + if ( fAdd ) + Abc_NtkForEachPo( pNtk, pObj, i ) + Vec_PtrPush( vPiPos, pObj ); +} +Vec_Ptr_t * Abc_NtkCollectPiPos( Abc_Ntk_t * pNtk ) +{ + Vec_Ptr_t * vPiPos = Vec_PtrAlloc( 1000 ); + Abc_NtkCollectPiPos_int( pNtk, vPiPos, 0 ); + return vPiPos; +} + +/**Function************************************************************* + + Synopsis [Derives logic network while introducing barbufs.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Abc_NtkToBarBufs_rec( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pNet ) +{ + Abc_Ntk_t * pModel; + Abc_Obj_t * pObj, * pFanin, * pFanout, * pLatch; + int i; + assert( Abc_ObjIsNet(pNet) ); + if ( pNet->pCopy ) + return; + pObj = Abc_ObjFanin0(pNet); + assert( Abc_ObjIsNode(pObj) || Abc_ObjIsBox(pObj) ); + Abc_ObjForEachFanin( pObj, pFanin, i ) + Abc_NtkToBarBufs_rec( pNtkNew, pFanin ); + // create and connect object + if ( Abc_ObjIsNode(pObj) ) + { + pNet->pCopy = Abc_NtkDupObj( pNtkNew, pObj, 0 ); + Abc_ObjForEachFanin( pObj, pFanin, i ) + Abc_ObjAddFanin( pObj->pCopy, pFanin->pCopy ); + return; + } + pModel = Abc_ObjModel(pObj); + Abc_NtkCleanCopy( pModel ); + Abc_ObjForEachFanin( pObj, pFanin, i ) + { + pLatch = Abc_NtkAddLatch( pNtkNew, pFanin->pCopy, ABC_INIT_ZERO ); + Abc_ObjFanout0(Abc_NtkPi(pModel, i))->pCopy = Abc_ObjFanout0(pLatch); + } + Abc_NtkForEachPo( pModel, pObj, i ) + Abc_NtkToBarBufs_rec( pNtkNew, Abc_ObjFanin0(pObj) ); + Abc_ObjForEachFanout( pObj, pFanout, i ) + { + pLatch = Abc_NtkAddLatch( pNtkNew, Abc_ObjFanin0(Abc_NtkPo(pModel, i))->pCopy, ABC_INIT_ZERO ); + pFanout->pCopy = Abc_ObjFanout0(pLatch); + } +} +Abc_Ntk_t * Abc_NtkToBarBufs( Abc_Ntk_t * pNtk ) +{ + Abc_Ntk_t * pNtkNew; + Abc_Obj_t * pObj; + int i; + assert( Abc_NtkIsNetlist(pNtk) ); + if ( !Abc_NtkCheckSingleInstance(pNtk) ) + return NULL; + Abc_NtkCleanCopy( pNtk ); + // start the network + pNtkNew = Abc_NtkAlloc( ABC_NTK_LOGIC, pNtk->ntkFunc, 1 ); + pNtkNew->pName = Extra_UtilStrsav(pNtk->pName); + pNtkNew->pSpec = Extra_UtilStrsav(pNtk->pSpec); + // clone CIs/CIs/boxes + Abc_NtkForEachPi( pNtk, pObj, i ) + Abc_ObjFanout0(pObj)->pCopy = Abc_NtkDupObj( pNtkNew, pObj, 1 ); + Abc_NtkForEachPo( pNtk, pObj, i ) + Abc_NtkDupObj( pNtkNew, pObj, 1 ); + // create logic + Abc_NtkForEachPo( pNtk, pObj, i ) + { + Abc_NtkToBarBufs_rec( pNtkNew, Abc_ObjFanin0(pObj) ); + Abc_ObjAddFanin( pObj->pCopy, Abc_ObjFanin0(pObj)->pCopy ); + } + pNtkNew->nBarBufs = Abc_NtkLatchNum(pNtkNew); + return pNtkNew; +} + +/**Function************************************************************* + + Synopsis [Converts the logic with barbufs into a hierarchical network.] + + Description [The base network is the original hierarchical network. The + second argument is the optimized network with barbufs. This procedure + reconstructs the original hierarcical network which adding logic from + the optimized network. It is assumed that the PIs/POs of the original + network one-to-one mapping with the flops of the optimized network.] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +Abc_Obj_t * Abc_NtkFromBarBufs_rec( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pObj ) +{ + Abc_Obj_t * pFanin; int i; + if ( pObj->pCopy ) + return pObj->pCopy; + Abc_NtkDupObj( pNtkNew, pObj, 0 ); + Abc_ObjForEachFanin( pObj, pFanin, i ) + Abc_ObjAddFanin( pObj->pCopy, Abc_NtkFromBarBufs_rec(pNtkNew, pFanin) ); + return pObj->pCopy; +} +Abc_Ntk_t * Abc_NtkFromBarBufsInt( Abc_Ntk_t * pNtkBase, Abc_Ntk_t * pNtk, int fRoot ) +{ + Abc_Ntk_t * pNtkNew; + Abc_Obj_t * pObj, * pTerm, * pLatch, * pNet; + int i, k; + // start the network + pNtkNew = Abc_NtkAlloc( pNtk->ntkType, pNtk->ntkFunc, 1 ); + // clone CIs/CIs/boxes + if ( fRoot ) + { + pNtkNew->pName = Extra_UtilStrsav(pNtk->pName); + pNtkNew->pSpec = Extra_UtilStrsav(pNtk->pSpec); + Abc_NtkCleanCopy( pNtk ); + Abc_NtkForEachCi( pNtk, pObj, i ) + Abc_NtkDupObj( pNtkNew, pObj, 1 ); + Abc_NtkForEachCo( pNtk, pObj, i ) + Abc_NtkDupObj( pNtkNew, pObj, 1 ); + } + else + { + pNtkNew->pName = Extra_UtilStrsav(pNtkBase->pName); + pNtkNew->pSpec = Extra_UtilStrsav(pNtkBase->pSpec); + Abc_NtkForEachCi( pNtkBase, pObj, i ) + Abc_NtkDupObj( pNtkNew, pObj, 1 ); + Abc_NtkForEachCo( pNtkBase, pObj, i ) + Abc_NtkDupObj( pNtkNew, pObj, 1 ); + } + Abc_NtkForEachBox( pNtkBase, pObj, i ) + { + Abc_NtkDupObj( pNtkNew, pObj, 1 ); + Abc_ObjForEachFanout( pObj, pTerm, k ) + { + pNet = Abc_ObjFanout0(pTerm); + assert( Abc_ObjIsNet(pNet) ); + Abc_NtkDupObj( pNtkNew, pNet, 0 ); + pLatch = Abc_NtkCi( Abc_ObjModel(pObj), k )->pNext; + assert( Abc_ObjIsLatch(pLatch) ); + assert( Abc_ObjIsCi(Abc_ObjFanout0(pLatch)->pCopy) ); + Abc_ObjAddFanin( Abc_ObjFanout0(pLatch)->pCopy, pObj->pCopy ); + Abc_ObjAddFanin( pNet->pCopy, Abc_ObjFanout0(pLatch)->pCopy ); + assert( Abc_ObjFanout0(Abc_ObjFanout0(pLatch))->pCopy == NULL ); + Abc_ObjFanout0(Abc_ObjFanout0(pLatch))->pCopy = pNet->pCopy; + } + } + Abc_NtkForEachLatch( pNtk, pObj, i ) + assert( Abc_ObjFanout0(Abc_ObjFanout0(pLatch))->pCopy != NULL ); + // build PO cones + if ( fRoot ) + { + Abc_NtkForEachPo( pNtk, pObj, i ) + Abc_ObjAddFanin( pObj->pCopy, Abc_NtkFromBarBufs_rec(pNtkNew, Abc_ObjFanin0(pObj)) ); + } + else + { + Abc_NtkForEachPo( pNtkBase, pObj, i ) + { + pLatch = pObj->pNext; + assert( Abc_ObjIsLatch(pLatch) ); + Abc_ObjAddFanin( pObj->pCopy, Abc_ObjFanin0(pLatch)->pCopy ); + Abc_ObjAddFanin( Abc_ObjFanin0(pLatch)->pCopy, Abc_NtkFromBarBufs_rec(pNtkNew, Abc_ObjFanin0(Abc_ObjFanin0(pLatch))) ); + } + } + // build BI cones + Abc_NtkForEachBox( pNtkBase, pObj, i ) + { + Abc_ObjForEachFanin( pObj, pTerm, k ) + { + pNet = Abc_ObjFanin0(pTerm); + assert( Abc_ObjIsNet(pNet) ); + pLatch = Abc_NtkCo( Abc_ObjModel(pObj), k )->pNext; + assert( Abc_ObjIsLatch(pLatch) ); + assert( Abc_ObjIsCo(Abc_ObjFanin0(pLatch)->pCopy) ); + Abc_ObjAddFanin( pObj->pCopy, Abc_ObjFanin0(pLatch)->pCopy ); + Abc_ObjAddFanin( Abc_ObjFanin0(pLatch)->pCopy, Abc_NtkFromBarBufs_rec(pNtkNew, Abc_ObjFanin0(Abc_ObjFanin0(pLatch))) ); + } + } + return (pNtkBase->pCopy = pNtkNew); +} +Abc_Ntk_t * Abc_NtkFromBarBufs( Abc_Ntk_t * pNtkBase, Abc_Ntk_t * pNtk ) +{ + Abc_Ntk_t * pNtkNew, * pTemp; + Vec_Ptr_t * vPiPos; + Abc_Obj_t * pObj; + int i, k; + assert( pNtkBase->pDesign != NULL ); + assert( Abc_NtkIsNetlist(pNtk) ); + assert( Abc_NtkIsNetlist(pNtkBase) ); + assert( Abc_NtkLatchNum(pNtkBase) == 0 ); + assert( Abc_NtkLatchNum(pNtk) == pNtk->nBarBufs ); + assert( Abc_NtkCiNum(pNtk) == Abc_NtkCiNum(pNtkBase) ); + assert( Abc_NtkCoNum(pNtk) == Abc_NtkCoNum(pNtkBase) ); + // annotate PIs/POs of base with flops from optimized network + vPiPos = Abc_NtkCollectPiPos( pNtkBase ); + assert( Vec_PtrSize(vPiPos) == Abc_NtkLatchNum(pNtk) ); + Abc_NtkCleanCopy_rec( pNtkBase ); + Abc_NtkCleanNext_rec( pNtkBase ); + Vec_PtrForEachEntry( Abc_Obj_t *, vPiPos, pObj, i ) + pObj->pNext = Abc_NtkBox( pNtk, i ); + Vec_PtrFree( vPiPos ); + // duplicate the networks + pNtkNew = Abc_NtkFromBarBufsInt( pNtkBase, pNtk, 1 ); + pNtkNew->pDesign = Abc_LibCreate( pNtkBase->pDesign->pName ); + Abc_LibAddModel( pNtkNew->pDesign, pNtkNew ); + Vec_PtrPush( pNtkNew->pDesign->vTops, pNtkNew ); + Vec_PtrForEachEntry( Abc_Ntk_t *, pNtkBase->pDesign->vModules, pTemp, i ) + if ( pTemp != pNtkBase ) + { + pTemp = Abc_NtkFromBarBufsInt( pTemp, pNtk, 0 ); + Abc_LibAddModel( pNtkNew->pDesign, pTemp ); + } + // set node models + Vec_PtrForEachEntry( Abc_Ntk_t *, pNtkBase->pDesign->vModules, pTemp, i ) + Abc_NtkForEachBox( pTemp, pObj, k ) + pObj->pCopy->pData = Abc_ObjModel(pObj)->pCopy; + return pNtkNew; +} + +//////////////////////////////////////////////////////////////////////// +/// END OF FILE /// +//////////////////////////////////////////////////////////////////////// + + +ABC_NAMESPACE_IMPL_END + diff --git a/src/base/abc/abcUtil.c b/src/base/abc/abcUtil.c index 6a3ae282..7b805386 100644 --- a/src/base/abc/abcUtil.c +++ b/src/base/abc/abcUtil.c @@ -509,6 +509,14 @@ void Abc_NtkCleanCopy( Abc_Ntk_t * pNtk ) Abc_NtkForEachObj( pNtk, pObj, i ) pObj->pCopy = NULL; } +void Abc_NtkCleanCopy_rec( Abc_Ntk_t * pNtk ) +{ + Abc_Obj_t * pObj; + int i; + Abc_NtkCleanCopy( pNtk ); + Abc_NtkForEachBox( pNtk, pObj, i ) + Abc_NtkCleanCopy_rec( Abc_ObjModel(pObj) ); +} /**Function************************************************************* @@ -630,6 +638,14 @@ void Abc_NtkCleanNext( Abc_Ntk_t * pNtk ) Abc_NtkForEachObj( pNtk, pObj, i ) pObj->pNext = NULL; } +void Abc_NtkCleanNext_rec( Abc_Ntk_t * pNtk ) +{ + Abc_Obj_t * pObj; + int i; + Abc_NtkCleanNext( pNtk ); + Abc_NtkForEachBox( pNtk, pObj, i ) + Abc_NtkCleanNext_rec( Abc_ObjModel(pObj) ); +} /**Function************************************************************* @@ -1451,7 +1467,7 @@ int Abc_NtkPrepareTwoNtks( FILE * pErr, Abc_Ntk_t * pNtk, char ** argv, int argc else fclose( pFile ); pNtk1 = Abc_NtkDup(pNtk); - pNtk2 = Io_Read( pNtk->pSpec, Io_ReadFileType(pNtk->pSpec), fCheck ); + pNtk2 = Io_Read( pNtk->pSpec, Io_ReadFileType(pNtk->pSpec), fCheck, 0 ); if ( pNtk2 == NULL ) return 0; *pfDelete1 = 1; @@ -1465,7 +1481,7 @@ int Abc_NtkPrepareTwoNtks( FILE * pErr, Abc_Ntk_t * pNtk, char ** argv, int argc return 0; } pNtk1 = Abc_NtkDup(pNtk); - pNtk2 = Io_Read( argv[util_optind], Io_ReadFileType(argv[util_optind]), fCheck ); + pNtk2 = Io_Read( argv[util_optind], Io_ReadFileType(argv[util_optind]), fCheck, 0 ); if ( pNtk2 == NULL ) return 0; *pfDelete1 = 1; @@ -1473,10 +1489,10 @@ int Abc_NtkPrepareTwoNtks( FILE * pErr, Abc_Ntk_t * pNtk, char ** argv, int argc } else if ( argc == util_optind + 2 ) { - pNtk1 = Io_Read( argv[util_optind], Io_ReadFileType(argv[util_optind]), fCheck ); + pNtk1 = Io_Read( argv[util_optind], Io_ReadFileType(argv[util_optind]), fCheck, 0 ); if ( pNtk1 == NULL ) return 0; - pNtk2 = Io_Read( argv[util_optind+1], Io_ReadFileType(argv[util_optind+1]), fCheck ); + pNtk2 = Io_Read( argv[util_optind+1], Io_ReadFileType(argv[util_optind+1]), fCheck, 0 ); if ( pNtk2 == NULL ) { Abc_NtkDelete( pNtk1 ); diff --git a/src/base/abc/module.make b/src/base/abc/module.make index d5f55cae..e7c6345d 100644 --- a/src/base/abc/module.make +++ b/src/base/abc/module.make @@ -1,4 +1,5 @@ SRC += src/base/abc/abcAig.c \ + src/base/abc/abcBarBuf.c \ src/base/abc/abcBlifMv.c \ src/base/abc/abcCheck.c \ src/base/abc/abcDfs.c \ diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c index 7b7ab854..f42b2aab 100644 --- a/src/base/abci/abc.c +++ b/src/base/abci/abc.c @@ -7268,7 +7268,7 @@ int Abc_CommandAppend( Abc_Frame_t * pAbc, int argc, char ** argv ) // read the second network FileName = argv[globalUtilOptind]; - pNtk2 = Io_Read( FileName, Io_ReadFileType(FileName), 1 ); + pNtk2 = Io_Read( FileName, Io_ReadFileType(FileName), 1, 0 ); if ( pNtk2 == NULL ) return 1; @@ -7360,7 +7360,7 @@ int Abc_CommandPutOnTop( Abc_Frame_t * pAbc, int argc, char ** argv ) // read the second network FileName = argv[globalUtilOptind]; - pNtk2 = Io_Read( FileName, Io_ReadFileType(FileName), 1 ); + pNtk2 = Io_Read( FileName, Io_ReadFileType(FileName), 1, 0 ); if ( pNtk2 == NULL ) return 1; @@ -9031,7 +9031,7 @@ int Abc_CommandExdcSet( Abc_Frame_t * pAbc, int argc, char ** argv ) fclose( pFile ); // set the new network - pNtkNew = Io_Read( FileName, Io_ReadFileType(FileName), 1 ); + pNtkNew = Io_Read( FileName, Io_ReadFileType(FileName), 1, 0 ); if ( pNtkNew == NULL ) { Abc_Print( -1, "Reading network from file has failed.\n" ); @@ -9115,7 +9115,7 @@ int Abc_CommandCareSet( Abc_Frame_t * pAbc, int argc, char ** argv ) fclose( pFile ); // set the new network - pNtkNew = Io_Read( FileName, Io_ReadFileType(FileName), 1 ); + pNtkNew = Io_Read( FileName, Io_ReadFileType(FileName), 1, 0 ); if ( pNtkNew == NULL ) { Abc_Print( -1, "Reading network from file has failed.\n" ); @@ -13321,7 +13321,7 @@ int Abc_CommandFraigDress( Abc_Frame_t * pAbc, int argc, char ** argv ) pFileName = (argc == globalUtilOptind + 1) ? argv[globalUtilOptind] : Abc_NtkSpec(pNtk); // modify the current network // Abc_NtkDress( pNtk, pFileName, fVerbose ); - pNtk2 = Io_Read( pFileName, Io_ReadFileType(pFileName), 1 ); + pNtk2 = Io_Read( pFileName, Io_ReadFileType(pFileName), 1, 0 ); Abc_NtkDress2( pNtk, pNtk2, nConfs, fVerbose ); Abc_NtkDelete( pNtk2 ); return 0; @@ -18949,7 +18949,7 @@ int Abc_CommandClockGate( Abc_Frame_t * pAbc, int argc, char ** argv ) if ( argc == globalUtilOptind + 1 ) { - pNtkCare = Io_Read( argv[globalUtilOptind], Io_ReadFileType(argv[globalUtilOptind]), 1 ); + pNtkCare = Io_Read( argv[globalUtilOptind], Io_ReadFileType(argv[globalUtilOptind]), 1, 0 ); if ( pNtkCare == NULL ) { Abc_Print( -1, "Reading care network has failed.\n" ); @@ -19171,7 +19171,7 @@ int Abc_CommandInsWin( Abc_Frame_t * pAbc, int argc, char ** argv ) Abc_Print( -1, "Not enough command-line arguments.\n" ); return 1; } - pNtkCare = Io_Read( argv[globalUtilOptind], Io_ReadFileType(argv[globalUtilOptind]), 1 ); + pNtkCare = Io_Read( argv[globalUtilOptind], Io_ReadFileType(argv[globalUtilOptind]), 1, 0 ); if ( pNtkCare == NULL ) { Abc_Print( -1, "Reading care network has failed.\n" ); @@ -20032,7 +20032,7 @@ int Abc_CommandDProve( Abc_Frame_t * pAbc, int argc, char ** argv ) { char FileName[100]; sprintf(FileName, "sm%02d.aig", pSecPar->nSMnumber ); - pNtk = Io_Read( FileName, Io_ReadFileType(FileName), 1 ); + pNtk = Io_Read( FileName, Io_ReadFileType(FileName), 1, 0 ); if ( pNtk == NULL ) Abc_Print( -1, "Cannot read back unsolved reduced sequential miter \"%s\",\n", FileName ); else @@ -20128,7 +20128,7 @@ int Abc_CommandAbSec( Abc_Frame_t * pAbc, int argc, char ** argv ) if ( fMiter ) { -// pNtk = Io_Read( argv[globalUtilOptind], Io_ReadFileType(argv[globalUtilOptind]), 1 ); +// pNtk = Io_Read( argv[globalUtilOptind], Io_ReadFileType(argv[globalUtilOptind]), 1, 0 ); if ( argc == globalUtilOptind + 1 ) { Abc_Print( -1, "The miter cannot be given on the command line. Use \"read\".\n" ); @@ -23627,10 +23627,10 @@ int Abc_CommandReconcile( Abc_Frame_t * pAbc, int argc, char ** argv ) if ( argc == globalUtilOptind + 2 ) { // derive networks - pNtk1 = Io_Read( argv[globalUtilOptind], Io_ReadFileType(argv[globalUtilOptind]), 1 ); + pNtk1 = Io_Read( argv[globalUtilOptind], Io_ReadFileType(argv[globalUtilOptind]), 1, 0 ); if ( pNtk1 == NULL ) return 1; - pNtk2 = Io_Read( argv[globalUtilOptind+1], Io_ReadFileType(argv[globalUtilOptind+1]), 1 ); + pNtk2 = Io_Read( argv[globalUtilOptind+1], Io_ReadFileType(argv[globalUtilOptind+1]), 1, 0 ); if ( pNtk2 == NULL ) { Abc_NtkDelete( pNtk1 ); diff --git a/src/base/cmd/cmd.c b/src/base/cmd/cmd.c index 9f087585..2ec318d1 100644 --- a/src/base/cmd/cmd.c +++ b/src/base/cmd/cmd.c @@ -1731,7 +1731,7 @@ int CmdCommandSis( Abc_Frame_t * pAbc, int argc, char **argv ) fclose( pFile ); // set the new network - pNtkNew = Io_Read( "_sis_out.blif", IO_FILE_BLIF, 1 ); + pNtkNew = Io_Read( "_sis_out.blif", IO_FILE_BLIF, 1, 0 ); // set the original spec of the new network if ( pNtk->pSpec ) { @@ -1873,7 +1873,7 @@ int CmdCommandMvsis( Abc_Frame_t * pAbc, int argc, char **argv ) fclose( pFile ); // set the new network - pNtkNew = Io_Read( "_mvsis_out.blif", IO_FILE_BLIF, 1 ); + pNtkNew = Io_Read( "_mvsis_out.blif", IO_FILE_BLIF, 1, 0 ); // set the original spec of the new network if ( pNtk->pSpec ) { diff --git a/src/base/io/io.c b/src/base/io/io.c index b4fc1a00..ef17c8fd 100644 --- a/src/base/io/io.c +++ b/src/base/io/io.c @@ -172,12 +172,13 @@ int IoCommandRead( Abc_Frame_t * pAbc, int argc, char ** argv ) char Command[1000]; Abc_Ntk_t * pNtk; char * pFileName, * pTemp; - int c, fCheck; + int c, fCheck, fBarBufs; fCheck = 1; + fBarBufs = 0; glo_fMapped = 0; Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "mch" ) ) != EOF ) + while ( ( c = Extra_UtilGetopt( argc, argv, "mcbh" ) ) != EOF ) { switch ( c ) { @@ -187,6 +188,9 @@ int IoCommandRead( Abc_Frame_t * pAbc, int argc, char ** argv ) case 'c': fCheck ^= 1; break; + case 'b': + fBarBufs ^= 1; + break; case 'h': goto usage; default: @@ -230,7 +234,7 @@ int IoCommandRead( Abc_Frame_t * pAbc, int argc, char ** argv ) return 0; } // read the file using the corresponding file reader - pNtk = Io_Read( pFileName, Io_ReadFileType(pFileName), fCheck ); + pNtk = Io_Read( pFileName, Io_ReadFileType(pFileName), fCheck, fBarBufs ); if ( pNtk == NULL ) return 0; if ( Abc_NtkPiNum(pNtk) == 0 ) @@ -245,12 +249,13 @@ int IoCommandRead( Abc_Frame_t * pAbc, int argc, char ** argv ) return 0; usage: - fprintf( pAbc->Err, "usage: read [-mch] <file>\n" ); + fprintf( pAbc->Err, "usage: read [-mcbh] <file>\n" ); fprintf( pAbc->Err, "\t replaces the current network by the network read from <file>\n" ); fprintf( pAbc->Err, "\t by calling the parser that matches the extension of <file>\n" ); fprintf( pAbc->Err, "\t (to read a hierarchical design, use \"read_hie\")\n" ); fprintf( pAbc->Err, "\t-m : toggle reading mapped Verilog [default = %s]\n", glo_fMapped? "yes":"no" ); fprintf( pAbc->Err, "\t-c : toggle network check after reading [default = %s]\n", fCheck? "yes":"no" ); + fprintf( pAbc->Err, "\t-b : toggle reading barrier buffers [default = %s]\n", fBarBufs? "yes":"no" ); fprintf( pAbc->Err, "\t-h : prints the command summary\n" ); fprintf( pAbc->Err, "\tfile : the name of a file to read\n" ); return 1; @@ -294,7 +299,7 @@ int IoCommandReadAiger( Abc_Frame_t * pAbc, int argc, char ** argv ) // get the input file name pFileName = argv[globalUtilOptind]; // read the file using the corresponding file reader - pNtk = Io_Read( pFileName, IO_FILE_AIGER, fCheck ); + pNtk = Io_Read( pFileName, IO_FILE_AIGER, fCheck, 0 ); if ( pNtk == NULL ) return 1; // replace the current network @@ -349,7 +354,7 @@ int IoCommandReadBaf( Abc_Frame_t * pAbc, int argc, char ** argv ) // get the input file name pFileName = argv[globalUtilOptind]; // read the file using the corresponding file reader - pNtk = Io_Read( pFileName, IO_FILE_BAF, fCheck ); + pNtk = Io_Read( pFileName, IO_FILE_BAF, fCheck, 0 ); if ( pNtk == NULL ) return 1; // replace the current network @@ -404,7 +409,7 @@ int IoCommandReadBblif( Abc_Frame_t * pAbc, int argc, char ** argv ) // get the input file name pFileName = argv[globalUtilOptind]; // read the file using the corresponding file reader - pNtk = Io_Read( pFileName, IO_FILE_BBLIF, fCheck ); + pNtk = Io_Read( pFileName, IO_FILE_BBLIF, fCheck, 0 ); if ( pNtk == NULL ) return 1; // replace the current network @@ -473,7 +478,7 @@ int IoCommandReadBlif( Abc_Frame_t * pAbc, int argc, char ** argv ) if ( fReadAsAig ) pNtk = Io_ReadBlifAsAig( pFileName, fCheck ); else if ( fUseNewParser ) - pNtk = Io_Read( pFileName, IO_FILE_BLIF, fCheck ); + pNtk = Io_Read( pFileName, IO_FILE_BLIF, fCheck, 0 ); else { Abc_Ntk_t * pTemp; @@ -541,7 +546,7 @@ int IoCommandReadBlifMv( Abc_Frame_t * pAbc, int argc, char ** argv ) // get the input file name pFileName = argv[globalUtilOptind]; // read the file using the corresponding file reader - pNtk = Io_Read( pFileName, IO_FILE_BLIFMV, fCheck ); + pNtk = Io_Read( pFileName, IO_FILE_BLIFMV, fCheck, 0 ); if ( pNtk == NULL ) return 1; // replace the current network @@ -597,7 +602,7 @@ int IoCommandReadBench( Abc_Frame_t * pAbc, int argc, char ** argv ) // get the input file name pFileName = argv[globalUtilOptind]; // read the file using the corresponding file reader - pNtk = Io_Read( pFileName, IO_FILE_BENCH, fCheck ); + pNtk = Io_Read( pFileName, IO_FILE_BENCH, fCheck, 0 ); if ( pNtk == NULL ) return 1; // replace the current network @@ -714,7 +719,7 @@ int IoCommandReadEdif( Abc_Frame_t * pAbc, int argc, char ** argv ) // get the input file name pFileName = argv[globalUtilOptind]; // read the file using the corresponding file reader - pNtk = Io_Read( pFileName, IO_FILE_EDIF, fCheck ); + pNtk = Io_Read( pFileName, IO_FILE_EDIF, fCheck, 0 ); if ( pNtk == NULL ) return 1; // replace the current network @@ -769,7 +774,7 @@ int IoCommandReadEqn( Abc_Frame_t * pAbc, int argc, char ** argv ) // get the input file name pFileName = argv[globalUtilOptind]; // read the file using the corresponding file reader - pNtk = Io_Read( pFileName, IO_FILE_EQN, fCheck ); + pNtk = Io_Read( pFileName, IO_FILE_EQN, fCheck, 0 ); if ( pNtk == NULL ) return 1; // replace the current network @@ -910,7 +915,7 @@ int IoCommandReadPla( Abc_Frame_t * pAbc, int argc, char ** argv ) Abc_NtkDelete( pTemp ); } else - pNtk = Io_Read( pFileName, IO_FILE_PLA, fCheck ); + pNtk = Io_Read( pFileName, IO_FILE_PLA, fCheck, 0 ); if ( pNtk == NULL ) return 1; // replace the current network @@ -1015,13 +1020,14 @@ int IoCommandReadVerilog( Abc_Frame_t * pAbc, int argc, char ** argv ) { Abc_Ntk_t * pNtk; char * pFileName; - int fCheck; + int fCheck, fBarBufs; int c; fCheck = 1; + fBarBufs = 0; glo_fMapped = 0; Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "mch" ) ) != EOF ) + while ( ( c = Extra_UtilGetopt( argc, argv, "mcbh" ) ) != EOF ) { switch ( c ) { @@ -1031,6 +1037,9 @@ int IoCommandReadVerilog( Abc_Frame_t * pAbc, int argc, char ** argv ) case 'c': fCheck ^= 1; break; + case 'b': + fBarBufs ^= 1; + break; case 'h': goto usage; default: @@ -1042,7 +1051,7 @@ int IoCommandReadVerilog( Abc_Frame_t * pAbc, int argc, char ** argv ) // get the input file name pFileName = argv[globalUtilOptind]; // read the file using the corresponding file reader - pNtk = Io_Read( pFileName, IO_FILE_VERILOG, fCheck ); + pNtk = Io_Read( pFileName, IO_FILE_VERILOG, fCheck, fBarBufs ); if ( pNtk == NULL ) return 1; // replace the current network @@ -1051,10 +1060,11 @@ int IoCommandReadVerilog( Abc_Frame_t * pAbc, int argc, char ** argv ) return 0; usage: - fprintf( pAbc->Err, "usage: read_verilog [-mch] <file>\n" ); + fprintf( pAbc->Err, "usage: read_verilog [-mcbh] <file>\n" ); fprintf( pAbc->Err, "\t reads the network in Verilog (IWLS 2002/2005 subset)\n" ); fprintf( pAbc->Err, "\t-m : toggle reading mapped Verilog [default = %s]\n", glo_fMapped? "yes":"no" ); fprintf( pAbc->Err, "\t-c : toggle network check after reading [default = %s]\n", fCheck? "yes":"no" ); + fprintf( pAbc->Err, "\t-b : toggle reading barrier buffers [default = %s]\n", fBarBufs? "yes":"no" ); fprintf( pAbc->Err, "\t-h : prints the command summary\n" ); fprintf( pAbc->Err, "\tfile : the name of a file to read\n" ); return 1; diff --git a/src/base/io/ioAbc.h b/src/base/io/ioAbc.h index efac1212..f20f5c3d 100644 --- a/src/base/io/ioAbc.h +++ b/src/base/io/ioAbc.h @@ -136,7 +136,7 @@ extern void Io_WriteVerilog( Abc_Ntk_t * pNtk, char * FileName ); extern Io_FileType_t Io_ReadFileType( char * pFileName ); extern Io_FileType_t Io_ReadLibType( char * pFileName ); extern Abc_Ntk_t * Io_ReadNetlist( char * pFileName, Io_FileType_t FileType, int fCheck ); -extern Abc_Ntk_t * Io_Read( char * pFileName, Io_FileType_t FileType, int fCheck ); +extern Abc_Ntk_t * Io_Read( char * pFileName, Io_FileType_t FileType, int fCheck, int fBarBufs ); extern void Io_Write( Abc_Ntk_t * pNtk, char * pFileName, Io_FileType_t FileType ); extern void Io_WriteHie( Abc_Ntk_t * pNtk, char * pBaseName, char * pFileName ); extern Abc_Obj_t * Io_ReadCreatePi( Abc_Ntk_t * pNtk, char * pName ); diff --git a/src/base/io/ioUtil.c b/src/base/io/ioUtil.c index 0044f5fd..685fcf73 100644 --- a/src/base/io/ioUtil.c +++ b/src/base/io/ioUtil.c @@ -223,7 +223,7 @@ void updateLtlStoreOfNtk( Abc_Ntk_t *pNtk, Vec_Ptr_t *tempLtlStore ) SeeAlso [] ***********************************************************************/ -Abc_Ntk_t * Io_Read( char * pFileName, Io_FileType_t FileType, int fCheck ) +Abc_Ntk_t * Io_Read( char * pFileName, Io_FileType_t FileType, int fCheck, int fBarBufs ) { Abc_Ntk_t * pNtk, * pTemp; Vec_Ptr_t * vLtl; @@ -234,6 +234,14 @@ Abc_Ntk_t * Io_Read( char * pFileName, Io_FileType_t FileType, int fCheck ) vLtl = temporaryLtlStore( pNtk ); if ( !Abc_NtkIsNetlist(pNtk) ) return pNtk; + // derive barbufs + if ( fBarBufs ) + { + pNtk = Abc_NtkToBarBufs( pTemp = pNtk ); + Abc_NtkDelete( pTemp ); + assert( Abc_NtkIsLogic(pNtk) ); + return pNtk; + } // flatten logic hierarchy assert( Abc_NtkIsNetlist(pNtk) ); if ( Abc_NtkWhiteboxNum(pNtk) > 0 ) @@ -481,13 +489,22 @@ void Io_WriteHie( Abc_Ntk_t * pNtk, char * pBaseName, char * pFileName ) if ( Abc_NtkWhiteboxNum(pNtkBase) > 0 ) { pNtkBase = Abc_NtkFlattenLogicHierarchy( pNtkTemp = pNtkBase ); + Abc_NtkDelete( pNtkTemp ); if ( pNtkBase == NULL ) return; - Abc_NtkDelete( pNtkTemp ); } // reintroduce the boxes into the netlist - if ( Io_ReadFileType(pBaseName) == IO_FILE_BLIFMV ) + if ( pNtk->nBarBufs > 0 ) + { + // derive the netlist + pNtkResult = Abc_NtkToNetlist( pNtk ); + pNtkResult = Abc_NtkFromBarBufs( pNtkBase, pNtkTemp = pNtkResult ); + Abc_NtkDelete( pNtkTemp ); + if ( pNtkResult ) + printf( "Hierarchy writer reintroduced %d barbufs.\n", pNtk->nBarBufs ); + } + else if ( Io_ReadFileType(pBaseName) == IO_FILE_BLIFMV ) { if ( Abc_NtkBlackboxNum(pNtkBase) > 0 ) { @@ -499,7 +516,10 @@ void Io_WriteHie( Abc_Ntk_t * pNtk, char * pBaseName, char * pFileName ) assert( !Abc_NtkIsNetlist(pNtk) ); pNtkResult = Abc_NtkToNetlist( pNtk ); if ( !Abc_NtkConvertToBlifMv( pNtkResult ) ) + { + Abc_NtkDelete( pNtkBase ); return; + } // reintroduce the network pNtkResult = Abc_NtkInsertBlifMv( pNtkBase, pNtkTemp = pNtkResult ); Abc_NtkDelete( pNtkTemp ); |