/**Function************************************************************* Synopsis [Returns the vector of given equivalence class of objects.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Vec_Int_t * Abc_ObjDressClass( Vec_Ptr_t * vRes, Vec_Int_t * vClass2Num, int Class ) { int ClassNumber; assert( Class > 0 ); ClassNumber = Vec_IntEntry( vClass2Num, Class ); assert( ClassNumber != 0 ); if ( ClassNumber > 0 ) return (Vec_Int_t *)Vec_PtrEntry( vRes, ClassNumber ); // previous class // create new class Vec_IntWriteEntry( vClass2Num, Class, Vec_PtrSize(vRes) ); Vec_PtrPush( vRes, Vec_IntAlloc(4) ); return (Vec_Int_t *)Vec_PtrEntryLast( vRes ); }
/**Function************************************************************* Synopsis [Computes truth table of the cut.] Description [The returned pointer should be used immediately.] SideEffects [] SeeAlso [] ***********************************************************************/ unsigned * Aig_ManCutTruth( Aig_Obj_t * pRoot, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vNodes, Vec_Ptr_t * vTruthElem, Vec_Ptr_t * vTruthStore ) { Aig_Obj_t * pObj; int i, nWords; assert( Vec_PtrSize(vLeaves) <= Vec_PtrSize(vTruthElem) ); assert( Vec_PtrSize(vNodes) <= Vec_PtrSize(vTruthStore) ); assert( Vec_PtrSize(vNodes) == 0 || pRoot == Vec_PtrEntryLast(vNodes) ); // assign elementary truth tables Vec_PtrForEachEntry( vLeaves, pObj, i ) pObj->pData = Vec_PtrEntry( vTruthElem, i ); // compute truths for other nodes nWords = Aig_TruthWordNum( Vec_PtrSize(vLeaves) ); Vec_PtrForEachEntry( vNodes, pObj, i ) pObj->pData = Aig_ManCutTruthOne( pObj, Vec_PtrEntry(vTruthStore, i), nWords ); return pRoot->pData; }
ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Returns the wireload model for the given area.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ SC_WireLoad * Abc_SclFindWireLoadModel( SC_Lib * p, float Area ) { SC_WireLoad * pWL = NULL; char * pWLoadUsed = NULL; int i; if ( p->default_wire_load_sel && strlen(p->default_wire_load_sel) ) { SC_WireLoadSel * pWLS = NULL; SC_LibForEachWireLoadSel( p, pWLS, i ) if ( !strcmp(pWLS->pName, p->default_wire_load_sel) ) break; if ( i == Vec_PtrSize(p->vWireLoadSels) ) { Abc_Print( -1, "Cannot find wire load selection model \"%s\".\n", p->default_wire_load_sel ); exit(1); } for ( i = 0; i < Vec_FltSize(pWLS->vAreaFrom); i++) if ( Area >= Vec_FltEntry(pWLS->vAreaFrom, i) && Area < Vec_FltEntry(pWLS->vAreaTo, i) ) { pWLoadUsed = (char *)Vec_PtrEntry(pWLS->vWireLoadModel, i); break; } if ( i == Vec_FltSize(pWLS->vAreaFrom) ) pWLoadUsed = (char *)Vec_PtrEntryLast(pWLS->vWireLoadModel); }
/**Function************************************************************* Synopsis [Returns the number of dangling nodes removed.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Aig_ManPropagateBuffers( Aig_Man_t * p, int fNodesOnly, int fUpdateLevel ) { Aig_Obj_t * pObj; int nSteps; assert( p->pFanData ); for ( nSteps = 0; Vec_PtrSize(p->vBufs) > 0; nSteps++ ) { // get the node with a buffer fanin for ( pObj = Vec_PtrEntryLast(p->vBufs); Aig_ObjIsBuf(pObj); pObj = Aig_ObjFanout0(p, pObj) ); // replace this node by a node without buffer Aig_NodeFixBufferFanins( p, pObj, fNodesOnly, fUpdateLevel ); // stop if a cycle occured if ( nSteps > 1000000 ) { printf( "Error: A cycle is encountered while propagating buffers.\n" ); break; } } return nSteps; }