diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c index 44ceacc88..a8d056979 100644 --- a/src/base/abci/abc.c +++ b/src/base/abci/abc.c @@ -43267,6 +43267,105 @@ static Gia_Man_t * Abc_GiaReorderInputsByName( Gia_Man_t * pFirst, Gia_Man_t * p return pNew; } +static Gia_Man_t * Abc_GiaDupPermOutputs( Gia_Man_t * p, Vec_Int_t * vPoPerm ) +{ + Gia_Man_t * pNew; + Gia_Obj_t * pObj; + int i; + assert( Vec_IntSize(vPoPerm) == Gia_ManPoNum(p) ); + pNew = Gia_ManStart( Gia_ManObjNum(p) ); + pNew->pName = Abc_UtilStrsav( p->pName ); + pNew->pSpec = Abc_UtilStrsav( p->pSpec ); + Gia_ManConst0(p)->Value = 0; + Gia_ManForEachCi( p, pObj, i ) + pObj->Value = Gia_ManAppendCi( pNew ); + Gia_ManForEachAnd( p, pObj, i ) + { + if ( Gia_ObjIsBuf(pObj) ) + pObj->Value = Gia_ManAppendBuf( pNew, Gia_ObjFanin0Copy(pObj) ); + else + pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) ); + } + Gia_ManForEachPo( p, pObj, i ) + Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(Gia_ManPo(p, Vec_IntEntry(vPoPerm, i))) ); + Gia_ManForEachRi( p, pObj, i ) + Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) ); + Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) ); + return pNew; +} + +static Gia_Man_t * Abc_GiaReorderOutputsByName( Gia_Man_t * pFirst, Gia_Man_t * pSecond ) +{ + Vec_Int_t * vPoPerm; + Gia_Man_t * pNew; + char * pName1, * pName2; + int * pUsed; + int i, k, nPos, fDiff = 0; + if ( pFirst == NULL || pSecond == NULL || pFirst->vNamesOut == NULL || pSecond->vNamesOut == NULL ) + return NULL; + nPos = Gia_ManPoNum( pFirst ); + if ( nPos != Gia_ManPoNum(pSecond) ) + return NULL; + if ( Vec_PtrSize(pFirst->vNamesOut) < nPos || Vec_PtrSize(pSecond->vNamesOut) < nPos ) + return NULL; + vPoPerm = Vec_IntAlloc( nPos ); + pUsed = ABC_CALLOC( int, nPos ); + for ( i = 0; i < nPos; i++ ) + { + pName1 = (char *)Vec_PtrEntry( pFirst->vNamesOut, i ); + if ( pName1 == NULL ) + break; + for ( k = 0; k < nPos; k++ ) + { + pName2 = (char *)Vec_PtrEntry( pSecond->vNamesOut, k ); + if ( pName2 && !pUsed[k] && !strcmp(pName1, pName2) ) + break; + } + if ( k == nPos ) + break; + pUsed[k] = 1; + Vec_IntPush( vPoPerm, k ); + fDiff |= (k != i); + } + ABC_FREE( pUsed ); + if ( i < nPos || !fDiff ) + { + Vec_IntFree( vPoPerm ); + return NULL; + } + pNew = Abc_GiaDupPermOutputs( pSecond, vPoPerm ); + Vec_IntFree( vPoPerm ); + pNew->vNamesIn = Abc_GiaDupNameVec( pSecond->vNamesIn ); + pNew->vNamesOut = Vec_PtrAlloc( Vec_PtrSize(pSecond->vNamesOut) ); + for ( i = 0; i < nPos; i++ ) + { + pName1 = (char *)Vec_PtrEntry( pFirst->vNamesOut, i ); + Vec_PtrPush( pNew->vNamesOut, pName1 ? Abc_UtilStrsav(pName1) : NULL ); + } + for ( i = nPos; i < Vec_PtrSize(pSecond->vNamesOut); i++ ) + { + pName2 = (char *)Vec_PtrEntry( pSecond->vNamesOut, i ); + Vec_PtrPush( pNew->vNamesOut, pName2 ? Abc_UtilStrsav(pName2) : NULL ); + } + return pNew; +} + +static void Abc_GiaTransferNamesIfMatch( Gia_Man_t * pGia, Gia_Man_t * pGiaNames ) +{ + if ( pGia == NULL || pGiaNames == NULL ) + return; + if ( pGia->vNamesIn == NULL && pGiaNames->vNamesIn != NULL && Gia_ManCiNum(pGia) == Vec_PtrSize(pGiaNames->vNamesIn) ) + { + pGia->vNamesIn = pGiaNames->vNamesIn; + pGiaNames->vNamesIn = NULL; + } + if ( pGia->vNamesOut == NULL && pGiaNames->vNamesOut != NULL && Gia_ManCoNum(pGia) == Vec_PtrSize(pGiaNames->vNamesOut) ) + { + pGia->vNamesOut = pGiaNames->vNamesOut; + pGiaNames->vNamesOut = NULL; + } +} + /**Function************************************************************* Synopsis [] @@ -43344,6 +43443,7 @@ static Gia_Man_t * Abc_ReadAigerOrVerilogFile( char * pFileName, char * pFileNam } if ( pFileName2 ) { + Gia_Man_t * pGiaNames = NULL; Abc_Ntk_t * pNtk = Io_Read( pFileTemp, IO_FILE_AIGER, 1, 0 ); if ( pNtk == NULL ) { @@ -43361,6 +43461,10 @@ static Gia_Man_t * Abc_ReadAigerOrVerilogFile( char * pFileName, char * pFileNam } pGia = Gia_ManFromAig( pAig ); Aig_ManStop( pAig ); + pGiaNames = Gia_AigerRead( pFileTemp, 0, 1, 0 ); + Abc_GiaTransferNamesIfMatch( pGia, pGiaNames ); + if ( pGiaNames ) + Gia_ManStop( pGiaNames ); } else { @@ -43644,6 +43748,15 @@ int Abc_CommandAbc9Cec( Abc_Frame_t * pAbc, int argc, char ** argv ) Gia_ManStop( pGias[1] ); pGias[1] = pTemp; } + pTemp = Abc_GiaReorderOutputsByName( pGias[0], pGias[1] ); + if ( pTemp ) + { + if ( pPars->fVerbose ) + Abc_Print( 1, "Reordered primary outputs of the second network using output names.\n" ); + if ( pGias[1] != pAbc->pGia && pGias[1] != pAbc->pGiaSaved ) + Gia_ManStop( pGias[1] ); + pGias[1] = pTemp; + } } pPars->pNameSpec = pGias[0] ? (pGias[0]->pSpec ? pGias[0]->pSpec : pGias[0]->pName) : NULL; pPars->pNameImpl = pGias[1] ? (pGias[1]->pSpec ? pGias[1]->pSpec : pGias[1]->pName) : NULL; diff --git a/src/base/wln/wlnRtl.c b/src/base/wln/wlnRtl.c index fe103557a..6c92cffbc 100644 --- a/src/base/wln/wlnRtl.c +++ b/src/base/wln/wlnRtl.c @@ -146,6 +146,21 @@ static int Wln_FileNamesHasSv( char ** ppFileNames, int nFileNames ) return 1; return 0; } +static void Wln_GiaTransferNamesIfMatch( Gia_Man_t * pGia, Gia_Man_t * pGiaNames ) +{ + if ( pGia == NULL || pGiaNames == NULL ) + return; + if ( pGia->vNamesIn == NULL && pGiaNames->vNamesIn != NULL && Gia_ManCiNum(pGia) == Vec_PtrSize(pGiaNames->vNamesIn) ) + { + pGia->vNamesIn = pGiaNames->vNamesIn; + pGiaNames->vNamesIn = NULL; + } + if ( pGia->vNamesOut == NULL && pGiaNames->vNamesOut != NULL && Gia_ManCoNum(pGia) == Vec_PtrSize(pGiaNames->vNamesOut) ) + { + pGia->vNamesOut = pGiaNames->vNamesOut; + pGiaNames->vNamesOut = NULL; + } +} int Wln_ConvertToRtl( char * pCommand, char * pFileTemp ) { #if defined(__wasm) @@ -252,6 +267,7 @@ Gia_Man_t * Wln_BlastSystemVerilog( char ** ppFileNames, int nFileNames, char * { extern Aig_Man_t * Abc_NtkToDar( Abc_Ntk_t * pNtk, int fExors, int fRegisters ); Aig_Man_t * pAig = NULL; + Gia_Man_t * pGiaNames = NULL; Abc_Ntk_t * pNtk = Io_Read( pFileTemp, IO_FILE_AIGER, 1, 0 ); if ( pNtk == NULL ) { @@ -269,6 +285,10 @@ Gia_Man_t * Wln_BlastSystemVerilog( char ** ppFileNames, int nFileNames, char * } pGia = fSkipStrash ? Gia_ManFromAigSimple(pAig) : Gia_ManFromAig(pAig); Aig_ManStop( pAig ); + pGiaNames = Gia_AigerRead( pFileTemp, 0, 1, 0 ); + Wln_GiaTransferNamesIfMatch( pGia, pGiaNames ); + if ( pGiaNames ) + Gia_ManStop( pGiaNames ); } else pGia = Gia_AigerRead( pFileTemp, 0, fSkipStrash, 0 );