Enabling support for input/output names in mini mapping format.

This commit is contained in:
Alan Mishchenko 2025-03-10 17:29:01 -07:00
parent 9390a74c54
commit 40ea8a7598
2 changed files with 53 additions and 31 deletions

View File

@ -852,7 +852,7 @@ Vec_Int_t * Abc_NtkWriteMiniMapping( Abc_Ntk_t * pNtk )
// write the numbers of CI/CO/Node/FF
Vec_IntPush( vMapping, Abc_NtkCiNum(pNtk) );
Vec_IntPush( vMapping, Abc_NtkCoNum(pNtk) );
Vec_IntPush( vMapping, Abc_NtkNodeNum(pNtk) );
Vec_IntPush( vMapping, Vec_PtrSize(vNodes) );
Vec_IntPush( vMapping, Abc_NtkLatchNum(pNtk) );
// write the nodes
vGates = Vec_StrAlloc( 10000 );
@ -868,6 +868,15 @@ Vec_Int_t * Abc_NtkWriteMiniMapping( Abc_Ntk_t * pNtk )
// write the COs literals
Abc_NtkForEachCo( pNtk, pObj, i )
Vec_IntPush( vMapping, Abc_ObjFanin0(pObj)->iTemp );
// write signal names
Abc_NtkForEachCi( pNtk, pObj, i ) {
Vec_StrPrintStr( vGates, Abc_ObjName(pObj) );
Vec_StrPush( vGates, '\0' );
}
Abc_NtkForEachCo( pNtk, pObj, i ) {
Vec_StrPrintStr( vGates, Abc_ObjName(pObj) );
Vec_StrPush( vGates, '\0' );
}
// finish off the array
nExtra = 4 - Vec_StrSize(vGates) % 4;
for ( i = 0; i < nExtra; i++ )
@ -913,19 +922,23 @@ Abc_Ntk_t * Abc_NtkFromMiniMapping( int *pArray )
int i, k, nLeaves, Pos = 4;
char * pBuffer, * pName;
Mio_Gate_t *pGate;
Abc_Obj_t * pObj;
nCis = pArray[0];
nCos = pArray[1];
nNodes = pArray[2];
nFlops = pArray[3];
// create pi
for ( i = 0; i < nCis; i++ )
// create pis
for ( i = 0; i < nCis-nFlops; i++ )
Abc_NtkCreatePi( pNtkMapped );
// create pos
for ( i = 0; i < nCos-nFlops; i++ )
Abc_NtkCreatePo( pNtkMapped );
// create flops
for ( i = 0; i < nFlops; i++ )
Abc_NtkAddLatch( pNtkMapped, NULL, ABC_INIT_ZERO );
// create nodes
for ( i = 0; i < nNodes; i++ )
Abc_NtkCreateNode( pNtkMapped );
// create po
for ( i = 0; i < nCos; i++ )
Abc_NtkCreatePo( pNtkMapped );
// connect nodes
for ( i = 0; i < nNodes; i++ )
{
@ -944,26 +957,21 @@ Abc_Ntk_t * Abc_NtkFromMiniMapping( int *pArray )
pGate = Mio_LibraryReadGateByName( pLib, pName, NULL );
Abc_NtkObj( pNtkMapped, nCis + i + 1 )->pData = pGate;
}
Abc_NtkAddDummyPiNames( pNtkMapped );
Abc_NtkAddDummyPoNames( pNtkMapped );
// decouple the PO driver nodes to reduce the number of levels
int fFixDrivers = 1, fUseBuffs = 1, fVerbose = 1;
if ( fFixDrivers )
{
int nDupGates = Abc_NtkLogicMakeSimpleCos( pNtkMapped, !fUseBuffs );
if ( fVerbose && nDupGates && !Abc_FrameReadFlag("silentmode") )
{
if ( fUseBuffs )
printf( "Added %d buffers/inverters to decouple the CO drivers.\n", nDupGates );
else
printf( "Duplicated %d gates to decouple the CO drivers.\n", nDupGates );
}
assert( Abc_NtkCiNum(pNtkMapped) == nCis );
Abc_NtkForEachCi( pNtkMapped, pObj, i ) {
pName = pBuffer;
pBuffer += strlen(pName) + 1;
Abc_ObjAssignName( pObj, pName, NULL );
}
assert( Abc_NtkCoNum(pNtkMapped) == nCos );
Abc_NtkForEachCo( pNtkMapped, pObj, i ) {
pName = pBuffer;
pBuffer += strlen(pName) + 1;
Abc_ObjAssignName( pObj, pName, NULL );
}
if ( !Abc_NtkCheck( pNtkMapped ) ) {
//extern void Abc_NtkPrintMiniMapping( int * pArray );
//Abc_NtkPrintMiniMapping( pArray );
fprintf( stdout, "Abc_NtkFromMiniMapping(): Network check has failed.\n" );
}
@ -987,11 +995,11 @@ Abc_Ntk_t * Abc_NtkReadFromFile( char * pFileName )
if ( nSize == 0 )
return NULL;
FILE * pFile = fopen( pFileName, "rb" );
int * pArray = ABC_ALLOC( int, nSize );
char * pArray = ABC_ALLOC( char, nSize );
int nSize2 = fread( pArray, sizeof(char), nSize, pFile );
assert( nSize2 == nSize );
fclose( pFile );
Abc_Ntk_t * pNtk = Abc_NtkFromMiniMapping( pArray );
Abc_Ntk_t * pNtk = Abc_NtkFromMiniMapping( (int*)pArray );
ABC_FREE( pArray );
return pNtk;
}
@ -1032,8 +1040,8 @@ void Abc_NtkPrintMiniMapping( int * pArray )
printf( "The first %d object IDs (from 0 to %d) are reserved for the CIs.\n", nCis, nCis - 1 );
for ( i = 0; i < nNodes; i++ )
{
printf( "Node %d has fanins {", nCis + i );
nLeaves = pArray[Pos++];
printf( "Node %d has %d fanins {", nCis + i, nLeaves );
for ( k = 0; k < nLeaves; k++ )
printf( " %d", pArray[Pos++] );
printf( " }\n" );
@ -1047,6 +1055,18 @@ void Abc_NtkPrintMiniMapping( int * pArray )
pBuffer += strlen(pName) + 1;
printf( "Node %d has gate \"%s\"\n", nCis + i, pName );
}
for ( i = 0; i < nCis; i++ )
{
pName = pBuffer;
pBuffer += strlen(pName) + 1;
printf( "CI %d has name \"%s\"\n", i, pName );
}
for ( i = 0; i < nCos; i++ )
{
pName = pBuffer;
pBuffer += strlen(pName) + 1;
printf( "CO %d has name \"%s\"\n", i, pName );
}
}
/**Function*************************************************************

View File

@ -1335,8 +1335,6 @@ int Abc_NtkStochProcess1( void * p )
Vec_Ptr_t * Abc_NtkStochProcess( Vec_Ptr_t * vWins, char * pScript, int nProcs, int TimeSecs, int fVerbose )
{
if ( nProcs <= 2 ) {
if ( fVerbose )
printf( "Running non-concurrent synthesis.\n" ), fflush(stdout);
Abc_NtkStochSynthesis( vWins, pScript );
return NULL;
}
@ -1352,8 +1350,6 @@ Vec_Ptr_t * Abc_NtkStochProcess( Vec_Ptr_t * vWins, char * pScript, int nProcs,
pData[i].TimeOut = TimeSecs;
Vec_PtrPush( vData, pData+i );
}
if ( fVerbose )
printf( "Running concurrent synthesis with %d processes.\n", nProcs ), fflush(stdout);
Util_ProcessThreads( Abc_NtkStochProcess1, vData, nProcs, TimeSecs, fVerbose );
// replace old AIGs by new AIGs
Vec_PtrForEachEntry( Abc_Ntk_t *, vWins, pNtk, i ) {
@ -1850,8 +1846,14 @@ void Abc_NtkStochMap( int nSuppMax, int nIters, int TimeOut, int Seed, int fVerb
Abc_Random(1);
for ( i = 0; i < 10+Seed; i++ )
Abc_Random(0);
if ( fVerbose )
printf( "Running %d iterations of script \"%s\".\n", nIters, pScript );
if ( fVerbose ) {
printf( "Running %d iterations of the script \"%s\"", nIters, pScript );
if ( nProcs > 2 )
printf( " using %d concurrent threads.\n", nProcs-1 );
else
printf( " without concurrency.\n" );
fflush(stdout);
}
Vec_Ptr_t * vIns = NULL, * vOuts = NULL, * vNodes = NULL;
for ( i = 0; i < nIters; i++ )
{