mirror of https://github.com/YosysHQ/abc.git
Improvements to LMS code.
This commit is contained in:
parent
c73c37a99d
commit
15895cd2e3
|
|
@ -805,8 +805,7 @@ extern ABC_DLL void Abc_NtkRecAdd3( Abc_Ntk_t * pNtk, int fUseSOPB
|
||||||
extern ABC_DLL void Abc_NtkRecPs3(int fPrintLib);
|
extern ABC_DLL void Abc_NtkRecPs3(int fPrintLib);
|
||||||
extern ABC_DLL Gia_Man_t * Abc_NtkRecGetGia3();
|
extern ABC_DLL Gia_Man_t * Abc_NtkRecGetGia3();
|
||||||
extern ABC_DLL int Abc_NtkRecIsRunning3();
|
extern ABC_DLL int Abc_NtkRecIsRunning3();
|
||||||
//extern ABC_DLL int Abc_NtkRecIsInTrimMode3();
|
extern ABC_DLL void Abc_NtkRecLibMerge3(Gia_Man_t * pGia);
|
||||||
//extern ABC_DLL void Abc_NtkRecLibMerge3(Gia_Man_t * pGia);
|
|
||||||
//extern ABC_DLL void Abc_NtkRecFilter3(int nLimit);
|
//extern ABC_DLL void Abc_NtkRecFilter3(int nLimit);
|
||||||
/*=== abcReconv.c ==========================================================*/
|
/*=== abcReconv.c ==========================================================*/
|
||||||
extern ABC_DLL Abc_ManCut_t * Abc_NtkManCutStart( int nNodeSizeMax, int nConeSizeMax, int nNodeFanStop, int nConeFanStop );
|
extern ABC_DLL Abc_ManCut_t * Abc_NtkManCutStart( int nNodeSizeMax, int nConeSizeMax, int nNodeFanStop, int nConeFanStop );
|
||||||
|
|
|
||||||
|
|
@ -220,6 +220,7 @@ static int Abc_CommandRecStop3 ( Abc_Frame_t * pAbc, int argc, cha
|
||||||
static int Abc_CommandRecPs3 ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
static int Abc_CommandRecPs3 ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
||||||
static int Abc_CommandRecAdd3 ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
static int Abc_CommandRecAdd3 ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
||||||
static int Abc_CommandRecDump3 ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
static int Abc_CommandRecDump3 ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
||||||
|
static int Abc_CommandRecMerge3 ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
||||||
|
|
||||||
static int Abc_CommandMap ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
static int Abc_CommandMap ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
||||||
static int Abc_CommandAmap ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
static int Abc_CommandAmap ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
||||||
|
|
@ -659,22 +660,23 @@ void Abc_Init( Abc_Frame_t * pAbc )
|
||||||
Cmd_CommandAdd( pAbc, "Choicing", "rec_add", Abc_CommandRecAdd, 0 );
|
Cmd_CommandAdd( pAbc, "Choicing", "rec_add", Abc_CommandRecAdd, 0 );
|
||||||
Cmd_CommandAdd( pAbc, "Choicing", "rec_ps", Abc_CommandRecPs, 0 );
|
Cmd_CommandAdd( pAbc, "Choicing", "rec_ps", Abc_CommandRecPs, 0 );
|
||||||
Cmd_CommandAdd( pAbc, "Choicing", "rec_use", Abc_CommandRecUse, 1 );
|
Cmd_CommandAdd( pAbc, "Choicing", "rec_use", Abc_CommandRecUse, 1 );
|
||||||
Cmd_CommandAdd( pAbc, "Choicing", "rec_filter", Abc_CommandRecFilter, 1 );
|
Cmd_CommandAdd( pAbc, "Choicing", "rec_filter", Abc_CommandRecFilter, 0 );
|
||||||
Cmd_CommandAdd( pAbc, "Choicing", "rec_merge", Abc_CommandRecMerge, 1 );
|
Cmd_CommandAdd( pAbc, "Choicing", "rec_merge", Abc_CommandRecMerge, 0 );
|
||||||
|
|
||||||
Cmd_CommandAdd( pAbc, "Choicing", "rec_start2", Abc_CommandRecStart2, 0 );
|
Cmd_CommandAdd( pAbc, "Choicing", "rec_start2", Abc_CommandRecStart2, 0 );
|
||||||
Cmd_CommandAdd( pAbc, "Choicing", "rec_stop2", Abc_CommandRecStop2, 0 );
|
Cmd_CommandAdd( pAbc, "Choicing", "rec_stop2", Abc_CommandRecStop2, 0 );
|
||||||
Cmd_CommandAdd( pAbc, "Choicing", "rec_ps2", Abc_CommandRecPs2, 0 );
|
Cmd_CommandAdd( pAbc, "Choicing", "rec_ps2", Abc_CommandRecPs2, 0 );
|
||||||
Cmd_CommandAdd( pAbc, "Choicing", "rec_add2", Abc_CommandRecAdd2, 0 );
|
Cmd_CommandAdd( pAbc, "Choicing", "rec_add2", Abc_CommandRecAdd2, 0 );
|
||||||
Cmd_CommandAdd( pAbc, "Choicing", "rec_dump2", Abc_CommandRecDump2, 1 );
|
Cmd_CommandAdd( pAbc, "Choicing", "rec_dump2", Abc_CommandRecDump2, 1 );
|
||||||
Cmd_CommandAdd( pAbc, "Choicing", "rec_filter2", Abc_CommandRecFilter2, 1 );
|
Cmd_CommandAdd( pAbc, "Choicing", "rec_filter2", Abc_CommandRecFilter2, 0 );
|
||||||
Cmd_CommandAdd( pAbc, "Choicing", "rec_merge2", Abc_CommandRecMerge2, 1 );
|
Cmd_CommandAdd( pAbc, "Choicing", "rec_merge2", Abc_CommandRecMerge2, 0 );
|
||||||
|
|
||||||
Cmd_CommandAdd( pAbc, "Choicing", "rec_start3", Abc_CommandRecStart3, 0 );
|
Cmd_CommandAdd( pAbc, "Choicing", "rec_start3", Abc_CommandRecStart3, 0 );
|
||||||
Cmd_CommandAdd( pAbc, "Choicing", "rec_stop3", Abc_CommandRecStop3, 0 );
|
Cmd_CommandAdd( pAbc, "Choicing", "rec_stop3", Abc_CommandRecStop3, 0 );
|
||||||
Cmd_CommandAdd( pAbc, "Choicing", "rec_ps3", Abc_CommandRecPs3, 0 );
|
Cmd_CommandAdd( pAbc, "Choicing", "rec_ps3", Abc_CommandRecPs3, 0 );
|
||||||
Cmd_CommandAdd( pAbc, "Choicing", "rec_add3", Abc_CommandRecAdd3, 0 );
|
Cmd_CommandAdd( pAbc, "Choicing", "rec_add3", Abc_CommandRecAdd3, 0 );
|
||||||
Cmd_CommandAdd( pAbc, "Choicing", "rec_dump3", Abc_CommandRecDump3, 1 );
|
Cmd_CommandAdd( pAbc, "Choicing", "rec_dump3", Abc_CommandRecDump3, 0 );
|
||||||
|
Cmd_CommandAdd( pAbc, "Choicing", "rec_merge3", Abc_CommandRecMerge3, 0 );
|
||||||
|
|
||||||
Cmd_CommandAdd( pAbc, "SC mapping", "map", Abc_CommandMap, 1 );
|
Cmd_CommandAdd( pAbc, "SC mapping", "map", Abc_CommandMap, 1 );
|
||||||
Cmd_CommandAdd( pAbc, "SC mapping", "amap", Abc_CommandAmap, 1 );
|
Cmd_CommandAdd( pAbc, "SC mapping", "amap", Abc_CommandAmap, 1 );
|
||||||
|
|
@ -13110,7 +13112,7 @@ int Abc_CommandRecStart3( Abc_Frame_t * pAbc, int argc, char ** argv )
|
||||||
pArgvNew = argv + globalUtilOptind;
|
pArgvNew = argv + globalUtilOptind;
|
||||||
nArgcNew = argc - globalUtilOptind;
|
nArgcNew = argc - globalUtilOptind;
|
||||||
if ( nArgcNew != 1 )
|
if ( nArgcNew != 1 )
|
||||||
Abc_Print( 1, "File name is not given on the command line. Start a new record.\n" );
|
Abc_Print( 1, "File name is not given on the command line. Starting a new record.\n" );
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// get the input file name
|
// get the input file name
|
||||||
|
|
@ -13139,7 +13141,7 @@ int Abc_CommandRecStart3( Abc_Frame_t * pAbc, int argc, char ** argv )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
usage:
|
usage:
|
||||||
Abc_Print( -2, "usage: rec_start3 [-K num] [-C num] [-fvh]\n" );
|
Abc_Print( -2, "usage: rec_start3 [-K num] [-C num] [-fvh] <file>\n" );
|
||||||
Abc_Print( -2, "\t starts recording AIG subgraphs (should be called for\n" );
|
Abc_Print( -2, "\t starts recording AIG subgraphs (should be called for\n" );
|
||||||
Abc_Print( -2, "\t an empty network or after reading in a previous record)\n" );
|
Abc_Print( -2, "\t an empty network or after reading in a previous record)\n" );
|
||||||
Abc_Print( -2, "\t-K num : the largest number of inputs [default = %d]\n", nVars );
|
Abc_Print( -2, "\t-K num : the largest number of inputs [default = %d]\n", nVars );
|
||||||
|
|
@ -13147,6 +13149,7 @@ usage:
|
||||||
Abc_Print( -2, "\t-f : toggles recording functions without AIG subgraphs [default = %s]\n", fFuncOnly? "yes": "no" );
|
Abc_Print( -2, "\t-f : toggles recording functions without AIG subgraphs [default = %s]\n", fFuncOnly? "yes": "no" );
|
||||||
Abc_Print( -2, "\t-v : toggles additional verbose output [default = %s]\n", fVerbose? "yes": "no" );
|
Abc_Print( -2, "\t-v : toggles additional verbose output [default = %s]\n", fVerbose? "yes": "no" );
|
||||||
Abc_Print( -2, "\t-h : print the command usage\n");
|
Abc_Print( -2, "\t-h : print the command usage\n");
|
||||||
|
Abc_Print( -2, "\t<file> : AIGER file with the library\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -13348,6 +13351,87 @@ int Abc_CommandRecDump3( Abc_Frame_t * pAbc, int argc, char ** argv )
|
||||||
usage:
|
usage:
|
||||||
Abc_Print( -2, "usage: rec_dump3 [-h] <file>\n" );
|
Abc_Print( -2, "usage: rec_dump3 [-h] <file>\n" );
|
||||||
Abc_Print( -2, "\t-h : print the command usage\n");
|
Abc_Print( -2, "\t-h : print the command usage\n");
|
||||||
|
Abc_Print( -2, "\t<file> : AIGER file to write the library\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**Function*************************************************************
|
||||||
|
|
||||||
|
Synopsis []
|
||||||
|
|
||||||
|
Description []
|
||||||
|
|
||||||
|
SideEffects []
|
||||||
|
|
||||||
|
SeeAlso []
|
||||||
|
|
||||||
|
***********************************************************************/
|
||||||
|
int Abc_CommandRecMerge3( Abc_Frame_t * pAbc, int argc, char ** argv )
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
char * FileName, * pTemp;
|
||||||
|
char ** pArgvNew;
|
||||||
|
int nArgcNew;
|
||||||
|
FILE * pFile;
|
||||||
|
Gia_Man_t * pGia = NULL;
|
||||||
|
|
||||||
|
// set defaults
|
||||||
|
Extra_UtilGetoptReset();
|
||||||
|
while ( ( c = Extra_UtilGetopt( argc, argv, "dh" ) ) != EOF )
|
||||||
|
{
|
||||||
|
switch ( c )
|
||||||
|
{
|
||||||
|
case 'h':
|
||||||
|
goto usage;
|
||||||
|
default:
|
||||||
|
goto usage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( !Abc_NtkRecIsRunning3() )
|
||||||
|
{
|
||||||
|
Abc_Print( -1, "This command works for AIGs only after calling \"rec_start3\".\n" );
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
pArgvNew = argv + globalUtilOptind;
|
||||||
|
nArgcNew = argc - globalUtilOptind;
|
||||||
|
if ( nArgcNew != 1 )
|
||||||
|
{
|
||||||
|
Abc_Print( -1, "File name is not given on the command line.\n" );
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// get the input file name
|
||||||
|
FileName = pArgvNew[0];
|
||||||
|
// fix the wrong symbol
|
||||||
|
for ( pTemp = FileName; *pTemp; pTemp++ )
|
||||||
|
if ( *pTemp == '>' )
|
||||||
|
*pTemp = '\\';
|
||||||
|
if ( (pFile = fopen( FileName, "r" )) == NULL )
|
||||||
|
{
|
||||||
|
Abc_Print( -1, "Cannot open input file \"%s\". ", FileName );
|
||||||
|
if ( (FileName = Extra_FileGetSimilarName( FileName, ".aig", NULL, NULL, NULL, NULL )) )
|
||||||
|
Abc_Print( 1, "Did you mean \"%s\"?", FileName );
|
||||||
|
Abc_Print( 1, "\n" );
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
fclose( pFile );
|
||||||
|
pGia = Gia_ReadAiger( FileName, 1, 0 );
|
||||||
|
if ( pGia == NULL )
|
||||||
|
{
|
||||||
|
Abc_Print( -1, "Reading AIGER has failed.\n" );
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Abc_NtkRecLibMerge3(pGia);
|
||||||
|
Gia_ManStop( pGia );
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
usage:
|
||||||
|
Abc_Print( -2, "usage: rec_merge3 [-h] <file>\n" );
|
||||||
|
Abc_Print( -2, "\t merge libraries\n" );
|
||||||
|
Abc_Print( -2, "\t-h : print the command usage\n");
|
||||||
|
Abc_Print( -2, "\t<file> : AIGER file with the library\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -84,8 +84,6 @@ struct Lms_Man_t_
|
||||||
clock_t timeInsert;
|
clock_t timeInsert;
|
||||||
clock_t timeOther;
|
clock_t timeOther;
|
||||||
clock_t timeTotal;
|
clock_t timeTotal;
|
||||||
|
|
||||||
clock_t timeDerive;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static Lms_Man_t * s_pMan3 = NULL;
|
static Lms_Man_t * s_pMan3 = NULL;
|
||||||
|
|
@ -174,7 +172,8 @@ void Lms_ManStop( Lms_Man_t * p )
|
||||||
void Lms_ManPrint( Lms_Man_t * p )
|
void Lms_ManPrint( Lms_Man_t * p )
|
||||||
{
|
{
|
||||||
// Gia_ManPrintStats( p->pGia, 0, 0 );
|
// Gia_ManPrintStats( p->pGia, 0, 0 );
|
||||||
printf( "The record has %d classes containing %d AIG subgraphs with %d AND nodes.\n", Vec_MemEntryNum(p->vTtMem), p->nAdded, Gia_ManAndNum(p->pGia) );
|
printf( "Library with %d vars has %d classes and %d AIG subgraphs with %d AND nodes.\n",
|
||||||
|
Gia_ManCiNum(p->pGia), Vec_MemEntryNum(p->vTtMem), p->nAdded, Gia_ManAndNum(p->pGia) );
|
||||||
|
|
||||||
p->nAddedFuncs = Vec_MemEntryNum(p->vTtMem);
|
p->nAddedFuncs = Vec_MemEntryNum(p->vTtMem);
|
||||||
printf( "Subgraphs tried = %10d. (%6.2f %%)\n", p->nTried, !p->nTried? 0 : 100.0*p->nTried/p->nTried );
|
printf( "Subgraphs tried = %10d. (%6.2f %%)\n", p->nTried, !p->nTried? 0 : 100.0*p->nTried/p->nTried );
|
||||||
|
|
@ -186,6 +185,7 @@ void Lms_ManPrint( Lms_Man_t * p )
|
||||||
printf( "Subgraphs filtered by isomorphism = %10d. (%6.2f %%)\n", p->nFilterSame, !p->nTried? 0 : 100.0*p->nFilterSame/p->nTried );
|
printf( "Subgraphs filtered by isomorphism = %10d. (%6.2f %%)\n", p->nFilterSame, !p->nTried? 0 : 100.0*p->nFilterSame/p->nTried );
|
||||||
printf( "Subgraphs added = %10d. (%6.2f %%)\n", p->nAdded, !p->nTried? 0 : 100.0*p->nAdded/p->nTried );
|
printf( "Subgraphs added = %10d. (%6.2f %%)\n", p->nAdded, !p->nTried? 0 : 100.0*p->nAdded/p->nTried );
|
||||||
printf( "Functions added = %10d. (%6.2f %%)\n", p->nAddedFuncs, !p->nTried? 0 : 100.0*p->nAddedFuncs/p->nTried );
|
printf( "Functions added = %10d. (%6.2f %%)\n", p->nAddedFuncs, !p->nTried? 0 : 100.0*p->nAddedFuncs/p->nTried );
|
||||||
|
if ( p->nHoleInTheWall )
|
||||||
printf( "Cuts whose logic structure has a hole = %10d. (%6.2f %%)\n", p->nHoleInTheWall, !p->nTried? 0 : 100.0*p->nHoleInTheWall/p->nTried );
|
printf( "Cuts whose logic structure has a hole = %10d. (%6.2f %%)\n", p->nHoleInTheWall, !p->nTried? 0 : 100.0*p->nHoleInTheWall/p->nTried );
|
||||||
|
|
||||||
p->timeOther = p->timeTotal - p->timeCollect - p->timeCanon - p->timeBuild - p->timeCheck - p->timeInsert;
|
p->timeOther = p->timeTotal - p->timeCollect - p->timeCanon - p->timeBuild - p->timeCheck - p->timeInsert;
|
||||||
|
|
@ -383,7 +383,7 @@ void Lms_GiaPrintSubgraph( Gia_Man_t * p, Gia_Obj_t * pObj )
|
||||||
SeeAlso []
|
SeeAlso []
|
||||||
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
Gia_Man_t * Lms_GiaProfilesPrint( Gia_Man_t * p )
|
void Lms_GiaProfilesPrint( Gia_Man_t * p )
|
||||||
{
|
{
|
||||||
Gia_Obj_t * pObj;
|
Gia_Obj_t * pObj;
|
||||||
int i;
|
int i;
|
||||||
|
|
@ -403,7 +403,6 @@ Gia_Man_t * Lms_GiaProfilesPrint( Gia_Man_t * p )
|
||||||
|
|
||||||
Vec_WrdFree( vDelays );
|
Vec_WrdFree( vDelays );
|
||||||
Vec_StrFree( vAreas );
|
Vec_StrFree( vAreas );
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**Function*************************************************************
|
/**Function*************************************************************
|
||||||
|
|
@ -448,6 +447,156 @@ static void Abc_TtStretch6( word * pInOut, int nVarS, int nVarB )
|
||||||
pInOut[w + i] = pInOut[i];
|
pInOut[w + i] = pInOut[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**Function*************************************************************
|
||||||
|
|
||||||
|
Synopsis [Compute support sizes for each CO.]
|
||||||
|
|
||||||
|
Description []
|
||||||
|
|
||||||
|
SideEffects []
|
||||||
|
|
||||||
|
SeeAlso []
|
||||||
|
|
||||||
|
***********************************************************************/
|
||||||
|
Vec_Str_t * Gia_ManSuppSizes( Gia_Man_t * p )
|
||||||
|
{
|
||||||
|
Vec_Str_t * vResult;
|
||||||
|
Vec_Str_t * vSupps;
|
||||||
|
Gia_Obj_t * pObj;
|
||||||
|
int i;
|
||||||
|
vSupps = Vec_StrAlloc( Gia_ManObjNum(p) );
|
||||||
|
Vec_StrPush( vSupps, 0 );
|
||||||
|
Gia_ManForEachObj1( p, pObj, i )
|
||||||
|
{
|
||||||
|
if ( Gia_ObjIsAnd(pObj) )
|
||||||
|
Vec_StrPush( vSupps, (char)Abc_MaxInt( Vec_StrEntry(vSupps, Gia_ObjFaninId0(pObj, i)), Vec_StrEntry(vSupps, Gia_ObjFaninId1(pObj, i)) ) );
|
||||||
|
else if ( Gia_ObjIsCo(pObj) )
|
||||||
|
Vec_StrPush( vSupps, Vec_StrEntry(vSupps, Gia_ObjFaninId0(pObj, i)) );
|
||||||
|
else if ( Gia_ObjIsCi(pObj) )
|
||||||
|
Vec_StrPush( vSupps, (char)(Gia_ObjCioId(pObj)+1) );
|
||||||
|
else assert( 0 );
|
||||||
|
}
|
||||||
|
assert( Vec_StrSize(vSupps) == Gia_ManObjNum(p) );
|
||||||
|
vResult = Vec_StrAlloc( Gia_ManCoNum(p) );
|
||||||
|
Gia_ManForEachCo( p, pObj, i )
|
||||||
|
Vec_StrPush( vResult, Vec_StrEntry(vSupps, Gia_ObjId(p, pObj)) );
|
||||||
|
Vec_StrFree( vSupps );
|
||||||
|
return vResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**Function*************************************************************
|
||||||
|
|
||||||
|
Synopsis [Recanonicizes the library and add it to the current library.]
|
||||||
|
|
||||||
|
Description []
|
||||||
|
|
||||||
|
SideEffects []
|
||||||
|
|
||||||
|
SeeAlso []
|
||||||
|
|
||||||
|
***********************************************************************/
|
||||||
|
void Abc_NtkRecLibMerge3( Gia_Man_t * pLib )
|
||||||
|
{
|
||||||
|
int fCheck = 0;
|
||||||
|
Lms_Man_t * p = s_pMan3;
|
||||||
|
Gia_Man_t * pGia = p->pGia;
|
||||||
|
Vec_Str_t * vSupps;
|
||||||
|
char pCanonPerm[16];
|
||||||
|
unsigned uCanonPhase;
|
||||||
|
unsigned * pTruth;
|
||||||
|
int i, k, Index, iFanin0, iFanin1, nLeaves;
|
||||||
|
Gia_Obj_t * pDriver, * pTemp, * pObjPo;
|
||||||
|
clock_t clk, clk2 = clock();
|
||||||
|
|
||||||
|
assert( Gia_ManCiNum(pLib) == Gia_ManCiNum(pGia) );
|
||||||
|
|
||||||
|
// create hash table if not available
|
||||||
|
if ( pGia->pHTable == NULL )
|
||||||
|
Gia_ManHashStart( pGia );
|
||||||
|
|
||||||
|
// add AIG subgraphs
|
||||||
|
vSupps = Gia_ManSuppSizes( pLib );
|
||||||
|
Gia_ManForEachCo( pLib, pObjPo, k )
|
||||||
|
{
|
||||||
|
// get support size
|
||||||
|
nLeaves = Vec_StrEntry(vSupps, k);
|
||||||
|
assert( nLeaves > 1 );
|
||||||
|
// compute the truth table
|
||||||
|
clk = clock();
|
||||||
|
pTruth = Gia_ObjComputeTruthTable( pLib, Gia_ObjFanin0(pObjPo) );
|
||||||
|
p->timeCollect += clock() - clk;
|
||||||
|
// semi-canonicize
|
||||||
|
clk = clock();
|
||||||
|
memcpy( p->pTemp1, pTruth, p->nWords * sizeof(word) );
|
||||||
|
// uCanonPhase = luckyCanonicizer_final_fast( p->pTemp1, nLeaves, pCanonPerm );
|
||||||
|
uCanonPhase = Kit_TruthSemiCanonicize( (unsigned *)p->pTemp1, (unsigned *)p->pTemp2, nLeaves, pCanonPerm );
|
||||||
|
Abc_TtStretch5( (unsigned *)p->pTemp1, nLeaves, p->nVars );
|
||||||
|
p->timeCanon += clock() - clk;
|
||||||
|
// pCanonPerm and uCanonPhase show what was the variable corresponding to each var in the current truth
|
||||||
|
|
||||||
|
clk = clock();
|
||||||
|
// map cut leaves into elementary variables of GIA
|
||||||
|
for ( i = 0; i < nLeaves; i++ )
|
||||||
|
Gia_ManCi( pLib, pCanonPerm[i] )->Value = Abc_Var2Lit( Gia_ObjId(pGia, Gia_ManPi(pGia, i)), (uCanonPhase >> i) & 1 );
|
||||||
|
// build internal nodes
|
||||||
|
assert( Vec_IntSize(pLib->vTtNodes) > 0 );
|
||||||
|
Gia_ManForEachObjVec( pLib->vTtNodes, pLib, pTemp, i )
|
||||||
|
{
|
||||||
|
iFanin0 = Abc_LitNotCond( Gia_ObjFanin0(pTemp)->Value, Gia_ObjFaninC0(pTemp) );
|
||||||
|
iFanin1 = Abc_LitNotCond( Gia_ObjFanin1(pTemp)->Value, Gia_ObjFaninC1(pTemp) );
|
||||||
|
pTemp->Value = Gia_ManHashAnd( pGia, iFanin0, iFanin1 );
|
||||||
|
}
|
||||||
|
p->timeBuild += clock() - clk;
|
||||||
|
|
||||||
|
// check if this node is already driving a PO
|
||||||
|
assert( Gia_ObjIsAnd(pTemp) );
|
||||||
|
pDriver = Gia_ManObj(pGia, Abc_Lit2Var(pTemp->Value));
|
||||||
|
if ( pDriver->fMark1 )
|
||||||
|
{
|
||||||
|
p->nFilterSame++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
pDriver->fMark1 = 1;
|
||||||
|
// create output
|
||||||
|
Gia_ManAppendCo( pGia, Abc_LitNotCond( pTemp->Value, (uCanonPhase >> nLeaves) & 1 ) );
|
||||||
|
|
||||||
|
// verify truth table
|
||||||
|
if ( fCheck )
|
||||||
|
{
|
||||||
|
clk = clock();
|
||||||
|
pTemp = Gia_ManCo(pGia, Gia_ManCoNum(pGia)-1);
|
||||||
|
pTruth = Gia_ObjComputeTruthTable( pGia, Gia_ManCo(pGia, Gia_ManCoNum(pGia)-1) );
|
||||||
|
p->timeCheck += clock() - clk;
|
||||||
|
if ( memcmp( p->pTemp1, pTruth, p->nWords * sizeof(word) ) != 0 )
|
||||||
|
{
|
||||||
|
|
||||||
|
Kit_DsdPrintFromTruth( pTruth, nLeaves ); printf( "\n" );
|
||||||
|
Kit_DsdPrintFromTruth( (unsigned *)p->pTemp1, nLeaves ); printf( "\n" );
|
||||||
|
printf( "Truth table verification has failed.\n" );
|
||||||
|
|
||||||
|
// drive PO with constant
|
||||||
|
Gia_ManPatchCoDriver( pGia, Gia_ManCoNum(pGia)-1, 0 );
|
||||||
|
// save truth table ID
|
||||||
|
Vec_IntPush( p->vTruthIds, -1 );
|
||||||
|
p->nFilterTruth++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
clk = clock();
|
||||||
|
// add the resulting truth table to the hash table
|
||||||
|
Index = Vec_MemHashInsert( p->vTtMem, p->pTemp1 );
|
||||||
|
// save truth table ID
|
||||||
|
Vec_IntPush( p->vTruthIds, Index );
|
||||||
|
assert( Gia_ManCoNum(pGia) == Vec_IntSize(p->vTruthIds) );
|
||||||
|
p->nAdded++;
|
||||||
|
p->timeInsert += clock() - clk;
|
||||||
|
}
|
||||||
|
Vec_StrFree( vSupps );
|
||||||
|
p->timeTotal += clock() - clk2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**Function*************************************************************
|
/**Function*************************************************************
|
||||||
|
|
||||||
|
|
@ -490,8 +639,6 @@ p->timeCollect += clock() - clk;
|
||||||
|
|
||||||
// semi-canonicize truth table
|
// semi-canonicize truth table
|
||||||
clk = clock();
|
clk = clock();
|
||||||
for ( i = 0; i < Abc_MaxInt(nLeaves, 6); i++ )
|
|
||||||
pCanonPerm[i] = i;
|
|
||||||
memcpy( p->pTemp1, If_CutTruthW(pCut), p->nWords * sizeof(word) );
|
memcpy( p->pTemp1, If_CutTruthW(pCut), p->nWords * sizeof(word) );
|
||||||
// uCanonPhase = luckyCanonicizer_final_fast( p->pTemp1, nLeaves, pCanonPerm );
|
// uCanonPhase = luckyCanonicizer_final_fast( p->pTemp1, nLeaves, pCanonPerm );
|
||||||
uCanonPhase = Kit_TruthSemiCanonicize( (unsigned *)p->pTemp1, (unsigned *)p->pTemp2, nLeaves, pCanonPerm );
|
uCanonPhase = Kit_TruthSemiCanonicize( (unsigned *)p->pTemp1, (unsigned *)p->pTemp2, nLeaves, pCanonPerm );
|
||||||
|
|
@ -522,24 +669,21 @@ clk = clock();
|
||||||
p->timeBuild += clock() - clk;
|
p->timeBuild += clock() - clk;
|
||||||
|
|
||||||
// check if this node is already driving a PO
|
// check if this node is already driving a PO
|
||||||
|
assert( If_ObjIsAnd(pIfObj) );
|
||||||
pDriver = Gia_ManObj(pGia, Abc_Lit2Var(pIfObj->iCopy));
|
pDriver = Gia_ManObj(pGia, Abc_Lit2Var(pIfObj->iCopy));
|
||||||
if ( pDriver->fMark1 )
|
if ( pDriver->fMark1 )
|
||||||
{
|
{
|
||||||
p->nFilterSame++;
|
p->nFilterSame++;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// create output
|
|
||||||
assert( If_ObjIsAnd(pIfObj) );
|
|
||||||
Gia_ManAppendCo( pGia, Abc_LitNotCond( pIfObj->iCopy, (uCanonPhase >> nLeaves) & 1 ) );
|
|
||||||
|
|
||||||
// mark the driver
|
|
||||||
pDriver = Gia_ManObj(pGia, Abc_Lit2Var(pIfObj->iCopy));
|
|
||||||
pDriver->fMark1 = 1;
|
pDriver->fMark1 = 1;
|
||||||
|
// create output
|
||||||
|
Gia_ManAppendCo( pGia, Abc_LitNotCond( pIfObj->iCopy, (uCanonPhase >> nLeaves) & 1 ) );
|
||||||
|
|
||||||
// verify truth table
|
// verify truth table
|
||||||
clk = clock();
|
clk = clock();
|
||||||
pTruth = Gia_ObjComputeTruthTable( pGia, Gia_ManCo(pGia, Gia_ManCoNum(pGia)-1) );
|
pTruth = Gia_ObjComputeTruthTable( pGia, Gia_ManCo(pGia, Gia_ManCoNum(pGia)-1) );
|
||||||
|
p->timeCheck += clock() - clk;
|
||||||
if ( memcmp( p->pTemp1, pTruth, p->nWords * sizeof(word) ) != 0 )
|
if ( memcmp( p->pTemp1, pTruth, p->nWords * sizeof(word) ) != 0 )
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
|
@ -554,7 +698,6 @@ clk = clock();
|
||||||
p->nFilterTruth++;
|
p->nFilterTruth++;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
p->timeCheck += clock() - clk;
|
|
||||||
|
|
||||||
clk = clock();
|
clk = clock();
|
||||||
// add the resulting truth table to the hash table
|
// add the resulting truth table to the hash table
|
||||||
|
|
@ -909,6 +1052,7 @@ void Lms_GiaNormalize( Lms_Man_t * p )
|
||||||
Vec_Int_t * vRemain;
|
Vec_Int_t * vRemain;
|
||||||
Vec_Int_t * vTruthIdsNew;
|
Vec_Int_t * vTruthIdsNew;
|
||||||
int i, Entry, Prev = -1, Next;
|
int i, Entry, Prev = -1, Next;
|
||||||
|
clock_t clk = clock();
|
||||||
// collect non-redundant COs
|
// collect non-redundant COs
|
||||||
vRemain = Lms_GiaFindNonRedundantCos( p );
|
vRemain = Lms_GiaFindNonRedundantCos( p );
|
||||||
// change these to be useful literals
|
// change these to be useful literals
|
||||||
|
|
@ -940,6 +1084,7 @@ void Lms_GiaNormalize( Lms_Man_t * p )
|
||||||
Vec_IntFree( p->vTruthIds );
|
Vec_IntFree( p->vTruthIds );
|
||||||
p->vTruthIds = vTruthIdsNew;
|
p->vTruthIds = vTruthIdsNew;
|
||||||
// Vec_IntPrint( vTruthIdsNew );
|
// Vec_IntPrint( vTruthIdsNew );
|
||||||
|
Abc_PrintTime( 1, "Normalization runtime", clock() - clk );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**Function*************************************************************
|
/**Function*************************************************************
|
||||||
|
|
|
||||||
|
|
@ -1664,6 +1664,8 @@ unsigned Kit_TruthSemiCanonicize( unsigned * pInOut, unsigned * pAux, int nVars,
|
||||||
|
|
||||||
// canonicize output
|
// canonicize output
|
||||||
uCanonPhase = 0;
|
uCanonPhase = 0;
|
||||||
|
for ( i = 0; i < nVars; i++ )
|
||||||
|
pCanonPerm[i] = i;
|
||||||
|
|
||||||
nOnes = Kit_TruthCountOnes(pIn, nVars);
|
nOnes = Kit_TruthCountOnes(pIn, nVars);
|
||||||
//if(pIn[0] & 1)
|
//if(pIn[0] & 1)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue