/**CFile**************************************************************** FileName [rwtMan.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [DAG-aware AIG rewriting package.] Synopsis [Rewriting manager.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 20, 2005.] Revision [$Id: rwtMan.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] ***********************************************************************/ #include "rwt.h" #include "bool/deco/deco.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// static unsigned short * s_puCanons = NULL; static char * s_pPhases = NULL; static char * s_pPerms = NULL; static unsigned char * s_pMap = NULL; //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Starts residual rewriting manager.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Rwt_ManGlobalStart() { if ( s_puCanons == NULL ) Extra_Truth4VarNPN( &s_puCanons, &s_pPhases, &s_pPerms, &s_pMap ); } /**Function************************************************************* Synopsis [Starts residual rewriting manager.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Rwt_ManGlobalStop() { ABC_FREE( s_puCanons ); ABC_FREE( s_pPhases ); ABC_FREE( s_pPerms ); ABC_FREE( s_pMap ); } /**Function************************************************************* Synopsis [Starts rewriting manager.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Rwt_Man_t * Rwt_ManStart( int fPrecompute ) { Rwt_Man_t * p; abctime clk = Abc_Clock(); clk = Abc_Clock(); p = ABC_ALLOC( Rwt_Man_t, 1 ); memset( p, 0, sizeof(Rwt_Man_t) ); p->nFuncs = (1<<16); // copy the global tables Rwt_ManGlobalStart(); p->puCanons = s_puCanons; p->pPhases = s_pPhases; p->pPerms = s_pPerms; p->pMap = s_pMap; // initialize practical NPN classes p->pPractical = Rwt_ManGetPractical( p ); // create the table p->pTable = ABC_ALLOC( Rwt_Node_t *, p->nFuncs ); memset( p->pTable, 0, sizeof(Rwt_Node_t *) * p->nFuncs ); // create the elementary nodes p->pMmNode = Mem_FixedStart( sizeof(Rwt_Node_t) ); p->vForest = Vec_PtrAlloc( 100 ); Rwt_ManAddVar( p, 0x0000, fPrecompute ); // constant 0 Rwt_ManAddVar( p, 0xAAAA, fPrecompute ); // var A Rwt_ManAddVar( p, 0xCCCC, fPrecompute ); // var B Rwt_ManAddVar( p, 0xF0F0, fPrecompute ); // var C Rwt_ManAddVar( p, 0xFF00, fPrecompute ); // var D p->nClasses = 5; // other stuff p->nTravIds = 1; p->pPerms4 = Extra_Permutations( 4 ); p->vLevNums = Vec_IntAlloc( 50 ); p->vFanins = Vec_PtrAlloc( 50 ); p->vFaninsCur = Vec_PtrAlloc( 50 ); p->vNodesTemp = Vec_PtrAlloc( 50 ); if ( fPrecompute ) { // precompute subgraphs // Rwt_ManPrecompute( p ); // Rwt_ManPrint( p ); // Rwt_ManWriteToArray( p ); } else { // load saved subgraphs Rwt_ManLoadFromArray( p, 0 ); // Rwt_ManPrint( p ); Rwt_ManPreprocess( p ); } p->timeStart = Abc_Clock() - clk; return p; } /**Function************************************************************* Synopsis [Stops rewriting manager.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Rwt_ManStop( Rwt_Man_t * p ) { if ( p->vClasses ) { Rwt_Node_t * pNode; int i, k; Vec_VecForEachEntry( Rwt_Node_t *, p->vClasses, pNode, i, k ) Dec_GraphFree( (Dec_Graph_t *)pNode->pNext ); } if ( p->vClasses ) Vec_VecFree( p->vClasses ); Vec_PtrFree( p->vNodesTemp ); Vec_PtrFree( p->vForest ); Vec_IntFree( p->vLevNums ); Vec_PtrFree( p->vFanins ); Vec_PtrFree( p->vFaninsCur ); Mem_FixedStop( p->pMmNode, 0 ); ABC_FREE( p->pMapInv ); ABC_FREE( p->pTable ); ABC_FREE( p->pPractical ); ABC_FREE( p->pPerms4 ); ABC_FREE( p ); } /**Function************************************************************* Synopsis [Stops the resynthesis manager.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Rwt_ManPrintStats( Rwt_Man_t * p ) { int i, Counter = 0; for ( i = 0; i < 222; i++ ) Counter += (p->nScores[i] > 0); printf( "Rewriting statistics:\n" ); printf( "Total cuts tries = %8d.\n", p->nCutsGood ); printf( "Bad cuts found = %8d.\n", p->nCutsBad ); printf( "Total subgraphs = %8d.\n", p->nSubgraphs ); printf( "Used NPN classes = %8d.\n", Counter ); printf( "Nodes considered = %8d.\n", p->nNodesConsidered ); printf( "Nodes rewritten = %8d.\n", p->nNodesRewritten ); printf( "Calculated gain = %8d.\n", p->nNodesGained ); ABC_PRT( "Start ", p->timeStart ); ABC_PRT( "Cuts ", p->timeCut ); ABC_PRT( "Truth ", p->timeTruth ); ABC_PRT( "Resynthesis ", p->timeRes ); ABC_PRT( " Mffc ", p->timeMffc ); ABC_PRT( " Eval ", p->timeEval ); ABC_PRT( "Update ", p->timeUpdate ); ABC_PRT( "TOTAL ", p->timeTotal ); /* printf( "The scores are:\n" ); for ( i = 0; i < 222; i++ ) if ( p->nScores[i] > 0 ) { extern void Ivy_TruthDsdComputePrint( unsigned uTruth ); printf( "%3d = %8d canon = %5d ", i, p->nScores[i], p->pMapInv[i] ); Ivy_TruthDsdComputePrint( (unsigned)p->pMapInv[i] | ((unsigned)p->pMapInv[i] << 16) ); } printf( "\n" ); */ } /**Function************************************************************* Synopsis [Stops the resynthesis manager.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Rwt_ManPrintStatsFile( Rwt_Man_t * p ) { FILE * pTable; pTable = fopen( "stats.txt", "a+" ); fprintf( pTable, "%d ", p->nCutsGood ); fprintf( pTable, "%d ", p->nSubgraphs ); fprintf( pTable, "%d ", p->nNodesRewritten ); fprintf( pTable, "%d", p->nNodesGained ); fprintf( pTable, "\n" ); fclose( pTable ); } /**Function************************************************************* Synopsis [Stops the resynthesis manager.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void * Rwt_ManReadDecs( Rwt_Man_t * p ) { return p->pGraph; } /**Function************************************************************* Synopsis [Stops the resynthesis manager.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Vec_Ptr_t * Rwt_ManReadLeaves( Rwt_Man_t * p ) { return p->vFanins; } /**Function************************************************************* Synopsis [Stops the resynthesis manager.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Rwt_ManReadCompl( Rwt_Man_t * p ) { return p->fCompl; } /**Function************************************************************* Synopsis [Stops the resynthesis manager.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Rwt_ManAddTimeCuts( Rwt_Man_t * p, abctime Time ) { p->timeCut += Time; } /**Function************************************************************* Synopsis [Stops the resynthesis manager.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Rwt_ManAddTimeUpdate( Rwt_Man_t * p, abctime Time ) { p->timeUpdate += Time; } /**Function************************************************************* Synopsis [Stops the resynthesis manager.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Rwt_ManAddTimeTotal( Rwt_Man_t * p, abctime Time ) { p->timeTotal += Time; } /**Function************************************************************* Synopsis [Precomputes AIG subgraphs.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Rwt_Precompute() { Rwt_Man_t * p; p = Rwt_ManStart( 1 ); Rwt_ManStop( p ); } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END