diff options
| author | Alan Mishchenko <alanmi@berkeley.edu> | 2014-02-28 21:06:21 -0800 | 
|---|---|---|
| committer | Alan Mishchenko <alanmi@berkeley.edu> | 2014-02-28 21:06:21 -0800 | 
| commit | 3d6eac52abb1fd05a0c954f00dd5b8b855765f6e (patch) | |
| tree | 87ffc62a7e9ea895d4e2915ef5c7a79117f31502 /src | |
| parent | de48fd79992a5218c18da8dca62869b865a62f0e (diff) | |
| download | abc-3d6eac52abb1fd05a0c954f00dd5b8b855765f6e.tar.gz abc-3d6eac52abb1fd05a0c954f00dd5b8b855765f6e.tar.bz2 abc-3d6eac52abb1fd05a0c954f00dd5b8b855765f6e.zip | |
Changes to LUT mappers.
Diffstat (limited to 'src')
| -rw-r--r-- | src/base/abci/abc.c | 235 | ||||
| -rw-r--r-- | src/base/abci/abcIf.c | 9 | ||||
| -rw-r--r-- | src/base/main/main.h | 3 | ||||
| -rw-r--r-- | src/base/main/mainFrame.c | 4 | ||||
| -rw-r--r-- | src/base/main/mainInt.h | 3 | ||||
| -rw-r--r-- | src/map/if/if.h | 8 | ||||
| -rw-r--r-- | src/map/if/ifDsd.c | 622 | ||||
| -rw-r--r-- | src/map/if/ifMan.c | 22 | ||||
| -rw-r--r-- | src/map/if/ifMap.c | 57 | ||||
| -rw-r--r-- | src/map/if/ifSat.c | 24 | 
10 files changed, 721 insertions, 266 deletions
| diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c index b8e41dc0..5361e1b2 100644 --- a/src/base/abci/abc.c +++ b/src/base/abci/abc.c @@ -231,6 +231,10 @@ static int Abc_CommandSuperChoiceLut         ( Abc_Frame_t * pAbc, int argc, cha  //static int Abc_CommandFpgaFast               ( Abc_Frame_t * pAbc, int argc, char ** argv );  static int Abc_CommandIf                     ( Abc_Frame_t * pAbc, int argc, char ** argv );  static int Abc_CommandIfif                   ( Abc_Frame_t * pAbc, int argc, char ** argv ); +static int Abc_CommandDsdSave                ( Abc_Frame_t * pAbc, int argc, char ** argv ); +static int Abc_CommandDsdLoad                ( Abc_Frame_t * pAbc, int argc, char ** argv ); +static int Abc_CommandDsdFree                ( Abc_Frame_t * pAbc, int argc, char ** argv ); +static int Abc_CommandDsdPs                  ( Abc_Frame_t * pAbc, int argc, char ** argv );  static int Abc_CommandScut                   ( Abc_Frame_t * pAbc, int argc, char ** argv );  static int Abc_CommandInit                   ( Abc_Frame_t * pAbc, int argc, char ** argv ); @@ -784,6 +788,10 @@ void Abc_Init( Abc_Frame_t * pAbc )  //    Cmd_CommandAdd( pAbc, "FPGA mapping", "ffpga",         Abc_CommandFpgaFast,         1 );      Cmd_CommandAdd( pAbc, "FPGA mapping", "if",            Abc_CommandIf,               1 );      Cmd_CommandAdd( pAbc, "FPGA mapping", "ifif",          Abc_CommandIfif,             1 ); +    Cmd_CommandAdd( pAbc, "FPGA mapping", "dsd_save",      Abc_CommandDsdSave,          0 ); +    Cmd_CommandAdd( pAbc, "FPGA mapping", "dsd_load",      Abc_CommandDsdLoad,          0 ); +    Cmd_CommandAdd( pAbc, "FPGA mapping", "dsd_free",      Abc_CommandDsdFree,          0 ); +    Cmd_CommandAdd( pAbc, "FPGA mapping", "dsd_ps",        Abc_CommandDsdPs,            0 );  //    Cmd_CommandAdd( pAbc, "Sequential",   "scut",          Abc_CommandScut,             0 );      Cmd_CommandAdd( pAbc, "Sequential",   "init",          Abc_CommandInit,             1 ); @@ -15088,6 +15096,29 @@ int Abc_CommandIf( Abc_Frame_t * pAbc, int argc, char ** argv )          pPars->fUsePerm    =  1;      } +    if ( pPars->fUseDsd ) +    { +        int LutSize = (pPars->pLutStruct && pPars->pLutStruct[2] == 0)? pPars->pLutStruct[0] - '0' : 0; +        If_DsdMan_t * p = (If_DsdMan_t *)Abc_FrameReadManDsd(); +        if ( pPars->pLutStruct && pPars->pLutStruct[2] != 0 ) +        { +            printf( "DSD only works for LUT structures XY.\n" ); +            return 0; +        } +        if ( p && pPars->nLutSize > If_DsdManVarNum(p) ) +        { +            printf( "DSD manager has incompatible number of variables.\n" ); +            return 0; +        } +        if ( p && LutSize != If_DsdManLutSize(p) ) +        { +            printf( "DSD manager has different LUT size.\n" ); +            return 0; +        } +        if ( p == NULL ) +            Abc_FrameSetManDsd( If_DsdManAlloc(pPars->nLutSize, LutSize) ); +    } +      if ( pPars->fUserRecLib )      {          assert( Abc_NtkRecIsRunning3() ); @@ -15322,6 +15353,210 @@ usage:      return 1;  } +/**Function************************************************************* + +  Synopsis    [] + +  Description [] + +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +int Abc_CommandDsdSave( Abc_Frame_t * pAbc, int argc, char ** argv ) +{ +    char * FileName; +    char ** pArgvNew; +    int nArgcNew; +    int c; + +    Extra_UtilGetoptReset(); +    while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) +    { +        switch ( c ) +        { +        case 'h': +            goto usage; +        default: +            goto usage; +        } +    } + +    if ( !Abc_FrameReadManDsd() ) +    { +        Abc_Print( -1, "The DSD manager is not started.\n" ); +        return 1; +    } + +    pArgvNew = argv + globalUtilOptind; +    nArgcNew = argc - globalUtilOptind; +    if ( nArgcNew != 1 ) +    { +        Abc_Print( -1, "File name is not given on the command line.\n" ); +        return 1; +    } +    // get the input file name +    FileName = (nArgcNew == 1) ? pArgvNew[0] : NULL; +    If_DsdManSave( (If_DsdMan_t *)Abc_FrameReadManDsd(), FileName ); +    return 0; + +usage: +    Abc_Print( -2, "usage: dsd_save [-h] <file>\n" ); +    Abc_Print( -2, "\t         saves DSD manager into a file\n"); +    Abc_Print( -2, "\t-h     : print the command usage\n"); +    Abc_Print( -2, "\t<file> : (optional) file name to write\n"); +    return 1; +} + +/**Function************************************************************* + +  Synopsis    [] + +  Description [] + +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +int Abc_CommandDsdLoad( Abc_Frame_t * pAbc, int argc, char ** argv ) +{ +    char * FileName, * pTemp; +    char ** pArgvNew; +    int c, nArgcNew; +    FILE * pFile; +    If_DsdMan_t * pDsdMan; +    Extra_UtilGetoptReset(); +    while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) +    { +        switch ( c ) +        { +        case 'h': +            goto usage; +        default: +            goto usage; +        } +    } +    pArgvNew = argv + globalUtilOptind; +    nArgcNew = argc - globalUtilOptind; +    if ( nArgcNew != 1 ) +    { +        Abc_Print( -1, "File name is not given on the command line.\n" ); +        return 1; +    } +    // 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 ); +    pDsdMan = If_DsdManLoad(FileName); +    if ( pDsdMan == NULL ) +        return 1; +    Abc_FrameSetManDsd( pDsdMan ); +    return 0; + +usage: +    Abc_Print( -2, "usage: dsd_load [-h] <file>\n" ); +    Abc_Print( -2, "\t         loads DSD manager from file\n"); +    Abc_Print( -2, "\t-h     : print the command usage\n"); +    Abc_Print( -2, "\t<file> : file name to read\n"); +    return 1; +} + +/**Function************************************************************* + +  Synopsis    [] + +  Description [] + +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +int Abc_CommandDsdFree( Abc_Frame_t * pAbc, int argc, char ** argv ) +{ +    int c; +    Extra_UtilGetoptReset(); +    while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) +    { +        switch ( c ) +        { +        case 'h': +            goto usage; +        default: +            goto usage; +        } +    } +    if ( !Abc_FrameReadManDsd() ) +    { +        Abc_Print( 1, "The DSD manager is not started.\n" ); +        return 0; +    } +    Abc_FrameSetManDsd( NULL ); +    return 0; + +usage: +    Abc_Print( -2, "usage: dsd_ps [-h]\n" ); +    Abc_Print( -2, "\t        deletes DSD manager\n" ); +    Abc_Print( -2, "\t-h    : print the command usage\n"); +    return 1; +} + +/**Function************************************************************* + +  Synopsis    [] + +  Description [] + +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +int Abc_CommandDsdPs( Abc_Frame_t * pAbc, int argc, char ** argv ) +{ +    int c, fPrintLib = 0; +    Extra_UtilGetoptReset(); +    while ( ( c = Extra_UtilGetopt( argc, argv, "ph" ) ) != EOF ) +    { +        switch ( c ) +        { +        case 'p': +            fPrintLib ^= 1; +            break; +        case 'h': +            goto usage; +        default: +            goto usage; +        } +    } +    if ( !Abc_FrameReadManDsd() ) +    { +        Abc_Print( 1, "The DSD manager is not started.\n" ); +        return 0; +    } +    If_DsdManPrint( (If_DsdMan_t *)Abc_FrameReadManDsd(), NULL, 0 ); +    return 0; + +usage: +    Abc_Print( -2, "usage: dsd_ps [-h]\n" ); +    Abc_Print( -2, "\t        prints statistics of DSD manager\n" ); +    Abc_Print( -2, "\t-h    : print the command usage\n"); +    return 1; +} +  /**Function************************************************************* diff --git a/src/base/abci/abcIf.c b/src/base/abci/abcIf.c index 63fdfb15..64dc11e6 100644 --- a/src/base/abci/abcIf.c +++ b/src/base/abci/abcIf.c @@ -137,6 +137,15 @@ Abc_Ntk_t * Abc_NtkIf( Abc_Ntk_t * pNtk, If_Par_t * pPars )      if ( pPars->fPower )          Abc_NtkIfComputeSwitching( pNtk, pIfMan ); +    // create DSD manager +    if ( pPars->fUseDsd ) +    { +        If_DsdMan_t * p = (If_DsdMan_t *)Abc_FrameReadManDsd(); +        assert( pPars->nLutSize <= If_DsdManVarNum(p) ); +        assert( (pPars->pLutStruct == NULL && If_DsdManLutSize(p) == 0) || (pPars->pLutStruct && pPars->pLutStruct[0] - '0' == If_DsdManLutSize(p)) ); +        pIfMan->pIfDsdMan = (If_DsdMan_t *)Abc_FrameReadManDsd(); +    } +      // perform FPGA mapping      if ( !If_ManPerformMapping( pIfMan ) )      { diff --git a/src/base/main/main.h b/src/base/main/main.h index a55ff06c..e58fa75b 100644 --- a/src/base/main/main.h +++ b/src/base/main/main.h @@ -106,6 +106,8 @@ extern ABC_DLL void *          Abc_FrameReadLibVer();  extern ABC_DLL void *          Abc_FrameReadLibScl();                    extern ABC_DLL void *          Abc_FrameReadManDd();                       extern ABC_DLL void *          Abc_FrameReadManDec();                     +extern ABC_DLL void *          Abc_FrameReadManDsd();            +           extern ABC_DLL char *          Abc_FrameReadFlag( char * pFlag );   extern ABC_DLL int             Abc_FrameIsFlagEnabled( char * pFlag );  extern ABC_DLL int             Abc_FrameIsBatchMode(); @@ -138,6 +140,7 @@ extern ABC_DLL void            Abc_FrameSetFlag( char * pFlag, char * pValue );  extern ABC_DLL void            Abc_FrameSetCex( Abc_Cex_t * pCex );  extern ABC_DLL void            Abc_FrameSetNFrames( int nFrames );  extern ABC_DLL void            Abc_FrameSetStatus( int Status ); +extern ABC_DLL void            Abc_FrameSetManDsd( void * pMan );  extern ABC_DLL int             Abc_FrameCheckPoConst( Abc_Frame_t * p, int iPoNum ); diff --git a/src/base/main/mainFrame.c b/src/base/main/mainFrame.c index 20054228..bb9d19e4 100644 --- a/src/base/main/mainFrame.c +++ b/src/base/main/mainFrame.c @@ -22,6 +22,7 @@  #include "mainInt.h"  #include "bool/dec/dec.h"  #include "misc/extra/extraBdd.h" +#include "map/if/if.h"  ABC_NAMESPACE_IMPL_START @@ -59,6 +60,7 @@ void *      Abc_FrameReadLibVer()                            { return s_GlobalFr  void *      Abc_FrameReadLibScl()                            { return s_GlobalFrame->pLibScl;      }   void *      Abc_FrameReadManDd()                             { if ( s_GlobalFrame->dd == NULL )      s_GlobalFrame->dd = Cudd_Init( 0, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );  return s_GlobalFrame->dd;      }   void *      Abc_FrameReadManDec()                            { if ( s_GlobalFrame->pManDec == NULL ) s_GlobalFrame->pManDec = Dec_ManStart();                                        return s_GlobalFrame->pManDec; }  +void *      Abc_FrameReadManDsd()                            { return s_GlobalFrame->pManDsd;      }   char *      Abc_FrameReadFlag( char * pFlag )                { return Cmd_FlagReadByName( s_GlobalFrame, pFlag );   }   int         Abc_FrameReadBmcFrames( Abc_Frame_t * p )        { return s_GlobalFrame->nFrames;      }                @@ -85,6 +87,7 @@ void        Abc_FrameSetFlag( char * pFlag, char * pValue )  { Cmd_FlagUpdateVal  void        Abc_FrameSetCex( Abc_Cex_t * pCex )              { ABC_FREE( s_GlobalFrame->pCex ); s_GlobalFrame->pCex = pCex;       }  void        Abc_FrameSetNFrames( int nFrames )               { ABC_FREE( s_GlobalFrame->pCex ); s_GlobalFrame->nFrames = nFrames; }  void        Abc_FrameSetStatus( int Status )                 { ABC_FREE( s_GlobalFrame->pCex ); s_GlobalFrame->Status = Status;   } +void        Abc_FrameSetManDsd( void * pMan )                { if (s_GlobalFrame->pManDsd) If_DsdManFree((If_DsdMan_t *)s_GlobalFrame->pManDsd, 0); s_GlobalFrame->pManDsd = pMan; }  int         Abc_FrameIsBatchMode()                           { return s_GlobalFrame ? s_GlobalFrame->fBatchMode : 0;              }  @@ -194,6 +197,7 @@ void Abc_FrameDeallocate( Abc_Frame_t * p )      if ( p->pSave2    )  Aig_ManStop( (Aig_Man_t *)p->pSave2 );      if ( p->pSave3    )  Aig_ManStop( (Aig_Man_t *)p->pSave3 );      if ( p->pSave4    )  Aig_ManStop( (Aig_Man_t *)p->pSave4 ); +    if ( p->pManDsd   )  If_DsdManFree( (If_DsdMan_t *)p->pManDsd, 0 );      if ( p->vPlugInComBinPairs )       {          char * pTemp; diff --git a/src/base/main/mainInt.h b/src/base/main/mainInt.h index 07dc93e4..c5b7de58 100644 --- a/src/base/main/mainInt.h +++ b/src/base/main/mainInt.h @@ -82,8 +82,9 @@ struct Abc_Frame_t_      double          TimeTotal;     // the total runtime of all commands      // temporary storage for structural choices      Vec_Ptr_t *     vStore;        // networks to be used by choice -    // decomposition package +    // decomposition package          void *          pManDec;       // decomposition manager +    void *          pManDsd;       // decomposition manager      DdManager *     dd;            // temporary BDD package      // libraries for mapping      void *          pLibLut;       // the current LUT library diff --git a/src/map/if/if.h b/src/map/if/if.h index 47bd7390..c8b04ef1 100644 --- a/src/map/if/if.h +++ b/src/map/if/if.h @@ -517,12 +517,18 @@ extern int             If_CluCheckExt( void * p, word * pTruth, int nVars, int n  extern int             If_CluCheckExt3( void * p, word * pTruth, int nVars, int nLutLeaf, int nLutLeaf2, int nLutRoot,                              char * pLut0, char * pLut1, char * pLut2, word * pFunc0, word * pFunc1, word * pFunc2 );  /*=== ifDsd.c =============================================================*/ -extern If_DsdMan_t *   If_DsdManAlloc( int nLutSize ); +extern If_DsdMan_t *   If_DsdManAlloc( int nVars, int nLutSize );  extern void            If_DsdManDump( If_DsdMan_t * p );  extern void            If_DsdManPrint( If_DsdMan_t * p, char * pFileName, int fVerbose );  extern void            If_DsdManFree( If_DsdMan_t * p, int fVerbose ); +extern void            If_DsdManSave( If_DsdMan_t * p, char * pFileName ); +extern If_DsdMan_t *   If_DsdManLoad( char * pFileName );  extern int             If_DsdManCompute( If_DsdMan_t * p, word * pTruth, int nLeaves, unsigned char * pPerm, char * pLutStruct ); +extern char *          If_DsdManFileName( If_DsdMan_t * p ); +extern int             If_DsdManVarNum( If_DsdMan_t * p ); +extern int             If_DsdManLutSize( If_DsdMan_t * p );  extern int             If_DsdManCheckDec( If_DsdMan_t * p, int iDsd ); +extern unsigned        If_DsdManCheckXY( If_DsdMan_t * p, int iDsd, int LutSize, int fDerive, int fVerbose );  /*=== ifLib.c =============================================================*/  extern If_LibLut_t *   If_LibLutRead( char * FileName );  extern If_LibLut_t *   If_LibLutDup( If_LibLut_t * p ); diff --git a/src/map/if/ifDsd.c b/src/map/if/ifDsd.c index 23160e62..a72362d7 100644 --- a/src/map/if/ifDsd.c +++ b/src/map/if/ifDsd.c @@ -53,7 +53,9 @@ struct If_DsdObj_t_  struct If_DsdMan_t_  { +    char *         pStore;         // input/output file      int            nVars;          // max var number +    int            LutSize;        // LUT size      int            nWords;         // word number      int            nBins;          // table size      unsigned *     pBins;          // hash table @@ -113,10 +115,10 @@ static inline void          If_DsdVecObjSetMark( Vec_Ptr_t * p, int iObj )  ////////////////////////////////////////////////////////////////////////  ///                     FUNCTION DEFINITIONS                         ///  //////////////////////////////////////////////////////////////////////// -  +  /**Function************************************************************* -  Synopsis    [Sorting DSD literals.] +  Synopsis    []    Description [] @@ -125,114 +127,21 @@ static inline void          If_DsdVecObjSetMark( Vec_Ptr_t * p, int iObj )    SeeAlso     []  ***********************************************************************/ -int If_DsdObjCompare( Vec_Ptr_t * p, int iLit0, int iLit1 ) +char * If_DsdManFileName( If_DsdMan_t * p )  { -    If_DsdObj_t * p0 = If_DsdVecObj(p, Abc_Lit2Var(iLit0)); -    If_DsdObj_t * p1 = If_DsdVecObj(p, Abc_Lit2Var(iLit1)); -    int i, Res; -    if ( If_DsdObjType(p0) < If_DsdObjType(p1) ) -        return -1; -    if ( If_DsdObjType(p0) > If_DsdObjType(p1) ) -        return 1; -    if ( If_DsdObjType(p0) < IF_DSD_AND ) -        return 0; -    if ( If_DsdObjFaninNum(p0) < If_DsdObjFaninNum(p1) ) -        return -1; -    if ( If_DsdObjFaninNum(p0) > If_DsdObjFaninNum(p1) ) -        return 1; -    for ( i = 0; i < If_DsdObjFaninNum(p0); i++ ) -    { -        Res = If_DsdObjCompare( p, If_DsdObjFaninLit(p0, i), If_DsdObjFaninLit(p1, i) ); -        if ( Res != 0 ) -            return Res; -    } -    if ( Abc_LitIsCompl(iLit0) < Abc_LitIsCompl(iLit1) ) -        return -1; -    if ( Abc_LitIsCompl(iLit0) > Abc_LitIsCompl(iLit1) ) -        return 1; -    return 0; +    return p->pStore;  } -void If_DsdObjSort( Vec_Ptr_t * p, int * pLits, int nLits, int * pPerm ) +int If_DsdManVarNum( If_DsdMan_t * p )  { -    int i, j, best_i; -    for ( i = 0; i < nLits-1; i++ ) -    { -        best_i = i; -        for ( j = i+1; j < nLits; j++ ) -            if ( If_DsdObjCompare(p, pLits[best_i], pLits[j]) == 1 ) -                best_i = j; -        if ( i == best_i ) -            continue; -        ABC_SWAP( int, pLits[i], pLits[best_i] ); -        if ( pPerm ) -            ABC_SWAP( int, pPerm[i], pPerm[best_i] ); -    } +    return p->nVars;  } - -/**Function************************************************************* - -  Synopsis    [Creating DSD objects.] - -  Description [] -                -  SideEffects [] - -  SeeAlso     [] - -***********************************************************************/ -If_DsdObj_t * If_DsdObjAlloc( If_DsdMan_t * p, int Type, int nFans ) +int If_DsdManLutSize( If_DsdMan_t * p )  { -    int nWords = If_DsdObjWordNum( nFans + (int)(Type == DAU_DSD_PRIME) ); -    If_DsdObj_t * pObj = (If_DsdObj_t *)Mem_FlexEntryFetch( p->pMem, sizeof(word) * nWords ); -    If_DsdObjClean( pObj ); -    pObj->Type   = Type; -    pObj->nFans  = nFans; -    pObj->Id     = Vec_PtrSize( p->vObjs ); -    pObj->fMark  = 0; -    pObj->Count  = 0; -    Vec_PtrPush( p->vObjs, pObj ); -    Vec_IntPush( p->vNexts, 0 ); -    return pObj; +    return p->LutSize;  } -int If_DsdObjCreate( If_DsdMan_t * p, int Type, int * pLits, int nLits, int truthId ) +int If_DsdManCheckDec( If_DsdMan_t * p, int iDsd )  { -    If_DsdObj_t * pObj, * pFanin; -    int i, iPrev = -1; -    // check structural canonicity -    assert( Type != DAU_DSD_MUX || nLits == 3 ); -    assert( Type != DAU_DSD_MUX || !Abc_LitIsCompl(pLits[0]) ); -    assert( Type != DAU_DSD_MUX || !Abc_LitIsCompl(pLits[1]) || !Abc_LitIsCompl(pLits[2]) ); -    // check that leaves are in good order -    if ( Type == DAU_DSD_AND || Type == DAU_DSD_XOR ) -    { -        for ( i = 0; i < nLits; i++ ) -        { -            pFanin = If_DsdVecObj( p->vObjs, Abc_Lit2Var(pLits[i]) ); -            assert( Type != DAU_DSD_AND || Abc_LitIsCompl(pLits[i]) || If_DsdObjType(pFanin) != DAU_DSD_AND ); -            assert( Type != DAU_DSD_XOR || If_DsdObjType(pFanin) != DAU_DSD_XOR ); -            assert( iPrev == -1 || If_DsdObjCompare(p->vObjs, iPrev, pLits[i]) <= 0 ); -            iPrev = pLits[i]; -        } -    } -    if ( Vec_PtrSize(p->vObjs) % p->nBins == 0 ) -        printf( "Warning: The number of objects in If_DsdObjCreate() is more than the number of bins.\n" ); -    // create new node -    pObj = If_DsdObjAlloc( p, Type, nLits ); -    if ( Type == DAU_DSD_PRIME ) -        If_DsdObjSetTruth( p, pObj, truthId ); -    assert( pObj->nSupp == 0 ); -    for ( i = 0; i < nLits; i++ ) -    { -        pObj->pFans[i] = pLits[i]; -        pObj->nSupp += If_DsdVecLitSuppSize(p->vObjs, pLits[i]); -    } -/* -    { -        extern void If_DsdManPrintOne( If_DsdMan_t * p, int iDsdLit, int * pPermLits ); -        If_DsdManPrintOne( p, If_DsdObj2Lit(pObj), NULL ); -    } -*/ -    return pObj->Id; +    return If_DsdVecObjMark( p->vObjs, Abc_Lit2Var(iDsd) );  }  /**Function************************************************************* @@ -258,17 +167,35 @@ static inline word ** If_ManDsdTtElems()      }      return pTtElems;  } -If_DsdMan_t * If_DsdManAlloc( int nVars ) +If_DsdObj_t * If_DsdObjAlloc( If_DsdMan_t * p, int Type, int nFans ) +{ +    int nWords = If_DsdObjWordNum( nFans + (int)(Type == DAU_DSD_PRIME) ); +    If_DsdObj_t * pObj = (If_DsdObj_t *)Mem_FlexEntryFetch( p->pMem, sizeof(word) * nWords ); +    If_DsdObjClean( pObj ); +    pObj->Type   = Type; +    pObj->nFans  = nFans; +    pObj->Id     = Vec_PtrSize( p->vObjs ); +    pObj->fMark  = 0; +    pObj->Count  = 0; +    Vec_PtrPush( p->vObjs, pObj ); +    Vec_IntPush( p->vNexts, 0 ); +    return pObj; +} +If_DsdMan_t * If_DsdManAlloc( int nVars, int LutSize )  {      If_DsdMan_t * p; int v; +    char pFileName[10]; +    sprintf( pFileName, "%02d.dsd", nVars );      p = ABC_CALLOC( If_DsdMan_t, 1 ); -    p->nVars  = nVars; -    p->nWords = Abc_TtWordNum( nVars ); -    p->nBins  = Abc_PrimeCudd( 1000000 ); -    p->pBins  = ABC_CALLOC( unsigned, p->nBins ); -    p->pMem   = Mem_FlexStart(); -    p->vObjs  = Vec_PtrAlloc( 10000 ); -    p->vNexts = Vec_IntAlloc( 10000 ); +    p->pStore  = Abc_UtilStrsav( pFileName ); +    p->nVars   = nVars; +    p->LutSize = LutSize; +    p->nWords  = Abc_TtWordNum( nVars ); +    p->nBins   = Abc_PrimeCudd( 1000000 ); +    p->pBins   = ABC_CALLOC( unsigned, p->nBins ); +    p->pMem    = Mem_FlexStart(); +    p->vObjs   = Vec_PtrAlloc( 10000 ); +    p->vNexts  = Vec_IntAlloc( 10000 );      If_DsdObjAlloc( p, IF_DSD_CONST0, 0 );      If_DsdObjAlloc( p, IF_DSD_VAR, 0 )->nSupp = 1;      p->vNodes   = Vec_IntAlloc( 32 ); @@ -284,8 +211,8 @@ void If_DsdManFree( If_DsdMan_t * p, int fVerbose )  {      int v;  //    If_DsdManDump( p ); -    If_DsdManPrint( p, NULL, 0 ); -    Vec_MemDumpTruthTables( p->vTtMem, "dumpdsd", p->nVars ); +    if ( fVerbose ) +        If_DsdManPrint( p, NULL, 0 );      if ( fVerbose )      {          Abc_PrintTime( 1, "Time DSD   ", p->timeDsd    ); @@ -293,6 +220,8 @@ void If_DsdManFree( If_DsdMan_t * p, int fVerbose )          Abc_PrintTime( 1, "Time check ", p->timeCheck  );          Abc_PrintTime( 1, "Time verify", p->timeVerify );      } +    if ( fVerbose ) +        Vec_MemDumpTruthTables( p->vTtMem, "dumpdsd", p->nVars );      for ( v = 2; v < p->nVars; v++ )          ABC_FREE( p->pSched[v] );      Vec_VecFree( (Vec_Vec_t *)p->vTtDecs ); @@ -302,9 +231,46 @@ void If_DsdManFree( If_DsdMan_t * p, int fVerbose )      Vec_IntFreeP( &p->vNexts );      Vec_PtrFreeP( &p->vObjs );      Mem_FlexStop( p->pMem, 0 ); +    ABC_FREE( p->pStore );      ABC_FREE( p->pBins );      ABC_FREE( p );  } +void If_DsdManDump( If_DsdMan_t * p ) +{ +    char * pFileName = "dss_tts.txt"; +    FILE * pFile; +    If_DsdObj_t * pObj; +    int i; +    pFile = fopen( pFileName, "wb" ); +    if ( pFile == NULL ) +    { +        printf( "Cannot open file \"%s\".\n", pFileName ); +        return; +    } +    If_DsdVecForEachObj( p->vObjs, pObj, i ) +    { +        if ( If_DsdObjType(pObj) != IF_DSD_PRIME ) +            continue; +        fprintf( pFile, "0x" ); +        Abc_TtPrintHexRev( pFile, If_DsdObjTruth(p, pObj), p->nVars ); +        fprintf( pFile, "\n" ); +        printf( "    " ); +        Dau_DsdPrintFromTruth( If_DsdObjTruth(p, pObj), p->nVars ); +    } +    fclose( pFile ); +} + +/**Function************************************************************* + +  Synopsis    [Printing.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/  void If_DsdManHashProfile( If_DsdMan_t * p )  {      If_DsdObj_t * pObj; @@ -367,6 +333,7 @@ void If_DsdManPrintOne( FILE * pFile, If_DsdMan_t * p, int iObjId, unsigned char      fprintf( pFile, "%6d : ", iObjId );      fprintf( pFile, "%2d ",   If_DsdVecObjSuppSize(p->vObjs, iObjId) );      fprintf( pFile, "%8d ",   If_DsdVecObjRef(p->vObjs, iObjId) ); +    fprintf( pFile, "%d  ",    If_DsdVecObjMark(p->vObjs, iObjId) );      If_DsdManPrint_rec( pFile, p, Abc_Var2Lit(iObjId, 0), pPermLits, &nSupp );      if ( fNewLine )          fprintf( pFile, "\n" ); @@ -400,7 +367,7 @@ void If_DsdManPrint( If_DsdMan_t * p, char * pFileName, int fVerbose )      fprintf( pFile, "Memory used for objects    = %8.2f MB.\n", 1.0*Mem_FlexReadMemUsage(p->pMem)/(1<<20) );      fprintf( pFile, "Memory used for hash table = %8.2f MB.\n", 1.0*sizeof(int)*p->nBins/(1<<20) );      fprintf( pFile, "Memory used for array      = %8.2f MB.\n", 1.0*sizeof(void *)*Vec_PtrCap(p->vObjs)/(1<<20) ); -    Abc_PrintTime( 1, "Time", Abc_Clock() - clk ); +//    Abc_PrintTime( 1, "Time", Abc_Clock() - clk );  //    If_DsdManHashProfile( p );  //    If_DsdManDump( p );  //    return; @@ -416,57 +383,6 @@ void If_DsdManPrint( If_DsdMan_t * p, char * pFileName, int fVerbose )      if ( pFileName )          fclose( pFile );  } -void If_DsdManDump( If_DsdMan_t * p ) -{ -    char * pFileName = "dss_tts.txt"; -    FILE * pFile; -    If_DsdObj_t * pObj; -    int i; -    pFile = fopen( pFileName, "wb" ); -    if ( pFile == NULL ) -    { -        printf( "Cannot open file \"%s\".\n", pFileName ); -        return; -    } -    If_DsdVecForEachObj( p->vObjs, pObj, i ) -    { -        if ( If_DsdObjType(pObj) != IF_DSD_PRIME ) -            continue; -        fprintf( pFile, "0x" ); -        Abc_TtPrintHexRev( pFile, If_DsdObjTruth(p, pObj), p->nVars ); -        fprintf( pFile, "\n" ); -        printf( "    " ); -        Dau_DsdPrintFromTruth( If_DsdObjTruth(p, pObj), p->nVars ); -    } -    fclose( pFile ); -} - -/**Function************************************************************* - -  Synopsis    [Collect nodes of the tree.] - -  Description [] -                -  SideEffects [] - -  SeeAlso     [] - -***********************************************************************/ -void If_DsdManCollect_rec( If_DsdMan_t * p, int Id, Vec_Int_t * vNodes ) -{ -    int i, iFanin; -    If_DsdObj_t * pObj = If_DsdVecObj( p->vObjs, Id ); -    if ( If_DsdObjType(pObj) == IF_DSD_CONST0 || If_DsdObjType(pObj) == IF_DSD_VAR ) -        return; -    If_DsdObjForEachFaninLit( p->vObjs, pObj, iFanin, i ) -        If_DsdManCollect_rec( p, Abc_Lit2Var(iFanin), vNodes ); -    Vec_IntPush( vNodes, Id ); -} -void If_DsdManCollect( If_DsdMan_t * p, int Id, Vec_Int_t * vNodes ) -{ -    Vec_IntClear( vNodes ); -    If_DsdManCollect_rec( p, Id, vNodes ); -}  /**Function************************************************************* @@ -481,7 +397,6 @@ void If_DsdManCollect( If_DsdMan_t * p, int Id, Vec_Int_t * vNodes )  ***********************************************************************/  static inline unsigned If_DsdObjHashKey( If_DsdMan_t * p, int Type, int * pLits, int nLits, int truthId )  { -//    static int s_Primes[8] = { 1699, 4177, 5147, 5647, 6343, 7103, 7873, 8147 };      static int s_Primes[24] = { 1049, 1297, 1559, 1823, 2089, 2371, 2663, 2909,                                   3221, 3517, 3779, 4073, 4363, 4663, 4973, 5281,                                   5573, 5861, 6199, 6481, 6803, 7109, 7477, 7727 }; @@ -512,6 +427,43 @@ unsigned * If_DsdObjHashLookup( If_DsdMan_t * p, int Type, int * pLits, int nLit      p->nUniqueMisses++;      return pSpot;  } +int If_DsdObjCreate( If_DsdMan_t * p, int Type, int * pLits, int nLits, int truthId ) +{ +    If_DsdObj_t * pObj, * pFanin; +    int i, iPrev = -1; +    // check structural canonicity +    assert( Type != DAU_DSD_MUX || nLits == 3 ); +    assert( Type != DAU_DSD_MUX || !Abc_LitIsCompl(pLits[0]) ); +    assert( Type != DAU_DSD_MUX || !Abc_LitIsCompl(pLits[1]) || !Abc_LitIsCompl(pLits[2]) ); +    // check that leaves are in good order +    if ( Type == DAU_DSD_AND || Type == DAU_DSD_XOR ) +    { +        for ( i = 0; i < nLits; i++ ) +        { +            pFanin = If_DsdVecObj( p->vObjs, Abc_Lit2Var(pLits[i]) ); +            assert( Type != DAU_DSD_AND || Abc_LitIsCompl(pLits[i]) || If_DsdObjType(pFanin) != DAU_DSD_AND ); +            assert( Type != DAU_DSD_XOR || If_DsdObjType(pFanin) != DAU_DSD_XOR ); +            assert( iPrev == -1 || If_DsdObjCompare(p->vObjs, iPrev, pLits[i]) <= 0 ); +            iPrev = pLits[i]; +        } +    } +    if ( Vec_PtrSize(p->vObjs) % p->nBins == 0 ) +        printf( "Warning: The number of objects in If_DsdObjCreate() is more than the number of bins.\n" ); +    // create new node +    pObj = If_DsdObjAlloc( p, Type, nLits ); +    if ( Type == DAU_DSD_PRIME ) +        If_DsdObjSetTruth( p, pObj, truthId ); +    assert( pObj->nSupp == 0 ); +    for ( i = 0; i < nLits; i++ ) +    { +        pObj->pFans[i] = pLits[i]; +        pObj->nSupp += If_DsdVecLitSuppSize(p->vObjs, pLits[i]); +    } +    // check decomposability +    if ( p->LutSize && !If_DsdManCheckXY(p, Abc_Var2Lit(pObj->Id, 0), p->LutSize, 0, 0) ) +        If_DsdVecObjSetMark( p->vObjs, pObj->Id ); +    return pObj->Id; +}  int If_DsdObjFindOrAdd( If_DsdMan_t * p, int Type, int * pLits, int nLits, word * pTruth )  {      int truthId = (Type == IF_DSD_PRIME) ? Vec_MemHashInsert(p->vTtMem, pTruth) : -1; @@ -536,6 +488,146 @@ p->timeCheck += Abc_Clock() - clk;  /**Function************************************************************* +  Synopsis    [Saving/loading DSD manager.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +void If_DsdManSave( If_DsdMan_t * p, char * pFileName ) +{ +    If_DsdObj_t * pObj;  +    Vec_Int_t * vSets; +    char * pBuffer = "dsd0"; +    word * pTruth;  +    int i, Num; +    FILE * pFile = fopen( pFileName ? pFileName : p->pStore, "wb" ); +    if ( pFile == NULL ) +    { +        printf( "Writing DSD manager file \"%s\" has failed.\n", pFileName ? pFileName : p->pStore ); +        return; +    } +    fwrite( pBuffer, 4, 1, pFile ); +    Num = p->nVars; +    fwrite( &Num, 4, 1, pFile ); +    Num = p->LutSize; +    fwrite( &Num, 4, 1, pFile ); +    Num = Vec_PtrSize(p->vObjs); +    fwrite( &Num, 4, 1, pFile ); +    Vec_PtrForEachEntryStart( If_DsdObj_t *, p->vObjs, pObj, i, 2 ) +    { +        Num = If_DsdObjWordNum( pObj->nFans + (int)(pObj->Type == DAU_DSD_PRIME) ); +        fwrite( &Num, 4, 1, pFile ); +        fwrite( pObj, sizeof(word)*Num, 1, pFile ); +    } +    assert( Vec_MemEntryNum(p->vTtMem) == Vec_PtrSize(p->vTtDecs) );  +    Num = Vec_MemEntryNum(p->vTtMem); +    fwrite( &Num, 4, 1, pFile ); +    Vec_MemForEachEntry( p->vTtMem, pTruth, i ) +        fwrite( pTruth, sizeof(word)*p->nWords, 1, pFile ); +    Vec_PtrForEachEntry( Vec_Int_t *, p->vTtDecs, vSets, i ) +    { +        Num = Vec_IntSize(vSets); +        fwrite( &Num, 4, 1, pFile ); +        fwrite( Vec_IntArray(vSets), sizeof(int)*Num, 1, pFile ); +    } +    fclose( pFile ); +} +If_DsdMan_t * If_DsdManLoad( char * pFileName ) +{ +    If_DsdMan_t * p; +    If_DsdObj_t * pObj;  +    Vec_Int_t * vSets; +    char pBuffer[10]; +    unsigned * pSpot; +    word * pTruth; +    int i, Num; +    FILE * pFile = fopen( pFileName, "rb" ); +    if ( pFile == NULL ) +    { +        printf( "Reading DSD manager file \"%s\" has failed.\n", pFileName ); +        return NULL; +    } +    fread( pBuffer, 4, 1, pFile ); +    if ( pBuffer[0] != 'd' && pBuffer[1] != 's' && pBuffer[2] != 'd' && pBuffer[3] != '0' ) +    { +        printf( "Unrecognized format of file \"%s\".\n", pFileName ); +        return NULL; +    } +    fread( &Num, 4, 1, pFile ); +    p = If_DsdManAlloc( Num, 0 ); +    ABC_FREE( p->pStore ); +    p->pStore = Abc_UtilStrsav( pFileName ); +    fread( &Num, 4, 1, pFile ); +    p->LutSize = Num; +    fread( &Num, 4, 1, pFile ); +    assert( Num >= 2 ); +    Vec_PtrFillExtra( p->vObjs, Num, NULL ); +    Vec_IntFill( p->vNexts, Num, 0 ); +    for ( i = 2; i < Vec_PtrSize(p->vObjs); i++ ) +    { +        fread( &Num, 4, 1, pFile ); +        pObj = (If_DsdObj_t *)Mem_FlexEntryFetch( p->pMem, sizeof(word) * Num ); +        fread( pObj, sizeof(word)*Num, 1, pFile ); +        Vec_PtrWriteEntry( p->vObjs, i, pObj ); +        pSpot = If_DsdObjHashLookup( p, pObj->Type, pObj->pFans, pObj->nFans, If_DsdObjTruthId(p, pObj) ); +        assert( *pSpot == 0 ); +        *pSpot = pObj->Id; +    } +    fread( &Num, 4, 1, pFile ); +    pTruth = ABC_ALLOC( word, p->nWords ); +    for ( i = 0; i < Num; i++ ) +    { +        fread( pTruth, sizeof(word)*p->nWords, 1, pFile ); +        Vec_MemHashInsert( p->vTtMem, pTruth ); +    } +    ABC_FREE( pTruth ); +    assert( Num == Vec_MemEntryNum(p->vTtMem) ); +    for ( i = 0; i < Vec_MemEntryNum(p->vTtMem); i++ ) +    { +        fread( &Num, 4, 1, pFile ); +        vSets = Vec_IntAlloc( Num ); +        fread( Vec_IntArray(vSets), sizeof(int)*Num, 1, pFile ); +        vSets->nSize = Num; +        Vec_PtrPush( p->vTtDecs, vSets ); +    } +    assert( Vec_MemEntryNum(p->vTtMem) == Vec_PtrSize(p->vTtDecs) );  +    fclose( pFile ); +    return p; +} + +/**Function************************************************************* + +  Synopsis    [Collect nodes of the tree.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +void If_DsdManCollect_rec( If_DsdMan_t * p, int Id, Vec_Int_t * vNodes ) +{ +    int i, iFanin; +    If_DsdObj_t * pObj = If_DsdVecObj( p->vObjs, Id ); +    if ( If_DsdObjType(pObj) == IF_DSD_CONST0 || If_DsdObjType(pObj) == IF_DSD_VAR ) +        return; +    If_DsdObjForEachFaninLit( p->vObjs, pObj, iFanin, i ) +        If_DsdManCollect_rec( p, Abc_Lit2Var(iFanin), vNodes ); +    Vec_IntPush( vNodes, Id ); +} +void If_DsdManCollect( If_DsdMan_t * p, int Id, Vec_Int_t * vNodes ) +{ +    Vec_IntClear( vNodes ); +    If_DsdManCollect_rec( p, Id, vNodes ); +} + +/**Function************************************************************* +    Synopsis    []    Description [] @@ -617,6 +709,61 @@ word * If_DsdManComputeTruth( If_DsdMan_t * p, int iDsd, unsigned char * pPermLi      assert( nSupp == If_DsdVecObjSuppSize(p->vObjs, Abc_Lit2Var(iDsd)) );      return pRes;  } +  +/**Function************************************************************* + +  Synopsis    [Sorting DSD literals.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +int If_DsdObjCompare( Vec_Ptr_t * p, int iLit0, int iLit1 ) +{ +    If_DsdObj_t * p0 = If_DsdVecObj(p, Abc_Lit2Var(iLit0)); +    If_DsdObj_t * p1 = If_DsdVecObj(p, Abc_Lit2Var(iLit1)); +    int i, Res; +    if ( If_DsdObjType(p0) < If_DsdObjType(p1) ) +        return -1; +    if ( If_DsdObjType(p0) > If_DsdObjType(p1) ) +        return 1; +    if ( If_DsdObjType(p0) < IF_DSD_AND ) +        return 0; +    if ( If_DsdObjFaninNum(p0) < If_DsdObjFaninNum(p1) ) +        return -1; +    if ( If_DsdObjFaninNum(p0) > If_DsdObjFaninNum(p1) ) +        return 1; +    for ( i = 0; i < If_DsdObjFaninNum(p0); i++ ) +    { +        Res = If_DsdObjCompare( p, If_DsdObjFaninLit(p0, i), If_DsdObjFaninLit(p1, i) ); +        if ( Res != 0 ) +            return Res; +    } +    if ( Abc_LitIsCompl(iLit0) < Abc_LitIsCompl(iLit1) ) +        return -1; +    if ( Abc_LitIsCompl(iLit0) > Abc_LitIsCompl(iLit1) ) +        return 1; +    return 0; +} +void If_DsdObjSort( Vec_Ptr_t * p, int * pLits, int nLits, int * pPerm ) +{ +    int i, j, best_i; +    for ( i = 0; i < nLits-1; i++ ) +    { +        best_i = i; +        for ( j = i+1; j < nLits; j++ ) +            if ( If_DsdObjCompare(p, pLits[best_i], pLits[j]) == 1 ) +                best_i = j; +        if ( i == best_i ) +            continue; +        ABC_SWAP( int, pLits[i], pLits[best_i] ); +        if ( pPerm ) +            ABC_SWAP( int, pPerm[i], pPerm[best_i] ); +    } +}  /**Function************************************************************* @@ -697,13 +844,26 @@ int If_DsdManOperation2( If_DsdMan_t * p, int Type, int * pLits, int nLits )    SeeAlso     []  ***********************************************************************/ +int If_DsdManComputeFirstArray( If_DsdMan_t * p, int * pLits, int nLits, int * pFirsts ) +{ +    int i, nSSize = 0; +    for ( i = 0; i < nLits; i++ ) +    { +        pFirsts[i] = nSSize; +        nSSize += If_DsdVecLitSuppSize(p->vObjs, pLits[i]); +    } +    return nSSize; +} +int If_DsdManComputeFirst( If_DsdMan_t * p, If_DsdObj_t * pObj, int * pFirsts ) +{ +    return If_DsdManComputeFirstArray( p, pObj->pFans, pObj->nFans, pFirsts ); +}  int If_DsdManOperation( If_DsdMan_t * p, int Type, int * pLits, int nLits, unsigned char * pPerm, word * pTruth )  {      If_DsdObj_t * pObj, * pFanin;      unsigned char pPermNew[DAU_MAX_VAR];      int nChildren = 0, pChildren[DAU_MAX_VAR], pBegEnd[DAU_MAX_VAR];      int i, k, j, Id, iFanin, fComplFan, fCompl = 0, nSSize = 0; -//    abctime clk;      if ( Type == IF_DSD_AND )      {          for ( k = 0; k < nLits; k++ ) @@ -813,11 +973,7 @@ int If_DsdManOperation( If_DsdMan_t * p, int Type, int * pLits, int nLits, unsig          int i, uCanonPhase, pFirsts[DAU_MAX_VAR];          uCanonPhase = Abc_TtCanonicize( pTruth, nLits, pCanonPerm );          fCompl = ((uCanonPhase >> nLits) & 1); -        for ( i = 0; i < nLits; i++ ) -        { -            pFirsts[i] = nSSize; -            nSSize += If_DsdVecLitSuppSize(p->vObjs, pLits[i]); -        } +        nSSize = If_DsdManComputeFirstArray( p, pLits, nLits, pFirsts );          for ( j = i = 0; i < nLits; i++ )          {              int iLitNew = Abc_LitNotCond( pLits[(int)pCanonPerm[i]], ((uCanonPhase>>i)&1) ); @@ -873,7 +1029,6 @@ int If_DsdManAddDsd_rec( char * pStr, char ** p, int * pMatches, If_DsdMan_t * p          fCompl = 1;          (*p)++;      } -//    assert( !((**p >= 'A' && **p <= 'F') || (**p >= '0' && **p <= '9')) );      if ( **p >= 'a' && **p <= 'z' ) // var      {          pPerm[(*pnSupp)++] = Abc_Var2Lit( **p - 'a', fCompl ); @@ -952,6 +1107,23 @@ int If_DsdManAddDsd( If_DsdMan_t * p, char * pDsd, word * pTruth, unsigned char    SeeAlso     []  ***********************************************************************/ +// create signature of the support of the node +unsigned If_DsdSign_rec( If_DsdMan_t * p, If_DsdObj_t * pObj, int * pnSupp ) +{ +    unsigned uSign = 0; int i; +    If_DsdObj_t * pFanin; +    if ( If_DsdObjType(pObj) == IF_DSD_VAR ) +        return (1 << (2*(*pnSupp)++)); +    If_DsdObjForEachFanin( p->vObjs, pObj, pFanin, i ) +        uSign |= If_DsdSign_rec( p, pFanin, pnSupp ); +    return uSign; +} +unsigned If_DsdSign( If_DsdMan_t * p, If_DsdObj_t * pObj, int iFan, int iFirst, int fShared ) +{ +    If_DsdObj_t * pFanin = If_DsdObjFanin( p->vObjs, pObj, iFan ); +    unsigned uSign = If_DsdSign_rec( p, pFanin, &iFirst ); +    return fShared ? (uSign << 1) | uSign : uSign; +}  // collect supports of the node  void If_DsdManGetSuppSizes( If_DsdMan_t * p, If_DsdObj_t * pObj, int * pSSizes )  { @@ -960,10 +1132,10 @@ void If_DsdManGetSuppSizes( If_DsdMan_t * p, If_DsdObj_t * pObj, int * pSSizes )          pSSizes[i] = If_DsdObjSuppSize(pFanin);      }  // checks if there is a way to package some fanins  -int If_DsdManCheckAndXor( If_DsdMan_t * p, If_DsdObj_t * pObj, int nSuppAll, int LutSize, int fVerbose ) +unsigned If_DsdManCheckAndXor( If_DsdMan_t * p, If_DsdObj_t * pObj, int nSuppAll, int LutSize, int fDerive, int fVerbose )  {      int i[6], LimitOut, SizeIn, SizeOut, pSSizes[DAU_MAX_VAR]; -    int nFans = If_DsdObjFaninNum(pObj); +    int nFans = If_DsdObjFaninNum(pObj), pFirsts[DAU_MAX_VAR];      assert( pObj->nFans > 2 );      assert( If_DsdObjSuppSize(pObj) > LutSize );      If_DsdManGetSuppSizes( p, pObj, pSSizes ); @@ -976,7 +1148,10 @@ int If_DsdManCheckAndXor( If_DsdMan_t * p, If_DsdObj_t * pObj, int nSuppAll, int          SizeOut = pObj->nSupp - SizeIn;          if ( SizeIn > LutSize || SizeOut > LimitOut )              continue; -        return (1 << i[0]) | (1 << i[1]); +        if ( !fDerive ) +            return ~0; +        If_DsdManComputeFirst( p, pObj, pFirsts ); +        return If_DsdSign(p, pObj, i[0], pFirsts[i[0]], 0) | If_DsdSign(p, pObj, i[1], pFirsts[i[1]], 0);      }      if ( pObj->nFans == 3 )          return 0; @@ -988,7 +1163,10 @@ int If_DsdManCheckAndXor( If_DsdMan_t * p, If_DsdObj_t * pObj, int nSuppAll, int          SizeOut = pObj->nSupp - SizeIn;          if ( SizeIn > LutSize || SizeOut > LimitOut )              continue; -        return (1 << i[0]) | (1 << i[1]) | (1 << i[2]); +        if ( !fDerive ) +            return ~0; +        If_DsdManComputeFirst( p, pObj, pFirsts ); +        return If_DsdSign(p, pObj, i[0], pFirsts[i[0]], 0) | If_DsdSign(p, pObj, i[1], pFirsts[i[1]], 0) | If_DsdSign(p, pObj, i[2], pFirsts[i[2]], 0);      }      if ( pObj->nFans == 4 )          return 0; @@ -1001,14 +1179,17 @@ int If_DsdManCheckAndXor( If_DsdMan_t * p, If_DsdObj_t * pObj, int nSuppAll, int          SizeOut = pObj->nSupp - SizeIn;          if ( SizeIn > LutSize || SizeOut > LimitOut )              continue; -        return (1 << i[0]) | (1 << i[1]) | (1 << i[2]) | (1 << i[3]); +        if ( !fDerive ) +            return ~0; +        If_DsdManComputeFirst( p, pObj, pFirsts ); +        return If_DsdSign(p, pObj, i[0], pFirsts[i[0]], 0) | If_DsdSign(p, pObj, i[1], pFirsts[i[1]], 0) | If_DsdSign(p, pObj, i[2], pFirsts[i[2]], 0) | If_DsdSign(p, pObj, i[3], pFirsts[i[3]], 0);      }      return 0;  }  // checks if there is a way to package some fanins  -int If_DsdManCheckMux( If_DsdMan_t * p, If_DsdObj_t * pObj, int nSuppAll, int LutSize, int fVerbose ) +unsigned If_DsdManCheckMux( If_DsdMan_t * p, If_DsdObj_t * pObj, int nSuppAll, int LutSize, int fDerive, int fVerbose )  { -    int LimitOut, SizeIn, SizeOut, pSSizes[DAU_MAX_VAR]; +    int LimitOut, SizeIn, SizeOut, pSSizes[DAU_MAX_VAR], pFirsts[DAU_MAX_VAR];      assert( If_DsdObjFaninNum(pObj) == 3 );      assert( If_DsdObjSuppSize(pObj) > LutSize );      If_DsdManGetSuppSizes( p, pObj, pSSizes ); @@ -1019,21 +1200,27 @@ int If_DsdManCheckMux( If_DsdMan_t * p, If_DsdObj_t * pObj, int nSuppAll, int Lu      SizeOut = pSSizes[2];      if ( SizeIn <= LutSize && SizeOut <= LimitOut )      { -        return 1; +        if ( !fDerive ) +            return ~0; +        If_DsdManComputeFirst( p, pObj, pFirsts ); +        return If_DsdSign(p, pObj, 0, pFirsts[0], 1) | If_DsdSign(p, pObj, 1, pFirsts[1], 0);      }      // second input      SizeIn = pSSizes[0] + pSSizes[2];      SizeOut = pSSizes[1];      if ( SizeIn <= LutSize && SizeOut <= LimitOut )      { -        return 1; +        if ( !fDerive ) +            return ~0; +        If_DsdManComputeFirst( p, pObj, pFirsts ); +        return If_DsdSign(p, pObj, 0, pFirsts[0], 1) | If_DsdSign(p, pObj, 2, pFirsts[2], 0);      }      return 0;  }  // checks if there is a way to package some fanins  -int If_DsdManCheckPrime( If_DsdMan_t * p, If_DsdObj_t * pObj, int nSuppAll, int LutSize, int fVerbose ) +unsigned If_DsdManCheckPrime( If_DsdMan_t * p, If_DsdObj_t * pObj, int nSuppAll, int LutSize, int fDerive, int fVerbose )  { -    int i, v, set, LimitOut, SizeIn, SizeOut, pSSizes[DAU_MAX_VAR]; +    int i, v, set, LimitOut, SizeIn, SizeOut, pSSizes[DAU_MAX_VAR], pFirsts[DAU_MAX_VAR];      int truthId = If_DsdObjTruthId( p, pObj );      int nFans = If_DsdObjFaninNum(pObj);      Vec_Int_t * vSets = (Vec_Int_t *)Vec_PtrEntry(p->vTtDecs, truthId); @@ -1066,11 +1253,29 @@ Dau_DecPrintSets( vSets, nFans );                  break;          }          if ( v == nFans ) -            return set; +        { +            unsigned uSign; +            if ( !fDerive ) +                return ~0; +            uSign = 0; +            If_DsdManComputeFirst( p, pObj, pFirsts ); +            for ( v = 0; v < nFans; v++ ) +            { +                int Value = ((set >> (v << 1)) & 3); +                if ( Value == 0 ) +                {} +                else if ( Value == 1 ) +                    uSign |= If_DsdSign(p, pObj, v, pFirsts[v], 0); +                else if ( Value == 3 ) +                    uSign |= If_DsdSign(p, pObj, v, pFirsts[v], 1); +                else assert( Value == 0 ); +            } +            return uSign; +        }      }      return 0;  } -int If_DsdManCheckXY( If_DsdMan_t * p, int iDsd, int LutSize, int fVerbose ) +unsigned If_DsdManCheckXY( If_DsdMan_t * p, int iDsd, int LutSize, int fDerive, int fVerbose )  {      If_DsdObj_t * pObj, * pTemp; int i, Mask;      pObj = If_DsdVecObj( p->vObjs, Abc_Lit2Var(iDsd) ); @@ -1080,7 +1285,7 @@ int If_DsdManCheckXY( If_DsdMan_t * p, int iDsd, int LutSize, int fVerbose )      {          if ( fVerbose )          printf( "    Trivial\n" ); -        return 1; +        return ~0;      }      If_DsdManCollect( p, pObj->Id, p->vNodes );      If_DsdVecForEachObjVec( p->vNodes, p->vObjs, pTemp, i ) @@ -1090,12 +1295,12 @@ int If_DsdManCheckXY( If_DsdMan_t * p, int iDsd, int LutSize, int fVerbose )              printf( "    Dec using node " );              if ( fVerbose )              If_DsdManPrintOne( stdout, p, pTemp->Id, NULL, 1 ); -            return 1; +            return ~0;          }      If_DsdVecForEachObjVec( p->vNodes, p->vObjs, pTemp, i )          if ( (If_DsdObjType(pTemp) == IF_DSD_AND || If_DsdObjType(pTemp) == IF_DSD_XOR) && If_DsdObjFaninNum(pTemp) > 2 && If_DsdObjSuppSize(pTemp) > LutSize )          { -            if ( (Mask = If_DsdManCheckAndXor(p, pTemp, If_DsdObjSuppSize(pObj), LutSize, fVerbose)) ) +            if ( (Mask = If_DsdManCheckAndXor(p, pTemp, If_DsdObjSuppSize(pObj), LutSize, fDerive, fVerbose)) )              {                  if ( fVerbose )                  printf( "    " ); @@ -1103,13 +1308,13 @@ int If_DsdManCheckXY( If_DsdMan_t * p, int iDsd, int LutSize, int fVerbose )                  Abc_TtPrintBinary( (word *)&Mask, 4 );                   if ( fVerbose )                  printf( "    Using multi-input AND/XOR node\n" ); -                return 1; +                return Mask;              }          }      If_DsdVecForEachObjVec( p->vNodes, p->vObjs, pTemp, i )          if ( If_DsdObjType(pTemp) == IF_DSD_MUX && If_DsdObjSuppSize(pTemp) > LutSize )          { -            if ( (Mask = If_DsdManCheckMux(p, pTemp, If_DsdObjSuppSize(pObj), LutSize, fVerbose)) ) +            if ( (Mask = If_DsdManCheckMux(p, pTemp, If_DsdObjSuppSize(pObj), LutSize, fDerive, fVerbose)) )              {                  if ( fVerbose )                  printf( "    " ); @@ -1117,13 +1322,13 @@ int If_DsdManCheckXY( If_DsdMan_t * p, int iDsd, int LutSize, int fVerbose )                  Abc_TtPrintBinary( (word *)&Mask, 4 );                   if ( fVerbose )                  printf( "    Using multi-input MUX node\n" ); -                return 1; +                return Mask;              }          }      If_DsdVecForEachObjVec( p->vNodes, p->vObjs, pTemp, i )          if ( If_DsdObjType(pTemp) == IF_DSD_PRIME && If_DsdObjSuppSize(pTemp) > LutSize )          { -            if ( (Mask = If_DsdManCheckPrime(p, pTemp, If_DsdObjSuppSize(pObj), LutSize, fVerbose)) ) +            if ( (Mask = If_DsdManCheckPrime(p, pTemp, If_DsdObjSuppSize(pObj), LutSize, fDerive, fVerbose)) )              {                  if ( fVerbose )                  printf( "    " ); @@ -1131,19 +1336,14 @@ int If_DsdManCheckXY( If_DsdMan_t * p, int iDsd, int LutSize, int fVerbose )                  Dau_DecPrintSet( Mask, If_DsdObjFaninNum(pTemp), 0 );                  if ( fVerbose )                  printf( "    Using prime node\n" ); -                return 1; +                return Mask;              }          }      if ( fVerbose )      printf( "    UNDEC\n" ); -  //    If_DsdManPrintOne( stdout, p, Abc_Lit2Var(iDsd), NULL, 1 );      return 0;  } -int If_DsdManCheckXYZ( If_DsdMan_t * p, int iDsd, int LutSize )  -{ -    return 1; -}  /**Function************************************************************* @@ -1156,9 +1356,9 @@ int If_DsdManCheckXYZ( If_DsdMan_t * p, int iDsd, int LutSize )    SeeAlso     []  ***********************************************************************/ -int If_DsdManCheckDec( If_DsdMan_t * p, int iDsd ) +unsigned If_DsdManCheckXYZ( If_DsdMan_t * p, int iDsd, int LutSize, int fDerive, int fVerbose )   { -    return If_DsdVecObjMark( p->vObjs, Abc_Lit2Var(iDsd) ); +    return ~0;  }  /**Function************************************************************* @@ -1183,17 +1383,6 @@ int If_DsdManCompute( If_DsdMan_t * p, word * pTruth, int nLeaves, unsigned char  clk = Abc_Clock();      nSizeNonDec = Dau_DsdDecompose( pCopy, nLeaves, 0, 1, pDsd );  p->timeDsd += Abc_Clock() - clk; -/* -    if ( nLeaves <= 6 ) -    { -        word pCopy2[DAU_MAX_WORD], t; -        char pDsd2[DAU_MAX_STR]; -        Abc_TtCopy( pCopy2, pTruth, p->nWords, 0 ); -        nSizeNonDec = Dau_DsdDecompose( pCopy2, nLeaves, 0, 1, pDsd2 ); -        t = Dau_Dsd6ToTruth( pDsd2 ); -        assert( t == *pTruth ); -    } -*/  //    if ( !strcmp(pDsd, "(![(!e!d)c]!(b!a))") )  //    {  //        int x = 0; @@ -1217,18 +1406,9 @@ p->timeVerify += Abc_Clock() - clk;          printf( "%s\n", pDsd );          Dau_DsdPrintFromTruth( pTruth, nLeaves );          Dau_DsdPrintFromTruth( pRes, nLeaves ); -//        Kit_DsdPrintFromTruth( (unsigned *)pTruth, nLeaves ); printf( "\n" ); -//        Kit_DsdPrintFromTruth( (unsigned *)pRes, nLeaves ); printf( "\n" );          If_DsdManPrintOne( stdout, p, Abc_Lit2Var(iDsd), pPerm, 1 );          printf( "\n" );      } -    if ( pLutStruct && If_DsdVecObjRef(p->vObjs, Abc_Lit2Var(iDsd)) ) -    { -        int LutSize = (int)(pLutStruct[0] - '0'); -        assert( pLutStruct[2] == 0 ); // XY -        if ( !If_DsdManCheckXY( p, iDsd, LutSize, 0 ) ) -            If_DsdVecObjSetMark( p->vObjs, Abc_Lit2Var(iDsd) ); -    }      If_DsdVecObjIncRef( p->vObjs, Abc_Lit2Var(iDsd) );      return iDsd;  } diff --git a/src/map/if/ifMan.c b/src/map/if/ifMan.c index d03fc200..686af7ae 100644 --- a/src/map/if/ifMan.c +++ b/src/map/if/ifMan.c @@ -85,7 +85,6 @@ If_Man_t * If_ManStart( If_Par_t * pPars )      p->puTempW   = p->pPars->fTruth? ABC_ALLOC( word, p->nTruth6Words ) : NULL;      if ( pPars->fUseDsd )      { -        p->pIfDsdMan = If_DsdManAlloc( pPars->nLutSize );          p->vTtDsds = Vec_IntAlloc( 1000 );          Vec_IntPush( p->vTtDsds, 0 );          Vec_IntPush( p->vTtDsds, 2 ); @@ -142,6 +141,15 @@ void If_ManRestart( If_Man_t * p )  ***********************************************************************/  void If_ManStop( If_Man_t * p )  { +/* +    if ( p->pIfDsdMan ) +    { +        If_DsdMan_t * pNew; +        If_DsdManSave( p->pIfDsdMan, NULL ); +        pNew = If_DsdManLoad( If_DsdManFileName(p->pIfDsdMan) ); +        If_DsdManFree( pNew, 1 ); +    } +*/      {  //        extern void If_CluHashFindMedian( If_Man_t * p );  //        extern void If_CluHashTableCheck( If_Man_t * p ); @@ -158,11 +166,13 @@ void If_ManStop( If_Man_t * p )                  Abc_Print( 1, "Useless cuts %2d  = %9d  (out of %9d)  (%6.2f %%)\n", i, p->nCutsUseless[i], p->nCutsCount[i], 100.0*p->nCutsUseless[i]/(p->nCutsCount[i]+1) );          Abc_Print( 1, "Useless cuts all = %9d  (out of %9d)  (%6.2f %%)\n", p->nCutsUselessAll, p->nCutsCountAll, 100.0*p->nCutsUselessAll/(p->nCutsCountAll+1) );      } -    if ( p->pPars->fVerbose && p->nCuts5 ) -        Abc_Print( 1, "Statistics about 5-cuts: Total = %d  Non-decomposable = %d (%.2f %%)\n", p->nCuts5, p->nCuts5-p->nCuts5a, 100.0*(p->nCuts5-p->nCuts5a)/p->nCuts5 ); -    if ( p->pPars->fUseDsd ) -        If_DsdManFree( p->pIfDsdMan, p->pPars->fVerbose ); -    if ( p->pPars->fUseDsd ) +//    if ( p->pPars->fVerbose && p->nCuts5 ) +//        Abc_Print( 1, "Statistics about 5-cuts: Total = %d  Non-decomposable = %d (%.2f %%)\n", p->nCuts5, p->nCuts5-p->nCuts5a, 100.0*(p->nCuts5-p->nCuts5a)/p->nCuts5 ); +//    if ( p->pPars->fUseDsd ) +//        If_DsdManFree( p->pIfDsdMan, p->pPars->fVerbose ); +    if ( p->pIfDsdMan ) +        p->pIfDsdMan = NULL; +    if ( p->pPars->fUseDsd && (p->nCountNonDec[0] || p->nCountNonDec[1]) )          printf( "NonDec0 = %d.  NonDec1 = %d.\n", p->nCountNonDec[0], p->nCountNonDec[1] );  //    Abc_PrintTime( 1, "Truth", p->timeTruth );  //    Abc_Print( 1, "Small support = %d.\n", p->nSmallSupp ); diff --git a/src/map/if/ifMap.c b/src/map/if/ifMap.c index d7b7f4cc..5c23c1b6 100644 --- a/src/map/if/ifMap.c +++ b/src/map/if/ifMap.c @@ -217,12 +217,39 @@ void If_ObjPerformMappingAnd( If_Man_t * p, If_Obj_t * pObj, int Mode, int fPrep  //            abctime clk = Abc_Clock();              If_CutComputeTruth( p, pCut, pCut0, pCut1, pObj->fCompl0, pObj->fCompl1 );  //            p->timeTruth += Abc_Clock() - clk; +            if ( p->pPars->fUseDsd ) +            { +                int truthId = Abc_Lit2Var(pCut->iCutFunc); +                if ( Vec_IntSize(p->vTtDsds) <= truthId || Vec_IntEntry(p->vTtDsds, truthId) == -1 ) +                { +                    pCut->iCutDsd = If_DsdManCompute( p->pIfDsdMan, If_CutTruthW(p, pCut), pCut->nLeaves, (unsigned char *)pCut->pPerm, p->pPars->pLutStruct ); +//                    printf( "%d(%d) ", pCut->iCutDsd, If_DsdManCheckDec( p->pIfDsdMan, pCut->iCutDsd ) ); +                    while ( Vec_IntSize(p->vTtDsds) <= truthId ) +                    { +                        Vec_IntPush( p->vTtDsds, -1 ); +                        for ( v = 0; v < p->pPars->nLutSize; v++ ) +                            Vec_StrPush( p->vTtPerms, IF_BIG_CHAR ); +                    } +                    Vec_IntWriteEntry( p->vTtDsds, truthId, Abc_LitNotCond(pCut->iCutDsd, Abc_LitIsCompl(pCut->iCutFunc)) ); +                    for ( v = 0; v < (int)pCut->nLeaves; v++ ) +                        Vec_StrWriteEntry( p->vTtPerms, truthId * p->pPars->nLutSize + v, (char)pCut->pPerm[v] ); +                } +                else +                { +                    pCut->iCutDsd = Abc_LitNotCond( Vec_IntEntry(p->vTtDsds, truthId), Abc_LitIsCompl(pCut->iCutFunc) ); +                    for ( v = 0; v < (int)pCut->nLeaves; v++ ) +                        pCut->pPerm[v] = (unsigned char)Vec_StrEntry( p->vTtPerms, truthId * p->pPars->nLutSize + v ); +                } +            }              // run user functions              pCut->fUseless = 0;              if ( p->pPars->pFuncCell )              {                  assert( pCut->nLimit >= 4 && pCut->nLimit <= 16 ); -                pCut->fUseless = !p->pPars->pFuncCell( p, If_CutTruth(p, pCut), pCut->nLimit, pCut->nLeaves, p->pPars->pLutStruct ); +                if ( p->pPars->fUseDsd ) +                    pCut->fUseless = If_DsdManCheckDec( p->pIfDsdMan, pCut->iCutDsd ); +                else +                    pCut->fUseless = !p->pPars->pFuncCell( p, If_CutTruth(p, pCut), pCut->nLimit, pCut->nLeaves, p->pPars->pLutStruct );                  p->nCutsUselessAll += pCut->fUseless;                  p->nCutsUseless[pCut->nLeaves] += pCut->fUseless;                  p->nCutsCountAll++; @@ -251,29 +278,9 @@ void If_ObjPerformMappingAnd( If_Man_t * p, If_Obj_t * pObj, int Mode, int fPrep                          p->nCuts5a++;                  }              } +/*              if ( p->pPars->fUseDsd )              { -                int truthId = Abc_Lit2Var(pCut->iCutFunc); -                if ( Vec_IntSize(p->vTtDsds) <= truthId || Vec_IntEntry(p->vTtDsds, truthId) == -1 ) -                { -                    pCut->iCutDsd = If_DsdManCompute( p->pIfDsdMan, If_CutTruthW(p, pCut), pCut->nLeaves, (unsigned char *)pCut->pPerm, p->pPars->pLutStruct ); -//                    printf( "%d(%d) ", pCut->iCutDsd, If_DsdManCheckDec( p->pIfDsdMan, pCut->iCutDsd ) ); -                    while ( Vec_IntSize(p->vTtDsds) <= truthId ) -                    { -                        Vec_IntPush( p->vTtDsds, -1 ); -                        for ( v = 0; v < p->pPars->nLutSize; v++ ) -                            Vec_StrPush( p->vTtPerms, IF_BIG_CHAR ); -                    } -                    Vec_IntWriteEntry( p->vTtDsds, truthId, Abc_LitNotCond(pCut->iCutDsd, Abc_LitIsCompl(pCut->iCutFunc)) ); -                    for ( v = 0; v < (int)pCut->nLeaves; v++ ) -                        Vec_StrWriteEntry( p->vTtPerms, truthId * p->pPars->nLutSize + v, (char)pCut->pPerm[v] ); -                } -                else -                { -                    pCut->iCutDsd = Abc_LitNotCond( Vec_IntEntry(p->vTtDsds, truthId), Abc_LitIsCompl(pCut->iCutFunc) ); -                    for ( v = 0; v < (int)pCut->nLeaves; v++ ) -                        pCut->pPerm[v] = (unsigned char)Vec_StrEntry( p->vTtPerms, truthId * p->pPars->nLutSize + v ); -                }                  if ( p->pPars->pLutStruct )                  {                      int Value = If_DsdManCheckDec( p->pIfDsdMan, pCut->iCutDsd ); @@ -283,7 +290,7 @@ void If_ObjPerformMappingAnd( If_Man_t * p, If_Obj_t * pObj, int Mode, int fPrep                              p->nCountNonDec[0]++;                          if ( !pCut->fUseless && Value )                              p->nCountNonDec[1]++;  -/* +  //                        if ( pCut->fUseless && !Value )  //                            printf( "Old does not work.  New works.\n" );                          if ( !pCut->fUseless && Value ) @@ -307,14 +314,14 @@ void If_ObjPerformMappingAnd( If_Man_t * p, If_Obj_t * pObj, int Mode, int fPrep                              z = If_Dec6Perform( t, 1 );                              If_DecPrintConfig( z ); -                            s = If_DsdManCheckXY( p->pIfDsdMan, pCut->iCutDsd, 4, 1 ); +                            s = If_DsdManCheckXY( p->pIfDsdMan, pCut->iCutDsd, 4, 0, 1 );                              printf( "Confirm %d\n", s );                              s = 0;                          } -*/                      }                  }              } +*/          }          // compute the application-specific cost and depth diff --git a/src/map/if/ifSat.c b/src/map/if/ifSat.c index 5ddb8241..3fec34e0 100644 --- a/src/map/if/ifSat.c +++ b/src/map/if/ifSat.c @@ -204,46 +204,46 @@ void If_ManSatTest()      uSet = (3 << 0) | (1 << 2) | (1 << 4);      RetValue = If_ManSatCheckXY( p, nLutSize, pTruth, nVars, uSet, &uBound, &uFree, vLits ); -    printf( "%d", RetValue ); +    printf( "%d (%d)", RetValue, sat_solver_nconflicts(p) );      uSet = (1 << 0) | (3 << 2) | (1 << 4);      RetValue = If_ManSatCheckXY( p, nLutSize, pTruth, nVars, uSet, &uBound, &uFree, vLits ); -    printf( "%d", RetValue ); +    printf( "%d (%d)", RetValue, sat_solver_nconflicts(p) );      uSet = (1 << 0) | (1 << 2) | (3 << 4);      RetValue = If_ManSatCheckXY( p, nLutSize, pTruth, nVars, uSet, &uBound, &uFree, vLits ); -    printf( "%d", RetValue ); +    printf( "%d (%d)", RetValue, sat_solver_nconflicts(p) );      uSet = (3 << 0) | (1 << 2) | (1 << 6);      RetValue = If_ManSatCheckXY( p, nLutSize, pTruth, nVars, uSet, &uBound, &uFree, vLits ); -    printf( "%d", RetValue ); +    printf( "%d (%d)", RetValue, sat_solver_nconflicts(p) );      uSet = (1 << 0) | (3 << 2) | (1 << 6);      RetValue = If_ManSatCheckXY( p, nLutSize, pTruth, nVars, uSet, &uBound, &uFree, vLits ); -    printf( "%d", RetValue ); +    printf( "%d (%d)", RetValue, sat_solver_nconflicts(p) );      uSet = (1 << 0) | (1 << 2) | (3 << 6);      RetValue = If_ManSatCheckXY( p, nLutSize, pTruth, nVars, uSet, &uBound, &uFree, vLits ); -    printf( "%d", RetValue ); +    printf( "%d (%d)", RetValue, sat_solver_nconflicts(p) );      uSet = (3 << 0) | (1 << 4) | (1 << 6);      RetValue = If_ManSatCheckXY( p, nLutSize, pTruth, nVars, uSet, &uBound, &uFree, vLits ); -    printf( "%d", RetValue ); +    printf( "%d (%d)", RetValue, sat_solver_nconflicts(p) );      uSet = (1 << 0) | (3 << 4) | (1 << 6);      RetValue = If_ManSatCheckXY( p, nLutSize, pTruth, nVars, uSet, &uBound, &uFree, vLits ); -    printf( "%d", RetValue ); +    printf( "%d (%d)", RetValue, sat_solver_nconflicts(p) );      uSet = (1 << 0) | (1 << 4) | (3 << 6);      RetValue = If_ManSatCheckXY( p, nLutSize, pTruth, nVars, uSet, &uBound, &uFree, vLits ); -    printf( "%d", RetValue ); +    printf( "%d (%d)", RetValue, sat_solver_nconflicts(p) );      uSet = (3 << 2) | (1 << 4) | (1 << 6);      RetValue = If_ManSatCheckXY( p, nLutSize, pTruth, nVars, uSet, &uBound, &uFree, vLits ); -    printf( "%d", RetValue ); +    printf( "%d (%d)", RetValue, sat_solver_nconflicts(p) );      uSet = (1 << 2) | (3 << 4) | (1 << 6);      RetValue = If_ManSatCheckXY( p, nLutSize, pTruth, nVars, uSet, &uBound, &uFree, vLits ); -    printf( "%d", RetValue ); +    printf( "%d (%d)", RetValue, sat_solver_nconflicts(p) );      uSet = (1 << 2) | (1 << 4) | (3 << 6);      RetValue = If_ManSatCheckXY( p, nLutSize, pTruth, nVars, uSet, &uBound, &uFree, vLits ); -    printf( "%d", RetValue ); +    printf( "%d (%d)", RetValue, sat_solver_nconflicts(p) );      printf( "\n" ); | 
