/**CFile**************************************************************** FileName [giaSatoko.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [Scalable AIG package.] Synopsis [Interface to Satoko solver.] Author [Alan Mishchenko, Bruno Schmitt] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 20, 2005.] Revision [$Id: giaSatoko.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] ***********************************************************************/ #include "gia.h" #include "sat/cnf/cnf.h" #include "sat/bsat/satSolver3.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ sat_solver3 * Gia_ManSat3Init( Cnf_Dat_t * pCnf ) { sat_solver3 * pSat = sat_solver3_new(); int i; //sat_solver_setnvars( pSat, p->nVars ); for ( i = 0; i < pCnf->nClauses; i++ ) { if ( !sat_solver3_addclause( pSat, pCnf->pClauses[i], pCnf->pClauses[i+1] ) ) { sat_solver3_delete( pSat ); return NULL; } } return pSat; } void Gia_ManSat3Report( int iOutput, int status, abctime clk ) { if ( iOutput >= 0 ) Abc_Print( 1, "Output %6d : ", iOutput ); else Abc_Print( 1, "Total: " ); if ( status == l_Undef ) Abc_Print( 1, "UNDECIDED " ); else if ( status == l_True ) Abc_Print( 1, "SATISFIABLE " ); else Abc_Print( 1, "UNSATISFIABLE " ); Abc_PrintTime( 1, "Time", clk ); } sat_solver3 * Gia_ManSat3Create( Gia_Man_t * p ) { Cnf_Dat_t * pCnf = (Cnf_Dat_t *)Mf_ManGenerateCnf( p, 8, 0, 1, 0, 0 ); sat_solver3 * pSat = Gia_ManSat3Init( pCnf ); int status = pSat ? sat_solver3_simplify(pSat) : 0; Cnf_DataFree( pCnf ); if ( status ) return pSat; if ( pSat ) sat_solver3_delete( pSat ); return NULL; } int Gia_ManSat3CallOne( Gia_Man_t * p, int iOutput ) { abctime clk = Abc_Clock(); sat_solver3 * pSat; int status, Cost = 0; pSat = Gia_ManSat3Create( p ); if ( pSat ) { status = sat_solver3_solve( pSat, NULL, NULL, 0, 0, 0, 0 ); Cost = (unsigned)pSat->stats.conflicts; sat_solver3_delete( pSat ); } else status = l_False; Gia_ManSat3Report( iOutput, status, Abc_Clock() - clk ); return Cost; } void Gia_ManSat3Call( Gia_Man_t * p, int fSplit ) { Gia_Man_t * pOne; Gia_Obj_t * pRoot; int i; if ( fSplit ) { abctime clk = Abc_Clock(); Gia_ManForEachCo( p, pRoot, i ) { pOne = Gia_ManDupDfsCone( p, pRoot ); Gia_ManSat3CallOne( pOne, i ); Gia_ManStop( pOne ); } Abc_PrintTime( 1, "Total time", Abc_Clock() - clk ); return; } Gia_ManSat3CallOne( p, -1 ); } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END