/**CFile**************************************************************** FileName [cutSeq.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [K-feasible cut computation package.] Synopsis [Sequential cut computation.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 20, 2005.] Revision [$Id: cutSeq.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] ***********************************************************************/ #include "cutInt.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Shifts all cut leaves of the node by the given number of latches.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline void Cut_NodeShiftCutLeaves( Cut_Cut_t * pList, int nLat ) { Cut_Cut_t * pTemp; int i; // shift the cuts by as many latches Cut_ListForEachCut( pList, pTemp ) { pTemp->uSign = 0; for ( i = 0; i < (int)pTemp->nLeaves; i++ ) { pTemp->pLeaves[i] += nLat; pTemp->uSign |= Cut_NodeSign( pTemp->pLeaves[i] ); } } } /**Function************************************************************* Synopsis [Computes sequential cuts for the node from its fanins.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Cut_NodeComputeCutsSeq( Cut_Man_t * p, int Node, int Node0, int Node1, int fCompl0, int fCompl1, int nLat0, int nLat1, int fTriv, int CutSetNum ) { Cut_List_t Super, * pSuper = &Super; Cut_Cut_t * pListNew; abctime clk; // get the number of cuts at the node p->nNodeCuts = Cut_CutCountList( Cut_NodeReadCutsOld(p, Node) ); if ( p->nNodeCuts >= p->pParams->nKeepMax ) return; // count only the first visit if ( p->nNodeCuts == 0 ) p->nNodes++; // store the fanin lists p->pStore0[0] = Cut_NodeReadCutsOld( p, Node0 ); p->pStore0[1] = Cut_NodeReadCutsNew( p, Node0 ); p->pStore1[0] = Cut_NodeReadCutsOld( p, Node1 ); p->pStore1[1] = Cut_NodeReadCutsNew( p, Node1 ); // duplicate the cut lists if fanin nodes are non-standard if ( Node == Node0 || Node == Node1 || Node0 == Node1 ) { p->pStore0[0] = Cut_CutDupList( p, p->pStore0[0] ); p->pStore0[1] = Cut_CutDupList( p, p->pStore0[1] ); p->pStore1[0] = Cut_CutDupList( p, p->pStore1[0] ); p->pStore1[1] = Cut_CutDupList( p, p->pStore1[1] ); } // shift the cuts by as many latches and recompute signatures if ( nLat0 ) Cut_NodeShiftCutLeaves( p->pStore0[0], nLat0 ); if ( nLat0 ) Cut_NodeShiftCutLeaves( p->pStore0[1], nLat0 ); if ( nLat1 ) Cut_NodeShiftCutLeaves( p->pStore1[0], nLat1 ); if ( nLat1 ) Cut_NodeShiftCutLeaves( p->pStore1[1], nLat1 ); // store the original lists for comparison p->pCompareOld = Cut_NodeReadCutsOld( p, Node ); p->pCompareNew = Cut_NodeReadCutsNew( p, Node ); // merge the old and the new clk = Abc_Clock(); Cut_ListStart( pSuper ); Cut_NodeDoComputeCuts( p, pSuper, Node, fCompl0, fCompl1, p->pStore0[0], p->pStore1[1], 0, 0 ); Cut_NodeDoComputeCuts( p, pSuper, Node, fCompl0, fCompl1, p->pStore0[1], p->pStore1[0], 0, 0 ); Cut_NodeDoComputeCuts( p, pSuper, Node, fCompl0, fCompl1, p->pStore0[1], p->pStore1[1], fTriv, 0 ); pListNew = Cut_ListFinish( pSuper ); p->timeMerge += Abc_Clock() - clk; // shift the cuts by as many latches and recompute signatures if ( Node == Node0 || Node == Node1 || Node0 == Node1 ) { Cut_CutRecycleList( p, p->pStore0[0] ); Cut_CutRecycleList( p, p->pStore0[1] ); Cut_CutRecycleList( p, p->pStore1[0] ); Cut_CutRecycleList( p, p->pStore1[1] ); } else { if ( nLat0 ) Cut_NodeShiftCutLeaves( p->pStore0[0], -nLat0 ); if ( nLat0 ) Cut_NodeShiftCutLeaves( p->pStore0[1], -nLat0 ); if ( nLat1 ) Cut_NodeShiftCutLeaves( p->pStore1[0], -nLat1 ); if ( nLat1 ) Cut_NodeShiftCutLeaves( p->pStore1[1], -nLat1 ); } // set the lists at the node if ( CutSetNum >= 0 ) { assert( Cut_NodeReadCutsTemp(p, CutSetNum) == NULL ); Cut_NodeWriteCutsTemp( p, CutSetNum, pListNew ); } else { assert( Cut_NodeReadCutsNew(p, Node) == NULL ); Cut_NodeWriteCutsNew( p, Node, pListNew ); } // mark the node if we exceeded the number of cuts if ( p->nNodeCuts >= p->pParams->nKeepMax ) p->nCutsLimit++; } /**Function************************************************************* Synopsis [Merges the new cuts with the old cuts.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Cut_NodeNewMergeWithOld( Cut_Man_t * p, int Node ) { Cut_Cut_t * pListOld, * pListNew, * pList; // get the new cuts pListNew = Cut_NodeReadCutsNew( p, Node ); if ( pListNew == NULL ) return; Cut_NodeWriteCutsNew( p, Node, NULL ); // get the old cuts pListOld = Cut_NodeReadCutsOld( p, Node ); if ( pListOld == NULL ) { Cut_NodeWriteCutsOld( p, Node, pListNew ); return; } // merge the lists pList = Cut_CutMergeLists( pListOld, pListNew ); Cut_NodeWriteCutsOld( p, Node, pList ); } /**Function************************************************************* Synopsis [Transfers the temporary cuts to be the new cuts.] Description [Returns 1 if something was transferred.] SideEffects [] SeeAlso [] ***********************************************************************/ int Cut_NodeTempTransferToNew( Cut_Man_t * p, int Node, int CutSetNum ) { Cut_Cut_t * pList; pList = Cut_NodeReadCutsTemp( p, CutSetNum ); Cut_NodeWriteCutsTemp( p, CutSetNum, NULL ); Cut_NodeWriteCutsNew( p, Node, pList ); return pList != NULL; } /**Function************************************************************* Synopsis [Transfers the old cuts to be the new cuts.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Cut_NodeOldTransferToNew( Cut_Man_t * p, int Node ) { Cut_Cut_t * pList; pList = Cut_NodeReadCutsOld( p, Node ); Cut_NodeWriteCutsOld( p, Node, NULL ); Cut_NodeWriteCutsNew( p, Node, pList ); // Cut_CutListVerify( pList ); } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END