/**CFile**************************************************************** FileName [cnfPost.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [AIG-to-CNF conversion.] Synopsis [] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - April 28, 2007.] Revision [$Id: cnfPost.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] ***********************************************************************/ #include "cnf.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Cnf_ManPostprocess_old( Cnf_Man_t * p ) { // extern int Aig_ManLargeCutEval( Aig_Man_t * p, Aig_Obj_t * pRoot, Dar_Cut_t * pCutR, Dar_Cut_t * pCutL, int Leaf ); int nNew, Gain, nGain = 0, nVars = 0; Aig_Obj_t * pObj, * pFan; Dar_Cut_t * pCutBest, * pCut; int i, k;//, a, b, Counter; Aig_ManForEachObj( p->pManAig, pObj, i ) { if ( !Aig_ObjIsNode(pObj) ) continue; if ( pObj->nRefs == 0 ) continue; // pCutBest = Aig_ObjBestCut(pObj); pCutBest = NULL; Dar_CutForEachLeaf( p->pManAig, pCutBest, pFan, k ) { if ( !Aig_ObjIsNode(pFan) ) continue; assert( pFan->nRefs != 0 ); if ( pFan->nRefs != 1 ) continue; // pCut = Aig_ObjBestCut(pFan); pCut = NULL; /* // find how many common variable they have Counter = 0; for ( a = 0; a < (int)pCut->nLeaves; a++ ) { for ( b = 0; b < (int)pCutBest->nLeaves; b++ ) if ( pCut->pLeaves[a] == pCutBest->pLeaves[b] ) break; if ( b == (int)pCutBest->nLeaves ) continue; Counter++; } printf( "%d ", Counter ); */ // find the new truth table after collapsing these two cuts // nNew = Aig_ManLargeCutEval( p->pManAig, pObj, pCutBest, pCut, pFan->Id ); nNew = 0; // printf( "%d+%d=%d:%d(%d) ", pCutBest->Cost, pCut->Cost, // pCutBest->Cost+pCut->Cost, nNew, pCutBest->Cost+pCut->Cost-nNew ); Gain = pCutBest->Value + pCut->Value - nNew; if ( Gain > 0 ) { nGain += Gain; nVars++; } } } printf( "Total gain = %d. Vars = %d.\n", nGain, nVars ); } /**Function************************************************************* Synopsis [Transfers cuts of the mapped nodes into internal representation.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Cnf_ManTransferCuts( Cnf_Man_t * p ) { Aig_Obj_t * pObj; int i; Aig_MmFlexRestart( p->pMemCuts ); Aig_ManForEachObj( p->pManAig, pObj, i ) { if ( Aig_ObjIsNode(pObj) && pObj->nRefs > 0 ) pObj->pData = Cnf_CutCreate( p, pObj ); else pObj->pData = NULL; } } /**Function************************************************************* Synopsis [Transfers cuts of the mapped nodes into internal representation.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Cnf_ManFreeCuts( Cnf_Man_t * p ) { Aig_Obj_t * pObj; int i; Aig_ManForEachObj( p->pManAig, pObj, i ) if ( pObj->pData ) { Cnf_CutFree( (Cnf_Cut_t *)pObj->pData ); pObj->pData = NULL; } } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Cnf_ManPostprocess( Cnf_Man_t * p ) { Cnf_Cut_t * pCut, * pCutFan, * pCutRes; Aig_Obj_t * pObj, * pFan; int Order[16], Costs[16]; int i, k, fChanges; Aig_ManForEachNode( p->pManAig, pObj, i ) { if ( pObj->nRefs == 0 ) continue; pCut = Cnf_ObjBestCut(pObj); // sort fanins according to their size Cnf_CutForEachLeaf( p->pManAig, pCut, pFan, k ) { Order[k] = k; Costs[k] = Aig_ObjIsNode(pFan)? Cnf_ObjBestCut(pFan)->Cost : 0; } // sort the cuts by Weight do { int Temp; fChanges = 0; for ( k = 0; k < pCut->nFanins - 1; k++ ) { if ( Costs[Order[k]] <= Costs[Order[k+1]] ) continue; Temp = Order[k]; Order[k] = Order[k+1]; Order[k+1] = Temp; fChanges = 1; } } while ( fChanges ); // Cnf_CutForEachLeaf( p->pManAig, pCut, pFan, k ) for ( k = 0; (k < (int)(pCut)->nFanins) && ((pFan) = Aig_ManObj(p->pManAig, (pCut)->pFanins[Order[k]])); k++ ) { if ( !Aig_ObjIsNode(pFan) ) continue; assert( pFan->nRefs != 0 ); if ( pFan->nRefs != 1 ) continue; pCutFan = Cnf_ObjBestCut(pFan); // try composing these two cuts // Cnf_CutPrint( pCut ); pCutRes = Cnf_CutCompose( p, pCut, pCutFan, pFan->Id ); // Cnf_CutPrint( pCut ); // printf( "\n" ); // check if the cost if reduced if ( pCutRes == NULL || pCutRes->Cost == 127 || pCutRes->Cost > pCut->Cost + pCutFan->Cost ) { if ( pCutRes ) Cnf_CutFree( pCutRes ); continue; } // update the cut Cnf_ObjSetBestCut( pObj, pCutRes ); Cnf_ObjSetBestCut( pFan, NULL ); Cnf_CutUpdateRefs( p, pCut, pCutFan, pCutRes ); assert( pFan->nRefs == 0 ); Cnf_CutFree( pCut ); Cnf_CutFree( pCutFan ); break; } } } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END