Skip to content

Commit

Permalink
Allow for disabling variable ordering in "lutmin".
Browse files Browse the repository at this point in the history
  • Loading branch information
alanminko committed Jul 28, 2024
1 parent 3e1979f commit 96edf40
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 31 deletions.
36 changes: 33 additions & 3 deletions src/aig/gia/giaDup.c
Original file line number Diff line number Diff line change
Expand Up @@ -6071,7 +6071,7 @@ Vec_Int_t * Gia_ManCofClassPattern( Gia_Man_t * p, Vec_Int_t * vVarNums, int fVe
if ( fVerbose )
{
int i, Class, nClasses = Vec_IntFindMax(vRes)+1;
printf( "Pattern %d -> %d: ", Vec_IntSize(vVarNums), nClasses );
printf( "%d -> %d: ", Vec_IntSize(vVarNums), nClasses );
if ( nClasses <= 36 )
Vec_IntForEachEntry( vRes, Class, i )
printf( "%c", (Class < 10 ? (int)'0' : (int)'A'-10) + Class );
Expand Down Expand Up @@ -6123,18 +6123,48 @@ Gia_Man_t * Gia_ManDupEncode( Gia_Man_t * p, Vec_Int_t * vVarNums, int fVerbose
***********************************************************************/
void Gia_ManCofClassRand( Gia_Man_t * p, int nVars, int nRands )
{
{
for ( int n = 0; n < nRands; n++ )
{
Abc_Random(1);
for ( int i = 0; i < n; i++ )
Abc_Random(0);
Vec_Int_t * vIns = Vec_IntStartNatural( Gia_ManPiNum(p) );
Vec_IntRandomizeOrder( vIns );
Vec_IntShrink( vIns, nVars );
Vec_IntPrint( vIns );
int k, Entry;
printf( "Vars: " );
Vec_IntForEachEntry( vIns, Entry, k )
printf( "%d ", Entry );
printf( " " );
Vec_Int_t * vTemp = Gia_ManCofClassPattern( p, vIns, 1 );
Vec_IntFree( vTemp );
Vec_IntFree( vIns );
}
}
void Gia_ManCofClassEnum( Gia_Man_t * p, int nVars )
{
Vec_Int_t * vIns = Vec_IntAlloc( nVars );
int m, k, Entry, Count, nMints = 1 << Gia_ManPiNum(p);
for ( m = 0; m < nMints; m++ ) {
for ( Count = k = 0; k < Gia_ManPiNum(p); k++ )
Count += (m >> k) & 1;
if ( Count != nVars )
continue;
Vec_IntClear( vIns );
for ( k = 0; k < Gia_ManPiNum(p); k++ )
if ( (m >> k) & 1 )
Vec_IntPush( vIns, k );
assert( Vec_IntSize(vIns) == Count );
printf( "Vars: " );
Vec_IntForEachEntry( vIns, Entry, k )
printf( "%d ", Entry );
printf( " " );
Vec_Int_t * vTemp = Gia_ManCofClassPattern( p, vIns, 1 );
Vec_IntFree( vTemp );
}
Vec_IntFree( vIns );
}

////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
Expand Down
62 changes: 41 additions & 21 deletions src/base/abci/abc.c
Original file line number Diff line number Diff line change
Expand Up @@ -5207,18 +5207,14 @@ int Abc_CommandLutpack( Abc_Frame_t * pAbc, int argc, char ** argv )
***********************************************************************/
int Abc_CommandLutmin( Abc_Frame_t * pAbc, int argc, char ** argv )
{
Abc_Ntk_t * pNtk, * pNtkRes;
extern Abc_Ntk_t * Abc_NtkLutmin( Abc_Ntk_t * pNtk, int nLutSize, int fReorder, int fVerbose );
Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc), * pNtkRes;
int c;
int nLutSize;
int fVerbose;
extern Abc_Ntk_t * Abc_NtkLutmin( Abc_Ntk_t * pNtk, int nLutSize, int fVerbose );

pNtk = Abc_FrameReadNtk(pAbc);
// set defaults
nLutSize = 4;
fVerbose = 0;
int nLutSize = 4;
int fReorder = 1;
int fVerbose = 0;
Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "Kvh" ) ) != EOF )
while ( ( c = Extra_UtilGetopt( argc, argv, "Krvh" ) ) != EOF )
{
switch ( c )
{
Expand All @@ -5231,6 +5227,9 @@ int Abc_CommandLutmin( Abc_Frame_t * pAbc, int argc, char ** argv )
nLutSize = atoi(argv[globalUtilOptind]);
globalUtilOptind++;
break;
case 'r':
fReorder ^= 1;
break;
case 'v':
fVerbose ^= 1;
break;
Expand All @@ -5246,7 +5245,7 @@ int Abc_CommandLutmin( Abc_Frame_t * pAbc, int argc, char ** argv )
return 1;
}
// modify the current network
pNtkRes = Abc_NtkLutmin( pNtk, nLutSize, fVerbose );
pNtkRes = Abc_NtkLutmin( pNtk, nLutSize, fReorder, fVerbose );
if ( pNtkRes == NULL )
{
Abc_Print( -1, "The command has failed.\n" );
Expand All @@ -5257,11 +5256,12 @@ int Abc_CommandLutmin( Abc_Frame_t * pAbc, int argc, char ** argv )
return 0;

usage:
Abc_Print( -2, "usage: lutmin [-K <num>] [-vh]\n" );
Abc_Print( -2, "usage: lutmin [-K <num>] [-rvh]\n" );
Abc_Print( -2, "\t perform FPGA mapping while minimizing the LUT count\n" );
Abc_Print( -2, "\t as described in the paper T. Sasao and A. Mishchenko:\n" );
Abc_Print( -2, "\t \"On the number of LUTs to implement logic functions\".\n" );
Abc_Print( -2, "\t-K <num> : the LUT size to use for the mapping (2 <= num) [default = %d]\n", nLutSize );
Abc_Print( -2, "\t-r : toggle using BDD variable reordering [default = %s]\n", fReorder? "yes": "no" );
Abc_Print( -2, "\t-v : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" );
Abc_Print( -2, "\t-h : print the command usage\n");
return 1;
Expand Down Expand Up @@ -53544,11 +53544,12 @@ int Abc_CommandAbc9FunAbs( Abc_Frame_t * pAbc, int argc, char ** argv )
extern Gia_Man_t * Gia_ManDupEncode( Gia_Man_t * p, Vec_Int_t * vVarNums, int fVerbose );
extern Vec_Int_t * Gia_ManCofClassPattern( Gia_Man_t * p, Vec_Int_t * vVarNums, int fVerbose );
extern void Gia_ManCofClassRand( Gia_Man_t * p, int nVars, int nRands );
extern void Gia_ManCofClassEnum( Gia_Man_t * p, int nVars );
Gia_Man_t * pNew = NULL;
Vec_Int_t * vVars = NULL;
int c, nVars = 6, nRands = 0, fPrint = 0, fVerbose = 0;
int c, nVars = 6, nRands = 0, fEnum = 0, fPrint = 0, fVerbose = 0;
Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "KRpvh" ) ) != EOF )
while ( ( c = Extra_UtilGetopt( argc, argv, "KRepvh" ) ) != EOF )
{
switch ( c )
{
Expand All @@ -53574,6 +53575,9 @@ int Abc_CommandAbc9FunAbs( Abc_Frame_t * pAbc, int argc, char ** argv )
if ( nRands < 0 )
goto usage;
break;
case 'e':
fEnum ^= 1;
break;
case 'p':
fPrint ^= 1;
break;
Expand Down Expand Up @@ -53603,6 +53607,10 @@ int Abc_CommandAbc9FunAbs( Abc_Frame_t * pAbc, int argc, char ** argv )
Gia_ManCofClassRand( pAbc->pGia, nVars, nRands );
return 0;
}
if ( fEnum ) {
Gia_ManCofClassEnum( pAbc->pGia, nVars );
return 0;
}
if ( argc == globalUtilOptind ) {
vVars = Vec_IntStartNatural( nVars );
printf( "Abstracting the first %d variables of the AIG.\n", nVars );
Expand All @@ -53626,10 +53634,11 @@ int Abc_CommandAbc9FunAbs( Abc_Frame_t * pAbc, int argc, char ** argv )
return 0;

usage:
Abc_Print( -2, "usage: &funabs [-KR num] [-pvh] <node1> <node2> ... <nodeN>\n" );
Abc_Print( -2, "usage: &funabs [-KR num] [-epvh] <node1> <node2> ... <nodeN>\n" );
Abc_Print( -2, "\t generates an abstraction of the function\n" );
Abc_Print( -2, "\t-K num : the number of primary inputs [default = %d]\n", nVars );
Abc_Print( -2, "\t-R num : the number of random K-set to try [default = %d]\n", nRands );
Abc_Print( -2, "\t-e : toggles enumerating bound sets of the given size [default = %s]\n", fEnum ? "yes": "no" );
Abc_Print( -2, "\t-p : toggles printing statistics only [default = %s]\n", fPrint ? "yes": "no" );
Abc_Print( -2, "\t-v : toggles printing verbose information [default = %s]\n", fVerbose ? "yes": "no" );
Abc_Print( -2, "\t-h : print the command usage\n");
Expand All @@ -53652,7 +53661,7 @@ int Abc_CommandAbc9DsdInfo( Abc_Frame_t * pAbc, int argc, char ** argv )
{
extern void Gia_ManPrintDsdMatrix( Gia_Man_t * p, int iIn );
extern void Gia_ManCheckDsd( Gia_Man_t * p, int fVerbose );
int c, iIn = 0, fDsd = 0, fVerbose = 0;
int c, iIn = -1, fDsd = 0, fVerbose = 0;
Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "Vdvh" ) ) != EOF )
{
Expand Down Expand Up @@ -53686,15 +53695,26 @@ int Abc_CommandAbc9DsdInfo( Abc_Frame_t * pAbc, int argc, char ** argv )
Abc_Print( -1, "Abc_CommandAbc9DsdInfo(): There is no AIG.\n" );
return 0;
}
if ( fDsd )
{
if ( iIn == -1 ) {
Gia_ManCheckDsd( pAbc->pGia, 1 );
return 0;
}
for ( c = 0; c < 2; c++ ) {
Gia_Man_t * pTemp = Gia_ManDupCofactorVar( pAbc->pGia, iIn, c );
printf( "Var %2d Cof %d:\n", iIn, c );
Gia_ManCheckDsd( pTemp, 1 );
Gia_ManStop( pTemp );
}
return 0;
}
if ( iIn < 0 || iIn >= Gia_ManPiNum(pAbc->pGia) )
{
Abc_Print( -1, "Abc_CommandAbc9DsdInfo(): There is no AIG.\n" );
Abc_Print( -1, "Abc_CommandAbc9DsdInfo(): The input variable is not specified.\n" );
return 0;
}
if ( fDsd )
Gia_ManCheckDsd( pAbc->pGia, fVerbose );
else
Gia_ManPrintDsdMatrix( pAbc->pGia, iIn );
Gia_ManPrintDsdMatrix( pAbc->pGia, iIn );
return 0;

