/**Function************************************************************* Synopsis [Deallocates the mapping manager.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Map_ManFree( Map_Man_t * p ) { // int i; // for ( i = 0; i < p->vNodesAll->nSize; i++ ) // Map_NodeVecFree( p->vNodesAll->pArray[i]->vFanouts ); // Map_NodeVecFree( p->pConst1->vFanouts ); if ( p->vAnds ) Map_NodeVecFree( p->vAnds ); if ( p->vNodesAll ) Map_NodeVecFree( p->vNodesAll ); if ( p->vNodesTemp ) Map_NodeVecFree( p->vNodesTemp ); if ( p->vMapping ) Map_NodeVecFree( p->vMapping ); if ( p->vVisited ) Map_NodeVecFree( p->vVisited ); if ( p->uCanons ) ABC_FREE( p->uCanons ); if ( p->uPhases ) ABC_FREE( p->uPhases ); if ( p->pCounters ) ABC_FREE( p->pCounters ); Extra_MmFixedStop( p->mmNodes ); Extra_MmFixedStop( p->mmCuts ); ABC_FREE( p->pNodeDelays ); ABC_FREE( p->pInputArrivals ); ABC_FREE( p->pOutputRequireds ); ABC_FREE( p->pInputs ); ABC_FREE( p->pOutputs ); ABC_FREE( p->pBins ); ABC_FREE( p->ppOutputNames ); ABC_FREE( p ); }
/**Function************************************************************* Synopsis [Computes the maximum and minimum levels of the choice nodes.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Map_MappingGetChoiceLevels( Map_Man_t * pMan, Map_Node_t * p1, Map_Node_t * p2, int * pMin, int * pMax ) { Map_NodeVec_t * vNodes; Map_NodeVec_t * vBoundary; Map_Node_t * pNode; int i, Min, Max; vNodes = Map_NodeVecAlloc( 100 ); vBoundary = Map_NodeVecAlloc( 100 ); Map_MappingDfsMarked1_rec( p1, vNodes, 1 ); Map_MappingDfsMarked2_rec( p2, vNodes, vBoundary, 1 ); // clean the marks Min = 100000; Max = -100000; for ( i = 0; i < vBoundary->nSize; i++ ) { pNode = vBoundary->pArray[i]; if ( Min > (int)pNode->Level ) Min = pNode->Level; if ( Max < (int)pNode->Level ) Max = pNode->Level; } Map_NodeVecFree( vBoundary ); for ( i = 0; i < vNodes->nSize; i++ ) { pNode = vNodes->pArray[i]; pNode->fMark0 = pNode->fMark1 = 0; } Map_NodeVecFree( vNodes ); *pMin = Min; *pMax = Max; }
/**Function************************************************************* Synopsis [Verify one useful property.] Description [This procedure verifies one useful property. After the FRAIG construction with choice nodes is over, each primary node should have fanins that are primary nodes. The primary nodes is the one that does not have pNode->pRepr set to point to another node.] SideEffects [] SeeAlso [] ***********************************************************************/ int Map_ManCheckConsistency( Map_Man_t * p ) { Map_Node_t * pNode; Map_NodeVec_t * pVec; int i; pVec = Map_MappingDfs( p, 0 ); for ( i = 0; i < pVec->nSize; i++ ) { pNode = pVec->pArray[i]; if ( Map_NodeIsVar(pNode) ) { if ( pNode->pRepr ) printf( "Primary input %d is a secondary node.\n", pNode->Num ); } else if ( Map_NodeIsConst(pNode) ) { if ( pNode->pRepr ) printf( "Constant 1 %d is a secondary node.\n", pNode->Num ); } else { if ( pNode->pRepr ) printf( "Internal node %d is a secondary node.\n", pNode->Num ); if ( Map_Regular(pNode->p1)->pRepr ) printf( "Internal node %d has first fanin that is a secondary node.\n", pNode->Num ); if ( Map_Regular(pNode->p2)->pRepr ) printf( "Internal node %d has second fanin that is a secondary node.\n", pNode->Num ); } } Map_NodeVecFree( pVec ); return 1; }
/**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ float Map_MappingGetChoiceVolumes( Map_Man_t * pMan, Map_Node_t * p1, Map_Node_t * p2 ) { Map_NodeVec_t * vNodes; Map_Node_t * pNode; int i, nVolumeTotal, nVolumeUnique; vNodes = Map_NodeVecAlloc( 100 ); Map_MappingDfsMarked3_rec( p1, vNodes ); Map_MappingDfsMarked4_rec( p2, vNodes ); // clean the marks nVolumeTotal = nVolumeUnique = 0; for ( i = 0; i < vNodes->nSize; i++ ) { pNode = vNodes->pArray[i]; if ( !Map_NodeIsAnd(pNode) ) continue; nVolumeTotal++; if ( pNode->fMark0 ^ pNode->fMark1 ) nVolumeUnique++; pNode->fMark0 = pNode->fMark1 = 0; } Map_NodeVecFree( vNodes ); // return ((float)nVolumeUnique)/nVolumeTotal; return (float)nVolumeUnique; }
/**Function************************************************************* Synopsis [Computes the maximum and minimum levels of the choice nodes.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Map_MappingCountUsedNodes( Map_Man_t * pMan, int fChoices ) { Map_NodeVec_t * vNodes; int Result; vNodes = Map_MappingDfs( pMan, fChoices ); Result = vNodes->nSize; Map_NodeVecFree( vNodes ); return Result; }