Add output name permutation in &cec.

This commit is contained in:
Alan Mishchenko 2026-06-04 21:05:04 +07:00
parent a917c1af9f
commit 21b2d8959a
2 changed files with 133 additions and 0 deletions

View File

@ -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;

View File

@ -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 );