@@ -43267,6 +43267,105 @@ static Gia_Man_t * Abc_GiaReorderInputsByName( Gia_Man_t * pFirst, Gia_Man_t * p
4326743267 return pNew;
4326843268}
4326943269
43270+ static Gia_Man_t * Abc_GiaDupPermOutputs( Gia_Man_t * p, Vec_Int_t * vPoPerm )
43271+ {
43272+ Gia_Man_t * pNew;
43273+ Gia_Obj_t * pObj;
43274+ int i;
43275+ assert( Vec_IntSize(vPoPerm) == Gia_ManPoNum(p) );
43276+ pNew = Gia_ManStart( Gia_ManObjNum(p) );
43277+ pNew->pName = Abc_UtilStrsav( p->pName );
43278+ pNew->pSpec = Abc_UtilStrsav( p->pSpec );
43279+ Gia_ManConst0(p)->Value = 0;
43280+ Gia_ManForEachCi( p, pObj, i )
43281+ pObj->Value = Gia_ManAppendCi( pNew );
43282+ Gia_ManForEachAnd( p, pObj, i )
43283+ {
43284+ if ( Gia_ObjIsBuf(pObj) )
43285+ pObj->Value = Gia_ManAppendBuf( pNew, Gia_ObjFanin0Copy(pObj) );
43286+ else
43287+ pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
43288+ }
43289+ Gia_ManForEachPo( p, pObj, i )
43290+ Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(Gia_ManPo(p, Vec_IntEntry(vPoPerm, i))) );
43291+ Gia_ManForEachRi( p, pObj, i )
43292+ Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
43293+ Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
43294+ return pNew;
43295+ }
43296+
43297+ static Gia_Man_t * Abc_GiaReorderOutputsByName( Gia_Man_t * pFirst, Gia_Man_t * pSecond )
43298+ {
43299+ Vec_Int_t * vPoPerm;
43300+ Gia_Man_t * pNew;
43301+ char * pName1, * pName2;
43302+ int * pUsed;
43303+ int i, k, nPos, fDiff = 0;
43304+ if ( pFirst == NULL || pSecond == NULL || pFirst->vNamesOut == NULL || pSecond->vNamesOut == NULL )
43305+ return NULL;
43306+ nPos = Gia_ManPoNum( pFirst );
43307+ if ( nPos != Gia_ManPoNum(pSecond) )
43308+ return NULL;
43309+ if ( Vec_PtrSize(pFirst->vNamesOut) < nPos || Vec_PtrSize(pSecond->vNamesOut) < nPos )
43310+ return NULL;
43311+ vPoPerm = Vec_IntAlloc( nPos );
43312+ pUsed = ABC_CALLOC( int, nPos );
43313+ for ( i = 0; i < nPos; i++ )
43314+ {
43315+ pName1 = (char *)Vec_PtrEntry( pFirst->vNamesOut, i );
43316+ if ( pName1 == NULL )
43317+ break;
43318+ for ( k = 0; k < nPos; k++ )
43319+ {
43320+ pName2 = (char *)Vec_PtrEntry( pSecond->vNamesOut, k );
43321+ if ( pName2 && !pUsed[k] && !strcmp(pName1, pName2) )
43322+ break;
43323+ }
43324+ if ( k == nPos )
43325+ break;
43326+ pUsed[k] = 1;
43327+ Vec_IntPush( vPoPerm, k );
43328+ fDiff |= (k != i);
43329+ }
43330+ ABC_FREE( pUsed );
43331+ if ( i < nPos || !fDiff )
43332+ {
43333+ Vec_IntFree( vPoPerm );
43334+ return NULL;
43335+ }
43336+ pNew = Abc_GiaDupPermOutputs( pSecond, vPoPerm );
43337+ Vec_IntFree( vPoPerm );
43338+ pNew->vNamesIn = Abc_GiaDupNameVec( pSecond->vNamesIn );
43339+ pNew->vNamesOut = Vec_PtrAlloc( Vec_PtrSize(pSecond->vNamesOut) );
43340+ for ( i = 0; i < nPos; i++ )
43341+ {
43342+ pName1 = (char *)Vec_PtrEntry( pFirst->vNamesOut, i );
43343+ Vec_PtrPush( pNew->vNamesOut, pName1 ? Abc_UtilStrsav(pName1) : NULL );
43344+ }
43345+ for ( i = nPos; i < Vec_PtrSize(pSecond->vNamesOut); i++ )
43346+ {
43347+ pName2 = (char *)Vec_PtrEntry( pSecond->vNamesOut, i );
43348+ Vec_PtrPush( pNew->vNamesOut, pName2 ? Abc_UtilStrsav(pName2) : NULL );
43349+ }
43350+ return pNew;
43351+ }
43352+
43353+ static void Abc_GiaTransferNamesIfMatch( Gia_Man_t * pGia, Gia_Man_t * pGiaNames )
43354+ {
43355+ if ( pGia == NULL || pGiaNames == NULL )
43356+ return;
43357+ if ( pGia->vNamesIn == NULL && pGiaNames->vNamesIn != NULL && Gia_ManCiNum(pGia) == Vec_PtrSize(pGiaNames->vNamesIn) )
43358+ {
43359+ pGia->vNamesIn = pGiaNames->vNamesIn;
43360+ pGiaNames->vNamesIn = NULL;
43361+ }
43362+ if ( pGia->vNamesOut == NULL && pGiaNames->vNamesOut != NULL && Gia_ManCoNum(pGia) == Vec_PtrSize(pGiaNames->vNamesOut) )
43363+ {
43364+ pGia->vNamesOut = pGiaNames->vNamesOut;
43365+ pGiaNames->vNamesOut = NULL;
43366+ }
43367+ }
43368+
4327043369/**Function*************************************************************
4327143370
4327243371 Synopsis []
@@ -43344,6 +43443,7 @@ static Gia_Man_t * Abc_ReadAigerOrVerilogFile( char * pFileName, char * pFileNam
4334443443 }
4334543444 if ( pFileName2 )
4334643445 {
43446+ Gia_Man_t * pGiaNames = NULL;
4334743447 Abc_Ntk_t * pNtk = Io_Read( pFileTemp, IO_FILE_AIGER, 1, 0 );
4334843448 if ( pNtk == NULL )
4334943449 {
@@ -43361,6 +43461,10 @@ static Gia_Man_t * Abc_ReadAigerOrVerilogFile( char * pFileName, char * pFileNam
4336143461 }
4336243462 pGia = Gia_ManFromAig( pAig );
4336343463 Aig_ManStop( pAig );
43464+ pGiaNames = Gia_AigerRead( pFileTemp, 0, 1, 0 );
43465+ Abc_GiaTransferNamesIfMatch( pGia, pGiaNames );
43466+ if ( pGiaNames )
43467+ Gia_ManStop( pGiaNames );
4336443468 }
4336543469 else
4336643470 {
@@ -43644,6 +43748,15 @@ int Abc_CommandAbc9Cec( Abc_Frame_t * pAbc, int argc, char ** argv )
4364443748 Gia_ManStop( pGias[1] );
4364543749 pGias[1] = pTemp;
4364643750 }
43751+ pTemp = Abc_GiaReorderOutputsByName( pGias[0], pGias[1] );
43752+ if ( pTemp )
43753+ {
43754+ if ( pPars->fVerbose )
43755+ Abc_Print( 1, "Reordered primary outputs of the second network using output names.\n" );
43756+ if ( pGias[1] != pAbc->pGia && pGias[1] != pAbc->pGiaSaved )
43757+ Gia_ManStop( pGias[1] );
43758+ pGias[1] = pTemp;
43759+ }
4364743760 }
4364843761 pPars->pNameSpec = pGias[0] ? (pGias[0]->pSpec ? pGias[0]->pSpec : pGias[0]->pName) : NULL;
4364943762 pPars->pNameImpl = pGias[1] ? (pGias[1]->pSpec ? pGias[1]->pSpec : pGias[1]->pName) : NULL;
0 commit comments