133 Gia_Obj_t * pFlop, * pObjC, * pObj0, * pObj1, * pNode, * pTemp;
134 int i, k, Ent, * pSets, * pResets, * pEnables;
135 int nHaveSetReset = 0, nHaveEnable = 0;
136 assert( Gia_ManRegNum(
p) > 0 );
140 vSuper = Vec_IntAlloc( 100 );
143 pNode = Gia_ObjFanin0(pFlop);
144 if ( !Gia_ObjIsAnd(pNode) )
148 if ( Gia_ObjFaninC0(pFlop) )
158 pTemp = Gia_ObjRiToRo(
p, pFlop );
159 if ( Gia_Regular(pObj0) != pTemp && Gia_Regular(pObj1) != pTemp )
161 if ( !Gia_ObjFaninC0(pFlop) )
163 pObj0 = Gia_Not(pObj0);
164 pObj1 = Gia_Not(pObj1);
166 if ( Gia_IsComplement(pObjC) )
168 pObjC = Gia_Not(pObjC);
177 pEnables[Gia_ObjId(
p, pObjC)]++;
182 pNode = Gia_ObjFanin0(pFlop);
183 if ( !Gia_ObjIsAnd(pNode) )
188 if ( pSets[Ent] > 1 || pResets[Ent] > 1 )
194 Vec_IntFree( vSuper );
199 printf(
"Flops with set/reset = %6d. Flops with enable = %6d.\n", nHaveSetReset, nHaveEnable );
228 Gia_Obj_t * pFlop, * pObjC, * pObj0, * pObj1, * pNode, * pTemp;
229 int i, k, Ent, * pSets, * pResets, * pEnables;
230 int nHaveSetReset = 0, nHaveEnable = 0;
231 assert( Gia_ManRegNum(
p) > 0 );
235 vSuper = Vec_IntAlloc( 100 );
238 pNode = Gia_ObjFanin0(pFlop);
239 if ( !Gia_ObjIsAnd(pNode) )
243 if ( Gia_ObjFaninC0(pFlop) )
253 pTemp = Gia_ObjRiToRo(
p, pFlop );
254 if ( Gia_Regular(pObj0) != pTemp && Gia_Regular(pObj1) != pTemp )
256 if ( !Gia_ObjFaninC0(pFlop) )
258 pObj0 = Gia_Not(pObj0);
259 pObj1 = Gia_Not(pObj1);
261 if ( Gia_IsComplement(pObjC) )
263 pObjC = Gia_Not(pObjC);
272 pEnables[Gia_ObjId(
p, pObjC)]++;
277 pNode = Gia_ObjFanin0(pFlop);
278 if ( !Gia_ObjIsAnd(pNode) )
283 if ( pSets[Ent] > 1 || pResets[Ent] > 1 )
289 Vec_IntFree( vSuper );
290 vResult = Vec_IntAlloc( 100 );
291 for ( i = 1; i < Gia_ManObjNum(
p); i++ )
292 if ( pSets[i] > nFanMax )
295 printf(
"Adding set signal %d related to %d flops.\n", i, pSets[i] );
296 Vec_IntPushUnique( vResult, i );
298 for ( i = 1; i < Gia_ManObjNum(
p); i++ )
299 if ( pResets[i] > nFanMax )
302 printf(
"Adding reset signal %d related to %d flops.\n", i, pResets[i] );
303 Vec_IntPushUnique( vResult, i );
305 for ( i = 1; i < Gia_ManObjNum(
p); i++ )
306 if ( pEnables[i] > nFanMax )
309 printf(
"Adding enable signal %d related to %d flops.\n", i, pEnables[i] );
310 Vec_IntPushUnique( vResult, i );
365 Vec_IntFill( &
p->vCopies, nFrames * Gia_ManObjNum(
p), -1 );
367 pNew->
pName = Abc_UtilStrsav(
p->pName );
368 pNew->
pSpec = Abc_UtilStrsav(
p->pSpec );
371 Gia_ObjSetCopyF(
p, 0, pObj, 0 );
372 for ( f = 0; f < nFrames; f++ )
374 Gia_ObjSetCopyF(
p, f, Gia_ManConst0(
p), 0 );
376 Gia_ObjSetCopyF(
p, f, pObj, Gia_ManAppendCi(pNew) );
378 Gia_ObjSetCopyF(
p, f, pObj,
Gia_ManHashAnd(pNew, Gia_ObjFanin0CopyF(
p, f, pObj), Gia_ObjFanin1CopyF(
p, f, pObj)) );
380 Gia_ObjSetCopyF(
p, f, pObj, Gia_ObjFanin0CopyF(
p, f, pObj) );
382 Gia_ManAppendCo( pNew, Gia_ObjCopyF(
p, f, pObj) );
383 if ( f == nFrames - 1 )
386 Gia_ObjSetCopyF(
p, f+1, pObjRo, Gia_ObjCopyF(
p, f, pObjRi) );
439 Gia_Obj_t * pTemp, * pObjC, * pObj0, * pObj1, * pFlopIn, * pFlopOut;
443 pNew->
pName = Abc_UtilStrsav(
p->pName );
444 pNew->
pSpec = Abc_UtilStrsav(
p->pSpec );
447 Gia_ManConst0(
p)->Value = 0;
449 pThis->
Value = Gia_ManAppendCi( pNew );
453 pThis->
Value = Gia_ObjFanin0Copy(pThis);
456 pNode = Gia_ObjFanin0(pFlopIn);
459 printf(
"Cannot recognize enable of flop %d.\n", i );
463 pFlopOut = Gia_ObjRiToRo(
p, pFlopIn );
464 if ( Gia_Regular(pObj0) != pFlopOut && Gia_Regular(pObj1) != pFlopOut )
466 printf(
"Cannot recognize self-loop of enable flop %d.\n", i );
469 if ( !Gia_ObjFaninC0(pFlopIn) )
471 pObj0 = Gia_Not(pObj0);
472 pObj1 = Gia_Not(pObj1);
474 if ( Gia_IsComplement(pObjC) )
476 pObjC = Gia_Not(pObjC);
481 if ( Gia_Regular(pObj0) == pFlopOut )
485 pFlopIn->
Value = Abc_LitNotCond(Gia_Regular(pObj1)->Value, !Gia_IsComplement(pObj1));
487 else if ( Gia_Regular(pObj1) == pFlopOut )
491 pFlopIn->
Value = Abc_LitNotCond(Gia_Regular(pObj0)->Value, !Gia_IsComplement(pObj0));
495 Gia_ManAppendCo( pNew, pThis->
Value );
519 Gia_Obj_t * pFlopIn, * pFlopOut, * pDriver, * pFan0, * pFan1, * pCtrl = NULL, * pData, * pObj;
520 int i, iClass, fCompl, Counter = 0;
521 vCtrls = Vec_PtrAlloc( 100 );
522 Vec_PtrPush( vCtrls, NULL );
523 vDatas = Vec_PtrAlloc( Gia_ManRegNum(
p) );
524 vFlopClasses = Vec_IntAlloc( Gia_ManRegNum(
p) );
527 fCompl = Gia_ObjFaninC0(pFlopIn);
528 pDriver = Gia_ObjFanin0(pFlopIn);
529 if ( !Gia_ObjIsAnd(pDriver) )
531 printf(
"The flop driver %d is not a node.\n", i );
532 Vec_PtrPush( vDatas, NULL );
533 Vec_IntPush( vFlopClasses, 0 );
537 if ( !Gia_ObjFaninC0(pDriver) || !Gia_ObjFaninC1(pDriver) )
539 printf(
"The flop driver %d is not an OR gate.\n", i );
540 Vec_PtrPush( vDatas, NULL );
541 Vec_IntPush( vFlopClasses, 0 );
545 pFan0 = Gia_ObjFanin0(pDriver);
546 pFan1 = Gia_ObjFanin1(pDriver);
547 if ( !Gia_ObjIsAnd(pFan0) || !Gia_ObjIsAnd(pFan1) )
549 printf(
"The flop driver fanin %d is not a node.\n", i );
550 Vec_PtrPush( vDatas, NULL );
551 Vec_IntPush( vFlopClasses, 0 );
555 pFlopOut = Gia_ObjRiToRo(
p, pFlopIn );
556 pFlopOut = Gia_NotCond( pFlopOut, !fCompl );
557 if ( Gia_ObjChild0(pFan0) != pFlopOut && Gia_ObjChild1(pFan0) != pFlopOut &&
558 Gia_ObjChild0(pFan1) != pFlopOut && Gia_ObjChild1(pFan1) != pFlopOut )
560 printf(
"The flop %d does not have a self-loop.\n", i );
561 Vec_PtrPush( vDatas, NULL );
562 Vec_IntPush( vFlopClasses, 0 );
567 if ( Gia_ObjChild0(pFan0) == pFlopOut )
569 pCtrl = Gia_Not( Gia_ObjChild1(pFan0) );
570 if ( Gia_ObjFanin0(pFan1) == Gia_Regular(pCtrl) )
571 pData = Gia_ObjChild1(pFan1);
573 pData = Gia_ObjChild0(pFan1);
575 else if ( Gia_ObjChild1(pFan0) == pFlopOut )
577 pCtrl = Gia_Not( Gia_ObjChild0(pFan0) );
578 if ( Gia_ObjFanin0(pFan1) == Gia_Regular(pCtrl) )
579 pData = Gia_ObjChild1(pFan1);
581 pData = Gia_ObjChild0(pFan1);
583 else if ( Gia_ObjChild0(pFan1) == pFlopOut )
585 pCtrl = Gia_Not( Gia_ObjChild1(pFan1) );
586 if ( Gia_ObjFanin0(pFan0) == Gia_Regular(pCtrl) )
587 pData = Gia_ObjChild1(pFan0);
589 pData = Gia_ObjChild0(pFan0);
591 else if ( Gia_ObjChild1(pFan1) == pFlopOut )
593 pCtrl = Gia_Not( Gia_ObjChild0(pFan1) );
594 if ( Gia_ObjFanin0(pFan0) == Gia_Regular(pCtrl) )
595 pData = Gia_ObjChild1(pFan0);
597 pData = Gia_ObjChild0(pFan0);
600 if ( Vec_PtrFind( vCtrls, pCtrl ) == -1 )
601 Vec_PtrPush( vCtrls, pCtrl );
602 iClass = Vec_PtrFind( vCtrls, pCtrl );
603 pData = Gia_NotCond( pData, !fCompl );
604 Vec_PtrPush( vDatas, pData );
605 Vec_IntPush( vFlopClasses, iClass );
607 assert( Vec_PtrSize( vDatas ) == Gia_ManRegNum(
p) );
608 assert( Vec_IntSize( vFlopClasses ) == Gia_ManRegNum(
p) );
609 printf(
"Detected %d classes.\n", Vec_PtrSize(vCtrls) - (Counter == 0) );
610 Vec_PtrFree( vCtrls );
614 pNew->
pName = Abc_UtilStrsav(
p->pName );
615 pNew->
pSpec = Abc_UtilStrsav(
p->pSpec );
616 Gia_ManConst0(
p)->Value = 0;
619 if ( Gia_ObjIsAnd(pObj) )
620 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
621 else if ( Gia_ObjIsCi(pObj) )
622 pObj->Value = Gia_ManAppendCi( pNew );
623 else if ( Gia_ObjIsPo(
p, pObj) )
624 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
628 pData = (
Gia_Obj_t *)Vec_PtrEntry(vDatas, i);
630 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
632 pObj->Value = Gia_ManAppendCo( pNew, Abc_LitNotCond(Gia_Regular(pData)->Value, Gia_IsComplement(pData)) );
635 Vec_PtrFree( vDatas );