| /**CFile**************************************************************** |
| |
| FileName [amapLib.c] |
| |
| SystemName [ABC: Logic synthesis and verification system.] |
| |
| PackageName [Technology mapper for standard cells.] |
| |
| Synopsis [Standard-cell library.] |
| |
| Author [Alan Mishchenko] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - June 20, 2005.] |
| |
| Revision [$Id: amapLib.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "amapInt.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**Function************************************************************* |
| |
| Synopsis [Allocs a library.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Amap_Lib_t * Amap_LibAlloc() |
| { |
| Amap_Lib_t * p; |
| p = (Amap_Lib_t *)ABC_ALLOC( Amap_Lib_t, 1 ); |
| memset( p, 0, sizeof(Amap_Lib_t) ); |
| p->vGates = Vec_PtrAlloc( 100 ); |
| p->pMemGates = Aig_MmFlexStart(); |
| p->pMemSet = Aig_MmFlexStart(); |
| return p; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Deallocs a library.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Amap_LibFree( Amap_Lib_t * p ) |
| { |
| if ( p == NULL ) |
| return; |
| if ( p->vSelect ) |
| Vec_PtrFree( p->vSelect ); |
| if ( p->vSorted ) |
| Vec_PtrFree( p->vSorted ); |
| if ( p->vGates ) |
| Vec_PtrFree( p->vGates ); |
| if ( p->vRules ) |
| Vec_VecFree( (Vec_Vec_t *)p->vRules ); |
| if ( p->vRulesX ) |
| Vec_VecFree( (Vec_Vec_t *)p->vRulesX ); |
| if ( p->vRules3 ) |
| Vec_IntFree( p->vRules3 ); |
| Aig_MmFlexStop( p->pMemGates, 0 ); |
| Aig_MmFlexStop( p->pMemSet, 0 ); |
| ABC_FREE( p->pRules ); |
| ABC_FREE( p->pRulesX ); |
| ABC_FREE( p->pNodes ); |
| ABC_FREE( p->pName ); |
| ABC_FREE( p ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Returns the largest gate size.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Amap_LibNumPinsMax( Amap_Lib_t * p ) |
| { |
| Amap_Gat_t * pGate; |
| int i, Counter = 0; |
| Amap_LibForEachGate( p, pGate, i ) |
| if ( Counter < (int)pGate->nPins ) |
| Counter = pGate->nPins; |
| return Counter; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Writes one pin.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Amap_LibWritePin( FILE * pFile, Amap_Pin_t * pPin ) |
| { |
| char * pPhaseNames[10] = { "UNKNOWN", "INV", "NONINV" }; |
| fprintf( pFile, " PIN " ); |
| fprintf( pFile, "%9s ", pPin->pName ); |
| fprintf( pFile, "%10s ", pPhaseNames[pPin->Phase] ); |
| fprintf( pFile, "%6d ", (int)pPin->dLoadInput ); |
| fprintf( pFile, "%6d ", (int)pPin->dLoadMax ); |
| fprintf( pFile, "%6.2f ", pPin->dDelayBlockRise ); |
| fprintf( pFile, "%6.2f ", pPin->dDelayFanoutRise ); |
| fprintf( pFile, "%6.2f ", pPin->dDelayBlockFall ); |
| fprintf( pFile, "%6.2f", pPin->dDelayFanoutFall ); |
| fprintf( pFile, "\n" ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Writes one gate.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Amap_LibWriteGate( FILE * pFile, Amap_Gat_t * pGate, int fPrintDsd ) |
| { |
| Amap_Pin_t * pPin; |
| fprintf( pFile, "GATE " ); |
| fprintf( pFile, "%12s ", pGate->pName ); |
| fprintf( pFile, "%10.2f ", pGate->dArea ); |
| fprintf( pFile, "%s=%s;\n", pGate->pOutName, pGate->pForm ); |
| if ( fPrintDsd ) |
| { |
| if ( pGate->pFunc == NULL ) |
| printf( "Truth table is not available.\n" ); |
| else |
| Kit_DsdPrintFromTruth( pGate->pFunc, pGate->nPins ); |
| } |
| Amap_GateForEachPin( pGate, pPin ) |
| Amap_LibWritePin( pFile, pPin ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Writes library.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Amap_LibWrite( FILE * pFile, Amap_Lib_t * pLib, int fPrintDsd ) |
| { |
| Amap_Gat_t * pGate; |
| int i; |
| fprintf( pFile, "# The genlib library \"%s\".\n", pLib->pName ); |
| Amap_LibForEachGate( pLib, pGate, i ) |
| Amap_LibWriteGate( pFile, pGate, fPrintDsd ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Compares two gates by area.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Amap_LibCompareGatesByArea( Amap_Gat_t ** pp1, Amap_Gat_t ** pp2 ) |
| { |
| double Diff = (*pp1)->dArea - (*pp2)->dArea; |
| if ( Diff < 0.0 ) |
| return -1; |
| if ( Diff > 0.0 ) |
| return 1; |
| return 0; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Compares gates by area.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Vec_Ptr_t * Amap_LibSortGatesByArea( Amap_Lib_t * pLib ) |
| { |
| Vec_Ptr_t * vSorted; |
| vSorted = Vec_PtrDup( pLib->vGates ); |
| qsort( (void *)Vec_PtrArray(vSorted), Vec_PtrSize(vSorted), sizeof(void *), |
| (int (*)(const void *, const void *)) Amap_LibCompareGatesByArea ); |
| return vSorted; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Finds min-area gate with the given function.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Amap_Gat_t * Amap_LibFindGate( Amap_Lib_t * p, unsigned uTruth ) |
| { |
| Amap_Gat_t * pGate; |
| int i; |
| Vec_PtrForEachEntry( Amap_Gat_t *, p->vSorted, pGate, i ) |
| if ( pGate->nPins <= 5 && pGate->pFunc[0] == uTruth ) |
| return pGate; |
| return NULL; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Selects gates useful for area-only mapping.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Vec_Ptr_t * Amap_LibSelectGates( Amap_Lib_t * p, int fVerbose ) |
| { |
| Vec_Ptr_t * vSelect; |
| Amap_Gat_t * pGate, * pGate2; |
| int i, k;//, clk = Abc_Clock(); |
| p->pGate0 = Amap_LibFindGate( p, 0 ); |
| p->pGate1 = Amap_LibFindGate( p, ~0 ); |
| p->pGateBuf = Amap_LibFindGate( p, 0xAAAAAAAA ); |
| p->pGateInv = Amap_LibFindGate( p, ~0xAAAAAAAA ); |
| vSelect = Vec_PtrAlloc( 100 ); |
| Vec_PtrForEachEntry( Amap_Gat_t *, p->vSorted, pGate, i ) |
| { |
| if ( pGate->pFunc == NULL || pGate->pTwin != NULL ) |
| continue; |
| Vec_PtrForEachEntryStop( Amap_Gat_t *, p->vSorted, pGate2, k, i ) |
| { |
| if ( pGate2->pFunc == NULL || pGate2->pTwin != NULL ) |
| continue; |
| if ( pGate2->nPins != pGate->nPins ) |
| continue; |
| if ( !memcmp( pGate2->pFunc, pGate->pFunc, sizeof(unsigned) * Abc_TruthWordNum(pGate->nPins) ) ) |
| break; |
| } |
| if ( k < i ) |
| continue; |
| Vec_PtrPush( vSelect, pGate ); |
| } |
| return vSelect; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Selects gates useful for area-only mapping.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Amap_LibPrintSelectedGates( Amap_Lib_t * p, int fAllGates ) |
| { |
| Vec_Ptr_t * vArray; |
| Amap_Gat_t * pGate; |
| int i; |
| vArray = fAllGates? p->vGates : p->vSelect; |
| Vec_PtrForEachEntry( Amap_Gat_t *, vArray, pGate, i ) |
| { |
| printf( "%3d :%12s %d %9.2f ", i, pGate->pName, pGate->nPins, pGate->dArea ); |
| printf( "%4s=%40s ", pGate->pOutName, pGate->pForm ); |
| printf( "DSD: " ); |
| Kit_DsdPrintFromTruth( pGate->pFunc, pGate->nPins ); |
| printf( "\n" ); |
| } |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Parses equations for the gates.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Amap_Lib_t * Amap_LibReadAndPrepare( char * pFileName, char * pBuffer, int fVerbose, int fVeryVerbose ) |
| { |
| Amap_Lib_t * p; |
| abctime clk = Abc_Clock(); |
| if ( pBuffer == NULL ) |
| p = Amap_LibReadFile( pFileName, fVerbose ); |
| else |
| { |
| p = Amap_LibReadBuffer( pBuffer, fVerbose ); |
| if ( p ) |
| p->pName = Abc_UtilStrsav( pFileName ); |
| } |
| if ( fVerbose ) |
| printf( "Read %d gates from file \"%s\".\n", Vec_PtrSize(p->vGates), pFileName ); |
| if ( p == NULL ) |
| return NULL; |
| if ( !Amap_LibParseEquations( p, fVerbose ) ) |
| { |
| Amap_LibFree( p ); |
| return NULL; |
| } |
| p->vSorted = Amap_LibSortGatesByArea( p ); |
| p->vSelect = Amap_LibSelectGates( p, fVerbose ); |
| if ( fVerbose ) |
| { |
| printf( "Selected %d functionally unique gates. ", Vec_PtrSize(p->vSelect) ); |
| ABC_PRT( "Time", Abc_Clock() - clk ); |
| // Amap_LibPrintSelectedGates( p, 0 ); |
| } |
| clk = Abc_Clock(); |
| Amap_LibCreateRules( p, fVeryVerbose ); |
| if ( fVerbose ) |
| { |
| printf( "Created %d rules and %d matches. ", p->nNodes, p->nSets ); |
| ABC_PRT( "Time", Abc_Clock() - clk ); |
| } |
| return p; |
| } |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |