/**CFile**************************************************************** FileName [cnfCore.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [AIG-to-CNF conversion.] Synopsis [] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - April 28, 2007.] Revision [$Id: cnfCore.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] ***********************************************************************/ #include "cnf.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// static Cnf_Man_t * s_pManCnf = NULL; //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Cnf_ManPrepare() { if ( s_pManCnf == NULL ) { // printf( "\n\nCreating CNF manager!!!!!\n\n" ); s_pManCnf = Cnf_ManStart(); } } Cnf_Man_t * Cnf_ManRead() { return s_pManCnf; } void Cnf_ManFree() { if ( s_pManCnf == NULL ) return; Cnf_ManStop( s_pManCnf ); s_pManCnf = NULL; } /**Function************************************************************* Synopsis [Converts AIG into the SAT solver.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Vec_Int_t * Cnf_DeriveMappingArray( Aig_Man_t * pAig ) { Vec_Int_t * vResult; Cnf_Man_t * p; Vec_Ptr_t * vMapped; Aig_MmFixed_t * pMemCuts; abctime clk; // allocate the CNF manager p = Cnf_ManStart(); p->pManAig = pAig; // generate cuts for all nodes, assign cost, and find best cuts clk = Abc_Clock(); pMemCuts = Dar_ManComputeCuts( pAig, 10, 0, 0 ); p->timeCuts = Abc_Clock() - clk; // find the mapping clk = Abc_Clock(); Cnf_DeriveMapping( p ); p->timeMap = Abc_Clock() - clk; // Aig_ManScanMapping( p, 1 ); // convert it into CNF clk = Abc_Clock(); Cnf_ManTransferCuts( p ); vMapped = Cnf_ManScanMapping( p, 1, 0 ); vResult = Cnf_ManWriteCnfMapping( p, vMapped ); Vec_PtrFree( vMapped ); Aig_MmFixedStop( pMemCuts, 0 ); p->timeSave = Abc_Clock() - clk; // reset reference counters Aig_ManResetRefs( pAig ); //ABC_PRT( "Cuts ", p->timeCuts ); //ABC_PRT( "Map ", p->timeMap ); //ABC_PRT( "Saving ", p->timeSave ); Cnf_ManStop( p ); return vResult; } /**Function************************************************************* Synopsis [Converts AIG into the SAT solver.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Cnf_Dat_t * Cnf_DeriveWithMan( Cnf_Man_t * p, Aig_Man_t * pAig, int nOutputs ) { Cnf_Dat_t * pCnf; Vec_Ptr_t * vMapped; Aig_MmFixed_t * pMemCuts; abctime clk; // connect the managers p->pManAig = pAig; // generate cuts for all nodes, assign cost, and find best cuts clk = Abc_Clock(); pMemCuts = Dar_ManComputeCuts( pAig, 10, 0, 0 ); p->timeCuts = Abc_Clock() - clk; // find the mapping clk = Abc_Clock(); Cnf_DeriveMapping( p ); p->timeMap = Abc_Clock() - clk; // Aig_ManScanMapping( p, 1 ); // convert it into CNF clk = Abc_Clock(); Cnf_ManTransferCuts( p ); vMapped = Cnf_ManScanMapping( p, 1, 1 ); pCnf = Cnf_ManWriteCnf( p, vMapped, nOutputs ); Vec_PtrFree( vMapped ); Aig_MmFixedStop( pMemCuts, 0 ); p->timeSave = Abc_Clock() - clk; // reset reference counters Aig_ManResetRefs( pAig ); //ABC_PRT( "Cuts ", p->timeCuts ); //ABC_PRT( "Map ", p->timeMap ); //ABC_PRT( "Saving ", p->timeSave ); return pCnf; } Cnf_Dat_t * Cnf_Derive( Aig_Man_t * pAig, int nOutputs ) { Cnf_ManPrepare(); return Cnf_DeriveWithMan( s_pManCnf, pAig, nOutputs ); } /**Function************************************************************* Synopsis [Converts AIG into the SAT solver.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Cnf_Dat_t * Cnf_DeriveOtherWithMan( Cnf_Man_t * p, Aig_Man_t * pAig, int fSkipTtMin ) { Cnf_Dat_t * pCnf; Vec_Ptr_t * vMapped; Aig_MmFixed_t * pMemCuts; abctime clk; // connect the managers p->pManAig = pAig; // generate cuts for all nodes, assign cost, and find best cuts clk = Abc_Clock(); pMemCuts = Dar_ManComputeCuts( pAig, 10, fSkipTtMin, 0 ); p->timeCuts = Abc_Clock() - clk; // find the mapping clk = Abc_Clock(); Cnf_DeriveMapping( p ); p->timeMap = Abc_Clock() - clk; // Aig_ManScanMapping( p, 1 ); // convert it into CNF clk = Abc_Clock(); Cnf_ManTransferCuts( p ); vMapped = Cnf_ManScanMapping( p, 1, 1 ); pCnf = Cnf_ManWriteCnfOther( p, vMapped ); pCnf->vMapping = Cnf_ManWriteCnfMapping( p, vMapped ); Vec_PtrFree( vMapped ); Aig_MmFixedStop( pMemCuts, 0 ); p->timeSave = Abc_Clock() - clk; // reset reference counters Aig_ManResetRefs( pAig ); //ABC_PRT( "Cuts ", p->timeCuts ); //ABC_PRT( "Map ", p->timeMap ); //ABC_PRT( "Saving ", p->timeSave ); return pCnf; } Cnf_Dat_t * Cnf_DeriveOther( Aig_Man_t * pAig, int fSkipTtMin ) { Cnf_ManPrepare(); return Cnf_DeriveOtherWithMan( s_pManCnf, pAig, fSkipTtMin ); } #if 0 /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Cnf_Dat_t * Cnf_Derive_old( Aig_Man_t * pAig ) { /* // iteratively improve area flow for ( i = 0; i < nIters; i++ ) { clk = Abc_Clock(); Cnf_ManScanMapping( p, 0 ); Cnf_ManMapForCnf( p ); ABC_PRT( "iter ", Abc_Clock() - clk ); } */ // write the file vMapped = Aig_ManScanMapping( p, 1 ); Vec_PtrFree( vMapped ); clk = Abc_Clock(); Cnf_ManTransferCuts( p ); Cnf_ManPostprocess( p ); Cnf_ManScanMapping( p, 0 ); /* Cnf_ManPostprocess( p ); Cnf_ManScanMapping( p, 0 ); Cnf_ManPostprocess( p ); Cnf_ManScanMapping( p, 0 ); */ ABC_PRT( "Ext ", Abc_Clock() - clk ); /* vMapped = Cnf_ManScanMapping( p, 1 ); pCnf = Cnf_ManWriteCnf( p, vMapped ); Vec_PtrFree( vMapped ); // clean up Cnf_ManFreeCuts( p ); Dar_ManCutsFree( pAig ); return pCnf; */ Aig_MmFixedStop( pMemCuts, 0 ); return NULL; } #endif //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END