146{
148 int iElem, i, nRegCount, oldPoNum, poSerialNum, iElemHint;
149 int piCopied = 0, liCopied = 0, liCreated = 0, loCopied = 0, loCreated = 0;
150 int poCopied = 0, poCreated = 0;
151 Aig_Obj_t *pObj, *pObjPo, *pObjDriver, *pObjDriverNew, *pObjPendingDriverNew, *pObjPendingAndNextPending;
152 Aig_Obj_t *pPendingFlop, *pHintSignalLo, *pHintMonotoneFlop, *pObjTemp1, *pObjTemp2, *pObjKnownMonotoneAnd;
156
159
160
164
165
166
167
168
169
172 sprintf(pNewAig->pName,
"%s_%s", pAig->pName,
"_monotone");
173 pNewAig->pSpec = NULL;
174
175
176
177
178 pObj = Aig_ManConst1( pAig );
179 pObj->
pData = Aig_ManConst1( pNewAig );
180
181
182
183
185 {
186 piCopied++;
188 }
189
190
191
192
194 {
195 loCopied++;
197 }
198
199
200
201
202 loCreated++;
204
205
206
207
208 vHintMonotoneLocalFlopOutput = Vec_PtrAlloc(Vec_IntSize(vHintMonotoneLocal));
210 {
211 loCreated++;
213 Vec_PtrPush( vHintMonotoneLocalFlopOutput, pHintMonotoneFlop );
214 }
215
216 nRegCount = loCreated + loCopied;
217 printf("\nnRegCount = %d\n", nRegCount);
218
219
220
221
223 {
224 pObj->
pData =
Aig_And( pNewAig, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
225 }
226
227
228
229
230
231 pObjPo = Aig_ManCo( pAig, pendingSignalIndexLocal );
232 pObjDriver = Aig_NotCond((
Aig_Obj_t *)Aig_ObjFanin0(pObjPo), Aig_ObjFaninC0(pObjPo));
233 pObjPendingDriverNew = !Aig_IsComplement(pObjDriver)?
234 (
Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData) :
235 Aig_Not((
Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData));
236
237 pObjPendingAndNextPending =
Aig_And( pNewAig, pObjPendingDriverNew, pPendingFlop );
238
239 oldPoNum = Aig_ManCoNum(pAig) - Aig_ManRegNum(pAig);
240 pObjKnownMonotoneAnd = Aig_ManConst1( pNewAig );
241 #if 1
242 if( vKnownMonotoneLocal )
243 {
245
247 {
248 iElem = (iElemHint - hintSingalBeginningMarkerLocal) + 1 + pendingSignalIndexLocal;
249 printf("\nProcessing knownMonotone = %d\n", iElem);
250 pObjPo = Aig_ManCo( pAig, iElem );
251 pObjDriver = Aig_NotCond((
Aig_Obj_t *)Aig_ObjFanin0(pObjPo), Aig_ObjFaninC0(pObjPo));
252 pObjDriverNew = !Aig_IsComplement(pObjDriver)?
253 (
Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData) :
254 Aig_Not((
Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData));
255 pHintSignalLo = (
Aig_Obj_t *)Vec_PtrEntry(vHintMonotoneLocalFlopOutput, iElem - oldPoNum);
256 pObjTemp1 =
Aig_Or( pNewAig,
Aig_And(pNewAig, pObjDriverNew, pHintSignalLo),
257 Aig_And(pNewAig, Aig_Not(pObjDriverNew), Aig_Not(pHintSignalLo)) );
258
259 pObjKnownMonotoneAnd =
Aig_And( pNewAig, pObjKnownMonotoneAnd, pObjTemp1 );
260 }
261 pObjPendingAndNextPending =
Aig_And( pNewAig, pObjPendingAndNextPending, pObjKnownMonotoneAnd );
262 }
263 #endif
264
265 vHintMonotoneLocalDriverNew = Vec_PtrAlloc(Vec_IntSize(vHintMonotoneLocal));
266 vHintMonotoneLocalProp = Vec_PtrAlloc(Vec_IntSize(vHintMonotoneLocal));
268 {
269 pObjPo = Aig_ManCo( pAig, iElem );
270 pObjDriver = Aig_NotCond((
Aig_Obj_t *)Aig_ObjFanin0(pObjPo), Aig_ObjFaninC0(pObjPo));
271 pObjDriverNew = !Aig_IsComplement(pObjDriver)?
272 (
Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData) :
273 Aig_Not((
Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData));
274
275 if( vKnownMonotoneLocal != NULL && Vec_IntFind( vKnownMonotoneLocal, iElem ) != -1 )
276 {
277 Vec_PtrPush(vHintMonotoneLocalDriverNew, pObjDriverNew);
278 }
279 else
280 {
281 poSerialNum = Vec_IntFind( vHintMonotoneLocal, iElem );
282 pHintSignalLo = (
Aig_Obj_t *)Vec_PtrEntry(vHintMonotoneLocalFlopOutput, poSerialNum );
283 pObjTemp1 =
Aig_And( pNewAig, pObjPendingAndNextPending, pHintSignalLo);
284 pObjTemp2 =
Aig_Or( pNewAig, Aig_Not(pObjTemp1), pObjDriverNew );
285
286
287 Vec_PtrPush(vHintMonotoneLocalDriverNew, pObjDriverNew);
288 Vec_PtrPush(vHintMonotoneLocalProp, pObjTemp2);
289 }
290 }
291
292
293
294
296 {
297 poCopied++;
299 }
300
301 *startMonotonePropPo = i;
303 {
304 poCreated++;
306 }
307
308
309
310
311
313 {
314 liCopied++;
316 }
317
318
319
320
321
322 liCreated++;
324
325
326
327
328
330 {
331 liCreated++;
333 }
334
335 printf("\npoCopied = %d, poCreated = %d\n", poCopied, poCreated);
336 printf("\nliCreated++ = %d\n", liCreated );
339
341 assert( loCopied + loCreated == liCopied + liCreated );
342
343 printf("\nSaig_ManPoNum = %d\n", Saig_ManPoNum(pNewAig));
344 return pNewAig;
345}
#define Aig_ManForEachNode(p, pObj, i)
Aig_Obj_t * Aig_Or(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
int checkSanityOfKnownMonotone(Vec_Int_t *vKnownMonotone, Vec_Int_t *vCandMonotone, Vec_Int_t *vHintMonotone)
#define Saig_ManForEachLi(p, pObj, i)
#define Saig_ManForEachPo(p, pObj, i)
#define Saig_ManForEachLo(p, pObj, i)
#define Saig_ManForEachPi(p, pObj, i)