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

  FileName    [giaProp.c]

  SystemName  [ABC: Logic synthesis and verification system.]

  PackageName [Scalable AIG package.]

  Synopsis    [Constraint propagation on the AIG.]

  Author      [Alan Mishchenko]
  
  Affiliation [UC Berkeley]

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

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

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

#include "gia.h"

ABC_NAMESPACE_IMPL_START


////////////////////////////////////////////////////////////////////////
///                        DECLARATIONS                              ///
////////////////////////////////////////////////////////////////////////

#define GIA_SAT_SHIFT 12
#define GIA_ROOT_MASK 
#define GIA_PATH00_MASK
#define GIA_PATH10_MASK
#define GIA_PATH20_MASK
#define GIA_PATH30_MASK
#define GIA_PATH00_MASK
#define GIA_PATH10_MASK
#define GIA_PATH20_MASK
#define GIA_PATH30_MASK

static inline int Gia_SatObjIsRoot( Gia_Obj_t * p )      { return 0; }
static inline int Gia_SatObjXorRoot( Gia_Obj_t * p )     { return 0; }


static inline int Gia_SatObjIsAssigned( Gia_Obj_t * p )  { return 0; }
static inline int Gia_SatObjIsHeld( Gia_Obj_t * p )      { return 0; }
static inline int Gia_SatObjValue( Gia_Obj_t * p )       { return 0; }


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

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

  Synopsis    [Checks if the give cut is satisfied.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
int Gia_SatPathCheckCutSat_rec( Gia_Obj_t * p, int fCompl )
{
    if ( Gia_SatObjIsRoot(p) )
        return Gia_ObjIsAssigned(p) && Gia_SatObjValue(p) == fCompl;
    if ( Gia_SatObjPath0(p) && !Gia_SatPathCheckCutSat_rec( Gia_ObjFanin0(p), fCompl ^ Gia_ObjFaninC0(p) ) )
        return 0;
    if ( Gia_SatObjPath1(p) && !Gia_SatPathCheckCutSat_rec( Gia_ObjFanin1(p), fCompl ^ Gia_ObjFaninC1(p) ) )
        return 0;
    return 1;
}

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

  Synopsis    [Checks if the give cut is satisfied.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
int Gia_SatPathCheckCutSat( Gia_Obj_t * p )
{
    int RetValue;
    assert( Gia_SatObjIsRoot(p) );
    Gia_SatObjXorRoot(p);
    RetValue = Gia_SatPathCheckCutSat_rec( p );
    Gia_SatObjXorRoot(p);
    return RetValue;
}

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

  Synopsis    [Unbinds literals on the path.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
int Gia_SatPathUnbind_rec( Gia_Obj_t * p )
{
}

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

  Synopsis    [Creates a feasible path from the node to a terminal.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
int Gia_SatPathStart_rec( Gia_Obj_t * p, int fDiffs, int fCompl )
{
    if ( Gia_SatObjIsRoot(p) )
        return fDiffs && (!Gia_ObjIsAssigned(p) || Gia_SatObjValue(p) != fCompl);
    if ( fCompl == 0 )
    {
        if ( Gia_SatPathStart_rec( Gia_ObjFanin0(p), fDiffs + !Gia_SatObjPath0(p), fCompl ^ Gia_ObjFaninC0(p) ) &&
             Gia_SatPathStart_rec( Gia_ObjFanin1(p), fDiffs + !Gia_SatObjPath1(p), fCompl ^ Gia_ObjFaninC1(p) ) )
            return Gia_ObjSetDraftPath0(p) + Gia_ObjSetDraftPath1(p);
    }
    else
    {
        if ( Gia_SatPathStart_rec( Gia_ObjFanin0(p), fDiffs + !Gia_SatObjPath0(p), fCompl ^ Gia_ObjFaninC0(p) ) )
        {
            Gia_ObjUnsetDraftPath1(p);
            return Gia_ObjSetDraftPath0(p);
        }
        if ( Gia_SatPathStart_rec( Gia_ObjFanin1(p), fDiffs + !Gia_SatObjPath1(p), fCompl ^ Gia_ObjFaninC1(p) ) )
        {
            Gia_ObjUnsetDraftPath0(p);
            return Gia_ObjSetDraftPath1(p);
        }
    }
    return 0;
}

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

  Synopsis    [Creates a feasible path from the node to a terminal.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
int Gia_SatPathStart( Gia_Obj_t * p )
{
    int RetValue;
    assert( Gia_SatObjIsRoot(p) );
    Gia_SatObjXorRoot(p);
    RetValue = Gia_SatPathStart_rec( p, 0, 0 );
    Gia_SatObjXorRoot(p);
    return RetValue;
}

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


ABC_NAMESPACE_IMPL_END