From 6c93249373bb71f7f12cf99286bae0d31d884217 Mon Sep 17 00:00:00 2001 From: Alan Mishchenko Date: Wed, 4 Mar 2015 16:07:33 -0800 Subject: Improvements to the CBA package. --- src/base/cba/cba.h | 29 ++++++++++---------- src/base/cba/cbaBlast.c | 13 ++++----- src/base/cba/cbaCom.c | 37 ++++++++++++++++++++----- src/base/cba/cbaNtk.c | 51 +++++++++++++++++++---------------- src/base/cba/cbaOper.c | 4 +-- src/base/cba/cbaPrsBuild.c | 17 ++++++------ src/base/cba/cbaPtr.c | 66 ++++++++++++++++++++++++++++++++++++++++++++- src/base/cba/cbaPtrAbc.c | 19 ++++++++----- src/base/cba/cbaWriteBlif.c | 2 +- src/base/cba/cbaWriteVer.c | 7 ++++- 10 files changed, 175 insertions(+), 70 deletions(-) (limited to 'src') diff --git a/src/base/cba/cba.h b/src/base/cba/cba.h index 53652bd5..4ce02c50 100644 --- a/src/base/cba/cba.h +++ b/src/base/cba/cba.h @@ -197,9 +197,9 @@ static inline char * Cba_ManName( Cba_Man_t * p ) { r static inline char * Cba_ManSpec( Cba_Man_t * p ) { return p->pSpec; } static inline int Cba_ManNtkNum( Cba_Man_t * p ) { return p->nNtks; } static inline int Cba_ManPrimNum( Cba_Man_t * p ) { return Abc_NamObjNumMax(p->pMods) - Cba_ManNtkNum(p); } -static inline int Cba_ManNtkIsOk( Cba_Man_t * p, int i ) { return i >= 0 && i < Cba_ManNtkNum(p); } +static inline int Cba_ManNtkIsOk( Cba_Man_t * p, int i ) { return i > 0 && i <= Cba_ManNtkNum(p); } static inline Cba_Ntk_t * Cba_ManNtk( Cba_Man_t * p, int i ) { return Cba_ManNtkIsOk(p, i) ? p->pNtks + i : NULL; } -static inline int Cba_ManNtkFindId( Cba_Man_t * p, char * pName ) { return Abc_NamStrFind(p->pMods, pName) - 1; } +static inline int Cba_ManNtkFindId( Cba_Man_t * p, char * pName ) { return Abc_NamStrFind(p->pMods, pName); } static inline Cba_Ntk_t * Cba_ManNtkFind( Cba_Man_t * p, char * pName ) { return Cba_ManNtk( p, Cba_ManNtkFindId(p, pName) ); } static inline Cba_Ntk_t * Cba_ManRoot( Cba_Man_t * p ) { return Cba_ManNtk(p, p->iRoot); } static inline char * Cba_ManStr( Cba_Man_t * p, int i ) { return Abc_NamStr(p->pStrs, i); } @@ -233,7 +233,7 @@ static inline int Cba_NtkUserNum( Cba_Ntk_t * p ) { r static inline int Cba_NtkPi( Cba_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vInputs, i); } static inline int Cba_NtkPo( Cba_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vOutputs, i); } static inline char * Cba_NtkStr( Cba_Ntk_t * p, int i ) { return Cba_ManStr(p->pDesign, i); } -static inline Cba_Ntk_t * Cba_NtkHostNtk( Cba_Ntk_t * p ) { return p->iBoxNtk >= 0 ? Cba_ManNtk(p->pDesign, p->iBoxNtk) : NULL; } +static inline Cba_Ntk_t * Cba_NtkHostNtk( Cba_Ntk_t * p ) { return p->iBoxNtk > 0 ? Cba_ManNtk(p->pDesign, p->iBoxNtk) : NULL; } static inline int Cba_NtkHostObj( Cba_Ntk_t * p ) { return p->iBoxObj; } static inline void Cba_NtkSetHost( Cba_Ntk_t * p, int n, int i ) { assert(p->iBoxNtk == -1); p->iBoxNtk = n; p->iBoxObj = i; } @@ -306,7 +306,7 @@ static inline int Cba_BoxBoNum( Cba_Ntk_t * p, int i ) { i static inline int Cba_BoxSize( Cba_Ntk_t * p, int i ) { return 1 + Cba_BoxBiNum(p, i) + Cba_BoxBoNum(p, i); } static inline int Cba_BoxBi( Cba_Ntk_t * p, int b, int i ) { assert(Cba_ObjIsBox(p, b)); return b - 1 - i; } static inline int Cba_BoxBo( Cba_Ntk_t * p, int b, int i ) { assert(Cba_ObjIsBox(p, b)); return b + 1 + i; } -static inline int Cba_BoxBiBox( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsBi(p, i)); return i + 1 + Cba_ObjIndex(p, i); } +//static inline int Cba_BoxBiBox( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsBi(p, i)); return i + 1 + Cba_ObjIndex(p, i); } static inline int Cba_BoxBoBox( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsBo(p, i)); return i - 1 - Cba_ObjIndex(p, i); } static inline int Cba_BoxFanin( Cba_Ntk_t * p, int b, int i ) { return Cba_ObjFanin(p, Cba_BoxBi(p, b, i)); } static inline int Cba_BoxFaninBox( Cba_Ntk_t * p, int b, int i ) { return Cba_BoxBoBox(p, Cba_BoxFanin(p, b, i)); } @@ -316,10 +316,10 @@ static inline int Cba_ObjPiRange( Cba_Ntk_t * p, int i ) { i static inline int Cba_BoxNtkId( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsBox(p, i)); return Vec_IntEntry(&p->vFanin, i); } static inline void Cba_BoxSetNtkId( Cba_Ntk_t * p, int i, int x ) { assert(Cba_ObjIsBox(p, i)&&Cba_ManNtkIsOk(p->pDesign, x));Vec_IntSetEntry(&p->vFanin, i, x);} -static inline int Cba_BoxBiNtkId( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsBi(p, i)); return Cba_BoxNtkId(p, Cba_BoxBiBox(p, i)); } +//static inline int Cba_BoxBiNtkId( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsBi(p, i)); return Cba_BoxNtkId(p, Cba_BoxBiBox(p, i)); } static inline int Cba_BoxBoNtkId( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsBo(p, i)); return Cba_BoxNtkId(p, Cba_BoxBoBox(p, i)); } static inline Cba_Ntk_t * Cba_BoxNtk( Cba_Ntk_t * p, int i ) { return Cba_ManNtk( p->pDesign, Cba_BoxNtkId(p, i) ); } -static inline Cba_Ntk_t * Cba_BoxBiNtk( Cba_Ntk_t * p, int i ) { return Cba_ManNtk( p->pDesign, Cba_BoxBiNtkId(p, i) ); } +//static inline Cba_Ntk_t * Cba_BoxBiNtk( Cba_Ntk_t * p, int i ) { return Cba_ManNtk( p->pDesign, Cba_BoxBiNtkId(p, i) ); } static inline Cba_Ntk_t * Cba_BoxBoNtk( Cba_Ntk_t * p, int i ) { return Cba_ManNtk( p->pDesign, Cba_BoxBoNtkId(p, i) ); } static inline char * Cba_BoxNtkName( Cba_Ntk_t * p, int i ) { return Abc_NamStr( p->pDesign->pMods, Cba_BoxNtkId(p, i) ); } @@ -332,7 +332,7 @@ static inline char * Cba_BoxNtkName( Cba_Ntk_t * p, int i ) { r //////////////////////////////////////////////////////////////////////// #define Cba_ManForEachNtk( p, pNtk, i ) \ - for ( i = 0; (i < Cba_ManNtkNum(p)) && (((pNtk) = Cba_ManNtk(p, i)), 1); i++ ) + for ( i = 1; (i <= Cba_ManNtkNum(p)) && (((pNtk) = Cba_ManNtk(p, i)), 1); i++ ) #define Cba_NtkForEachPi( p, iObj, i ) \ for ( i = 0; (i < Cba_NtkPiNum(p)) && (((iObj) = Cba_NtkPi(p, i)), 1); i++ ) @@ -549,7 +549,7 @@ static inline void Cba_NtkAlloc( Cba_Ntk_t * pNew, int NameId, int nIns, int nOu if ( fFound ) printf( "Network with name %s already exists.\n", Cba_NtkStr(pNew, NameId) ); else - assert( NtkId == Cba_NtkId(pNew) + 1 ); + assert( NtkId == Cba_NtkId(pNew) ); } static inline void Cba_NtkDup( Cba_Ntk_t * pNew, Cba_Ntk_t * p ) { @@ -650,7 +650,7 @@ static inline void Cba_NtkPrintStats( Cba_Ntk_t * p ) printf( "clp =%7d ", p->Count ); printf( "obj =%7d ", Cba_NtkObjNum(p) ); printf( "%s ", Cba_NtkName(p) ); - if ( Cba_NtkHostNtk(p) ) + if ( Cba_NtkHostNtk(p) > 0 ) printf( "-> %s", Cba_NtkName(Cba_NtkHostNtk(p)) ); printf( "\n" ); } @@ -725,9 +725,9 @@ static inline Cba_Man_t * Cba_ManAlloc( char * pFileName, int nNtks ) pNew->pSpec = Abc_UtilStrsav( pFileName ); pNew->pStrs = Abc_NamStart( 1000, 24 ); pNew->pMods = Abc_NamStart( 1000, 24 ); - pNew->iRoot = 0; + pNew->iRoot = 1; pNew->nNtks = nNtks; - pNew->pNtks = ABC_CALLOC( Cba_Ntk_t, pNew->nNtks ); + pNew->pNtks = ABC_CALLOC( Cba_Ntk_t, pNew->nNtks + 1 ); Cba_ManForEachNtk( pNew, pNtk, i ) pNtk->pDesign = pNew; Cba_ManSetupTypes( pNew->pPrimNames, pNew->pPrimSymbs ); @@ -741,9 +741,9 @@ static inline Cba_Man_t * Cba_ManStart( Cba_Man_t * p, int nNtks ) pNew->pSpec = Abc_UtilStrsav( Cba_ManSpec(p) ); pNew->pStrs = Abc_NamRef( p->pStrs ); pNew->pMods = Abc_NamStart( 1000, 24 ); - pNew->iRoot = 0; + pNew->iRoot = 1; pNew->nNtks = nNtks; - pNew->pNtks = ABC_CALLOC( Cba_Ntk_t, nNtks ); + pNew->pNtks = ABC_CALLOC( Cba_Ntk_t, nNtks + 1 ); Cba_ManForEachNtk( pNew, pNtk, i ) pNtk->pDesign = pNew; return pNew; @@ -858,7 +858,7 @@ static inline void Cba_ManPrintStats( Cba_Man_t * p, int nModules, int fVerbose Cba_ManBoxNum( p ); Cba_ManForEachNtk( p, pNtk, i ) { - if ( i == nModules ) + if ( i == nModules+1 ) break; printf( "Module %5d : ", i ); Cba_NtkPrintStats( pNtk ); @@ -986,6 +986,7 @@ extern Cba_Man_t * Cba_ManCollapse( Cba_Man_t * p ); extern void Cba_PtrFree( Vec_Ptr_t * vDes ); extern int Cba_PtrMemory( Vec_Ptr_t * vDes ); extern void Cba_PtrDumpBlif( char * pFileName, Vec_Ptr_t * vDes ); +extern void Cba_PtrDumpVerilog( char * pFileName, Vec_Ptr_t * vDes ); extern Vec_Ptr_t * Cba_PtrTransformTest( Vec_Ptr_t * vDes ); /*=== cbaPtrAbc.c ============================================================*/ extern Cba_Man_t * Cba_PtrTransformToCba( Vec_Ptr_t * vDes ); diff --git a/src/base/cba/cbaBlast.c b/src/base/cba/cbaBlast.c index e4b3fc1a..446cd4b4 100644 --- a/src/base/cba/cbaBlast.c +++ b/src/base/cba/cbaBlast.c @@ -93,6 +93,7 @@ int Cba_ManAddBarbuf( Gia_Man_t * pNew, int iRes, Cba_Man_t * p, int iLNtk, int if ( vMap && Abc_Lit2Var(iRes) < Vec_IntSize(vMap) && (iIdLit = Vec_IntEntry(vMap, Abc_Lit2Var(iRes))) >= 0 && Vec_IntEntry(&p->vBuf2LeafNtk, Abc_Lit2Var(iIdLit)) == iLNtk && Vec_IntEntry(&p->vBuf2RootNtk, Abc_Lit2Var(iIdLit)) == iRNtk ) return Abc_LitNotCond( Vec_IntEntry(pNew->vBarBufs, Abc_Lit2Var(iIdLit)), Abc_LitIsCompl(iRes) ^ Abc_LitIsCompl(iIdLit) ); + assert( Cba_ManNtkIsOk(p, iLNtk) && Cba_ManNtkIsOk(p, iRNtk) ); Vec_IntPush( &p->vBuf2LeafNtk, iLNtk ); Vec_IntPush( &p->vBuf2LeafObj, iLObj ); Vec_IntPush( &p->vBuf2RootNtk, iRNtk ); @@ -277,9 +278,9 @@ void Cba_ManMarkNodesGia( Cba_Man_t * p, Gia_Man_t * pGia ) { Gia_Obj_t * pObj; int i, Count = 0; assert( Vec_IntSize(&p->vBuf2LeafNtk) == Gia_ManBufNum(pGia) ); - Gia_ManConst0(pGia)->Value = 0; + Gia_ManConst0(pGia)->Value = 1; Gia_ManForEachPi( pGia, pObj, i ) - pObj->Value = 0; + pObj->Value = 1; Gia_ManForEachAnd( pGia, pObj, i ) { if ( Gia_ObjIsBuf(pObj) ) @@ -293,8 +294,8 @@ void Cba_ManMarkNodesGia( Cba_Man_t * p, Gia_Man_t * pGia ) assert( Count == Gia_ManBufNum(pGia) ); Gia_ManForEachPo( pGia, pObj, i ) { - assert( Gia_ObjFanin0(pObj)->Value == 0 ); - pObj->Value = 0; + assert( Gia_ObjFanin0(pObj)->Value == 1 ); + pObj->Value = 1; } } void Cba_ManRemapBarbufs( Cba_Man_t * pNew, Cba_Man_t * p ) @@ -444,7 +445,7 @@ void Cba_ManMarkNodesAbc( Cba_Man_t * p, Abc_Ntk_t * pNtk ) Abc_Obj_t * pObj, * pFanin; int i, k, Count = 0; assert( Vec_IntSize(&p->vBuf2LeafNtk) == pNtk->nBarBufs2 ); Abc_NtkForEachPi( pNtk, pObj, i ) - pObj->iTemp = 0; + pObj->iTemp = 1; Abc_NtkForEachNode( pNtk, pObj, i ) { if ( Abc_ObjIsBarBuf(pObj) ) @@ -460,7 +461,7 @@ void Cba_ManMarkNodesAbc( Cba_Man_t * p, Abc_Ntk_t * pNtk ) { if ( !Abc_NodeIsSeriousGate(Abc_ObjFanin0(pObj)) ) continue; - assert( Abc_ObjFanin0(pObj)->iTemp == 0 ); + assert( Abc_ObjFanin0(pObj)->iTemp == 1 ); pObj->iTemp = Abc_ObjFanin0(pObj)->iTemp; } assert( Count == pNtk->nBarBufs2 ); diff --git a/src/base/cba/cbaCom.c b/src/base/cba/cbaCom.c index f587b96d..0c9c2ce9 100644 --- a/src/base/cba/cbaCom.c +++ b/src/base/cba/cbaCom.c @@ -144,15 +144,18 @@ int Cba_CommandRead( Abc_Frame_t * pAbc, int argc, char ** argv ) Cba_Man_t * p = NULL; Vec_Ptr_t * vDes = NULL; char * pFileName = NULL; - int c, fUseAbc = 0, fVerbose = 0; + int c, fUseAbc = 0, fUsePtr = 0, fVerbose = 0; Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "avh" ) ) != EOF ) + while ( ( c = Extra_UtilGetopt( argc, argv, "apvh" ) ) != EOF ) { switch ( c ) { case 'a': fUseAbc ^= 1; break; + case 'p': + fUsePtr ^= 1; + break; case 'v': fVerbose ^= 1; break; @@ -179,7 +182,7 @@ int Cba_CommandRead( Abc_Frame_t * pAbc, int argc, char ** argv ) } fclose( pFile ); // perform reading - if ( fUseAbc ) + if ( fUseAbc || fUsePtr ) { extern Vec_Ptr_t * Ptr_AbcDeriveDes( Abc_Ntk_t * pNtk ); Abc_Ntk_t * pAbcNtk = Io_ReadNetlist( pFileName, Io_ReadFileType(pFileName), 0 ); @@ -229,9 +232,10 @@ int Cba_CommandRead( Abc_Frame_t * pAbc, int argc, char ** argv ) Cba_AbcUpdateMan( pAbc, p ); return 0; usage: - Abc_Print( -2, "usage: @read [-avh] \n" ); + Abc_Print( -2, "usage: @read [-apvh] \n" ); Abc_Print( -2, "\t reads hierarchical design in BLIF or Verilog\n" ); Abc_Print( -2, "\t-a : toggle using old ABC parser [default = %s]\n", fUseAbc? "yes": "no" ); + Abc_Print( -2, "\t-p : toggle using Ptr construction [default = %s]\n", fUsePtr? "yes": "no" ); Abc_Print( -2, "\t-v : toggle printing verbose information [default = %s]\n", fVerbose? "yes": "no" ); Abc_Print( -2, "\t-h : print the command usage\n"); return 1; @@ -253,15 +257,19 @@ int Cba_CommandWrite( Abc_Frame_t * pAbc, int argc, char ** argv ) Cba_Man_t * p = Cba_AbcGetMan(pAbc); char * pFileName = NULL; int fUseAssign = 1; + int fUsePtr = 0; int c, fVerbose = 0; Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "avh" ) ) != EOF ) + while ( ( c = Extra_UtilGetopt( argc, argv, "apvh" ) ) != EOF ) { switch ( c ) { case 'a': fUseAssign ^= 1; break; + case 'p': + fUsePtr ^= 1; + break; case 'v': fVerbose ^= 1; break; @@ -289,7 +297,21 @@ int Cba_CommandWrite( Abc_Frame_t * pAbc, int argc, char ** argv ) if ( !strcmp( Extra_FileNameExtension(pFileName), "blif" ) ) Cba_ManWriteBlif( pFileName, p ); else if ( !strcmp( Extra_FileNameExtension(pFileName), "v" ) ) - Cba_ManWriteVerilog( pFileName, p, fUseAssign ); + { + if ( fUsePtr ) + { + Vec_Ptr_t * vPtr = Cba_PtrDeriveFromCba( p ); + if ( vPtr == NULL ) + printf( "Converting to Ptr has failed.\n" ); + else + { + Cba_PtrDumpVerilog( pFileName, vPtr ); + Cba_PtrFree( vPtr ); + } + } + else + Cba_ManWriteVerilog( pFileName, p, fUseAssign ); + } else if ( !strcmp( Extra_FileNameExtension(pFileName), "cba" ) ) Cba_ManWriteCba( pFileName, p ); else @@ -299,9 +321,10 @@ int Cba_CommandWrite( Abc_Frame_t * pAbc, int argc, char ** argv ) } return 0; usage: - Abc_Print( -2, "usage: @write [-avh]\n" ); + Abc_Print( -2, "usage: @write [-apvh]\n" ); Abc_Print( -2, "\t writes the design into a file in BLIF or Verilog\n" ); Abc_Print( -2, "\t-a : toggle using assign-statement for primitives [default = %s]\n", fUseAssign? "yes": "no" ); + Abc_Print( -2, "\t-p : toggle using Ptr construction (mapped Verilog only) [default = %s]\n", fUsePtr? "yes": "no" ); Abc_Print( -2, "\t-v : toggle printing verbose information [default = %s]\n", fVerbose? "yes": "no" ); Abc_Print( -2, "\t-h : print the command usage\n"); return 1; diff --git a/src/base/cba/cbaNtk.c b/src/base/cba/cbaNtk.c index e567ae39..93f33839 100644 --- a/src/base/cba/cbaNtk.c +++ b/src/base/cba/cbaNtk.c @@ -341,30 +341,33 @@ void Cba_ManAssignInternWordNamesNtk( Cba_Ntk_t * p, Vec_Int_t * vMap ) } } // transfer names to the interface - for ( k = 0; k < Cba_NtkInfoNum(p); k++ ) + if ( Cba_NtkInfoNum(p) ) { - //char * pName = Cba_NtkName(p); - if ( Cba_NtkInfoType(p, k) == 1 ) // PI + for ( k = 0; k < Cba_NtkInfoNum(p); k++ ) { - iObj = Cba_NtkPi(p, nPis); - assert( !Cba_ObjBit(p, iObj) ); - assert( Cba_ObjNameType(p, iObj) <= CBA_NAME_WORD ); - Cba_NtkSetInfoName( p, k, Abc_Var2Lit2(Cba_ObjNameId(p, iObj), 1) ); - nPis += Cba_NtkInfoRange(p, k); - } - else if ( Cba_NtkInfoType(p, k) == 2 ) // PO - { - iObj = Cba_NtkPo(p, nPos); - assert( !Cba_ObjBit(p, iObj) ); - iObj = Cba_ObjFanin(p, iObj); - assert( Cba_ObjNameType(p, iObj) <= CBA_NAME_WORD ); - Cba_NtkSetInfoName( p, k, Abc_Var2Lit2(Cba_ObjNameId(p, iObj), 2) ); - nPos += Cba_NtkInfoRange(p, k); + //char * pName = Cba_NtkName(p); + if ( Cba_NtkInfoType(p, k) == 1 ) // PI + { + iObj = Cba_NtkPi(p, nPis); + assert( !Cba_ObjBit(p, iObj) ); + assert( Cba_ObjNameType(p, iObj) <= CBA_NAME_WORD ); + Cba_NtkSetInfoName( p, k, Abc_Var2Lit2(Cba_ObjNameId(p, iObj), 1) ); + nPis += Cba_NtkInfoRange(p, k); + } + else if ( Cba_NtkInfoType(p, k) == 2 ) // PO + { + iObj = Cba_NtkPo(p, nPos); + assert( !Cba_ObjBit(p, iObj) ); + iObj = Cba_ObjFanin(p, iObj); + assert( Cba_ObjNameType(p, iObj) <= CBA_NAME_WORD ); + Cba_NtkSetInfoName( p, k, Abc_Var2Lit2(Cba_ObjNameId(p, iObj), 2) ); + nPos += Cba_NtkInfoRange(p, k); + } + else assert( 0 ); } - else assert( 0 ); + assert( nPis == Cba_NtkPiNum(p) ); + assert( nPos == Cba_NtkPoNum(p) ); } - assert( nPis == Cba_NtkPiNum(p) ); - assert( nPos == Cba_NtkPoNum(p) ); // assign instance names nDigits = Abc_Base10Log( Cba_NtkObjNum(p) ); Cba_NtkForEachBox( p, iObj ) @@ -388,7 +391,7 @@ void Cba_ManAssignInternWordNamesNtk( Cba_Ntk_t * p, Vec_Int_t * vMap ) } void Cba_ManAssignInternWordNames( Cba_Man_t * p ) { - Vec_Int_t * vMap = Vec_IntStart( Cba_ManObjNum(p) ); + Vec_Int_t * vMap = Vec_IntStart( 2*Cba_ManObjNum(p) ); Cba_Ntk_t * pNtk; int i; Cba_ManForEachNtk( p, pNtk, i ) Cba_ManAssignInternWordNamesNtk( pNtk, vMap ); @@ -569,6 +572,8 @@ Cba_Man_t * Cba_ManCollapse( Cba_Man_t * p ) Cba_Ntk_t * pRoot = Cba_ManRoot( p ); Cba_Ntk_t * pRootNew = Cba_ManRoot( pNew ); Cba_NtkAlloc( pRootNew, Cba_NtkNameId(pRoot), Cba_NtkPiNum(pRoot), Cba_NtkPoNum(pRoot), Cba_ManClpObjNum(p) ); + if ( Vec_IntSize(&pRoot->vInfo) ) + Vec_IntAppend( &pRootNew->vInfo, &pRoot->vInfo ); Cba_NtkForEachPi( pRoot, iObj, i ) Vec_IntPush( vSigs, Cba_ObjAlloc(pRootNew, CBA_OBJ_PI, -1) ); Cba_NtkCollapse_rec( pRootNew, pRoot, vSigs ); @@ -582,10 +587,10 @@ Cba_Man_t * Cba_ManCollapse( Cba_Man_t * p ) { Cba_NtkStartNames( pRootNew ); Cba_NtkForEachPi( pRoot, iObj, i ) - Cba_ObjSetName( pRootNew, Cba_NtkPi(pRootNew, i), Cba_ObjNameId(pRoot, iObj) ); + Cba_ObjSetName( pRootNew, Cba_NtkPi(pRootNew, i), Cba_ObjName(pRoot, iObj) ); Cba_NtkForEachPoDriver( pRoot, iObj, i ) if ( !Cba_ObjIsPi(pRoot, iObj) ) - Cba_ObjSetName( pRootNew, Cba_ObjCopy(pRoot, iObj), Cba_ObjNameId(pRoot, iObj) ); + Cba_ObjSetName( pRootNew, Cba_ObjCopy(pRoot, iObj), Cba_ObjName(pRoot, iObj) ); } return pNew; } diff --git a/src/base/cba/cbaOper.c b/src/base/cba/cbaOper.c index 4fe6d852..b39618b7 100644 --- a/src/base/cba/cbaOper.c +++ b/src/base/cba/cbaOper.c @@ -350,8 +350,8 @@ int Cba_ObjClpMemory( Cba_Ntk_t * p, int iBox ) // collect address } // for each fanout of RAMBOX, makes ure address width is the same - Cba_BoxForEachFanoutBox( p, iBox, iNext, i ) - assert( Cba_ObjType(p, iNext) == CBA_BOX_RAMR ); +// Cba_BoxForEachFanoutBox( p, iBox, iNext, i ) +// assert( Cba_ObjType(p, iNext) == CBA_BOX_RAMR ); // create selectors and connect them return 1; } diff --git a/src/base/cba/cbaPrsBuild.c b/src/base/cba/cbaPrsBuild.c index e3e51c1c..ba1bbc24 100644 --- a/src/base/cba/cbaPrsBuild.c +++ b/src/base/cba/cbaPrsBuild.c @@ -152,9 +152,10 @@ void Prs_ManRemapBoxes( Cba_Man_t * pNew, Vec_Ptr_t * vDes, Prs_Ntk_t * pNtk, Ve { int NtkId = Prs_BoxNtk( pNtk, iBox ); int NtkIdNew = Cba_ManNtkFindId( pNew, Prs_NtkStr(pNtk, NtkId) ); + assert( NtkIdNew > 0 ); Prs_BoxSetNtk( pNtk, iBox, NtkIdNew ); - if ( NtkIdNew < Cba_ManNtkNum(pNew) ) - Prs_ManRemapOne( vSigs, Prs_ManNtk(vDes, NtkIdNew), vMap ); + if ( NtkIdNew <= Cba_ManNtkNum(pNew) ) + Prs_ManRemapOne( vSigs, Prs_ManNtk(vDes, NtkIdNew-1), vMap ); //else // Prs_ManRemapGate( vSigs ); } @@ -194,10 +195,10 @@ void Prs_ManBuildNtk( Cba_Ntk_t * pNew, Vec_Ptr_t * vDes, Prs_Ntk_t * pNtk, Vec_ Prs_NtkForEachBox( pNtk, vSigs, iBox ) if ( !Prs_BoxIsNode(pNtk, iBox) ) { - pNtkBox = Prs_ManNtk( vDes, Prs_BoxNtk(pNtk, iBox) ); + pNtkBox = Prs_ManNtk( vDes, Prs_BoxNtk(pNtk, iBox)-1 ); if ( pNtkBox == NULL ) { - iObj = Cba_BoxAlloc( pNew, CBA_BOX_GATE, Vec_IntSize(vSigs)/2-1, 1, Prs_BoxNtk(pNtk, iBox) + 1 ); // +1 to map NtkId into gate name + iObj = Cba_BoxAlloc( pNew, CBA_BOX_GATE, Vec_IntSize(vSigs)/2-1, 1, Prs_BoxNtk(pNtk, iBox) ); Cba_ObjSetName( pNew, iObj, Abc_Var2Lit2(Prs_BoxName(pNtk, iBox), CBA_NAME_BIN) ); // consider box output NameId = Vec_IntEntryLast( vSigs ); @@ -250,7 +251,7 @@ void Prs_ManBuildNtk( Cba_Ntk_t * pNew, Vec_Ptr_t * vDes, Prs_Ntk_t * pNtk, Vec_ Prs_NtkForEachBox( pNtk, vSigs, iBox ) if ( !Prs_BoxIsNode(pNtk, iBox) ) { - pNtkBox = Prs_ManNtk( vDes, Prs_BoxNtk(pNtk, iBox) ); + pNtkBox = Prs_ManNtk( vDes, Prs_BoxNtk(pNtk, iBox)-1 ); iObj = Vec_IntEntry( vBoxes, iBox ); if ( pNtkBox == NULL ) { @@ -352,16 +353,16 @@ Cba_Man_t * Prs_ManBuildCba( char * pFileName, Vec_Ptr_t * vDes ) Abc_NamDeref( pNew->pStrs ); pNew->pStrs = Abc_NamRef( pNtk->pStrs ); Vec_PtrForEachEntry( Prs_Ntk_t *, vDes, pNtk, i ) - Cba_NtkAlloc( Cba_ManNtk(pNew, i), Prs_NtkId(pNtk), Prs_NtkPiNum(pNtk), Prs_NtkPoNum(pNtk), Prs_NtkCountObjects(pNtk) ); + Cba_NtkAlloc( Cba_ManNtk(pNew, i+1), Prs_NtkId(pNtk), Prs_NtkPiNum(pNtk), Prs_NtkPoNum(pNtk), Prs_NtkCountObjects(pNtk) ); if ( (pNtk->fMapped || (pNtk->fSlices && Prs_ManIsMapped(pNtk))) && !Cba_NtkBuildLibrary(pNew) ) Cba_ManFree(pNew), pNew = NULL; else Vec_PtrForEachEntry( Prs_Ntk_t *, vDes, pNtk, i ) - Prs_ManBuildNtk( Cba_ManNtk(pNew, i), vDes, pNtk, vMap, vTmp ); + Prs_ManBuildNtk( Cba_ManNtk(pNew, i+1), vDes, pNtk, vMap, vTmp ); assert( Vec_IntCountEntry(vMap, -1) == Vec_IntSize(vMap) ); Vec_IntFree( vMap ); Vec_IntFree( vTmp ); -// Vec_StrPrint( &Cba_ManNtk(pNew, 0)->vType, 1 ); +// Vec_StrPrint( &Cba_ManNtk(pNew, 1)->vType, 1 ); return pNew; } diff --git a/src/base/cba/cbaPtr.c b/src/base/cba/cbaPtr.c index aedaee95..d5427eff 100644 --- a/src/base/cba/cbaPtr.c +++ b/src/base/cba/cbaPtr.c @@ -198,12 +198,76 @@ void Cba_PtrDumpBlif( char * pFileName, Vec_Ptr_t * vDes ) printf( "Cannot open output file \"%s\".\n", pFileName ); return; } - fprintf( pFile, "// Design \"%s\" written by ABC on %s\n\n", (char *)Vec_PtrEntry(vDes, 0), Extra_TimeStamp() ); + fprintf( pFile, "// Design \"%s\" written via Ptr in ABC on %s\n\n", (char *)Vec_PtrEntry(vDes, 0), Extra_TimeStamp() ); Vec_PtrForEachEntryStart( Vec_Ptr_t *, vDes, vNtk, i, 1 ) Cba_PtrDumpModuleBlif( pFile, vNtk ); fclose( pFile ); } +/**Function************************************************************* + + Synopsis [Dumping Ptr into a Verilog file.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Cba_PtrDumpSignalsVerilog( FILE * pFile, Vec_Ptr_t * vSigs, int fAlwaysComma ) +{ + char * pSig; int i; + Vec_PtrForEachEntry( char *, vSigs, pSig, i ) + fprintf( pFile, " %s%s", pSig, (fAlwaysComma || i < Vec_PtrSize(vSigs) - 1) ? ",":"" ); +} +void Cba_PtrDumpBoxVerilog( FILE * pFile, Vec_Ptr_t * vBox ) +{ + char * pName; int i; + fprintf( pFile, " %s", (char *)Vec_PtrEntry(vBox, 0) ); + fprintf( pFile, " %s (", (char *)Vec_PtrEntry(vBox, 1) ); // write intance name in Verilog + Vec_PtrForEachEntryStart( char *, vBox, pName, i, 2 ) + fprintf( pFile, ".%s(%s)%s", pName, (char *)Vec_PtrEntry(vBox, i+1), i < Vec_PtrSize(vBox) - 2 ? ", ":"" ), i++; + fprintf( pFile, ");\n" ); +} +void Cba_PtrDumpBoxesVerilog( FILE * pFile, Vec_Ptr_t * vBoxes ) +{ + Vec_Ptr_t * vBox; int i; + Vec_PtrForEachEntry( Vec_Ptr_t *, vBoxes, vBox, i ) + Cba_PtrDumpBoxVerilog( pFile, vBox ); +} +void Cba_PtrDumpModuleVerilog( FILE * pFile, Vec_Ptr_t * vNtk ) +{ + fprintf( pFile, "module %s (\n ", (char *)Vec_PtrEntry(vNtk, 0) ); + Cba_PtrDumpSignalsVerilog( pFile, (Vec_Ptr_t *)Vec_PtrEntry(vNtk, 1), 1 ); + Cba_PtrDumpSignalsVerilog( pFile, (Vec_Ptr_t *)Vec_PtrEntry(vNtk, 2), 0 ); + fprintf( pFile, "\n );\n" ); + fprintf( pFile, " input" ); + Cba_PtrDumpSignalsVerilog( pFile, (Vec_Ptr_t *)Vec_PtrEntry(vNtk, 1), 0 ); + fprintf( pFile, ";\n" ); + fprintf( pFile, " output" ); + Cba_PtrDumpSignalsVerilog( pFile, (Vec_Ptr_t *)Vec_PtrEntry(vNtk, 2), 0 ); + fprintf( pFile, ";\n" ); + assert( Vec_PtrSize((Vec_Ptr_t *)Vec_PtrEntry(vNtk, 3)) == 0 ); // no nodes; only boxes + Cba_PtrDumpBoxesVerilog( pFile, (Vec_Ptr_t *)Vec_PtrEntry(vNtk, 4) ); + fprintf( pFile, "endmodule\n\n" ); +} +void Cba_PtrDumpVerilog( char * pFileName, Vec_Ptr_t * vDes ) +{ + FILE * pFile; + Vec_Ptr_t * vNtk; int i; + pFile = fopen( pFileName, "wb" ); + if ( pFile == NULL ) + { + printf( "Cannot open output file \"%s\".\n", pFileName ); + return; + } + fprintf( pFile, "// Design \"%s\" written via Ptr in ABC on %s\n\n", (char *)Vec_PtrEntry(vDes, 0), Extra_TimeStamp() ); + Vec_PtrForEachEntryStart( Vec_Ptr_t *, vDes, vNtk, i, 1 ) + Cba_PtrDumpModuleVerilog( pFile, vNtk ); + fclose( pFile ); +} + /**Function************************************************************* diff --git a/src/base/cba/cbaPtrAbc.c b/src/base/cba/cbaPtrAbc.c index b2c635ca..c35bb6d7 100644 --- a/src/base/cba/cbaPtrAbc.c +++ b/src/base/cba/cbaPtrAbc.c @@ -269,7 +269,7 @@ int Ptr_ManCountNtk( Vec_Ptr_t * vNtk ) int Cba_BoxCountOutputs( Cba_Ntk_t * pNtk, char * pBoxNtk ) { int ModuleId = Cba_ManNtkFindId( pNtk->pDesign, pBoxNtk ); - if ( ModuleId == -1 ) + if ( ModuleId == 0 ) return 1; return Cba_NtkPoNumAlloc( Cba_ManNtk(pNtk->pDesign, ModuleId) ); } @@ -306,7 +306,7 @@ int Cba_NtkDeriveFromPtr( Cba_Ntk_t * pNtk, Vec_Ptr_t * vNtk, Vec_Int_t * vMap, assert( Vec_PtrSize(vBox) % 2 == 0 ); assert( nOutputs > 0 && 2*(nOutputs + 1) <= Vec_PtrSize(vBox) ); iObj = Cba_BoxAlloc( pNtk, Ptr_NameToType(pBoxNtk), nInputs, nOutputs, NtkId ); - if ( NtkId >= 0 ) + if ( NtkId > 0 ) Cba_NtkSetHost( Cba_ManNtk(pNtk->pDesign, NtkId), Cba_NtkId(pNtk), iObj ); Cba_ObjSetName( pNtk, iObj, Abc_Var2Lit2(Abc_NamStrFindOrAdd(pNtk->pDesign->pStrs, pBoxName, NULL), CBA_NAME_BIN) ); Cba_BoxForEachBo( pNtk, iObj, iTerm, k ) @@ -362,7 +362,7 @@ Cba_Man_t * Cba_PtrTransformToCba( Vec_Ptr_t * vDes ) Cba_Ntk_t * pNtk; int i; Cba_ManForEachNtk( pNew, pNtk, i ) { - Vec_Ptr_t * vNtk = (Vec_Ptr_t *)Vec_PtrEntry(vDes, i+1); + Vec_Ptr_t * vNtk = (Vec_Ptr_t *)Vec_PtrEntry(vDes, i); Vec_Ptr_t * vInputs = (Vec_Ptr_t *)Vec_PtrEntry(vNtk, 1); Vec_Ptr_t * vOutputs = (Vec_Ptr_t *)Vec_PtrEntry(vNtk, 2); int NameId = Abc_NamStrFindOrAdd( pNew->pStrs, (char *)Vec_PtrEntry(vNtk, 0), NULL ); @@ -372,11 +372,11 @@ Cba_Man_t * Cba_PtrTransformToCba( Vec_Ptr_t * vDes ) // parse the networks Cba_ManForEachNtk( pNew, pNtk, i ) { - Vec_Ptr_t * vNtk = (Vec_Ptr_t *)Vec_PtrEntry(vDes, i+1); + Vec_Ptr_t * vNtk = (Vec_Ptr_t *)Vec_PtrEntry(vDes, i); if ( !Cba_NtkDeriveFromPtr( pNtk, vNtk, vMap, vBox2Id ) ) break; } - if ( i < Cba_ManNtkNum(pNew) ) + if ( i <= Cba_ManNtkNum(pNew) ) Cba_ManFree(pNew), pNew = NULL; Vec_IntFree( vBox2Id ); Vec_IntFree( vMap ); @@ -400,8 +400,8 @@ Vec_Ptr_t * Cba_NtkTransformToPtrBox( Cba_Ntk_t * p, int iBox ) int i, iTerm, fUser = Cba_ObjIsBoxUser( p, iBox ); Cba_Ntk_t * pBoxNtk = Cba_BoxNtk( p, iBox ); Mio_Library_t * pLib = (Mio_Library_t *)p->pDesign->pMioLib; - Mio_Gate_t * pGate = Mio_LibraryReadGateByName( pLib, Cba_BoxNtkName(p, iBox), NULL ); - Vec_Ptr_t * vBox = Vec_PtrAllocExact( Cba_BoxSize(p, iBox) ); + Mio_Gate_t * pGate = pLib ? Mio_LibraryReadGateByName( pLib, Cba_BoxNtkName(p, iBox), NULL ) : NULL; + Vec_Ptr_t * vBox = Vec_PtrAllocExact( 2*Cba_BoxSize(p, iBox) ); Vec_PtrPush( vBox, Cba_BoxNtkName(p, iBox) ); Vec_PtrPush( vBox, Cba_ObjNameStr(p, iBox) ); Cba_BoxForEachBi( p, iBox, iTerm, i ) @@ -462,6 +462,11 @@ Vec_Ptr_t * Cba_PtrDeriveFromCba( Cba_Man_t * p ) Cba_Ntk_t * pTemp; int i; if ( p == NULL ) return NULL; + if ( p->pMioLib == NULL ) + { + printf( "Cannot transform CBA network into Ptr because it is not mapped.\n" ); + return NULL; + } Cba_ManAssignInternWordNames( p ); vDes = Vec_PtrAllocExact( 1 + Cba_ManNtkNum(p) ); Vec_PtrPush( vDes, p->pName ); diff --git a/src/base/cba/cbaWriteBlif.c b/src/base/cba/cbaWriteBlif.c index 29f8f89b..6b34cf77 100644 --- a/src/base/cba/cbaWriteBlif.c +++ b/src/base/cba/cbaWriteBlif.c @@ -219,7 +219,7 @@ void Cba_ManWriteBlif( char * pFileName, Cba_Man_t * p ) printf( "Cannot open output file \"%s\".\n", pFileName ); return; } - fprintf( pFile, "# Design \"%s\" written by ABC on %s\n\n", Cba_ManName(p), Extra_TimeStamp() ); + fprintf( pFile, "# Design \"%s\" written via CBA package in ABC on %s\n\n", Cba_ManName(p), Extra_TimeStamp() ); Cba_ManAssignInternWordNames( p ); Cba_ManForEachNtk( p, pNtk, i ) Cba_ManWriteBlifNtk( pFile, pNtk ); diff --git a/src/base/cba/cbaWriteVer.c b/src/base/cba/cbaWriteVer.c index 15ed2c36..70042f21 100644 --- a/src/base/cba/cbaWriteVer.c +++ b/src/base/cba/cbaWriteVer.c @@ -397,7 +397,7 @@ static inline void Cba_ManWriteGate( Cba_Ntk_t * p, int iObj ) char * pGateName = Abc_NamStr(p->pDesign->pMods, Cba_BoxNtkId(p, iObj)); Mio_Library_t * pLib = (Mio_Library_t *)Abc_FrameReadLibGen( Abc_FrameGetGlobalFrame() ); Mio_Gate_t * pGate = Mio_LibraryReadGateByName( pLib, pGateName, NULL ); - Vec_StrPrintStr( vStr, " " ); + Vec_StrPrintStr( vStr, " " ); Vec_StrPrintStr( vStr, pGateName ); Vec_StrPrintStr( vStr, " " ); Vec_StrPrintStr( vStr, Cba_ObjName(p, iObj) ? Cba_ObjNameStr(p, iObj) : "" ); @@ -669,6 +669,11 @@ void Cba_ManWriteVerilog( char * pFileName, Cba_Man_t * p, int fUseAssign ) // derive the stream p->vOut = Vec_StrAlloc( 10000 ); p->vOut2 = Vec_StrAlloc( 1000 ); + Vec_StrPrintStr( p->vOut, "// Design \"" ); + Vec_StrPrintStr( p->vOut, Cba_ManName(p) ); + Vec_StrPrintStr( p->vOut, "\" written via CBA package in ABC on " ); + Vec_StrPrintStr( p->vOut, Extra_TimeStamp() ); + Vec_StrPrintStr( p->vOut, "\n\n" ); Cba_ManAssignInternWordNames( p ); Cba_ManForEachNtk( p, pNtk, i ) Cba_ManWriteVerilogNtk( pNtk, fUseAssign ); -- cgit v1.2.3