/**CFile****************************************************************

  FileName    [sfm.h]

  SystemName  [ABC: Logic synthesis and verification system.]

  PackageName [SAT-based optimization using internal don't-cares.]

  Synopsis    [External declarations.]

  Author      [Alan Mishchenko]
  
  Affiliation [UC Berkeley]

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

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

***********************************************************************/
 
#ifndef ABC__opt_sfm__h
#define ABC__opt_sfm__h


////////////////////////////////////////////////////////////////////////
///                          INCLUDES                                ///
////////////////////////////////////////////////////////////////////////

#include "misc/vec/vecWec.h"

////////////////////////////////////////////////////////////////////////
///                         PARAMETERS                               ///
////////////////////////////////////////////////////////////////////////

ABC_NAMESPACE_HEADER_START

////////////////////////////////////////////////////////////////////////
///                         BASIC TYPES                              ///
////////////////////////////////////////////////////////////////////////

typedef struct Sfm_Ntk_t_ Sfm_Ntk_t;
typedef struct Sfm_Par_t_ Sfm_Par_t;
struct Sfm_Par_t_
{
    int             nTfoLevMax;    // the maximum fanout levels
    int             nTfiLevMax;    // the maximum fanin levels
    int             nFanoutMax;    // the maximum number of fanouts
    int             nDepthMax;     // the maximum depth to try
    int             nVarMax;       // the maximum variable count
    int             nMffcMin;      // the minimum MFFC size
    int             nMffcMax;      // the maximum MFFC size
    int             nDecMax;       // the maximum number of decompositions
    int             nWinSizeMax;   // the maximum window size
    int             nGrowthLevel;  // the maximum allowed growth in level
    int             nBTLimit;      // the maximum number of conflicts in one SAT run
    int             nNodesMax;     // the maximum number of nodes to try
    int             iNodeOne;      // one particular node to try
    int             nFirstFixed;   // the number of first nodes to be treated as fixed
    int             nTimeWin;      // the size of timing window in percents
    int             DeltaCrit;     // delay delta in picoseconds
    int             DelAreaRatio;  // delay/area tradeoff (how many ps we trade for a unit of area)
    int             fRrOnly;       // perform redundance removal
    int             fArea;         // performs optimization for area
    int             fAreaRev;      // performs optimization for area in reverse order
    int             fMoreEffort;   // performs high-affort minimization
    int             fUseAndOr;     // enable internal detection of AND/OR gates
    int             fZeroCost;     // enable zero-cost replacement
    int             fUseSim;       // enable simulation
    int             fPrintDecs;    // enable printing decompositions
    int             fAllBoxes;     // enable preserving all boxes
    int             fLibVerbose;   // enable library stats
    int             fDelayVerbose; // enable delay stats
    int             fVerbose;      // enable basic stats
    int             fVeryVerbose;  // enable detailed stats
};

////////////////////////////////////////////////////////////////////////
///                      MACRO DEFINITIONS                           ///
////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////
///                    FUNCTION DECLARATIONS                         ///
////////////////////////////////////////////////////////////////////////

/*=== sfmCnf.c ==========================================================*/
/*=== sfmCore.c ==========================================================*/
extern void         Sfm_ParSetDefault( Sfm_Par_t * pPars );
extern int          Sfm_NtkPerform( Sfm_Ntk_t * p, Sfm_Par_t * pPars );
/*=== sfmNtk.c ==========================================================*/
extern Sfm_Ntk_t *  Sfm_NtkConstruct( Vec_Wec_t * vFanins, int nPis, int nPos, Vec_Str_t * vFixed, Vec_Str_t * vEmpty, Vec_Wrd_t * vTruths );
extern void         Sfm_NtkFree( Sfm_Ntk_t * p );
extern Vec_Int_t *  Sfm_NodeReadFanins( Sfm_Ntk_t * p, int i );
extern word *       Sfm_NodeReadTruth( Sfm_Ntk_t * p, int i );
extern int          Sfm_NodeReadFixed( Sfm_Ntk_t * p, int i );
extern int          Sfm_NodeReadUsed( Sfm_Ntk_t * p, int i );
/*=== sfmWin.c ==========================================================*/
extern Vec_Int_t *  Sfm_NtkDfs( Sfm_Ntk_t * p, Vec_Wec_t * vGroups, Vec_Int_t * vGroupMap, Vec_Int_t * vBoxesLeft, int fAllBoxes );


ABC_NAMESPACE_HEADER_END

#endif

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

