mfsMan.c 7.41 KB
Newer Older
Alan Mishchenko committed
1 2 3 4 5 6 7 8
/**CFile****************************************************************

  FileName    [mfsMan.c]

  SystemName  [ABC: Logic synthesis and verification system.]

  PackageName [The good old minimization with complete don't-cares.]

Alan Mishchenko committed
9
  Synopsis    [Procedures working with the manager.]
Alan Mishchenko committed
10 11 12 13 14 15 16 17 18 19 20 21 22

  Author      [Alan Mishchenko]
  
  Affiliation [UC Berkeley]

  Date        [Ver. 1.0. Started - June 20, 2005.]

  Revision    [$Id: mfsMan.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]

***********************************************************************/

#include "mfsInt.h"

23 24 25
ABC_NAMESPACE_IMPL_START


Alan Mishchenko committed
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
////////////////////////////////////////////////////////////////////////
///                        DECLARATIONS                              ///
////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////
///                     FUNCTION DEFINITIONS                         ///
////////////////////////////////////////////////////////////////////////

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Alan Mishchenko committed
45
Mfs_Man_t * Mfs_ManAlloc( Mfs_Par_t * pPars )
Alan Mishchenko committed
46 47 48
{
    Mfs_Man_t * p;
    // start the manager
Alan Mishchenko committed
49
    p = ABC_ALLOC( Mfs_Man_t, 1 );
Alan Mishchenko committed
50
    memset( p, 0, sizeof(Mfs_Man_t) );
Alan Mishchenko committed
51
    p->pPars     = pPars;
52 53
    p->vProjVarsCnf = Vec_IntAlloc( 100 );
    p->vProjVarsSat = Vec_IntAlloc( 100 );
Alan Mishchenko committed
54 55 56 57 58 59
    p->vDivLits  = Vec_IntAlloc( 100 );
    p->nDivWords = Aig_BitWordNum(p->pPars->nDivMax + MFS_FANIN_MAX);
    p->vDivCexes = Vec_PtrAllocSimInfo( p->pPars->nDivMax+MFS_FANIN_MAX+1, p->nDivWords );
    p->pMan      = Int_ManAlloc();
    p->vMem      = Vec_IntAlloc( 0 );
    p->vLevels   = Vec_VecStart( 32 );
60
    p->vMfsFanins= Vec_PtrAlloc( 32 );
Alan Mishchenko committed
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
    return p;
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Mfs_ManClean( Mfs_Man_t * p )
{
    if ( p->pAigWin )
        Aig_ManStop( p->pAigWin );
    if ( p->pCnf )
        Cnf_DataFree( p->pCnf );
    if ( p->pSat )
        sat_solver_delete( p->pSat );
    if ( p->vRoots )
        Vec_PtrFree( p->vRoots );
    if ( p->vSupp )
        Vec_PtrFree( p->vSupp );
    if ( p->vNodes )
        Vec_PtrFree( p->vNodes );
Alan Mishchenko committed
89 90
    if ( p->vDivs )
        Vec_PtrFree( p->vDivs );
Alan Mishchenko committed
91
    p->pAigWin = NULL;
Alan Mishchenko committed
92 93 94 95 96 97
    p->pCnf    = NULL;
    p->pSat    = NULL;
    p->vRoots  = NULL;
    p->vSupp   = NULL;
    p->vNodes  = NULL;
    p->vDivs   = NULL;
Alan Mishchenko committed
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Mfs_ManPrint( Mfs_Man_t * p )
{
Alan Mishchenko committed
113 114
    if ( p->pPars->fResub )
    {
Alan Mishchenko committed
115
/*
Alan Mishchenko committed
116 117 118 119 120 121 122
        printf( "Reduction in nodes = %5d. (%.2f %%) ", 
            p->nTotalNodesBeg-p->nTotalNodesEnd, 
            100.0*(p->nTotalNodesBeg-p->nTotalNodesEnd)/p->nTotalNodesBeg );
        printf( "Reduction in edges = %5d. (%.2f %%) ", 
            p->nTotalEdgesBeg-p->nTotalEdgesEnd, 
            100.0*(p->nTotalEdgesBeg-p->nTotalEdgesEnd)/p->nTotalEdgesBeg );
        printf( "\n" );
Alan Mishchenko committed
123 124
        printf( "Nodes = %d. Try = %d. Resub = %d. Div = %d. SAT calls = %d. Timeouts = %d.\n", 
            Abc_NtkNodeNum(p->pNtk), p->nNodesTried, p->nNodesResub, p->nTotalDivs, p->nSatCalls, p->nTimeOuts );
Alan Mishchenko committed
125 126 127 128 129
        if ( p->pPars->fSwapEdge )
            printf( "Swappable edges = %d. Total edges = %d. Ratio = %5.2f.\n", 
                p->nNodesResub, Abc_NtkGetTotalFanins(p->pNtk), 1.00 * p->nNodesResub / Abc_NtkGetTotalFanins(p->pNtk) );
        else
            Abc_NtkMfsPrintResubStats( p );
Alan Mishchenko committed
130
//        printf( "Average ratio of DCs in the resubed nodes = %.2f.\n", 1.0*p->nDcMints/(64 * p->nNodesResub) );
Alan Mishchenko committed
131 132 133 134 135 136 137 138 139 140 141 142
*/
        printf( "@@@-------  Node( %4d, %4.2f%% ),  ",
            p->nTotalNodesBeg-p->nTotalNodesEnd,
            100.0*(p->nTotalNodesBeg-p->nTotalNodesEnd)/p->nTotalNodesBeg );
        printf( "Edge( %4d, %4.2f%% ),  ",
            p->nTotalEdgesBeg-p->nTotalEdgesEnd,
            100.0*(p->nTotalEdgesBeg-p->nTotalEdgesEnd)/p->nTotalEdgesBeg );
        if (p->pPars->fPower)
            printf( "Power( %5.2f, %4.2f%%) ",
                 p->TotalSwitchingBeg - p->TotalSwitchingEnd,
                 100.0*(p->TotalSwitchingBeg-p->TotalSwitchingEnd)/p->TotalSwitchingBeg );
        printf( "\n" );
Alan Mishchenko committed
143
//#if 0
Alan Mishchenko committed
144 145
        printf( "Nodes = %d. Try = %d. Resub = %d. Div = %d. SAT calls = %d. Timeouts = %d.\n",
            Abc_NtkNodeNum(p->pNtk), p->nNodesTried, p->nNodesResub, p->nTotalDivs, p->nSatCalls, p->nTimeOuts );
Alan Mishchenko committed
146
//#endif
Alan Mishchenko committed
147 148 149 150 151 152
        if ( p->pPars->fSwapEdge )
            printf( "Swappable edges = %d. Total edges = %d. Ratio = %5.2f.\n",
                p->nNodesResub, Abc_NtkGetTotalFanins(p->pNtk), 1.00 * p->nNodesResub / Abc_NtkGetTotalFanins(p->pNtk) );
        else
            Abc_NtkMfsPrintResubStats( p );
//        printf( "Average ratio of DCs in the resubed nodes = %.2f.\n", 1.0*p->nDcMints/(64 * p->nNodesResub) );
Alan Mishchenko committed
153 154 155
    }
    else
    {
Alan Mishchenko committed
156 157
        printf( "Nodes = %d. Try = %d. Total mints = %d. Local DC mints = %d. Ratio = %5.2f.\n", 
            Abc_NtkNodeNum(p->pNtk), p->nNodesTried, p->nMintsTotal, p->nMintsTotal-p->nMintsCare, 
Alan Mishchenko committed
158 159 160
            1.0 * (p->nMintsTotal-p->nMintsCare) / p->nMintsTotal );
//        printf( "Average ratio of sequential DCs in the global space = %5.2f.\n", 
//            1.0-(p->dTotalRatios/p->nNodesTried) );
Alan Mishchenko committed
161 162
        printf( "Nodes resyn = %d. Ratio = %5.2f.  Total AIG node gain = %d. Timeouts = %d.\n", 
            p->nNodesDec, 1.0 * p->nNodesDec / p->nNodesTried, p->nNodesGained, p->nTimeOuts );
Alan Mishchenko committed
163
    }
Alan Mishchenko committed
164

Alan Mishchenko committed
165 166 167
    ABC_PRTP( "Win", p->timeWin            ,  p->timeTotal );
    ABC_PRTP( "Div", p->timeDiv            ,  p->timeTotal );
    ABC_PRTP( "Aig", p->timeAig            ,  p->timeTotal );
Alan Mishchenko committed
168
    ABC_PRTP( "Gia", p->timeGia            ,  p->timeTotal );
Alan Mishchenko committed
169 170 171 172
    ABC_PRTP( "Cnf", p->timeCnf            ,  p->timeTotal );
    ABC_PRTP( "Sat", p->timeSat-p->timeInt ,  p->timeTotal );
    ABC_PRTP( "Int", p->timeInt            ,  p->timeTotal );
    ABC_PRTP( "ALL", p->timeTotal          ,  p->timeTotal );
Alan Mishchenko committed
173

Alan Mishchenko committed
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Mfs_ManStop( Mfs_Man_t * p )
{
Alan Mishchenko committed
189 190
    if ( p->pPars->fVerbose )
        Mfs_ManPrint( p );
Alan Mishchenko committed
191 192 193 194
    if ( p->vTruth )
        Vec_IntFree( p->vTruth );
    if ( p->pManDec )
        Bdc_ManFree( p->pManDec );
Alan Mishchenko committed
195 196
    if ( p->pCare )
        Aig_ManStop( p->pCare );
Alan Mishchenko committed
197 198
    if ( p->vSuppsInv )
        Vec_VecFree( (Vec_Vec_t *)p->vSuppsInv );
Alan Mishchenko committed
199 200
    if ( p->vProbs )
        Vec_IntFree( p->vProbs );
Alan Mishchenko committed
201
    Mfs_ManClean( p );
Alan Mishchenko committed
202 203 204
    Int_ManFree( p->pMan );
    Vec_IntFree( p->vMem );
    Vec_VecFree( p->vLevels );
205 206 207
    Vec_PtrFree( p->vMfsFanins );
    Vec_IntFree( p->vProjVarsCnf );
    Vec_IntFree( p->vProjVarsSat );
Alan Mishchenko committed
208 209
    Vec_IntFree( p->vDivLits );
    Vec_PtrFree( p->vDivCexes );
Alan Mishchenko committed
210
    ABC_FREE( p );
Alan Mishchenko committed
211 212 213 214 215 216 217
}

////////////////////////////////////////////////////////////////////////
///                       END OF FILE                                ///
////////////////////////////////////////////////////////////////////////


218 219
ABC_NAMESPACE_IMPL_END