From 7b1c25086b650aa0b86280ea8c97ececbac79732 Mon Sep 17 00:00:00 2001 From: Alan Mishchenko Date: Sun, 1 Feb 2015 20:50:59 -0800 Subject: Improvements and tuning of CBA. --- src/base/cba/cba.h | 14 ++++++++--- src/base/cba/cbaBlast.c | 62 ++++++++++++++-------------------------------- src/base/cba/cbaCom.c | 26 +++++++++++-------- src/base/cba/cbaNtk.c | 2 +- src/base/cba/cbaWriteVer.c | 15 ++++++++++- 5 files changed, 60 insertions(+), 59 deletions(-) (limited to 'src/base/cba') diff --git a/src/base/cba/cba.h b/src/base/cba/cba.h index 2188f23d..e09baadc 100644 --- a/src/base/cba/cba.h +++ b/src/base/cba/cba.h @@ -194,6 +194,8 @@ static inline int Cba_NtkPiNumAlloc( Cba_Ntk_t * p ) { r static inline int Cba_NtkPoNumAlloc( Cba_Ntk_t * p ) { return Vec_IntCap(&p->vOutputs); } static inline int Cba_NtkBiNum( Cba_Ntk_t * p ) { return Vec_StrCountEntry(&p->vType, (char)CBA_OBJ_BI); } static inline int Cba_NtkBoNum( Cba_Ntk_t * p ) { return Vec_StrCountEntry(&p->vType, (char)CBA_OBJ_BO); } +static inline int Cba_NtkCiNum( Cba_Ntk_t * p ) { return Cba_NtkPiNum(p) + Cba_NtkBoNum(p); } +static inline int Cba_NtkCoNum( Cba_Ntk_t * p ) { return Cba_NtkPoNum(p) + Cba_NtkBiNum(p); } static inline int Cba_NtkBoxNum( Cba_Ntk_t * p ) { return Cba_NtkObjNum(p) - Vec_StrCountSmaller(&p->vType, (char)CBA_OBJ_BOX); } static inline int Cba_NtkPrimNum( Cba_Ntk_t * p ) { return Vec_StrCountLarger(&p->vType, (char)CBA_OBJ_BOX); } static inline int Cba_NtkUserNum( Cba_Ntk_t * p ) { return Vec_StrCountEntry(&p->vType, (char)CBA_OBJ_BOX); } @@ -241,7 +243,7 @@ static inline int Cba_ObjCopy( Cba_Ntk_t * p, int i ) { r static inline char * Cba_ObjNameStr( Cba_Ntk_t * p, int i ) { return Cba_NtkStr(p, Cba_ObjName(p, i)); } static inline char * Cba_ObjRangeStr( Cba_Ntk_t * p, int i ) { return Cba_NtkStr(p, Cba_ObjRange(p, i)); } static inline void Cba_ObjSetFanin( Cba_Ntk_t * p, int i, int x ) { assert(Cba_ObjFanin(p, i) == -1); Vec_IntWriteEntry( &p->vFanin, i, x ); } -static inline void Cba_ObjSetName( Cba_Ntk_t * p, int i, int x ) { /*assert(Cba_ObjName(p, i) == 0);*/ Vec_IntWriteEntry( &p->vName, i, x ); } +static inline void Cba_ObjSetName( Cba_Ntk_t * p, int i, int x ) { assert(Cba_ObjName(p, i) == 0); Vec_IntWriteEntry( &p->vName, i, x ); } static inline void Cba_ObjSetRange( Cba_Ntk_t * p, int i, int x ) { assert(Cba_ObjRange(p, i) == 0); Vec_IntWriteEntry( &p->vRange, i, x ); } static inline void Cba_ObjSetCopy( Cba_Ntk_t * p, int i, int x ) { assert(Cba_ObjCopy(p, i) == -1); Vec_IntWriteEntry( &p->vCopy, i, x ); } @@ -445,7 +447,7 @@ static inline void Cba_NtkDupUserBoxes( Cba_Ntk_t * pNew, Cba_Ntk_t * p ) { int i, iObj; assert( pNew != p ); - Cba_NtkAlloc( pNew, Cba_NtkNameId(p), Cba_NtkPiNum(p), Cba_NtkPoNum(p), Cba_NtkObjNum(p) ); + Cba_NtkAlloc( pNew, Cba_NtkNameId(p), Cba_NtkPiNum(p), Cba_NtkPoNum(p), Cba_NtkObjNum(p) + 3*Cba_NtkCoNum(p) ); Cba_NtkStartCopies( p ); if ( Cba_NtkHasNames(p) ) Cba_NtkStartNames( pNew ); @@ -455,6 +457,12 @@ static inline void Cba_NtkDupUserBoxes( Cba_Ntk_t * pNew, Cba_Ntk_t * p ) Cba_ObjDup( pNew, p, iObj ); Cba_NtkForEachBoxUser( p, iObj ) Cba_BoxDup( pNew, p, iObj ); + // connect feed-throughs + Cba_NtkForEachCo( p, iObj ) + if ( Cba_ObjCopy(p, iObj) >= 0 && + Cba_ObjCopy(p, Cba_ObjFanin(p, iObj)) >= 0 && + Cba_ObjName(p, iObj) == Cba_ObjName(p, Cba_ObjFanin(p, iObj)) ) + Cba_ObjSetFanin( pNew, Cba_ObjCopy(p, iObj), Cba_ObjCopy(p, Cba_ObjFanin(p, iObj)) ); } static inline void Cba_NtkFree( Cba_Ntk_t * p ) { @@ -627,7 +635,7 @@ static inline void Cba_ManPrintStats( Cba_Man_t * p, int nModules, int fVerbose Cba_Ntk_t * pRoot = Cba_ManRoot( p ); printf( "%-12s : ", Cba_ManName(p) ); printf( "pi =%5d ", Cba_NtkPiNum(pRoot) ); - printf( "pi =%5d ", Cba_NtkPoNum(pRoot) ); + printf( "po =%5d ", Cba_NtkPoNum(pRoot) ); printf( "mod =%6d ", Cba_ManNtkNum(p) ); printf( "box =%7d ", Cba_ManNodeNum(p) ); printf( "obj =%7d ", Cba_ManObjNum(p) ); diff --git a/src/base/cba/cbaBlast.c b/src/base/cba/cbaBlast.c index 8fb10b00..795ee678 100644 --- a/src/base/cba/cbaBlast.c +++ b/src/base/cba/cbaBlast.c @@ -143,6 +143,10 @@ int Cba_ManExtract_rec( Gia_Man_t * pNew, Cba_Ntk_t * p, int i, int fBuffers, Ve Dec_Graph_t * pGraph = (Dec_Graph_t *)p->pDesign->ppGraphs[Cba_BoxNtkId(p, iBox)]; Vec_Int_t Leaves = { nLits, nLits, pLits }; assert( pGraph != NULL ); + if ( pGraph->nLeaves == 0 ) + { + int s = 0; + } return Gia_ManFactorGraph( pNew, pGraph, &Leaves ); } else @@ -298,23 +302,17 @@ void Cba_ManRemapBarbufs( Cba_Man_t * pNew, Cba_Man_t * p ) void Cba_NtkCreateAndConnectBuffer( Gia_Man_t * pGia, Gia_Obj_t * pObj, Cba_Ntk_t * p, int iTerm ) { int iObj; -// Vec_IntWriteEntry( &p->vTypes, p->nObjs, CBA_OBJ_NODE ); if ( pGia && Gia_ObjFaninId0p(pGia, pObj) > 0 ) { -// Vec_IntWriteEntry( &p->vFuncs, p->nObjs, Gia_ObjFaninC0(pObj) ? CBA_BOX_INV : CBA_BOX_BUF ); -// Vec_IntWriteEntry( &p->vFanins, p->nObjs, Cba_ManHandleBuffer(p->pDesign, Gia_ObjFanin0(pObj)->Value) ); + assert( Cba_ObjName(p, Gia_ObjFanin0(pObj)->Value) != Cba_ObjName(p, iTerm) ); // not a feedthrough iObj = Cba_ObjAlloc( p, CBA_OBJ_BI, 0, Gia_ObjFanin0(pObj)->Value ); Cba_ObjSetName( p, iObj, Cba_ObjName(p, Gia_ObjFanin0(pObj)->Value) ); Cba_ObjAlloc( p, Gia_ObjFaninC0(pObj) ? CBA_BOX_INV : CBA_BOX_BUF, -1, -1 ); } else { -// Vec_IntWriteEntry( &p->vFuncs, p->nObjs, pGia && Gia_ObjFaninC0(pObj) ? CBA_BOX_C1 : CBA_BOX_C0 ); -// Vec_IntWriteEntry( &p->vFanins, p->nObjs, Cba_ManHandleBuffer(p->pDesign, -1) ); Cba_ObjAlloc( p, pGia && Gia_ObjFaninC0(pObj) ? CBA_BOX_C1 : CBA_BOX_C0, -1, -1 ); } -// Vec_IntWriteEntry( &p->vNameIds, p->nObjs, Cba_ObjNameId(p, iTerm) ); -// Vec_IntWriteEntry( &p->vFanins, iTerm, p->nObjs++ ); iObj = Cba_ObjAlloc( p, CBA_OBJ_BO, 0, -1 ); Cba_ObjSetName( p, iObj, Cba_ObjName(p, iTerm) ); Cba_ObjSetFanin( p, iTerm, iObj ); @@ -335,7 +333,8 @@ void Cba_NtkInsertGia( Cba_Man_t * p, Gia_Man_t * pGia ) pNtk = Cba_ManNtk( p, Vec_IntEntry(p->vBuf2RootNtk, Count) ); iTerm = Vec_IntEntry( p->vBuf2RootObj, Count ); assert( Cba_ObjIsCo(pNtk, iTerm) ); - Cba_NtkCreateAndConnectBuffer( pGia, pObj, pNtk, iTerm ); + if ( Cba_ObjFanin(pNtk, iTerm) == -1 ) // not a feedthrough + Cba_NtkCreateAndConnectBuffer( pGia, pObj, pNtk, iTerm ); // prepare leaf pObj->Value = Vec_IntEntry( p->vBuf2LeafObj, Count++ ); } @@ -357,13 +356,6 @@ void Cba_NtkInsertGia( Cba_Man_t * p, Gia_Man_t * pGia ) else Type = CBA_BOX_AND; // create box -/* - Vec_IntFillTwo( vTemp, 2, iLit0, iLit1 ); - Vec_IntWriteEntry( &pNtk->vTypes, pNtk->nObjs, CBA_OBJ_NODE ); - Vec_IntWriteEntry( &pNtk->vFuncs, pNtk->nObjs, Type ); - Vec_IntWriteEntry( &pNtk->vFanins, pNtk->nObjs, Cba_ManHandleArray(p, vTemp) ); - pNtk->nObjs++; -*/ iTerm = Cba_ObjAlloc( pNtk, CBA_OBJ_BI, 1, iLit1 ); Cba_ObjSetName( pNtk, iTerm, Cba_ObjName(pNtk, iLit1) ); iTerm = Cba_ObjAlloc( pNtk, CBA_OBJ_BI, 0, iLit0 ); @@ -387,7 +379,8 @@ void Cba_NtkInsertGia( Cba_Man_t * p, Gia_Man_t * pGia ) } // create node and connect POs Gia_ManForEachPo( pGia, pObj, i ) - Cba_NtkCreateAndConnectBuffer( pGia, pObj, pRoot, Cba_NtkPo(pRoot, i) ); + if ( Cba_ObjFanin(pRoot, Cba_NtkPo(pRoot, i)) == -1 ) // not a feedthrough + Cba_NtkCreateAndConnectBuffer( pGia, pObj, pRoot, Cba_NtkPo(pRoot, i) ); } Cba_Man_t * Cba_ManInsertGia( Cba_Man_t * p, Gia_Man_t * pGia ) { @@ -461,33 +454,22 @@ void Cba_ManMarkNodesAbc( Cba_Man_t * p, Abc_Ntk_t * pNtk ) void Cba_NtkCreateOrConnectFanin( Abc_Obj_t * pFanin, Cba_Ntk_t * p, int iTerm ) { int iObj; - if ( pFanin && Abc_NodeIsSeriousGate(pFanin) ) + if ( pFanin && Abc_NodeIsSeriousGate(pFanin) && Cba_ObjName(p, pFanin->iTemp) == -1 ) // gate without name { -// Vec_IntWriteEntry( &p->vNameIds, pFanin->iTemp, Cba_ObjNameId(p, iTerm) ); -// Vec_IntWriteEntry( &p->vFanins, iTerm, pFanin->iTemp ); iObj = pFanin->iTemp; } - else if ( pFanin && (Abc_ObjIsPi(pFanin) || Abc_ObjIsBarBuf(pFanin)) ) + else if ( pFanin && (Abc_ObjIsPi(pFanin) || Abc_ObjIsBarBuf(pFanin) || Abc_NodeIsSeriousGate(pFanin)) ) // PI/BO or gate with name { -// Vec_IntWriteEntry( &p->vTypes, p->nObjs, CBA_OBJ_NODE ); -// Vec_IntWriteEntry( &p->vFuncs, p->nObjs, 3 ); // assuming elem gates are added first -// Vec_IntWriteEntry( &p->vFanins, p->nObjs, Cba_ManHandleBuffer(p->pDesign, pFanin->iTemp) ); -// Vec_IntWriteEntry( &p->vNameIds, p->nObjs, Cba_ObjNameId(p, iTerm) ); -// Vec_IntWriteEntry( &p->vFanins, iTerm, p->nObjs++ ); + assert( Cba_ObjName(p, pFanin->iTemp) != Cba_ObjName(p, iTerm) ); // not a feedthrough iObj = Cba_ObjAlloc( p, CBA_OBJ_BI, 0, pFanin->iTemp ); Cba_ObjSetName( p, iObj, Cba_ObjName(p, pFanin->iTemp) ); - Cba_ObjAlloc( p, CBA_BOX_GATE, p->pDesign->ElemGates[2], -1 ); + Cba_ObjAlloc( p, CBA_BOX_GATE, p->pDesign->ElemGates[2], -1 ); // buffer iObj = Cba_ObjAlloc( p, CBA_OBJ_BO, 0, -1 ); } else { assert( !pFanin || Abc_NodeIsConst0(pFanin) || Abc_NodeIsConst1(pFanin) ); -// Vec_IntWriteEntry( &p->vTypes, p->nObjs, CBA_OBJ_NODE ); -// Vec_IntWriteEntry( &p->vFuncs, p->nObjs, pFanin && Abc_NodeIsConst1(pFanin) ? 2 : 1 ); // assuming elem gates are added first -// Vec_IntWriteEntry( &p->vFanins, p->nObjs, Cba_ManHandleBuffer(p->pDesign, -1) ); -// Vec_IntWriteEntry( &p->vNameIds, p->nObjs, Cba_ObjNameId(p, iTerm) ); -// Vec_IntWriteEntry( &p->vFanins, iTerm, p->nObjs++ ); - Cba_ObjAlloc( p, CBA_BOX_GATE, p->pDesign->ElemGates[(pFanin && Abc_NodeIsConst1(pFanin))], -1 ); + Cba_ObjAlloc( p, CBA_BOX_GATE, p->pDesign->ElemGates[(pFanin && Abc_NodeIsConst1(pFanin))], -1 ); // const 0/1 iObj = Cba_ObjAlloc( p, CBA_OBJ_BO, 0, -1 ); } Cba_ObjSetName( p, iObj, Cba_ObjName(p, iTerm) ); @@ -530,22 +512,13 @@ void Cba_NtkInsertNtk( Cba_Man_t * p, Abc_Ntk_t * pNtk ) pCbaNtk = Cba_ManNtk( p, Vec_IntEntry(p->vBuf2RootNtk, Count) ); iTerm = Vec_IntEntry( p->vBuf2RootObj, Count ); assert( Cba_ObjIsCo(pCbaNtk, iTerm) ); - Cba_NtkCreateOrConnectFanin( Abc_ObjFanin0(pObj), pCbaNtk, iTerm ); + if ( Cba_ObjFanin(pCbaNtk, iTerm) == -1 ) // not a feedthrough + Cba_NtkCreateOrConnectFanin( Abc_ObjFanin0(pObj), pCbaNtk, iTerm ); // prepare leaf pObj->iTemp = Vec_IntEntry( p->vBuf2LeafObj, Count++ ); } else if ( Abc_NodeIsSeriousGate(pObj) ) { -/* - Vec_IntClear( vTemp ); - Abc_ObjForEachFanin( pObj, pFanin, k ) - Vec_IntPush( vTemp, pFanin->iTemp ); - pCbaNtk = Cba_ManNtk( p, pObj->iTemp ); - Vec_IntWriteEntry( &pCbaNtk->vTypes, pCbaNtk->nObjs, CBA_OBJ_NODE ); - Vec_IntWriteEntry( &pCbaNtk->vFuncs, pCbaNtk->nObjs, Abc_NamStrFind(p->pMods, Mio_GateReadName((Mio_Gate_t *)pObj->pData)) ); - Vec_IntWriteEntry( &pCbaNtk->vFanins, pCbaNtk->nObjs, Cba_ManHandleArray(p, vTemp) ); - pObj->iTemp = pCbaNtk->nObjs++; -*/ pCbaNtk = Cba_ManNtk( p, pObj->iTemp ); for ( k = Abc_ObjFaninNum(pObj)-1; k >= 0; k-- ) { @@ -571,7 +544,8 @@ void Cba_NtkInsertNtk( Cba_Man_t * p, Abc_Ntk_t * pNtk ) } // create node and connect POs Abc_NtkForEachPo( pNtk, pObj, i ) - Cba_NtkCreateOrConnectFanin( Abc_ObjFanin0(pObj), pRoot, Cba_NtkPo(pRoot, i) ); + if ( Cba_ObjFanin(pRoot, Cba_NtkPo(pRoot, i)) == -1 ) // not a feedthrough + Cba_NtkCreateOrConnectFanin( Abc_ObjFanin0(pObj), pRoot, Cba_NtkPo(pRoot, i) ); } void * Cba_ManInsertAbc( Cba_Man_t * p, void * pAbc ) { diff --git a/src/base/cba/cbaCom.c b/src/base/cba/cbaCom.c index c74d4b45..4b0fd68b 100644 --- a/src/base/cba/cbaCom.c +++ b/src/base/cba/cbaCom.c @@ -196,13 +196,15 @@ int Cba_CommandRead( Abc_Frame_t * pAbc, int argc, char ** argv ) else if ( !strcmp( Extra_FileNameExtension(pFileName), "blif" ) ) { vDes = Prs_ManReadBlif( pFileName ); - p = Prs_ManBuildCba( pFileName, vDes ); + if ( vDes && Vec_PtrSize(vDes) ) + p = Prs_ManBuildCba( pFileName, vDes ); Prs_ManVecFree( vDes ); } else if ( !strcmp( Extra_FileNameExtension(pFileName), "v" ) ) { vDes = Prs_ManReadVerilog( pFileName ); - p = Prs_ManBuildCba( pFileName, vDes ); + if ( vDes && Vec_PtrSize(vDes) ) + p = Prs_ManBuildCba( pFileName, vDes ); Prs_ManVecFree( vDes ); } else assert( 0 ); @@ -352,12 +354,15 @@ int Cba_CommandPut( Abc_Frame_t * pAbc, int argc, char ** argv ) { Cba_Man_t * p = Cba_AbcGetMan(pAbc); Gia_Man_t * pGia = NULL; - int c, fVerbose = 0; + int c, fBarBufs = 1, fVerbose = 0; Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "vh" ) ) != EOF ) + while ( ( c = Extra_UtilGetopt( argc, argv, "bvh" ) ) != EOF ) { switch ( c ) { + case 'b': + fBarBufs ^= 1; + break; case 'v': fVerbose ^= 1; break; @@ -372,7 +377,7 @@ int Cba_CommandPut( Abc_Frame_t * pAbc, int argc, char ** argv ) Abc_Print( 1, "Cba_CommandPut(): There is no current design.\n" ); return 0; } - pGia = Cba_ManExtract( p, 1, 0 ); + pGia = Cba_ManExtract( p, fBarBufs, fVerbose ); if ( pGia == NULL ) { Abc_Print( 1, "Cba_CommandPut(): Conversion to AIG has failed.\n" ); @@ -381,8 +386,9 @@ int Cba_CommandPut( Abc_Frame_t * pAbc, int argc, char ** argv ) Abc_FrameUpdateGia( pAbc, pGia ); return 0; usage: - Abc_Print( -2, "usage: @put [-mvh]\n" ); - Abc_Print( -2, "\t extracts AIG with barrier buffers from the hierarchical design\n" ); + Abc_Print( -2, "usage: @put [-bvh]\n" ); + Abc_Print( -2, "\t extracts AIG from the hierarchical design\n" ); + Abc_Print( -2, "\t-b : toggle using barrier buffers [default = %s]\n", fBarBufs? "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; @@ -517,7 +523,7 @@ int Cba_CommandCec( Abc_Frame_t * pAbc, int argc, char ** argv ) Cec_ParCec_t ParsCec, * pPars = &ParsCec; Vec_Ptr_t * vDes; char * FileName, * pStr, ** pArgvNew; - int c, nArgcNew, fDumpMiter = 0, fVerbose = 0; + int c, nArgcNew, fDumpMiter = 0; FILE * pFile; Cec_ManCecSetDefaultParams( pPars ); Extra_UtilGetoptReset(); @@ -526,7 +532,7 @@ int Cba_CommandCec( Abc_Frame_t * pAbc, int argc, char ** argv ) switch ( c ) { case 'v': - fVerbose ^= 1; + pPars->fVerbose ^= 1; break; case 'h': goto usage; @@ -608,7 +614,7 @@ int Cba_CommandCec( Abc_Frame_t * pAbc, int argc, char ** argv ) usage: Abc_Print( -2, "usage: @cec [-vh]\n" ); Abc_Print( -2, "\t combinational equivalence checking\n" ); - Abc_Print( -2, "\t-v : toggle printing verbose information [default = %s]\n", fVerbose? "yes": "no" ); + Abc_Print( -2, "\t-v : toggle printing verbose information [default = %s]\n", pPars->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 eecebf82..e009f4b1 100644 --- a/src/base/cba/cbaNtk.c +++ b/src/base/cba/cbaNtk.c @@ -77,7 +77,7 @@ void Cba_ManAssignInternNamesNtk( Cba_Ntk_t * p ) continue; sprintf( Buffer, "%s%0*d", "_n_", nDigits, iTerm ); NameId = Abc_NamStrFindOrAdd( p->pDesign->pStrs, Buffer, &fFound ); - assert( !fFound ); + //assert( !fFound ); Cba_ObjSetName( p, iTerm, NameId ); } // transfer names for prim BI diff --git a/src/base/cba/cbaWriteVer.c b/src/base/cba/cbaWriteVer.c index 651a336f..5b9fd6c2 100644 --- a/src/base/cba/cbaWriteVer.c +++ b/src/base/cba/cbaWriteVer.c @@ -20,6 +20,7 @@ #include "cba.h" #include "cbaPrs.h" +#include "map/mio/mio.h" #include "base/main/main.h" ABC_NAMESPACE_IMPL_START @@ -260,7 +261,19 @@ void Cba_ManWriteVerilogBoxes( FILE * pFile, Cba_Ntk_t * p ) fprintf( pFile, "%s.%s(%s)", k ? ", " : "", Cba_ObjNameStr(pModel, iTerm), Cba_ObjNameStr(p, Cba_BoxBi(p, i, k)) ); Cba_NtkForEachPo( pModel, iTerm, k ) fprintf( pFile, "%s.%s(%s)", Cba_NtkPiNum(pModel) ? ", " : "", Cba_ObjNameStr(pModel, iTerm), Cba_ObjNameStr(p, Cba_BoxBo(p, i, k)) ); - fprintf( pFile, ")\n" ); + fprintf( pFile, ");\n" ); + } + else if ( Cba_ObjIsGate(p, i) ) + { + char * pGateName = Abc_NamStr(p->pDesign->pMods, Cba_BoxNtkId(p, i)); + Mio_Library_t * pLib = (Mio_Library_t *)Abc_FrameReadLibGen( Abc_FrameGetGlobalFrame() ); + Mio_Gate_t * pGate = Mio_LibraryReadGateByName( pLib, pGateName, NULL ); + fprintf( pFile, " %s (", pGateName ); + Cba_BoxForEachBi( p, i, iTerm, k ) + fprintf( pFile, "%s.%s(%s)", k ? ", " : "", Mio_GateReadPinName(pGate, k), Cba_ObjNameStr(p, iTerm) ); + Cba_BoxForEachBo( p, i, iTerm, k ) + fprintf( pFile, "%s.%s(%s)", Cba_BoxBiNum(p, i) ? ", " : "", Mio_GateReadOutName(pGate), Cba_ObjNameStr(p, iTerm) ); + fprintf( pFile, ");\n" ); } else { -- cgit v1.2.3