diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/aig/gia/giaMinLut.c | 152 | ||||
| -rw-r--r-- | src/aig/gia/module.make | 1 | ||||
| -rw-r--r-- | src/base/abci/abc.c | 68 | ||||
| -rw-r--r-- | src/base/abci/abcNtbdd.c | 9 | 
4 files changed, 226 insertions, 4 deletions
| diff --git a/src/aig/gia/giaMinLut.c b/src/aig/gia/giaMinLut.c new file mode 100644 index 00000000..660b3c8f --- /dev/null +++ b/src/aig/gia/giaMinLut.c @@ -0,0 +1,152 @@ +/**CFile**************************************************************** + +  FileName    [giaMinLut.c] + +  SystemName  [ABC: Logic synthesis and verification system.] + +  PackageName [Scalable AIG package.] + +  Synopsis    [Collapsing AIG.] + +  Author      [Alan Mishchenko] +   +  Affiliation [UC Berkeley] + +  Date        [Ver. 1.0. Started - June 20, 2005.] + +  Revision    [$Id: giaMinLut.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] + +***********************************************************************/ + +#include "gia.h" +#include "giaAig.h" +#include "base/main/mainInt.h" +#include "opt/sfm/sfm.h" + +#ifdef ABC_USE_CUDD +#include "bdd/extrab/extraBdd.h" +#include "bdd/dsd/dsd.h" +#endif + +ABC_NAMESPACE_IMPL_START + +//////////////////////////////////////////////////////////////////////// +///                        DECLARATIONS                              /// +//////////////////////////////////////////////////////////////////////// + +#ifdef ABC_USE_CUDD + +//////////////////////////////////////////////////////////////////////// +///                     FUNCTION DEFINITIONS                         /// +//////////////////////////////////////////////////////////////////////// + +/**Function************************************************************* + +  Synopsis    [] + +  Description [] + +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +Gia_Man_t * Gia_ManDoMuxMapping( Gia_Man_t * p ) +{ +    extern Gia_Man_t * Gia_ManPerformMfs( Gia_Man_t * p, Sfm_Par_t * pPars ); +    Gia_Man_t * pTemp, * pNew = Gia_ManDup( p ); +    Jf_Par_t Pars, * pPars = &Pars; int c, nIters = 2; +    Sfm_Par_t Pars2, * pPars2 = &Pars2; +    Lf_ManSetDefaultPars( pPars ); +    Sfm_ParSetDefault( pPars2 ); +    pPars2->nTfoLevMax  =    5; +    pPars2->nDepthMax   =  100; +    pPars2->nWinSizeMax = 2000; +    for ( c = 0; c < nIters; c++ ) +    { +        pNew = Lf_ManPerformMapping( pTemp = pNew, pPars ); +        Gia_ManStop( pTemp ); +        pNew = Gia_ManPerformMfs( pTemp = pNew, pPars2 ); +        Gia_ManStop( pTemp ); +        if ( c == nIters-1 ) +            break; +        pNew = (Gia_Man_t *)Dsm_ManDeriveGia( pTemp = pNew, 0 ); +        Gia_ManStop( pTemp ); +    } +    return pNew; +} +Gia_Man_t * Gia_ManDoMuxTransform( Gia_Man_t * p, int fReorder ) +{ +    extern Gia_Man_t * Abc_NtkStrashToGia( Abc_Ntk_t * pNtk ); +    extern Abc_Ntk_t * Abc_NtkFromAigPhase( Aig_Man_t * pMan ); +    extern int Abc_NtkBddToMuxesPerformGlo( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkNew, int Limit, int fReorder ); +    Gia_Man_t * pRes = NULL; +    Aig_Man_t * pMan = Gia_ManToAig( p, 0 ); +    Abc_Ntk_t * pNtk = Abc_NtkFromAigPhase( pMan ); +    Abc_Ntk_t * pNtkNew = Abc_NtkStartFrom( pNtk, ABC_NTK_LOGIC, ABC_FUNC_SOP ); +    pNtk->pName = Extra_UtilStrsav( pMan->pName ); +    Aig_ManStop( pMan ); +    if ( Abc_NtkBddToMuxesPerformGlo( pNtk, pNtkNew, 1000000, fReorder ) ) +    { +        Abc_Ntk_t * pStrash = Abc_NtkStrash( pNtkNew, 1, 1, 0 ); +        pRes = Abc_NtkStrashToGia( pStrash ); +        Abc_NtkDelete( pStrash ); +    } +    Abc_NtkDelete( pNtkNew ); +    Abc_NtkDelete( pNtk ); +    return pRes; +} +int Gia_ManDoTest1( Gia_Man_t * p, int fReorder ) +{ +    Gia_Man_t * pTemp, * pNew; int Res; +    pNew = Gia_ManDoMuxTransform( p, fReorder ); +    pNew = Gia_ManDoMuxMapping( pTemp = pNew ); +    Gia_ManStop( pTemp ); +    Res = Gia_ManLutNum( pNew ); +    Gia_ManStop( pNew ); +    return Res; +} +Gia_Man_t * Gia_ManPerformMinLut( Gia_Man_t * p, int GroupSize, int LutSize, int fVerbose ) +{ +    Gia_Man_t * pNew = NULL; +    int Res1, Res2, Result = 0; +    int g, nGroups = Gia_ManCoNum(p) / GroupSize; +    assert( Gia_ManCoNum(p) % GroupSize == 0 ); +    assert( GroupSize <= 64 ); +    for ( g = 0; g < nGroups; g++ ) +    { +        Gia_Man_t * pNew;//, * pTemp; +        int fTrimPis = 0; +        int o, pPos[64]; +        for ( o = 0; o < GroupSize; o++ ) +            pPos[o] = g*GroupSize+o; +        pNew = Gia_ManDupCones( p, pPos, GroupSize, fTrimPis ); +        printf( "%3d / %3d :  ", g, nGroups ); +        printf( "Test1 = %4d   ", Res1 = Gia_ManDoTest1(pNew, 0) ); +        printf( "Test2 = %4d   ", Res2 = Gia_ManDoTest1(pNew, 1) ); +        printf( "Test  = %4d   ", Abc_MinInt(Res1, Res2) ); +        printf( "\n" ); +        Result += Abc_MinInt(Res1, Res2); +        //Gia_ManPrintStats( pNew, NULL ); +        Gia_ManStop( pNew ); +    } +    printf( "Total LUT count = %d.\n", Result ); +    return pNew; +} + +#else + +Gia_Man_t * Gia_ManPerformMinLut( Gia_Man_t * p, int GroupSize, int LutSize, int fVerbose ) +{ +    return NULL; +} + +#endif + +//////////////////////////////////////////////////////////////////////// +///                       END OF FILE                                /// +//////////////////////////////////////////////////////////////////////// + + +ABC_NAMESPACE_IMPL_END + diff --git a/src/aig/gia/module.make b/src/aig/gia/module.make index e092765f..a84a25e5 100644 --- a/src/aig/gia/module.make +++ b/src/aig/gia/module.make @@ -51,6 +51,7 @@ SRC +=    src/aig/gia/giaAig.c \      src/aig/gia/giaMem.c \      src/aig/gia/giaMfs.c \      src/aig/gia/giaMini.c \ +    src/aig/gia/giaMinLut.c \      src/aig/gia/giaMuxes.c \      src/aig/gia/giaNf.c \      src/aig/gia/giaOf.c \ diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c index 4297c81d..65aaf360 100644 --- a/src/base/abci/abc.c +++ b/src/base/abci/abc.c @@ -485,6 +485,7 @@ static int Abc_CommandAbc9Of                 ( Abc_Frame_t * pAbc, int argc, cha  static int Abc_CommandAbc9Pack               ( Abc_Frame_t * pAbc, int argc, char ** argv );  static int Abc_CommandAbc9Edge               ( Abc_Frame_t * pAbc, int argc, char ** argv );  static int Abc_CommandAbc9SatLut             ( Abc_Frame_t * pAbc, int argc, char ** argv ); +static int Abc_CommandAbc9MinLut             ( Abc_Frame_t * pAbc, int argc, char ** argv );  static int Abc_CommandAbc9Unmap              ( Abc_Frame_t * pAbc, int argc, char ** argv );  static int Abc_CommandAbc9Struct             ( Abc_Frame_t * pAbc, int argc, char ** argv );  static int Abc_CommandAbc9Trace              ( Abc_Frame_t * pAbc, int argc, char ** argv ); @@ -1208,6 +1209,7 @@ void Abc_Init( Abc_Frame_t * pAbc )      Cmd_CommandAdd( pAbc, "ABC9",         "&pack",         Abc_CommandAbc9Pack,         0 );      Cmd_CommandAdd( pAbc, "ABC9",         "&edge",         Abc_CommandAbc9Edge,         0 );      Cmd_CommandAdd( pAbc, "ABC9",         "&satlut",       Abc_CommandAbc9SatLut,       0 ); +    Cmd_CommandAdd( pAbc, "ABC9",         "&minlut",       Abc_CommandAbc9MinLut,       0 );      Cmd_CommandAdd( pAbc, "ABC9",         "&unmap",        Abc_CommandAbc9Unmap,        0 );      Cmd_CommandAdd( pAbc, "ABC9",         "&struct",       Abc_CommandAbc9Struct,       0 );      Cmd_CommandAdd( pAbc, "ABC9",         "&trace",        Abc_CommandAbc9Trace,        0 ); @@ -40821,6 +40823,72 @@ usage:    SeeAlso     []  ***********************************************************************/ +int Abc_CommandAbc9MinLut( Abc_Frame_t * pAbc, int argc, char ** argv ) +{ +    extern Gia_Man_t * Gia_ManPerformMinLut( Gia_Man_t * p, int GroupSize, int LutSize, int fVerbose ); +    Gia_Man_t * pTemp; +    int c, LutSize = 6, GroupSize = 3, fVerbose = 0; +    Extra_UtilGetoptReset(); +    while ( ( c = Extra_UtilGetopt( argc, argv, "KGvh" ) ) != EOF ) +    { +        switch ( c ) +        { +        case 'K': +            if ( globalUtilOptind >= argc ) +            { +                Abc_Print( -1, "Command line switch \"-K\" should be followed by a positive integer.\n" ); +                goto usage; +            } +            LutSize = atoi(argv[globalUtilOptind]); +            globalUtilOptind++; +            break; +        case 'G': +            if ( globalUtilOptind >= argc ) +            { +                Abc_Print( -1, "Command line switch \"-G\" should be followed by a positive integer.\n" ); +                goto usage; +            } +            GroupSize = atoi(argv[globalUtilOptind]); +            globalUtilOptind++; +            break; +        case 'v': +            fVerbose ^= 1; +            break; +        case 'h': +        default: +            goto usage; +        } +    } +    if ( pAbc->pGia == NULL ) +    { +        Abc_Print( -1, "Empty GIA network.\n" ); +        return 1; +    } +    pTemp = Gia_ManPerformMinLut( pAbc->pGia, GroupSize, LutSize, fVerbose ); +    //Abc_FrameUpdateGia( pAbc, pTemp ); +    return 0; + +usage: +    Abc_Print( -2, "usage: &minlut [-KG num] [-vh]\n" ); +    Abc_Print( -2, "\t           performs specialized LUT mapping\n" ); +    Abc_Print( -2, "\t-K num   : the LUT size for mapping [default = %d]\n", LutSize ); +    Abc_Print( -2, "\t-G num   : the output group size [default = %d]\n",    GroupSize ); +    Abc_Print( -2, "\t-v       : toggles verbose output [default = %s]\n",   fVerbose? "yes": "no" ); +    Abc_Print( -2, "\t-h       : prints the command usage\n"); +    return 1; +} + +/**Function************************************************************* + +  Synopsis    [] + +  Description [] + +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/  int Abc_CommandAbc9Unmap( Abc_Frame_t * pAbc, int argc, char ** argv )  {      extern void Gia_ManTestStruct( Gia_Man_t * p ); diff --git a/src/base/abci/abcNtbdd.c b/src/base/abci/abcNtbdd.c index aa35aa6a..185696f2 100644 --- a/src/base/abci/abcNtbdd.c +++ b/src/base/abci/abcNtbdd.c @@ -34,7 +34,7 @@ ABC_NAMESPACE_IMPL_START  #ifdef ABC_USE_CUDD -static int         Abc_NtkBddToMuxesPerformGlo( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkNew, int Limit ); +       int         Abc_NtkBddToMuxesPerformGlo( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkNew, int Limit, int fReorder );  static void        Abc_NtkBddToMuxesPerform( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkNew );  static Abc_Obj_t * Abc_NodeBddToMuxes( Abc_Obj_t * pNodeOld, Abc_Ntk_t * pNtkNew );  static Abc_Obj_t * Abc_NodeBddToMuxes_rec( DdManager * dd, DdNode * bFunc, Abc_Ntk_t * pNtkNew, st__table * tBdd2Node ); @@ -135,7 +135,7 @@ Abc_Ntk_t * Abc_NtkBddToMuxes( Abc_Ntk_t * pNtk, int fGlobal, int Limit )      pNtkNew = Abc_NtkStartFrom( pNtk, ABC_NTK_LOGIC, ABC_FUNC_SOP );      if ( fGlobal )       { -        if ( !Abc_NtkBddToMuxesPerformGlo( pNtk, pNtkNew, Limit ) ) +        if ( !Abc_NtkBddToMuxesPerformGlo( pNtk, pNtkNew, Limit, 0 ) )          {              Abc_NtkDelete( pNtkNew );              return NULL; @@ -265,13 +265,13 @@ Abc_Obj_t * Abc_NodeBddToMuxes_rec( DdManager * dd, DdNode * bFunc, Abc_Ntk_t *    SeeAlso     []  ***********************************************************************/ -int Abc_NtkBddToMuxesPerformGlo( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkNew, int Limit ) +int Abc_NtkBddToMuxesPerformGlo( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkNew, int Limit, int fReorder )  {      DdManager * dd;      Abc_Obj_t * pObj, * pObjNew; int i;      st__table * tBdd2Node;      assert( Abc_NtkIsStrash(pNtk) ); -    dd = (DdManager *)Abc_NtkBuildGlobalBdds( pNtk, Limit, 1, 1, 0, 0 ); +    dd = (DdManager *)Abc_NtkBuildGlobalBdds( pNtk, Limit, 1, 1, fReorder, 0 );      if ( dd == NULL )      {          printf( "Construction of global BDDs has failed.\n" ); @@ -410,6 +410,7 @@ void * Abc_NtkBuildGlobalBdds( Abc_Ntk_t * pNtk, int nBddSizeMax, int fDropInter      if ( fReorder )      {          Cudd_ReduceHeap( dd, CUDD_REORDER_SYMM_SIFT, 1 ); +//        Cudd_ReduceHeap( dd, CUDD_REORDER_SYMM_SIFT, 1 );          Cudd_AutodynDisable( dd );      }  //    Cudd_PrintInfo( dd, stdout ); | 