usage:
Expand Down
14 changes: 7 additions & 7 deletions src/base/abci/abcLutmin.c
Original file line number Diff line number Diff line change
Expand Up @@ -727,13 +727,13 @@ void Abc_NtkLutminConstruct( Abc_Ntk_t * pNtkClp, Abc_Ntk_t * pNtkDec, int nLutS
SeeAlso []
***********************************************************************/
Abc_Ntk_t * Abc_NtkLutminInt( Abc_Ntk_t * pNtk, int nLutSize, int fVerbose )
Abc_Ntk_t * Abc_NtkLutminInt( Abc_Ntk_t * pNtk, int nLutSize, int fReorder, int fVerbose )
{
extern void Abc_NtkBddReorder( Abc_Ntk_t * pNtk, int fVerbose );
Abc_Ntk_t * pNtkDec;
// minimize BDDs
// Abc_NtkBddReorder( pNtk, fVerbose );
Abc_NtkBddReorder( pNtk, 0 );
if ( fReorder )
Abc_NtkBddReorder( pNtk, 0 );
// decompose one output at a time
pNtkDec = Abc_NtkStartFrom( pNtk, ABC_NTK_LOGIC, ABC_FUNC_BDD );
// make sure the new manager has enough inputs
Expand All @@ -758,7 +758,7 @@ Abc_Ntk_t * Abc_NtkLutminInt( Abc_Ntk_t * pNtk, int nLutSize, int fVerbose )
SeeAlso []
***********************************************************************/
Abc_Ntk_t * Abc_NtkLutmin( Abc_Ntk_t * pNtkInit, int nLutSize, int fVerbose )
Abc_Ntk_t * Abc_NtkLutmin( Abc_Ntk_t * pNtkInit, int nLutSize, int fReorder, int fVerbose )
{
extern int Abc_NtkFraigSweep( Abc_Ntk_t * pNtk, int fUseInv, int fExdc, int fVerbose, int fVeryVerbose );
Abc_Ntk_t * pNtkNew, * pTemp;
Expand All @@ -779,7 +779,7 @@ Abc_Ntk_t * Abc_NtkLutmin( Abc_Ntk_t * pNtkInit, int nLutSize, int fVerbose )
else
pNtkNew = Abc_NtkStrash( pNtkInit, 0, 1, 0 );
// collapse the network
pNtkNew = Abc_NtkCollapse( pTemp = pNtkNew, 10000, 0, 1, 0, 0, 0 );
pNtkNew = Abc_NtkCollapse( pTemp = pNtkNew, 10000, 0, fReorder, 0, 0, 0 );
Abc_NtkDelete( pTemp );
if ( pNtkNew == NULL )
return NULL;
Expand All @@ -794,7 +794,7 @@ Abc_Ntk_t * Abc_NtkLutmin( Abc_Ntk_t * pNtkInit, int nLutSize, int fVerbose )
if ( fVerbose )
printf( "Decomposing network with %d nodes and %d max fanin count for K = %d.\n",
Abc_NtkNodeNum(pNtkNew), Abc_NtkGetFaninMax(pNtkNew), nLutSize );
pNtkNew = Abc_NtkLutminInt( pTemp = pNtkNew, nLutSize, fVerbose );
pNtkNew = Abc_NtkLutminInt( pTemp = pNtkNew, nLutSize, fReorder, fVerbose );
Abc_NtkDelete( pTemp );
}
// fix the problem with complemented and duplicated CO edges
Expand All @@ -812,7 +812,7 @@ Abc_Ntk_t * Abc_NtkLutmin( Abc_Ntk_t * pNtkInit, int nLutSize, int fVerbose )

#else

Abc_Ntk_t * Abc_NtkLutmin( Abc_Ntk_t * pNtkInit, int nLutSize, int fVerbose ) { return NULL; }
Abc_Ntk_t * Abc_NtkLutmin( Abc_Ntk_t * pNtkInit, int nLutSize, int fReorder, int fVerbose ) { return NULL; }

#endif

Expand Down

0 comments on commit 96edf40

Please sign in to comment.