77 int nCofs, i, k, nSkip;
82 if ( i != k && Aig_Regular((
Aig_Obj_t *)pObj->pCopy) == Aig_Regular((
Aig_Obj_t *)pObj2->pCopy) )
89 vNodes = Vec_PtrAlloc( 100 );
91 Aig_ObjSetTravIdCurrent( pAig, Aig_ManConst1(pAig) );
95 Aig_ObjSetTravIdCurrent( pAig, Aig_Regular(pAnd) );
102 Vec_PtrFree( vNodes );
107 nCofs = (1 << Vec_PtrSize(vTimes));
108 for ( i = 0; i < nCofs; i++ )
113 Aig_Regular(pAnd)->pData = Aig_Regular(pAnd);
118 Aig_Regular(pAnd)->pData = Aig_NotCond( Aig_ManConst1(pAig), ((i & (1<<k)) == 0) );
121 pTemp->
pData =
Aig_And( pAig, Aig_ObjChild0Copy(pTemp), Aig_ObjChild1Copy(pTemp) );
124 ppCofs[i] = Aig_NotCond( (
Aig_Obj_t *)Aig_Regular(pAnd)->pData, Aig_IsComplement(pAnd) );
126 Vec_PtrFree( vNodes );
133 for ( nSkip = (1<<k), i = 0; i < nCofs; i += 2*nSkip )
136 ppCofs[i] =
Aig_Mux( pAig, Aig_Regular(pAnd), ppCofs[i+nSkip], ppCofs[i] );
141 pAnd = Aig_Regular((
Aig_Obj_t *)pNode->pCopy);
142 pTemp = Aig_Regular(ppCofs[0]);
143 if ( Aig_ObjEquiv(pAig, pAnd) == NULL && Aig_ObjEquiv(pAig, pTemp) == NULL && !
Aig_ObjCheckTfi(pAig, pTemp, pAnd) )
144 pAig->pEquivs[pAnd->
Id] = pTemp;
211 float tDelta, tArrival;
212 int i, k, k2, Counter, CounterRes, nTimeCris;
213 unsigned * puTCEdges;
225 tDelta = fUseLutLib ? tArrival*Percentage/100.0 : 1.0;
228 printf(
"Max delay = %.2f. Delta = %.2f. ", tArrival, tDelta );
229 printf(
"Using %s model. ", fUseLutLib?
"LUT library" :
"unit-delay" );
231 printf(
"Percentage = %d. ", Percentage );
235 puTCEdges =
ABC_ALLOC(
unsigned, Nwk_ManObjNumMax(pNtk) );
236 memset( puTCEdges, 0,
sizeof(
unsigned) * Nwk_ManObjNumMax(pNtk) );
239 if ( Nwk_ObjSlack(pNode) >= tDelta )
245 Counter = CounterRes = 0;
249 if ( !Nwk_ObjIsCi(pFanin) && Nwk_ObjSlack(pFanin) < tDelta )
251 CounterRes += Aig_WordCountOnes( puTCEdges[pNode->Id] );
253 printf(
"Edges: Total = %7d. 0-slack = %7d. Critical = %7d. Ratio = %4.2f\n",
259 memset( pAig->pEquivs, 0,
sizeof(
Aig_Obj_t *) * 3 * Aig_ManObjNumMax(pAig) );
262 Counter = CounterRes = 0;
263 vTimeCries = Vec_PtrAlloc( 16 );
264 vTimeFanins = Vec_PtrAlloc( 16 );
267 if ( Nwk_ObjSlack(pNode) >= tDelta )
272 if ( !Nwk_ObjIsCi(pFanin) && (puTCEdges[pNode->Id] & (1<<k)) )
274 if ( !fVeryVerbose && nTimeCris == 0 )
278 Vec_PtrClear( vTimeCries );
282 if ( !Nwk_ObjIsCi(pFanin) && (puTCEdges[pNode->Id] & (1<<k)) )
284 if ( puTCEdges[pFanin->Id] & (1<<k2) )
285 Vec_PtrPushUnique( vTimeCries, pFanin2 );
288 if ( (Vec_PtrSize(vTimeCries) == 0 || Vec_PtrSize(vTimeCries) > Degree) )
292 Vec_PtrClear( vTimeFanins );
295 if ( Nwk_ObjIsCi(pFanin) )
296 Vec_PtrPushUnique( vTimeFanins, pFanin );
299 Vec_PtrPushUnique( vTimeFanins, pFanin2 );
304 printf(
"%5d Node %5d : %d %2d %2d ", Counter, pNode->Id,
305 nTimeCris, Vec_PtrSize(vTimeCries), Vec_PtrSize(vTimeFanins) );
307 printf(
"%d(%.2f)%s ", pFanin->Id, Nwk_ObjSlack(pFanin), (puTCEdges[pNode->Id] & (1<<k))?
"*":
"" );
311 if ( Vec_PtrSize(vTimeCries) == 0 || Vec_PtrSize(vTimeCries) > Degree )
314 if ( Vec_PtrSize(vTimeCries) > 1 )
316 pFanin = (
Nwk_Obj_t *)Vec_PtrEntry( vTimeCries, 0 );
317 pFanin2 = (
Nwk_Obj_t *)Vec_PtrEntry( vTimeCries, 1 );
318 if ( Nwk_ObjSlack(pFanin) < Nwk_ObjSlack(pFanin2) )
320 Vec_PtrWriteEntry( vTimeCries, 0, pFanin2 );
321 Vec_PtrWriteEntry( vTimeCries, 1, pFanin );
324 if ( Vec_PtrSize(vTimeCries) > 2 )
326 pFanin = (
Nwk_Obj_t *)Vec_PtrEntry( vTimeCries, 1 );
327 pFanin2 = (
Nwk_Obj_t *)Vec_PtrEntry( vTimeCries, 2 );
328 if ( Nwk_ObjSlack(pFanin) < Nwk_ObjSlack(pFanin2) )
330 Vec_PtrWriteEntry( vTimeCries, 1, pFanin2 );
331 Vec_PtrWriteEntry( vTimeCries, 2, pFanin );
333 pFanin = (
Nwk_Obj_t *)Vec_PtrEntry( vTimeCries, 0 );
334 pFanin2 = (
Nwk_Obj_t *)Vec_PtrEntry( vTimeCries, 1 );
335 if ( Nwk_ObjSlack(pFanin) < Nwk_ObjSlack(pFanin2) )
337 Vec_PtrWriteEntry( vTimeCries, 0, pFanin2 );
338 Vec_PtrWriteEntry( vTimeCries, 1, pFanin );
344 Vec_PtrFree( vTimeCries );
345 Vec_PtrFree( vTimeFanins );
348 printf(
"Nodes: Total = %7d. 0-slack = %7d. Workable = %7d. Ratio = %4.2f\n",
349 Nwk_ManNodeNum(pNtk), Counter, CounterRes, Counter? 1.0*CounterRes/Counter : 0.0 );
353 if ( Aig_ObjEquiv(pAig, pAnd) )
355 if ( Aig_ObjRefs(Aig_ObjEquiv(pAig, pAnd)) > 0 )
356 pAig->pEquivs[pAnd->
Id] = NULL;