// pProgress = Bar_ProgressStart( stdout, Aig_ManPoNum(p) ); Aig_ManForEachPo( p, pObj, i ) { // Bar_ProgressUpdate( pProgress, i, NULL ); // get old supports vSup = (Vec_Int_t *)Vec_VecEntry( vSupps, i ); if ( Vec_IntSize(vSup) < 2 ) continue; // compute new supports CountOver = CountQuant = 0; vSupNew = Vec_IntDup( vSup ); // go through the nodes where the first var appears Aig_ManForEachPo( p, pObj, k ) // iVar = Vec_IntEntry( vSup, 0 ); // vSupIn = Vec_VecEntry( vSuppsIn, iVar ); // Vec_IntForEachEntry( vSupIn, Entry, k ) { // pObj = Aig_ManObj( p, Entry ); // get support of this output // vSup2 = (Vec_Int_t *)pObj->pNext; vSup2 = (Vec_Int_t *)Vec_VecEntry( vSupps, k ); // count the number of common vars nCommon = Vec_IntTwoCountCommon(vSup, vSup2); if ( nCommon < 2 ) continue; if ( nCommon > nComLim ) { vSupNew = Vec_IntTwoMerge( vTemp = vSupNew, vSup2 ); Vec_IntFree( vTemp ); CountOver++; } else CountQuant++; }
/**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Sat_ProofResolve( Vec_Vec_t * vClauses, int Result, int Clause1, int Clause2 ) { Vec_Int_t * vResult = Vec_VecEntry( vClauses, Result ); Vec_Int_t * vClause1 = Vec_VecEntry( vClauses, Clause1 ); Vec_Int_t * vClause2 = Vec_VecEntry( vClauses, Clause2 ); int Entry1, Entry2, ResVar; int i, j, Counter = 0; Vec_IntForEachEntry( vClause1, Entry1, i ) Vec_IntForEachEntry( vClause2, Entry2, j ) if ( Entry1 == -Entry2 ) { ResVar = Entry1; Counter++; } if ( Counter != 1 ) { printf( "Error: Clause %d = Resolve(%d, %d): The number of pivot vars is %d.\n", Result, Clause1, Clause2, Counter ); Sat_PrintClause( vClauses, Clause1 ); Sat_PrintClause( vClauses, Clause2 ); return 0; } // create new clause assert( Vec_IntSize(vResult) == 0 ); Vec_IntForEachEntry( vClause1, Entry1, i ) if ( Entry1 != ResVar && Entry1 != -ResVar ) Vec_IntPushUnique( vResult, Entry1 ); assert( Vec_IntSize(vResult) + 1 == Vec_IntSize(vClause1) ); Vec_IntForEachEntry( vClause2, Entry2, i ) if ( Entry2 != ResVar && Entry2 != -ResVar ) Vec_IntPushUnique( vResult, Entry2 ); return 1; }
ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Sat_PrintClause( Vec_Vec_t * vClauses, int Clause ) { Vec_Int_t * vClause; int i, Entry; printf( "Clause %d: {", Clause ); vClause = Vec_VecEntry( vClauses, Clause ); Vec_IntForEachEntry( vClause, Entry, i ) printf( " %d", Entry ); printf( " }\n" ); }
/**Function************************************************************* Synopsis [Prints Eqn formula for the AIG rooted at this node.] Description [The formula is in terms of PIs, which should have their names assigned in pObj->pData fields.] SideEffects [] SeeAlso [] ***********************************************************************/ void Hop_ObjPrintEqn( FILE * pFile, Hop_Obj_t * pObj, Vec_Vec_t * vLevels, int Level ) { Vec_Ptr_t * vSuper; Hop_Obj_t * pFanin; int fCompl, i; // store the complemented attribute fCompl = Hop_IsComplement(pObj); pObj = Hop_Regular(pObj); // constant case if ( Hop_ObjIsConst1(pObj) ) { fprintf( pFile, "%d", !fCompl ); return; } // PI case if ( Hop_ObjIsPi(pObj) ) { fprintf( pFile, "%s%s", fCompl? "!" : "", (char*)pObj->pData ); return; } // AND case Vec_VecExpand( vLevels, Level ); vSuper = Vec_VecEntry(vLevels, Level); Hop_ObjCollectMulti( pObj, vSuper ); fprintf( pFile, "%s", (Level==0? "" : "(") ); Vec_PtrForEachEntry( Hop_Obj_t *, vSuper, pFanin, i ) { Hop_ObjPrintEqn( pFile, Hop_NotCond(pFanin, fCompl), vLevels, Level+1 ); if ( i < Vec_PtrSize(vSuper) - 1 ) fprintf( pFile, " %s ", fCompl? "+" : "*" ); }
ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Fra_ManPartitionTest( Aig_Man_t * p, int nComLim ) { // Bar_Progress_t * pProgress; Vec_Vec_t * vSupps, * vSuppsIn; Vec_Ptr_t * vSuppsNew; Vec_Int_t * vSupNew, * vSup, * vSup2, * vTemp;//, * vSupIn; Vec_Int_t * vOverNew, * vQuantNew; Aig_Obj_t * pObj; int i, k, nCommon, CountOver, CountQuant; int nTotalSupp, nTotalSupp2, Entry, Largest;//, iVar; double Ratio, R; int clk; nTotalSupp = 0; nTotalSupp2 = 0; Ratio = 0.0; // compute supports clk = clock(); vSupps = (Vec_Vec_t *)Aig_ManSupports( p ); ABC_PRT( "Supports", clock() - clk ); // remove last entry Aig_ManForEachPo( p, pObj, i ) { vSup = (Vec_Int_t *)Vec_VecEntry( vSupps, i ); Vec_IntPop( vSup ); // remember support // pObj->pNext = (Aig_Obj_t *)vSup; }
/**Function************************************************************* Synopsis [Checks if all PO fanouts can be gated by this node.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Cgt_ManCheckGateComplete( Aig_Man_t * pAig, Vec_Vec_t * vGatesAll, Aig_Obj_t * pGate, Vec_Ptr_t * vFanout ) { Vec_Ptr_t * vGates; Aig_Obj_t * pObj; int i; Vec_PtrForEachEntry( Aig_Obj_t *, vFanout, pObj, i ) { if ( Saig_ObjIsPo(pAig, pObj) ) return 0; vGates = Vec_VecEntry( vGatesAll, Aig_ObjCioId(pObj) - Saig_ManPoNum(pAig) ); if ( Vec_PtrFind( vGates, pGate ) == -1 ) return 0; } return 1; }
Vec_Ptr_t * Dar_BalanceCone( Aig_Obj_t * pObj, Vec_Vec_t * vStore, int Level ) { Vec_Ptr_t * vNodes; assert( !Aig_IsComplement(pObj) ); assert( Aig_ObjIsNode(pObj) ); // extend the storage if ( Vec_VecSize( vStore ) <= Level ) Vec_VecPush( vStore, Level, 0 ); // get the temporary array of nodes vNodes = Vec_VecEntry( vStore, Level ); Vec_PtrClear( vNodes ); // collect the nodes in the implication supergate Dar_BalanceCone_rec( pObj, pObj, vNodes ); // remove duplicates Dar_BalanceUniqify( pObj, vNodes, Aig_ObjIsExor(pObj) ); return vNodes; }
/**Function************************************************************* Synopsis [Returns 1 if at least one entry has changed.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Lpk_NodeHasChanged( Lpk_Man_t * p, int iNode ) { Vec_Ptr_t * vNodes; Abc_Obj_t * pTemp; int i; vNodes = Vec_VecEntry( p->vVisited, iNode ); if ( Vec_PtrSize(vNodes) == 0 ) return 1; Vec_PtrForEachEntry( Abc_Obj_t *, vNodes, pTemp, i ) { // check if the node has changed pTemp = Abc_NtkObj( p->pNtk, (int)(ABC_PTRUINT_T)pTemp ); if ( pTemp == NULL ) return 1; // check if the number of fanouts has changed // if ( Abc_ObjFanoutNum(pTemp) != (int)Vec_PtrEntry(vNodes, i+1) ) // return 1; i++; }
/**Function************************************************************* Synopsis [Evaluates the cut.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Dec_Graph_t * Rwr_CutEvaluate( Rwr_Man_t * p, Abc_Obj_t * pRoot, Cut_Cut_t * pCut, Vec_Ptr_t * vFaninsCur, int nNodesSaved, int LevelMax, int * pGainBest, int fPlaceEnable ) { Vec_Ptr_t * vSubgraphs; Dec_Graph_t * pGraphBest, * pGraphCur; Rwr_Node_t * pNode, * pFanin; int nNodesAdded, GainBest, i, k; unsigned uTruth; float CostBest;//, CostCur; // find the matching class of subgraphs uTruth = 0xFFFF & *Cut_CutReadTruth(pCut); vSubgraphs = Vec_VecEntry( p->vClasses, p->pMap[uTruth] ); p->nSubgraphs += vSubgraphs->nSize; // determine the best subgraph GainBest = -1; CostBest = ABC_INFINITY; Vec_PtrForEachEntry( vSubgraphs, pNode, i ) { // get the current graph pGraphCur = (Dec_Graph_t *)pNode->pNext; // copy the leaves Vec_PtrForEachEntry( vFaninsCur, pFanin, k ) Dec_GraphNode(pGraphCur, k)->pFunc = pFanin; // detect how many unlabeled nodes will be reused nNodesAdded = Dec_GraphToNetworkCount( pRoot, pGraphCur, nNodesSaved, LevelMax ); if ( nNodesAdded == -1 ) continue; assert( nNodesSaved >= nNodesAdded ); /* // evaluate the cut if ( fPlaceEnable ) { extern float Abc_PlaceEvaluateCut( Abc_Obj_t * pRoot, Vec_Ptr_t * vFanins ); float Alpha = 0.5; // ??? float PlaceCost; // get the placement cost of the cut PlaceCost = Abc_PlaceEvaluateCut( pRoot, vFaninsCur ); // get the weigted cost of the cut CostCur = nNodesSaved - nNodesAdded + Alpha * PlaceCost; // do not allow uphill moves if ( nNodesSaved - nNodesAdded < 0 ) continue; // decide what cut to use if ( CostBest > CostCur ) { GainBest = nNodesSaved - nNodesAdded; // pure node cost CostBest = CostCur; // cost with placement pGraphBest = pGraphCur; // subgraph to be used for rewriting // score the graph if ( nNodesSaved - nNodesAdded > 0 ) { pNode->nScore++; pNode->nGain += GainBest; pNode->nAdded += nNodesAdded; } } } else */ { // count the gain at this node if ( GainBest < nNodesSaved - nNodesAdded ) { GainBest = nNodesSaved - nNodesAdded; pGraphBest = pGraphCur; // score the graph if ( nNodesSaved - nNodesAdded > 0 ) { pNode->nScore++; pNode->nGain += GainBest; pNode->nAdded += nNodesAdded; } } } }
/**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Sat_ProofChecker( char * pFileName ) { FILE * pFile; Vec_Vec_t * vClauses; int c, i, Num, RetValue, Counter, Counter2, Clause1, Clause2; int RetValue; // open the file pFile = fopen( pFileName, "r" ); if ( pFile == NULL ) return; // count the number of clauses Counter = Counter2 = 0; while ( (c = fgetc(pFile)) != EOF ) { Counter += (c == '\n'); Counter2 += (c == '*'); } vClauses = Vec_VecStart( Counter+1 ); printf( "The proof contains %d roots and %d resolution steps.\n", Counter-Counter2, Counter2 ); // read the clauses rewind( pFile ); for ( i = 1 ; ; i++ ) { RetValue = RetValue = fscanf( pFile, "%d", &Num ); if ( RetValue != 1 ) break; assert( Num == i ); while ( (c = fgetc( pFile )) == ' ' ); if ( c == '*' ) { RetValue = fscanf( pFile, "%d %d", &Clause1, &Clause2 ); assert( RetValue == 2 ); RetValue = fscanf( pFile, "%d", &Num ); assert( RetValue == 1 ); assert( Num == 0 ); if ( !Sat_ProofResolve( vClauses, i, Clause1, Clause2 ) ) { printf( "Error detected in the resolution proof.\n" ); Vec_VecFree( vClauses ); fclose( pFile ); return; } } else { ungetc( c, pFile ); while ( 1 ) { RetValue = fscanf( pFile, "%d", &Num ); assert( RetValue == 1 ); if ( Num == 0 ) break; Vec_VecPush( vClauses, i, (void *)Num ); } RetValue = fscanf( pFile, "%d", &Num ); assert( RetValue == 1 ); assert( Num == 0 ); } } assert( i-1 == Counter ); if ( Vec_IntSize( Vec_VecEntry(vClauses, Counter) ) != 0 ) printf( "The last clause is not empty.\n" ); else printf( "The empty clause is derived.\n" ); Vec_VecFree( vClauses ); fclose( pFile ); }
Aig_ManForEachPo( p, pObj, i ) { vSup = (Vec_Int_t *)Vec_VecEntry( vSupps, i ); Vec_IntForEachEntry( vSup, Entry, k ) Vec_VecPush( vSuppsIn, Entry, (void *)(ABC_PTRUINT_T)i ); }