mirror of https://github.com/YosysHQ/abc.git
Adding new code to support barrier buffers.
This commit is contained in:
parent
91d80a63d8
commit
1c582413da
|
|
@ -356,6 +356,7 @@ static inline int Abc_ObjIsLatch( Abc_Obj_t * pObj ) { return pO
|
||||||
static inline int Abc_ObjIsBox( Abc_Obj_t * pObj ) { return pObj->Type == ABC_OBJ_LATCH || pObj->Type == ABC_OBJ_WHITEBOX || pObj->Type == ABC_OBJ_BLACKBOX; }
|
static inline int Abc_ObjIsBox( Abc_Obj_t * pObj ) { return pObj->Type == ABC_OBJ_LATCH || pObj->Type == ABC_OBJ_WHITEBOX || pObj->Type == ABC_OBJ_BLACKBOX; }
|
||||||
static inline int Abc_ObjIsWhitebox( Abc_Obj_t * pObj ) { return pObj->Type == ABC_OBJ_WHITEBOX;}
|
static inline int Abc_ObjIsWhitebox( Abc_Obj_t * pObj ) { return pObj->Type == ABC_OBJ_WHITEBOX;}
|
||||||
static inline int Abc_ObjIsBlackbox( Abc_Obj_t * pObj ) { return pObj->Type == ABC_OBJ_BLACKBOX;}
|
static inline int Abc_ObjIsBlackbox( Abc_Obj_t * pObj ) { return pObj->Type == ABC_OBJ_BLACKBOX;}
|
||||||
|
static inline int Abc_ObjIsBarBuf( Abc_Obj_t * pObj ) { assert( Abc_NtkIsMappedLogic(pObj->pNtk) ); return Vec_IntSize(&pObj->vFanins) == 1 && pObj->pData == NULL; }
|
||||||
static inline void Abc_ObjBlackboxToWhitebox( Abc_Obj_t * pObj ) { assert( Abc_ObjIsBlackbox(pObj) ); pObj->Type = ABC_OBJ_WHITEBOX; pObj->pNtk->nObjCounts[ABC_OBJ_BLACKBOX]--; pObj->pNtk->nObjCounts[ABC_OBJ_WHITEBOX]++; }
|
static inline void Abc_ObjBlackboxToWhitebox( Abc_Obj_t * pObj ) { assert( Abc_ObjIsBlackbox(pObj) ); pObj->Type = ABC_OBJ_WHITEBOX; pObj->pNtk->nObjCounts[ABC_OBJ_BLACKBOX]--; pObj->pNtk->nObjCounts[ABC_OBJ_WHITEBOX]++; }
|
||||||
|
|
||||||
// working with fanin/fanout edges
|
// working with fanin/fanout edges
|
||||||
|
|
@ -559,6 +560,8 @@ extern ABC_DLL int Abc_NtkAttach( Abc_Ntk_t * pNtk );
|
||||||
/*=== abcBarBuf.c ==========================================================*/
|
/*=== abcBarBuf.c ==========================================================*/
|
||||||
extern ABC_DLL Abc_Ntk_t * Abc_NtkToBarBufs( Abc_Ntk_t * pNtk );
|
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 );
|
extern ABC_DLL Abc_Ntk_t * Abc_NtkFromBarBufs( Abc_Ntk_t * pNtkBase, Abc_Ntk_t * pNtk );
|
||||||
|
extern ABC_DLL Abc_Ntk_t * Abc_NtkBarBufsToBuffers( Abc_Ntk_t * pNtk );
|
||||||
|
extern ABC_DLL Abc_Ntk_t * Abc_NtkBarBufsFromBuffers( Abc_Ntk_t * pNtkBase, Abc_Ntk_t * pNtk );
|
||||||
/*=== abcBlifMv.c ==========================================================*/
|
/*=== abcBlifMv.c ==========================================================*/
|
||||||
extern ABC_DLL void Abc_NtkStartMvVars( Abc_Ntk_t * pNtk );
|
extern ABC_DLL void Abc_NtkStartMvVars( Abc_Ntk_t * pNtk );
|
||||||
extern ABC_DLL void Abc_NtkFreeMvVars( Abc_Ntk_t * pNtk );
|
extern ABC_DLL void Abc_NtkFreeMvVars( Abc_Ntk_t * pNtk );
|
||||||
|
|
|
||||||
|
|
@ -273,6 +273,8 @@ Abc_Ntk_t * Abc_NtkFromBarBufs( Abc_Ntk_t * pNtkBase, Abc_Ntk_t * pNtk )
|
||||||
Abc_NtkCleanCopy_rec( pNtkBase );
|
Abc_NtkCleanCopy_rec( pNtkBase );
|
||||||
Vec_PtrForEachEntry( Abc_Ntk_t *, pNtkBase->pDesign->vModules, pTemp, i )
|
Vec_PtrForEachEntry( Abc_Ntk_t *, pNtkBase->pDesign->vModules, pTemp, i )
|
||||||
pTemp->pCopy = Abc_NtkStartFrom( pTemp, pNtk->ntkType, pNtk->ntkFunc );
|
pTemp->pCopy = Abc_NtkStartFrom( pTemp, pNtk->ntkType, pNtk->ntkFunc );
|
||||||
|
Vec_PtrForEachEntry( Abc_Ntk_t *, pNtkBase->pDesign->vModules, pTemp, i )
|
||||||
|
pTemp->pCopy->pAltView = pTemp->pAltView ? pTemp->pAltView->pCopy : NULL;
|
||||||
// update box models
|
// update box models
|
||||||
Vec_PtrForEachEntry( Abc_Ntk_t *, pNtkBase->pDesign->vModules, pTemp, i )
|
Vec_PtrForEachEntry( Abc_Ntk_t *, pNtkBase->pDesign->vModules, pTemp, i )
|
||||||
Abc_NtkForEachBox( pTemp, pObj, k )
|
Abc_NtkForEachBox( pTemp, pObj, k )
|
||||||
|
|
@ -382,6 +384,120 @@ Vec_Ptr_t * Abc_NtkToBarBufsCollect( Abc_Ntk_t * pNtk )
|
||||||
return vNodes;
|
return vNodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**Function*************************************************************
|
||||||
|
|
||||||
|
Synopsis [Count barrier buffers.]
|
||||||
|
|
||||||
|
Description []
|
||||||
|
|
||||||
|
SideEffects []
|
||||||
|
|
||||||
|
SeeAlso []
|
||||||
|
|
||||||
|
***********************************************************************/
|
||||||
|
int Abc_NtkCountBarBufs( Abc_Ntk_t * pNtk )
|
||||||
|
{
|
||||||
|
Abc_Obj_t * pObj;
|
||||||
|
int i, Counter = 0;
|
||||||
|
Abc_NtkForEachNode( pNtk, pObj, i )
|
||||||
|
Counter += Abc_ObjIsBarBuf( pObj );
|
||||||
|
return Counter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**Function*************************************************************
|
||||||
|
|
||||||
|
Synopsis [Converts the network to dedicated barbufs and back.]
|
||||||
|
|
||||||
|
Description []
|
||||||
|
|
||||||
|
SideEffects []
|
||||||
|
|
||||||
|
SeeAlso []
|
||||||
|
|
||||||
|
***********************************************************************/
|
||||||
|
Abc_Ntk_t * Abc_NtkBarBufsToBuffers( Abc_Ntk_t * pNtk )
|
||||||
|
{
|
||||||
|
Vec_Ptr_t * vNodes;
|
||||||
|
Abc_Ntk_t * pNtkNew;
|
||||||
|
Abc_Obj_t * pObj, * pFanin;
|
||||||
|
int i, k;
|
||||||
|
assert( Abc_NtkIsLogic(pNtk) );
|
||||||
|
assert( pNtk->pDesign == NULL );
|
||||||
|
assert( pNtk->nBarBufs > 0 );
|
||||||
|
assert( pNtk->nBarBufs == Abc_NtkLatchNum(pNtk) );
|
||||||
|
vNodes = Abc_NtkToBarBufsCollect( 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);
|
||||||
|
// create objects
|
||||||
|
Abc_NtkCleanCopy( pNtk );
|
||||||
|
Vec_PtrForEachEntry( Abc_Obj_t *, vNodes, pObj, i )
|
||||||
|
{
|
||||||
|
if ( Abc_ObjIsPi(pObj) )
|
||||||
|
Abc_NtkDupObj( pNtkNew, pObj, 1 );
|
||||||
|
else if ( Abc_ObjIsPo( pObj) )
|
||||||
|
Abc_ObjAddFanin( Abc_NtkDupObj(pNtkNew, pObj, 1), Abc_ObjFanin0(pObj)->pCopy );
|
||||||
|
else if ( Abc_ObjIsBi(pObj) || Abc_ObjIsBo(pObj) )
|
||||||
|
pObj->pCopy = Abc_ObjFanin0(pObj)->pCopy;
|
||||||
|
else if ( Abc_ObjIsLatch(pObj) )
|
||||||
|
Abc_ObjAddFanin( (pObj->pCopy = Abc_NtkCreateNode(pNtkNew)), Abc_ObjFanin0(pObj)->pCopy );
|
||||||
|
else if ( Abc_ObjIsNode(pObj) )
|
||||||
|
{
|
||||||
|
Abc_NtkDupObj( pNtkNew, pObj, 1 );
|
||||||
|
Abc_ObjForEachFanin( pObj, pFanin, k )
|
||||||
|
Abc_ObjAddFanin( pObj->pCopy, pFanin->pCopy );
|
||||||
|
}
|
||||||
|
else assert( 0 );
|
||||||
|
}
|
||||||
|
Vec_PtrFree( vNodes );
|
||||||
|
return pNtkNew;
|
||||||
|
}
|
||||||
|
Abc_Ntk_t * Abc_NtkBarBufsFromBuffers( Abc_Ntk_t * pNtkBase, Abc_Ntk_t * pNtk )
|
||||||
|
{
|
||||||
|
Abc_Ntk_t * pNtkNew;
|
||||||
|
Abc_Obj_t * pObj, * pFanin, * pLatch;
|
||||||
|
int i, k, nBarBufs;
|
||||||
|
assert( Abc_NtkIsLogic(pNtkBase) );
|
||||||
|
assert( Abc_NtkIsLogic(pNtk) );
|
||||||
|
assert( pNtkBase->nBarBufs == Abc_NtkLatchNum(pNtkBase) );
|
||||||
|
// start the network
|
||||||
|
pNtkNew = Abc_NtkStartFrom( pNtkBase, pNtk->ntkType, pNtk->ntkFunc );
|
||||||
|
// transfer PI pointers
|
||||||
|
Abc_NtkForEachPi( pNtk, pObj, i )
|
||||||
|
pObj->pCopy = Abc_NtkPi(pNtkNew, i);
|
||||||
|
// assuming that the order/number of barbufs remains the same
|
||||||
|
nBarBufs = 0;
|
||||||
|
Abc_NtkForEachNode( pNtk, pObj, i )
|
||||||
|
{
|
||||||
|
if ( Abc_ObjIsBarBuf(pObj) )
|
||||||
|
{
|
||||||
|
pLatch = Abc_NtkBox(pNtkNew, nBarBufs++);
|
||||||
|
Abc_ObjAddFanin( Abc_ObjFanin0(pLatch), Abc_ObjFanin0(pObj)->pCopy );
|
||||||
|
pObj->pCopy = Abc_ObjFanout0(pLatch);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Abc_NtkDupObj( pNtkNew, pObj, 1 );
|
||||||
|
Abc_ObjForEachFanin( pObj, pFanin, k )
|
||||||
|
Abc_ObjAddFanin( pObj->pCopy, pFanin->pCopy );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert( nBarBufs == pNtkBase->nBarBufs );
|
||||||
|
// connect POs
|
||||||
|
Abc_NtkForEachPo( pNtk, pObj, i )
|
||||||
|
Abc_ObjAddFanin( Abc_NtkPo(pNtkNew, i), Abc_ObjFanin0(pObj)->pCopy );
|
||||||
|
return pNtkNew;
|
||||||
|
}
|
||||||
|
Abc_Ntk_t * Abc_NtkBarBufsOnOffTest( Abc_Ntk_t * pNtk )
|
||||||
|
{
|
||||||
|
Abc_Ntk_t * pNtkNew, * pNtkNew2;
|
||||||
|
pNtkNew = Abc_NtkBarBufsToBuffers( pNtk );
|
||||||
|
pNtkNew2 = Abc_NtkBarBufsFromBuffers( pNtk, pNtkNew );
|
||||||
|
Abc_NtkDelete( pNtkNew );
|
||||||
|
return pNtkNew2;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
/// END OF FILE ///
|
/// END OF FILE ///
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
||||||
|
|
@ -10295,7 +10295,7 @@ usage:
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
int Abc_CommandTest( Abc_Frame_t * pAbc, int argc, char ** argv )
|
int Abc_CommandTest( Abc_Frame_t * pAbc, int argc, char ** argv )
|
||||||
{
|
{
|
||||||
// Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);
|
Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);
|
||||||
int nCutMax = 1;
|
int nCutMax = 1;
|
||||||
int nLeafMax = 10;
|
int nLeafMax = 10;
|
||||||
int nDivMax = 50;
|
int nDivMax = 50;
|
||||||
|
|
@ -10424,8 +10424,19 @@ int Abc_CommandTest( Abc_Frame_t * pAbc, int argc, char ** argv )
|
||||||
// if ( pNtk )
|
// if ( pNtk )
|
||||||
// Abc_NtkMakeLegit( pNtk );
|
// Abc_NtkMakeLegit( pNtk );
|
||||||
{
|
{
|
||||||
extern void Ifd_ManDsdTest();
|
// extern void Ifd_ManDsdTest();
|
||||||
Ifd_ManDsdTest();
|
// Ifd_ManDsdTest();
|
||||||
|
}
|
||||||
|
if ( pNtk )
|
||||||
|
{
|
||||||
|
extern Abc_Ntk_t * Abc_NtkBarBufsOnOffTest( Abc_Ntk_t * pNtk );
|
||||||
|
Abc_Ntk_t * pNtkRes = Abc_NtkBarBufsOnOffTest( pNtk );
|
||||||
|
if ( pNtkRes == NULL )
|
||||||
|
{
|
||||||
|
Abc_Print( -1, "Command has failed.\n" );
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes );
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
usage:
|
usage:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue