30static void dfsfast_e_retreat(
Abc_Obj_t *pObj );
31static void dfsfast_r_retreat(
Abc_Obj_t *pObj );
33#define FDIST(xn, xe, yn, ye) (FDATA(xn)->xe##_dist == (FDATA(yn)->ye##_dist + 1))
56 Vec_Ptr_t *vTimeIn, *qn = Vec_PtrAlloc(Abc_NtkObjNum(pNtk));
57 Vec_Int_t *qe = Vec_IntAlloc(Abc_NtkObjNum(pNtk));
62#if !defined(IGNORE_TIMING)
66 vTimeIn =
FDATA(pNext)->vNodes;
68 vTimeIn =
FDATA(pNext)->vNodes = Vec_PtrAlloc(2);
70 Vec_PtrPush(vTimeIn, pObj);
78 memset(Vec_IntArray(
pManMR->vSinkDistHist), 0,
sizeof(
int)*Vec_IntSize(
pManMR->vSinkDistHist));
82 if (Abc_ObjIsPo(pObj) ||
83 Abc_ObjIsLatch(pObj) ||
85 Vec_PtrPush(qn, pObj);
87 FDATA(pObj)->r_dist = 1;
88 }
else if (Abc_ObjIsPi(pObj) ||
90 Vec_PtrPush(qn, pObj);
92 FDATA(pObj)->e_dist = 1;
96 while(qpos < Vec_PtrSize(qn)) {
97 pObj = (
Abc_Obj_t *)Vec_PtrEntry(qn, qpos);
99 end = Vec_IntEntry(qe, qpos);
103 d =
FDATA(pObj)->r_dist;
108 if (!
FDATA(pNext)->e_dist) {
109 FDATA(pNext)->e_dist = d+1;
110 Vec_PtrPush(qn, pNext);
111 Vec_IntPush(qe,
'e');
115 if (!
FDATA(pNext)->e_dist) {
116 FDATA(pNext)->e_dist = d+1;
117 Vec_PtrPush(qn, pNext);
118 Vec_IntPush(qe,
'e');
121 if (d == 1)
continue;
126 if (!
FDATA(pNext)->r_dist && !Abc_ObjIsLatch(pNext)) {
127 FDATA(pNext)->r_dist = d+1;
128 Vec_PtrPush(qn, pNext);
129 Vec_IntPush(qe,
'r');
133#if !defined(IGNORE_TIMING)
136 if (!
FDATA(pNext)->r_dist) {
137 FDATA(pNext)->r_dist = d+1;
138 Vec_PtrPush(qn, pNext);
139 Vec_IntPush(qe,
'r');
146 if (Abc_ObjIsLatch(pObj))
continue;
148 d =
FDATA(pObj)->e_dist;
151 if (!
FDATA(pObj)->r_dist) {
152 FDATA(pObj)->r_dist = d+1;
153 Vec_PtrPush(qn, pObj);
154 Vec_IntPush(qe,
'r');
158 if (!
pManMR->fIsForward) {
160 if (!
FDATA(pNext)->e_dist && !Abc_ObjIsLatch(pNext)) {
161 FDATA(pNext)->e_dist = d+1;
162 Vec_PtrPush(qn, pNext);
163 Vec_IntPush(qe,
'e');
167#if !defined(IGNORE_TIMING)
170 if (!
FDATA(pNext)->e_dist) {
171 FDATA(pNext)->e_dist = d+1;
172 Vec_PtrPush(qn, pNext);
173 Vec_IntPush(qe,
'e');
182#if !defined(IGNORE_TIMING)
185 vTimeIn =
FDATA(pObj)->vNodes;
187 Vec_PtrFree(vTimeIn);
188 FDATA(pObj)->vNodes = 0;
195 Vec_IntAddToEntry(
pManMR->vSinkDistHist,
FDATA(pObj)->r_dist, 1);
196 Vec_IntAddToEntry(
pManMR->vSinkDistHist,
FDATA(pObj)->e_dist, 1);
199 printf(
"node %d\t: r=%d\te=%d\n", Abc_ObjId(pObj),
FDATA(pObj)->r_dist,
FDATA(pObj)->e_dist);
214 if (
pManMR->fSinkDistTerminate)
return 0;
227 printf(
"(%de=%d) ", Abc_ObjId(pObj),
FDATA(pObj)->e_dist);
234 FDIST(pObj, e, pNext, r) &&
236#ifdef DEBUG_PRINT_FLOWS
245 FDIST(pObj, e, pNext, r) &&
247#ifdef DEBUG_PRINT_FLOWS
254 if (Abc_ObjIsLatch(pObj))
258 if (!
pManMR->fIsForward) {
261 FDIST(pObj, e, pNext, e) &&
263#ifdef DEBUG_PRINT_FLOWS
271#if !defined(IGNORE_TIMING)
275 FDIST(pObj, e, pNext, e) &&
277#ifdef DEBUG_PRINT_FLOWS
289 FDIST(pObj, e, pObj, r) &&
293 FSETPRED(pObj, NULL);
294#ifdef DEBUG_PRINT_FLOWS
302 dfsfast_e_retreat(pObj);
306#ifdef DEBUG_PRINT_FLOWS
307 printf(
"%d ", Abc_ObjId(pObj));
317 if (
pManMR->fSinkDistTerminate)
return 0;
320 printf(
"(%dr=%d) ", Abc_ObjId(pObj),
FDATA(pObj)->r_dist);
324 if (Abc_ObjIsLatch(pObj) ||
325 (
pManMR->fIsForward && Abc_ObjIsPo(pObj)) ||
335 pOldPred = FGETPRED(pObj);
338 FDIST(pObj, r, pOldPred, e) &&
341 FSETPRED(pObj, pPred);
343#ifdef DEBUG_PRINT_FLOWS
352 FDIST(pObj, r, pObj, e) &&
356 FSETPRED(pObj, pPred);
358#ifdef DEBUG_PRINT_FLOWS
369 FDIST(pObj, r, pNext, r) &&
370 !Abc_ObjIsLatch(pNext) &&
372#ifdef DEBUG_PRINT_FLOWS
380#if !defined(IGNORE_TIMING)
384 FDIST(pObj, r, pNext, r) &&
386#ifdef DEBUG_PRINT_FLOWS
396 dfsfast_r_retreat(pObj);
400#ifdef DEBUG_PRINT_FLOWS
401 printf(
"%d ", Abc_ObjId(pObj));
411 int old_dist =
FDATA(pObj)->e_dist;
417 adj_dist =
FDATA(pNext)->r_dist;
418 if (adj_dist) min_dist =
MIN(min_dist, adj_dist);
422 adj_dist =
FDATA(pNext)->r_dist;
423 if (adj_dist) min_dist =
MIN(min_dist, adj_dist);
426 if (Abc_ObjIsLatch(pObj))
goto update;
430 adj_dist =
FDATA(pObj)->r_dist;
431 if (adj_dist) min_dist =
MIN(min_dist, adj_dist);
435 if (!
pManMR->fIsForward) {
437 adj_dist =
FDATA(pNext)->e_dist;
438 if (adj_dist) min_dist =
MIN(min_dist, adj_dist);
442#if !defined(IGNORE_TIMING)
445 adj_dist =
FDATA(pNext)->e_dist;
446 if (adj_dist) min_dist =
MIN(min_dist, adj_dist);
453 if (min_dist >=
MAX_DIST) min_dist = 0;
455 FDATA(pObj)->e_dist = min_dist;
458 h = Vec_IntArray(
pManMR->vSinkDistHist);
462 pManMR->fSinkDistTerminate = 1;
470 int old_dist =
FDATA(pObj)->r_dist;
475 if (FGETPRED(pObj)) {
476 adj_dist =
FDATA(FGETPRED(pObj))->e_dist;
477 if (adj_dist) min_dist =
MIN(min_dist, adj_dist);
480 adj_dist =
FDATA(pObj)->e_dist;
481 if (adj_dist) min_dist =
MIN(min_dist, adj_dist);
487 if (!Abc_ObjIsLatch(pNext)) {
488 adj_dist =
FDATA(pNext)->r_dist;
489 if (adj_dist) min_dist =
MIN(min_dist, adj_dist);
493#if !defined(IGNORE_TIMING)
496 adj_dist =
FDATA(pNext)->r_dist;
497 if (adj_dist) min_dist =
MIN(min_dist, adj_dist);
503 if (min_dist >=
MAX_DIST) min_dist = 0;
505 FDATA(pObj)->r_dist = min_dist;
508 h = Vec_IntArray(
pManMR->vSinkDistHist);
512 pManMR->fSinkDistTerminate = 1;
548#ifdef DEBUG_PRINT_FLOWS
558#ifdef DEBUG_PRINT_FLOWS
565 if (Abc_ObjIsLatch(pObj))
569 if (!
pManMR->fIsForward) {
573#ifdef DEBUG_PRINT_FLOWS
581#if !defined(IGNORE_TIMING)
586#ifdef DEBUG_PRINT_FLOWS
600 FSETPRED(pObj, NULL);
601#ifdef DEBUG_PRINT_FLOWS
610#ifdef DEBUG_PRINT_FLOWS
611 printf(
"%d ", Abc_ObjId(pObj));
622 if (Abc_ObjIsLatch(pObj) ||
623 (
pManMR->fIsForward && Abc_ObjIsPo(pObj)) ||
635 pOldPred = FGETPRED(pObj);
640 FSETPRED(pObj, pPred);
642#ifdef DEBUG_PRINT_FLOWS
654 FSETPRED(pObj, pPred);
656#ifdef DEBUG_PRINT_FLOWS
667 !Abc_ObjIsLatch(pNext) &&
669#ifdef DEBUG_PRINT_FLOWS
677#if !defined(IGNORE_TIMING)
682#ifdef DEBUG_PRINT_FLOWS
694#ifdef DEBUG_PRINT_FLOWS
695 printf(
"%d ", Abc_ObjId(pObj));
struct Abc_Obj_t_ Abc_Obj_t
#define Abc_NtkForEachObj(pNtk, pObj, i)
ITERATORS ///.
#define Abc_ObjForEachFanin(pObj, pFanin, i)
#define Abc_ObjForEachFanout(pObj, pFanout, i)
struct Abc_Ntk_t_ Abc_Ntk_t
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define FDIST(xn, xe, yn, ye)
int dfsfast_e(Abc_Obj_t *pObj, Abc_Obj_t *pPred)
int dfsplain_e(Abc_Obj_t *pObj, Abc_Obj_t *pPred)
int dfsplain_r(Abc_Obj_t *pObj, Abc_Obj_t *pPred)
int dfsfast_r(Abc_Obj_t *pObj, Abc_Obj_t *pPred)
void dfsfast_preorder(Abc_Ntk_t *pNtk)
FUNCTION DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.