/**CFile**************************************************************** FileName [llb1Core.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [BDD based reachability.] Synopsis [Top-level procedure.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 20, 2005.] Revision [$Id: llb1Core.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] ***********************************************************************/ #include "llbInt.h" #include "aig/gia/gia.h" #include "aig/gia/giaAig.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Llb_ManSetDefaultParams( Gia_ParLlb_t * p ) { memset( p, 0, sizeof(Gia_ParLlb_t) ); p->nBddMax = 10000000; p->nIterMax = 10000000; p->nClusterMax = 20; p->nHintDepth = 0; p->HintFirst = 0; p->fUseFlow = 0; // use flow p->nVolumeMax = 100; // max volume p->nVolumeMin = 30; // min volume p->nPartValue = 5; // partitioning value p->fBackward = 0; // forward by default p->fReorder = 1; p->fIndConstr = 0; p->fUsePivots = 0; p->fCluster = 0; p->fSchedule = 0; p->fDumpReached = 0; p->fVerbose = 0; p->fVeryVerbose = 0; p->fSilent = 0; p->TimeLimit = 0; // p->TimeLimit = 0; p->TimeLimitGlo = 0; p->TimeTarget = 0; p->iFrame = -1; } /**Function************************************************************* Synopsis [Prints statistics about MFFCs.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Llb_ManPrintAig( Llb_Man_t * p ) { Abc_Print( 1, "pi =%3d ", Saig_ManPiNum(p->pAig) ); Abc_Print( 1, "po =%3d ", Saig_ManPoNum(p->pAig) ); Abc_Print( 1, "ff =%3d ", Saig_ManRegNum(p->pAig) ); Abc_Print( 1, "int =%5d ", Vec_IntSize(p->vVar2Obj)-Aig_ManCiNum(p->pAig)-Saig_ManRegNum(p->pAig) ); Abc_Print( 1, "var =%5d ", Vec_IntSize(p->vVar2Obj) ); Abc_Print( 1, "part =%5d ", Vec_PtrSize(p->vGroups)-2 ); Abc_Print( 1, "and =%5d ", Aig_ManNodeNum(p->pAig) ); Abc_Print( 1, "lev =%4d ", Aig_ManLevelNum(p->pAig) ); // Abc_Print( 1, "cut =%4d ", Llb_ManCrossCut(p->pAig) ); Abc_Print( 1, "\n" ); } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Llb_ManModelCheckAig( Aig_Man_t * pAigGlo, Gia_ParLlb_t * pPars, Vec_Int_t * vHints, DdManager ** pddGlo ) { Llb_Man_t * p = NULL; Aig_Man_t * pAig; int RetValue = -1; abctime clk = Abc_Clock(); if ( pPars->fIndConstr ) { assert( vHints == NULL ); vHints = Llb_ManDeriveConstraints( pAigGlo ); } // derive AIG for hints if ( vHints == NULL ) pAig = Aig_ManDupSimple( pAigGlo ); else { if ( pPars->fVerbose ) Llb_ManPrintEntries( pAigGlo, vHints ); pAig = Aig_ManDupSimpleWithHints( pAigGlo, vHints ); } if ( pPars->fUseFlow ) { // p = Llb_ManStartFlow( pAigGlo, pAig, pPars ); } else { p = Llb_ManStart( pAigGlo, pAig, pPars ); if ( pPars->fVerbose ) { Llb_ManPrintAig( p ); printf( "Original matrix: " ); Llb_MtrPrintMatrixStats( p->pMatrix ); if ( pPars->fVeryVerbose ) Llb_MtrPrint( p->pMatrix, 1 ); } if ( pPars->fCluster ) { Llb_ManCluster( p->pMatrix ); if ( pPars->fVerbose ) { printf( "Matrix after clustering: " ); Llb_MtrPrintMatrixStats( p->pMatrix ); if ( pPars->fVeryVerbose ) Llb_MtrPrint( p->pMatrix, 1 ); } } if ( pPars->fSchedule ) { Llb_MtrSchedule( p->pMatrix ); if ( pPars->fVerbose ) { printf( "Matrix after scheduling: " ); Llb_MtrPrintMatrixStats( p->pMatrix ); if ( pPars->fVeryVerbose ) Llb_MtrPrint( p->pMatrix, 1 ); } } } if ( !p->pPars->fSkipReach ) RetValue = Llb_ManReachability( p, vHints, pddGlo ); Llb_ManStop( p ); Abc_PrintTime( 1, "Time", Abc_Clock() - clk ); if ( pPars->fIndConstr ) Vec_IntFreeP( &vHints ); return RetValue; } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Llb_ManModelCheckGia( Gia_Man_t * pGia, Gia_ParLlb_t * pPars ) { Gia_Man_t * pGia2; Aig_Man_t * pAig; int RetValue = -1; pGia2 = Gia_ManDupDfs( pGia ); pAig = Gia_ManToAigSimple( pGia2 ); Gia_ManStop( pGia2 ); //Aig_ManShow( pAig, 0, NULL ); if ( pPars->nHintDepth == 0 ) RetValue = Llb_ManModelCheckAig( pAig, pPars, NULL, NULL ); else RetValue = Llb_ManModelCheckAigWithHints( pAig, pPars ); pGia->pCexSeq = pAig->pSeqModel; pAig->pSeqModel = NULL; Aig_ManStop( pAig ); return RetValue; } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END