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 | |
| parent | 7a3e57a4cb174325f7d78cedecb75da6f2b87fc5 (diff) | |
| download | abc-89eed1aaf95ae9f2682c7b801d02954e5e3b8c7b.tar.gz abc-89eed1aaf95ae9f2682c7b801d02954e5e3b8c7b.tar.bz2 abc-89eed1aaf95ae9f2682c7b801d02954e5e3b8c7b.zip | |
Adding barrier buffers.
| -rw-r--r-- | abclib.dsp | 4 | ||||
| -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 | 
10 files changed, 449 insertions, 38 deletions
| @@ -99,6 +99,10 @@ SOURCE=.\src\base\abc\abcAig.c  # End Source File  # Begin Source File +SOURCE=.\src\base\abc\abcBarBuf.c +# End Source File +# Begin Source File +  SOURCE=.\src\base\abc\abcBlifMv.c  # End Source File  # Begin Source File 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 ); | 
