/**CFile**************************************************************** FileName [mapperCore.c] PackageName [MVSIS 1.3: Multi-valued logic synthesis system.] Synopsis [Generic technology mapping engine.] Author [MVSIS Group] Affiliation [UC Berkeley] Date [Ver. 2.0. Started - June 1, 2004.] Revision [$Id: mapperCore.c,v 1.7 2004/10/01 23:41:04 satrajit Exp $] ***********************************************************************/ #include "mapperInt.h" //#include "resm.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Performs technology mapping for the given object graph.] Description [The object graph is stored in the mapping manager. First, the AND nodes that fanout into POs are collected in the DFS order. Two preprocessing steps are performed: the k-feasible cuts are computed for each node and the truth tables are computed for each cut. Next, the delay-optimal matches are assigned for each node, followed by several iterations of area recoveryd: using area flow (global optimization) and using exact area at a node (local optimization).] SideEffects [] SeeAlso [] ***********************************************************************/ int Map_Mapping( Map_Man_t * p ) { int fShowSwitching = 0; int fUseAreaFlow = 1; int fUseExactArea = !p->fSwitching; int fUseExactAreaWithPhase = !p->fSwitching; abctime clk; ////////////////////////////////////////////////////////////////////// // perform pre-mapping computations if ( p->fVerbose ) Map_MappingReportChoices( p ); Map_MappingSetChoiceLevels( p ); // should always be called before mapping! // return 1; // compute the cuts of nodes in the DFS order clk = Abc_Clock(); Map_MappingCuts( p ); p->timeCuts = Abc_Clock() - clk; // derive the truth tables clk = Abc_Clock(); Map_MappingTruths( p ); p->timeTruth = Abc_Clock() - clk; ////////////////////////////////////////////////////////////////////// //ABC_PRT( "Truths", Abc_Clock() - clk ); ////////////////////////////////////////////////////////////////////// // compute the minimum-delay mapping clk = Abc_Clock(); p->fMappingMode = 0; if ( !Map_MappingMatches( p ) ) return 0; p->timeMatch = Abc_Clock() - clk; // compute the references and collect the nodes used in the mapping Map_MappingSetRefs( p ); p->AreaBase = Map_MappingGetArea( p ); if ( p->fVerbose ) { printf( "Delay : %s = %8.2f Flow = %11.1f Area = %11.1f %4.1f %% ", fShowSwitching? "Switch" : "Delay", fShowSwitching? Map_MappingGetSwitching(p) : p->fRequiredGlo, Map_MappingGetAreaFlow(p), p->AreaBase, 0.0 ); ABC_PRT( "Time", p->timeMatch ); } ////////////////////////////////////////////////////////////////////// if ( !p->fAreaRecovery ) { if ( p->fVerbose ) Map_MappingPrintOutputArrivals( p ); return 1; } ////////////////////////////////////////////////////////////////////// // perform area recovery using area flow clk = Abc_Clock(); if ( fUseAreaFlow ) { // compute the required times Map_TimeComputeRequiredGlobal( p ); // recover area flow p->fMappingMode = 1; Map_MappingMatches( p ); // compute the references and collect the nodes used in the mapping Map_MappingSetRefs( p ); p->AreaFinal = Map_MappingGetArea( p ); if ( p->fVerbose ) { printf( "AreaFlow : %s = %8.2f Flow = %11.1f Area = %11.1f %4.1f %% ", fShowSwitching? "Switch" : "Delay", fShowSwitching? Map_MappingGetSwitching(p) : p->fRequiredGlo, Map_MappingGetAreaFlow(p), p->AreaFinal, 100.0*(p->AreaBase-p->AreaFinal)/p->AreaBase ); ABC_PRT( "Time", Abc_Clock() - clk ); } } p->timeArea += Abc_Clock() - clk; ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // perform area recovery using exact area clk = Abc_Clock(); if ( fUseExactArea ) { // compute the required times Map_TimeComputeRequiredGlobal( p ); // recover area p->fMappingMode = 2; Map_MappingMatches( p ); // compute the references and collect the nodes used in the mapping Map_MappingSetRefs( p ); p->AreaFinal = Map_MappingGetArea( p ); if ( p->fVerbose ) { printf( "Area : %s = %8.2f Flow = %11.1f Area = %11.1f %4.1f %% ", fShowSwitching? "Switch" : "Delay", fShowSwitching? Map_MappingGetSwitching(p) : p->fRequiredGlo, 0.0, p->AreaFinal, 100.0*(p->AreaBase-p->AreaFinal)/p->AreaBase ); ABC_PRT( "Time", Abc_Clock() - clk ); } } p->timeArea += Abc_Clock() - clk; ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // perform area recovery using exact area clk = Abc_Clock(); if ( fUseExactAreaWithPhase ) { // compute the required times Map_TimeComputeRequiredGlobal( p ); // recover area p->fMappingMode = 3; Map_MappingMatches( p ); // compute the references and collect the nodes used in the mapping Map_MappingSetRefs( p ); p->AreaFinal = Map_MappingGetArea( p ); if ( p->fVerbose ) { printf( "Area : %s = %8.2f Flow = %11.1f Area = %11.1f %4.1f %% ", fShowSwitching? "Switch" : "Delay", fShowSwitching? Map_MappingGetSwitching(p) : p->fRequiredGlo, 0.0, p->AreaFinal, 100.0*(p->AreaBase-p->AreaFinal)/p->AreaBase ); ABC_PRT( "Time", Abc_Clock() - clk ); } } p->timeArea += Abc_Clock() - clk; ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // perform area recovery using exact area clk = Abc_Clock(); if ( p->fSwitching ) { // compute the required times Map_TimeComputeRequiredGlobal( p ); // recover switching activity p->fMappingMode = 4; Map_MappingMatches( p ); // compute the references and collect the nodes used in the mapping Map_MappingSetRefs( p ); p->AreaFinal = Map_MappingGetArea( p ); if ( p->fVerbose ) { printf( "Switching: %s = %8.2f Flow = %11.1f Area = %11.1f %4.1f %% ", fShowSwitching? "Switch" : "Delay", fShowSwitching? Map_MappingGetSwitching(p) : p->fRequiredGlo, 0.0, p->AreaFinal, 100.0*(p->AreaBase-p->AreaFinal)/p->AreaBase ); ABC_PRT( "Time", Abc_Clock() - clk ); } // compute the required times Map_TimeComputeRequiredGlobal( p ); // recover switching activity p->fMappingMode = 4; Map_MappingMatches( p ); // compute the references and collect the nodes used in the mapping Map_MappingSetRefs( p ); p->AreaFinal = Map_MappingGetArea( p ); if ( p->fVerbose ) { printf( "Switching: %s = %8.2f Flow = %11.1f Area = %11.1f %4.1f %% ", fShowSwitching? "Switch" : "Delay", fShowSwitching? Map_MappingGetSwitching(p) : p->fRequiredGlo, 0.0, p->AreaFinal, 100.0*(p->AreaBase-p->AreaFinal)/p->AreaBase ); ABC_PRT( "Time", Abc_Clock() - clk ); } } p->timeArea += Abc_Clock() - clk; ////////////////////////////////////////////////////////////////////// // print the arrival times of the latest outputs if ( p->fVerbose ) Map_MappingPrintOutputArrivals( p ); return 1; } ABC_NAMESPACE_IMPL_END