FUNCTION DEFINITIONS ///.
Description [Uses sink-distance-histogram heuristic. May not find all flow paths: this occurs in a small number of cases where the flow predecessor points to a non-adjacent node and the distance ordering is perturbed.]
54 {
56 Vec_Ptr_t *vTimeIn, *qn = Vec_PtrAlloc(Abc_NtkObjNum(pNtk));
57 Vec_Int_t *qe = Vec_IntAlloc(Abc_NtkObjNum(pNtk));
58 int i, j, d = 0, end;
59 int qpos = 0;
60
61
62#if !defined(IGNORE_TIMING)
66 vTimeIn =
FDATA(pNext)->vNodes;
67 if (!vTimeIn) {
68 vTimeIn =
FDATA(pNext)->vNodes = Vec_PtrAlloc(2);
69 }
70 Vec_PtrPush(vTimeIn, pObj);
71 }
72 }
73 }
74#endif
75
76
78 memset(Vec_IntArray(
pManMR->vSinkDistHist), 0,
sizeof(
int)*Vec_IntSize(
pManMR->vSinkDistHist));
79
80
82 if (Abc_ObjIsPo(pObj) ||
83 Abc_ObjIsLatch(pObj) ||
85 Vec_PtrPush(qn, pObj);
86 Vec_IntPush(qe, 'r');
87 FDATA(pObj)->r_dist = 1;
88 } else if (Abc_ObjIsPi(pObj) ||
90 Vec_PtrPush(qn, pObj);
91 Vec_IntPush(qe, 'e');
92 FDATA(pObj)->e_dist = 1;
93 }
94
95
96 while(qpos < Vec_PtrSize(qn)) {
97 pObj = (
Abc_Obj_t *)Vec_PtrEntry(qn, qpos);
99 end = Vec_IntEntry(qe, qpos);
100 qpos++;
101
102 if (end == 'r') {
103 d =
FDATA(pObj)->r_dist;
104
105
108 if (!
FDATA(pNext)->e_dist) {
109 FDATA(pNext)->e_dist = d+1;
110 Vec_PtrPush(qn, pNext);
111 Vec_IntPush(qe, 'e');
112 }
113 } else
115 if (!
FDATA(pNext)->e_dist) {
116 FDATA(pNext)->e_dist = d+1;
117 Vec_PtrPush(qn, pNext);
118 Vec_IntPush(qe, 'e');
119 }
120
121 if (d == 1) continue;
122
123
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');
130 }
131
132
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');
140 }
141 }
142#endif
143 }
144
145 } else {
146 if (Abc_ObjIsLatch(pObj)) continue;
147
148 d =
FDATA(pObj)->e_dist;
149
150
151 if (!
FDATA(pObj)->r_dist) {
152 FDATA(pObj)->r_dist = d+1;
153 Vec_PtrPush(qn, pObj);
154 Vec_IntPush(qe, 'r');
155 }
156
157
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');
164 }
165
166
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');
174 }
175 }
176#endif
177 }
178 }
179 }
180
181
182#if !defined(IGNORE_TIMING)
185 vTimeIn =
FDATA(pObj)->vNodes;
186 if (vTimeIn) {
187 Vec_PtrFree(vTimeIn);
188 FDATA(pObj)->vNodes = 0;
189 }
190 }
191 }
192#endif
193
195 Vec_IntAddToEntry(
pManMR->vSinkDistHist,
FDATA(pObj)->r_dist, 1);
196 Vec_IntAddToEntry(
pManMR->vSinkDistHist,
FDATA(pObj)->e_dist, 1);
197
198#ifdef DEBUG_PREORDER
199 printf(
"node %d\t: r=%d\te=%d\n", Abc_ObjId(pObj),
FDATA(pObj)->r_dist,
FDATA(pObj)->e_dist);
200#endif
201 }
202
203
204
205
206 Vec_PtrFree( qn );
207 Vec_IntFree( qe );
208}
#define Abc_NtkForEachObj(pNtk, pObj, i)
ITERATORS ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.