Skip to content

Commit 2d74899

Browse files
authored
Merge branch 'berkeley-abc:master' into master
2 parents 0279686 + 21b2d89 commit 2d74899

2 files changed

Lines changed: 133 additions & 0 deletions

File tree

src/base/abci/abc.c

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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;

src/base/wln/wlnRtl.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,21 @@ static int Wln_FileNamesHasSv( char ** ppFileNames, int nFileNames )
146146
return 1;
147147
return 0;
148148
}
149+
static void Wln_GiaTransferNamesIfMatch( Gia_Man_t * pGia, Gia_Man_t * pGiaNames )
150+
{
151+
if ( pGia == NULL || pGiaNames == NULL )
152+
return;
153+
if ( pGia->vNamesIn == NULL && pGiaNames->vNamesIn != NULL && Gia_ManCiNum(pGia) == Vec_PtrSize(pGiaNames->vNamesIn) )
154+
{
155+
pGia->vNamesIn = pGiaNames->vNamesIn;
156+
pGiaNames->vNamesIn = NULL;
157+
}
158+
if ( pGia->vNamesOut == NULL && pGiaNames->vNamesOut != NULL && Gia_ManCoNum(pGia) == Vec_PtrSize(pGiaNames->vNamesOut) )
159+
{
160+
pGia->vNamesOut = pGiaNames->vNamesOut;
161+
pGiaNames->vNamesOut = NULL;
162+
}
163+
}
149164
int Wln_ConvertToRtl( char * pCommand, char * pFileTemp )
150165
{
151166
#if defined(__wasm)
@@ -252,6 +267,7 @@ Gia_Man_t * Wln_BlastSystemVerilog( char ** ppFileNames, int nFileNames, char *
252267
{
253268
extern Aig_Man_t * Abc_NtkToDar( Abc_Ntk_t * pNtk, int fExors, int fRegisters );
254269
Aig_Man_t * pAig = NULL;
270+
Gia_Man_t * pGiaNames = NULL;
255271
Abc_Ntk_t * pNtk = Io_Read( pFileTemp, IO_FILE_AIGER, 1, 0 );
256272
if ( pNtk == NULL )
257273
{
@@ -269,6 +285,10 @@ Gia_Man_t * Wln_BlastSystemVerilog( char ** ppFileNames, int nFileNames, char *
269285
}
270286
pGia = fSkipStrash ? Gia_ManFromAigSimple(pAig) : Gia_ManFromAig(pAig);
271287
Aig_ManStop( pAig );
288+
pGiaNames = Gia_AigerRead( pFileTemp, 0, 1, 0 );
289+
Wln_GiaTransferNamesIfMatch( pGia, pGiaNames );
290+
if ( pGiaNames )
291+
Gia_ManStop( pGiaNames );
272292
}
273293
else
274294
pGia = Gia_AigerRead( pFileTemp, 0, fSkipStrash, 0 );

0 commit comments

Comments
 (0)