/**CFile**************************************************************** FileName [rwrCut.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [DAG-aware AIG rewriting package.] Synopsis [Cut computation.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 20, 2005.] Revision [$Id: rwrCut.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] ***********************************************************************/ #include "rwr.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Adds one node.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Rwr_Trav2_rec( Rwr_Man_t * p, Rwr_Node_t * pNode, int * pVolume ) { if ( pNode->fUsed || pNode->TravId == p->nTravIds ) return; pNode->TravId = p->nTravIds; (*pVolume)++; Rwr_Trav2_rec( p, Rwr_Regular(pNode->p0), pVolume ); Rwr_Trav2_rec( p, Rwr_Regular(pNode->p1), pVolume ); } /**Function************************************************************* Synopsis [Adds the node to the end of the list.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Rwr_GetBushVolume( Rwr_Man_t * p, int Entry, int * pVolume, int * pnFuncs ) { Rwr_Node_t * pNode; int Volume = 0; int nFuncs = 0; Rwr_ManIncTravId( p ); for ( pNode = p->pTable[Entry]; pNode; pNode = pNode->pNext ) { if ( pNode->uTruth != p->puCanons[pNode->uTruth] ) continue; nFuncs++; Rwr_Trav2_rec( p, pNode, &Volume ); } *pVolume = Volume; *pnFuncs = nFuncs; } /**Function************************************************************* Synopsis [Adds the node to the end of the list.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Rwr_GetBushSumOfVolumes( Rwr_Man_t * p, int Entry ) { Rwr_Node_t * pNode; int Volume, VolumeTotal = 0; for ( pNode = p->pTable[Entry]; pNode; pNode = pNode->pNext ) { if ( pNode->uTruth != p->puCanons[pNode->uTruth] ) continue; Volume = 0; Rwr_ManIncTravId( p ); Rwr_Trav2_rec( p, pNode, &Volume ); VolumeTotal += Volume; } return VolumeTotal; } /**Function************************************************************* Synopsis [Prints one rwr node.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Rwr_NodePrint_rec( FILE * pFile, Rwr_Node_t * pNode ) { assert( !Rwr_IsComplement(pNode) ); if ( pNode->Id == 0 ) { fprintf( pFile, "Const1" ); return; } if ( pNode->Id < 5 ) { fprintf( pFile, "%c", 'a' + pNode->Id - 1 ); return; } if ( Rwr_IsComplement(pNode->p0) ) { if ( Rwr_Regular(pNode->p0)->Id < 5 ) { Rwr_NodePrint_rec( pFile, Rwr_Regular(pNode->p0) ); fprintf( pFile, "\'" ); } else { fprintf( pFile, "(" ); Rwr_NodePrint_rec( pFile, Rwr_Regular(pNode->p0) ); fprintf( pFile, ")\'" ); } } else { if ( Rwr_Regular(pNode->p0)->Id < 5 ) { Rwr_NodePrint_rec( pFile, Rwr_Regular(pNode->p0) ); } else { fprintf( pFile, "(" ); Rwr_NodePrint_rec( pFile, Rwr_Regular(pNode->p0) ); fprintf( pFile, ")" ); } } if ( pNode->fExor ) fprintf( pFile, "+" ); if ( Rwr_IsComplement(pNode->p1) ) { if ( Rwr_Regular(pNode->p1)->Id < 5 ) { Rwr_NodePrint_rec( pFile, Rwr_Regular(pNode->p1) ); fprintf( pFile, "\'" ); } else { fprintf( pFile, "(" ); Rwr_NodePrint_rec( pFile, Rwr_Regular(pNode->p1) ); fprintf( pFile, ")\'" ); } } else { if ( Rwr_Regular(pNode->p1)->Id < 5 ) { Rwr_NodePrint_rec( pFile, Rwr_Regular(pNode->p1) ); } else { fprintf( pFile, "(" ); Rwr_NodePrint_rec( pFile, Rwr_Regular(pNode->p1) ); fprintf( pFile, ")" ); } } } /**Function************************************************************* Synopsis [Prints one rwr node.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Rwr_NodePrint( FILE * pFile, Rwr_Man_t * p, Rwr_Node_t * pNode ) { unsigned uTruth; fprintf( pFile, "%5d : ", pNode->Id ); uTruth = pNode->uTruth; Extra_PrintHex( pFile, &uTruth, 4 ); fprintf( pFile, " tt=" ); Extra_PrintBinary( pFile, &uTruth, 16 ); // fprintf( pFile, " cn=", pNode->Id ); // uTruth = p->puCanons[pNode->uTruth]; // Extra_PrintBinary( pFile, &uTruth, 16 ); fprintf( pFile, " lev=%d", pNode->Level ); fprintf( pFile, " vol=%d", pNode->Volume ); fprintf( pFile, " " ); Rwr_NodePrint_rec( pFile, pNode ); fprintf( pFile, "\n" ); } /**Function************************************************************* Synopsis [Prints one rwr node.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Rwr_ManPrint( Rwr_Man_t * p ) { FILE * pFile; Rwr_Node_t * pNode; unsigned uTruth; int Limit, Counter, Volume, nFuncs, i; pFile = fopen( "graph_lib.txt", "w" ); Counter = 0; Limit = (1 << 16); for ( i = 0; i < Limit; i++ ) { if ( p->pTable[i] == NULL ) continue; if ( i != p->puCanons[i] ) continue; fprintf( pFile, "\nClass %3d. Func %6d. ", p->pMap[i], Counter++ ); Rwr_GetBushVolume( p, i, &Volume, &nFuncs ); fprintf( pFile, "Roots = %3d. Vol = %3d. Sum = %3d. ", nFuncs, Volume, Rwr_GetBushSumOfVolumes(p, i) ); uTruth = i; Extra_PrintBinary( pFile, &uTruth, 16 ); fprintf( pFile, "\n" ); for ( pNode = p->pTable[i]; pNode; pNode = pNode->pNext ) if ( pNode->uTruth == p->puCanons[pNode->uTruth] ) Rwr_NodePrint( pFile, p, pNode ); } fclose( pFile ); } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END