141 int index, oldIndex, originalLatchNum = Saig_ManRegNum(pAigOld), strMatch, i;
142 char *dummyStr = (
char *)
malloc(
sizeof(
char) * 50 );
144 assert( Saig_ObjIsLo( pAigNew, pObjPivot ) );
146 if(
pObj == pObjPivot )
148 if( index < originalLatchNum )
150 oldIndex = Saig_ManPiNum( pAigOld ) + index;
151 pObjOld = Aig_ManCi( pAigOld, oldIndex );
152 pNode = Abc_NtkCi( pNtkOld, oldIndex );
156 else if( index == originalLatchNum )
158 else if( index > originalLatchNum && index < 2 * originalLatchNum + 1 )
160 oldIndex = Saig_ManPiNum( pAigOld ) + index - originalLatchNum - 1;
161 pObjOld = Aig_ManCi( pAigOld, oldIndex );
162 pNode = Abc_NtkCi( pNtkOld, oldIndex );
166 else if( index >= 2 * originalLatchNum + 1 && index < 2 * originalLatchNum + 1 + Vec_PtrSize( vLive ) )
168 oldIndex = index - 2 * originalLatchNum - 1;
173 pNode = Abc_NtkPo( pNtkOld, i );
175 if( nodeName_starts_with( pNode,
"assert_fair" ) )
177 if( strMatch == oldIndex )
187 assert( dummyStr[0] !=
'\0' );
190 else if( index >= 2 * originalLatchNum + 1 + Vec_PtrSize( vLive ) && index < 2 * originalLatchNum + 1 + Vec_PtrSize( vLive ) + Vec_PtrSize( vFair ) )
192 oldIndex = index - 2 * originalLatchNum - 1 - Vec_PtrSize( vLive );
197 pNode = Abc_NtkPo( pNtkOld, i );
199 if( nodeName_starts_with( pNode,
"assume_fair" ) )
201 if( strMatch == oldIndex )
211 assert( dummyStr[0] !=
'\0' );
250 Aig_Obj_t *pObjSavedLo = NULL, *pObjSavedLi = NULL;
252 Aig_Obj_t *pObjSaveOrSaved = NULL, *pObjSaveAndNotSaved = NULL, *pObjSavedLoAndEquality;
253 Aig_Obj_t *pObjShadowLo, *pObjShadowLi, *pObjShadowLiDriver;
254 Aig_Obj_t *pObjXor, *pObjXnor, *pObjAndAcc;
255 Aig_Obj_t *pObjLive, *pObjFair, *pObjSafetyGate;
256 Aig_Obj_t *pObjSafetyPropertyOutput = NULL;
257 Aig_Obj_t *pObjOriginalSafetyPropertyOutput;
258 Aig_Obj_t *pDriverImage, *pArgument, *collectiveAssertSafety, *collectiveAssumeSafety;
260 int piCopied = 0, liCopied = 0, loCopied = 0, liCreated = 0, loCreated = 0, liveLatch = 0, fairLatch = 0;
262 vecPis = Vec_PtrAlloc( Saig_ManPiNum(
p ) + 1);
263 vecPiNames = Vec_PtrAlloc( Saig_ManPiNum(
p ) + 1);
265 vecLos = Vec_PtrAlloc( Saig_ManRegNum(
p )*2 + 1 + Vec_PtrSize( vLive ) + Vec_PtrSize( vFair ) );
266 vecLoNames = Vec_PtrAlloc( Saig_ManRegNum(
p )*2 + 1 + Vec_PtrSize( vLive ) + Vec_PtrSize( vFair ) );
281 pObj = Aig_ManConst1(
p );
292 nodeName = Abc_UtilStrsav(
Abc_ObjName( Abc_NtkPi( pNtk, i ) ));
302 nodeName =
"SAVE_BIERE",
314 nodeName = Abc_UtilStrsav(
Abc_ObjName( Abc_NtkCi( pNtk, Abc_NtkPiNum(pNtk) + i ) ));
325 Vec_PtrPush(
vecLos, pObjSavedLo );
326 nodeName =
"SAVED_LO";
335 pObjSaveOrSaved =
Aig_Or( pNew, pObjSavePi, pObjSavedLo );
336 pObjSaveAndNotSaved =
Aig_And( pNew, pObjSavePi, Aig_Not(pObjSavedLo) );
355 if( Vec_PtrSize( vAssertSafety ) != 0 && Vec_PtrSize( vAssumeSafety ) == 0 )
357 pObjAndAcc = Aig_ManConst1( pNew );
360 pArgument = Aig_NotCond( (
Aig_Obj_t *)Aig_ObjFanin0(
pObj)->pData, Aig_ObjFaninC0(
pObj ) );
361 pObjAndAcc =
Aig_And( pNew, pArgument, pObjAndAcc );
363 pObjOriginalSafetyPropertyOutput =
Aig_ObjCreateCo( pNew, Aig_Not(pObjAndAcc) );
365 else if( Vec_PtrSize( vAssertSafety ) != 0 && Vec_PtrSize( vAssumeSafety ) != 0 )
367 pObjAndAcc = Aig_ManConst1( pNew );
370 pArgument = Aig_NotCond( (
Aig_Obj_t *)Aig_ObjFanin0(
pObj)->pData, Aig_ObjFaninC0(
pObj ) );
371 pObjAndAcc =
Aig_And( pNew, pArgument, pObjAndAcc );
373 collectiveAssertSafety = pObjAndAcc;
375 pObjAndAcc = Aig_ManConst1( pNew );
378 pArgument = Aig_NotCond( (
Aig_Obj_t *)Aig_ObjFanin0(
pObj)->pData, Aig_ObjFaninC0(
pObj ) );
379 pObjAndAcc =
Aig_And( pNew, pArgument, pObjAndAcc );
381 collectiveAssumeSafety = pObjAndAcc;
382 pObjOriginalSafetyPropertyOutput =
Aig_ObjCreateCo( pNew,
Aig_And( pNew, Aig_Not(collectiveAssertSafety), collectiveAssumeSafety ) );
386 printf(
"WARNING!! No safety property is found, a new (negated) constant 1 output is created\n");
387 pObjOriginalSafetyPropertyOutput =
Aig_ObjCreateCo( pNew, Aig_Not( Aig_ManConst1(pNew) ) );
405 pMatch = Saig_ObjLoToLi(
p,
pObj );
414 #ifndef DUPLICATE_CKT_DEBUG
421 pObjAndAcc = Aig_ManConst1( pNew );
428 #ifdef PROPAGATE_NAMES
429 Vec_PtrPush(
vecLos, pObjShadowLo );
431 sprintf( nodeName,
"%s__%s",
Abc_ObjName( Abc_NtkCi( pNtk, Abc_NtkPiNum(pNtk) + i ) ),
"SHADOW" );
439 loCreated++; liCreated++;
442 pObjXnor = Aig_Not( pObjXor );
444 pObjAndAcc =
Aig_And( pNew, pObjXnor, pObjAndAcc );
448 pObjSavedLoAndEquality =
Aig_And( pNew, pObjSavedLo, pObjAndAcc );
451 pObjAndAcc = Aig_ManConst1( pNew );
452 if( vLive == NULL || Vec_PtrSize( vLive ) == 0 )
454 printf(
"Circuit without any liveness property\n");
461 pDriverImage = Aig_NotCond((
Aig_Obj_t *)Aig_Regular(Aig_ObjChild0(
pObj ))->pData, Aig_ObjFaninC0(
pObj));
464 #ifdef PROPAGATE_NAMES
465 Vec_PtrPush(
vecLos, pObjShadowLo );
471 pObjShadowLiDriver =
Aig_Or( pNew, pObjShadowLo,
Aig_And( pNew, pDriverImage, pObjSaveOrSaved ) );
474 loCreated++; liCreated++;
476 pObjAndAcc =
Aig_And( pNew, pObjShadowLo, pObjAndAcc );
480 pObjLive = pObjAndAcc;
482 pObjAndAcc = Aig_ManConst1( pNew );
483 if( vFair == NULL || Vec_PtrSize( vFair ) == 0 )
484 printf(
"Circuit without any fairness property\n");
490 pDriverImage = Aig_NotCond((
Aig_Obj_t *)Aig_Regular(Aig_ObjChild0(
pObj ))->pData, Aig_ObjFaninC0(
pObj));
493 #ifdef PROPAGATE_NAMES
494 Vec_PtrPush(
vecLos, pObjShadowLo );
500 pObjShadowLiDriver =
Aig_Or( pNew, pObjShadowLo,
Aig_And( pNew, pDriverImage, pObjSaveOrSaved ) );
503 loCreated++; liCreated++;
505 pObjAndAcc =
Aig_And( pNew, pObjShadowLo, pObjAndAcc );
509 pObjFair = pObjAndAcc;
513 pObjSafetyGate =
Aig_And( pNew, pObjSavedLoAndEquality,
Aig_And( pNew, pObjFair, Aig_Not( pObjLive ) ) );
530 assert((
Aig_Obj_t *)Vec_PtrEntry(pNew->vCos, Saig_ManPoNum(pNew)+Aig_ObjCioId(pObjSavedLo)-Saig_ManPiNum(
p)-1) == pObjSavedLi);
531 assert( Saig_ManPiNum(
p ) + 1 == Saig_ManPiNum( pNew ) );
532 assert( Saig_ManRegNum( pNew ) == Saig_ManRegNum(
p ) * 2 + 1 + liveLatch + fairLatch );
546 int i, nRegCount, iEntry;
548 Aig_Obj_t *pObjSavedLi = NULL, *pObjSavedLo = NULL;
550 Aig_Obj_t *pObjSavedLoAndEquality, *pObjSaveOrSaved = NULL, *pObjSaveAndNotSaved = NULL;
551 Aig_Obj_t *pObjShadowLo, *pObjShadowLi, *pObjShadowLiDriver;
552 Aig_Obj_t *pObjXor, *pObjXnor, *pObjAndAcc;
553 Aig_Obj_t *pObjLive, *pObjFair, *pObjSafetyGate;
554 Aig_Obj_t *pObjSafetyPropertyOutput = NULL;
555 Aig_Obj_t *pDriverImage, *pArgument, *collectiveAssertSafety, *collectiveAssumeSafety;
557 int piCopied = 0, liCopied = 0, loCopied = 0, liCreated = 0, loCreated = 0, liveLatch = 0, fairLatch = 0;
559 vecPis = Vec_PtrAlloc( Saig_ManPiNum(
p ) + 1);
560 vecPiNames = Vec_PtrAlloc( Saig_ManPiNum(
p ) + 1);
562 vecLos = Vec_PtrAlloc( Saig_ManRegNum(
p ) + Vec_IntSize( vFlops ) + 1 + Vec_PtrSize( vLive ) + Vec_PtrSize( vFair ) );
563 vecLoNames = Vec_PtrAlloc( Saig_ManRegNum(
p ) + Vec_IntSize( vFlops ) + 1 + Vec_PtrSize( vLive ) + Vec_PtrSize( vFair ) );
578 pObj = Aig_ManConst1(
p );
589 nodeName = Abc_UtilStrsav(
Abc_ObjName( Abc_NtkPi( pNtk, i ) ));
599 nodeName =
"SAVE_BIERE",
611 nodeName = Abc_UtilStrsav(
Abc_ObjName( Abc_NtkCi( pNtk, Abc_NtkPiNum(pNtk) + i ) ));
622 Vec_PtrPush(
vecLos, pObjSavedLo );
623 nodeName =
"SAVED_LO";
632 pObjSaveOrSaved =
Aig_Or( pNew, pObjSavePi, pObjSavedLo );
633 pObjSaveAndNotSaved =
Aig_And( pNew, pObjSavePi, Aig_Not(pObjSavedLo) );
652 if( Vec_PtrSize( vAssertSafety ) != 0 && Vec_PtrSize( vAssumeSafety ) == 0 )
654 pObjAndAcc = Aig_ManConst1( pNew );
657 pArgument = Aig_NotCond( (
Aig_Obj_t *)Aig_ObjFanin0(
pObj)->pData, Aig_ObjFaninC0(
pObj ) );
658 pObjAndAcc =
Aig_And( pNew, pArgument, pObjAndAcc );
662 else if( Vec_PtrSize( vAssertSafety ) != 0 && Vec_PtrSize( vAssumeSafety ) != 0 )
664 pObjAndAcc = Aig_ManConst1( pNew );
667 pArgument = Aig_NotCond( (
Aig_Obj_t *)Aig_ObjFanin0(
pObj)->pData, Aig_ObjFaninC0(
pObj ) );
668 pObjAndAcc =
Aig_And( pNew, pArgument, pObjAndAcc );
670 collectiveAssertSafety = pObjAndAcc;
672 pObjAndAcc = Aig_ManConst1( pNew );
675 pArgument = Aig_NotCond( (
Aig_Obj_t *)Aig_ObjFanin0(
pObj)->pData, Aig_ObjFaninC0(
pObj ) );
676 pObjAndAcc =
Aig_And( pNew, pArgument, pObjAndAcc );
678 collectiveAssumeSafety = pObjAndAcc;
683 printf(
"WARNING!! No safety property is found, a new (negated) constant 1 output is created\n");
702 pMatch = Saig_ObjLoToLi(
p,
pObj );
711 #ifndef DUPLICATE_CKT_DEBUG
718 pObjAndAcc = Aig_ManConst1( pNew );
724 printf(
"Flop[%d] = %s\n", i,
Abc_ObjName( Abc_NtkCi( pNtk, Abc_NtkPiNum(pNtk) + i ) ) );
729 pObj = Aig_ManLo(
p, iEntry );
731 #ifdef PROPAGATE_NAMES
732 Vec_PtrPush(
vecLos, pObjShadowLo );
734 sprintf( nodeName,
"%s__%s",
Abc_ObjName( Abc_NtkCi( pNtk, Abc_NtkPiNum(pNtk) + iEntry ) ),
"SHADOW" );
735 printf(
"Flop copied [%d] = %s\n", iEntry, nodeName );
742 loCreated++; liCreated++;
745 pObjXnor = Aig_Not( pObjXor );
747 pObjAndAcc =
Aig_And( pNew, pObjXnor, pObjAndAcc );
751 pObjSavedLoAndEquality =
Aig_And( pNew, pObjSavedLo, pObjAndAcc );
754 pObjAndAcc = Aig_ManConst1( pNew );
755 if( vLive == NULL || Vec_PtrSize( vLive ) == 0 )
757 printf(
"Circuit without any liveness property\n");
764 pDriverImage = Aig_NotCond((
Aig_Obj_t *)Aig_Regular(Aig_ObjChild0(
pObj ))->pData, Aig_ObjFaninC0(
pObj));
767 #ifdef PROPAGATE_NAMES
768 Vec_PtrPush(
vecLos, pObjShadowLo );
774 pObjShadowLiDriver =
Aig_Or( pNew, pObjShadowLo,
Aig_And( pNew, pDriverImage, pObjSaveOrSaved ) );
777 loCreated++; liCreated++;
779 pObjAndAcc =
Aig_And( pNew, pObjShadowLo, pObjAndAcc );
783 pObjLive = pObjAndAcc;
785 pObjAndAcc = Aig_ManConst1( pNew );
786 if( vFair == NULL || Vec_PtrSize( vFair ) == 0 )
787 printf(
"Circuit without any fairness property\n");
793 pDriverImage = Aig_NotCond((
Aig_Obj_t *)Aig_Regular(Aig_ObjChild0(
pObj ))->pData, Aig_ObjFaninC0(
pObj));
796 #ifdef PROPAGATE_NAMES
797 Vec_PtrPush(
vecLos, pObjShadowLo );
803 pObjShadowLiDriver =
Aig_Or( pNew, pObjShadowLo,
Aig_And( pNew, pDriverImage, pObjSaveOrSaved ) );
806 loCreated++; liCreated++;
808 pObjAndAcc =
Aig_And( pNew, pObjShadowLo, pObjAndAcc );
812 pObjFair = pObjAndAcc;
816 pObjSafetyGate =
Aig_And( pNew, pObjSavedLoAndEquality,
Aig_And( pNew, pObjFair, Aig_Not( pObjLive ) ) );
833 assert((
Aig_Obj_t *)Vec_PtrEntry(pNew->vCos, Saig_ManPoNum(pNew)+Aig_ObjCioId(pObjSavedLo)-Saig_ManPiNum(
p)-1) == pObjSavedLi);
834 assert( Saig_ManPiNum(
p ) + 1 == Saig_ManPiNum( pNew ) );
835 assert( Saig_ManRegNum( pNew ) == Saig_ManRegNum(
p ) + Vec_IntSize( vFlops ) + 1 + liveLatch + fairLatch );
851 Aig_Obj_t *pObjXor, *pObjXnor, *pObjAndAcc, *pObjAndAccDummy;
852 Aig_Obj_t *pObjLive, *pObjFair, *pObjSafetyGate;
853 Aig_Obj_t *pObjSafetyPropertyOutput = NULL;
857 Aig_Obj_t *collectiveAssertSafety, *collectiveAssumeSafety;
860 int piCopied = 0, liCopied = 0, loCopied = 0;
862 if( Aig_ManRegNum(
p ) == 0 )
864 printf(
"The input AIG contains no register, returning the original AIG as it is\n");
868 vecPis = Vec_PtrAlloc( Saig_ManPiNum(
p ) + 1);
869 vecPiNames = Vec_PtrAlloc( Saig_ManPiNum(
p ) + 1);
871 vecLos = Vec_PtrAlloc( Saig_ManRegNum(
p )*2 + 1 + Vec_PtrSize( vLive ) + Vec_PtrSize( vFair ) );
872 vecLoNames = Vec_PtrAlloc( Saig_ManRegNum(
p )*2 + 1 + Vec_PtrSize( vLive ) + Vec_PtrSize( vFair ) );
880 pNew->pName = Abc_UtilStrsav(
"live2safe" );
886 pObj = Aig_ManConst1(
p );
897 nodeName = Abc_UtilStrsav(
Abc_ObjName( Abc_NtkPi( pNtk, i ) ));
907 nodeName =
"SAVE_BIERE",
919 nodeName = Abc_UtilStrsav(
Abc_ObjName( Abc_NtkCi( pNtk, Abc_NtkPiNum(pNtk) + i ) ));
930 Vec_PtrPush(
vecLos, pObjSavedLo );
931 nodeName =
"SAVED_LO";
939 pObjSaveOrSaved =
Aig_Or( pNew, pObjSavePi, pObjSavedLo );
940 pObjSaveAndNotSaved =
Aig_And( pNew, pObjSavePi, Aig_Not(pObjSavedLo) );
963 if( Vec_PtrSize( vAssertSafety ) != 0 && Vec_PtrSize( vAssumeSafety ) == 0 )
969 pArgument = Aig_NotCond( (
Aig_Obj_t *)Aig_ObjFanin0(
pObj)->pData, Aig_ObjFaninC0(
pObj ) );
970 if( pObjAndAcc == NULL )
971 pObjAndAcc = pArgument;
974 pObjAndAccDummy = pObjAndAcc;
975 pObjAndAcc =
Aig_And( pNew, pArgument, pObjAndAccDummy );
980 else if( Vec_PtrSize( vAssertSafety ) != 0 && Vec_PtrSize( vAssumeSafety ) != 0 )
986 pArgument = Aig_NotCond( (
Aig_Obj_t *)Aig_ObjFanin0(
pObj)->pData, Aig_ObjFaninC0(
pObj ) );
987 if( pObjAndAcc == NULL )
988 pObjAndAcc = pArgument;
991 pObjAndAccDummy = pObjAndAcc;
992 pObjAndAcc =
Aig_And( pNew, pArgument, pObjAndAccDummy );
995 collectiveAssertSafety = pObjAndAcc;
1000 pArgument = Aig_NotCond( (
Aig_Obj_t *)Aig_ObjFanin0(
pObj)->pData, Aig_ObjFaninC0(
pObj ) );
1001 if( pObjAndAcc == NULL )
1002 pObjAndAcc = pArgument;
1005 pObjAndAccDummy = pObjAndAcc;
1006 pObjAndAcc =
Aig_And( pNew, pArgument, pObjAndAccDummy );
1009 collectiveAssumeSafety = pObjAndAcc;
1013 printf(
"No safety property is specified, hence no safety gate is created\n");
1032 pMatch = Saig_ObjLoToLi(
p,
pObj );
1057 pObjCorrespondingLi = Saig_ObjLoToLi(
p,
pObj );
1060 pObjXnor = Aig_Not( pObjXor );
1062 if( pObjAndAcc == NULL )
1063 pObjAndAcc = pObjXnor;
1066 pObjAndAccDummy = pObjAndAcc;
1067 pObjAndAcc =
Aig_And( pNew, pObjXnor, pObjAndAccDummy );
1072 pObjSavedLoAndEquality =
Aig_And( pNew, pObjSavePi, pObjAndAcc );
1076 if( vLive == NULL || Vec_PtrSize( vLive ) == 0 )
1077 printf(
"Circuit without any liveness property\n");
1082 pDriverImage = Aig_NotCond((
Aig_Obj_t *)Aig_Regular(Aig_ObjChild0(
pObj ))->pData, Aig_ObjFaninC0(
pObj));
1083 if( pObjAndAcc == NULL )
1084 pObjAndAcc = pDriverImage;
1087 pObjAndAccDummy = pObjAndAcc;
1088 pObjAndAcc =
Aig_And( pNew, pDriverImage, pObjAndAccDummy );
1093 if( pObjAndAcc != NULL )
1094 pObjLive = pObjAndAcc;
1096 pObjLive = Aig_ManConst1( pNew );
1100 if( vFair == NULL || Vec_PtrSize( vFair ) == 0 )
1101 printf(
"Circuit without any fairness property\n");
1106 pDriverImage = Aig_NotCond((
Aig_Obj_t *)Aig_Regular(Aig_ObjChild0(
pObj ))->pData, Aig_ObjFaninC0(
pObj));
1107 if( pObjAndAcc == NULL )
1108 pObjAndAcc = pDriverImage;
1111 pObjAndAccDummy = pObjAndAcc;
1112 pObjAndAcc =
Aig_And( pNew, pDriverImage, pObjAndAccDummy );
1117 if( pObjAndAcc != NULL )
1118 pObjFair = pObjAndAcc;
1120 pObjFair = Aig_ManConst1( pNew );
1122 pObjSafetyGate =
Aig_And( pNew, pObjSavedLoAndEquality,
Aig_And( pNew, pObjFair, Aig_Not( pObjLive ) ) );
1256 FILE * pOut, * pErr;
1257 Abc_Ntk_t * pNtk, * pNtkTemp, *pNtkNew, *pNtkOld;
1260 Vec_Ptr_t * vLive, * vFair, *vAssertSafety, *vAssumeSafety;
1269 assert( directive == -1 );
1280 if( directive == -1 )
1292 if( directive == -1 )
1303 if( directive == -1 )
1323 fprintf( pErr,
"Empty network.\n" );
1326 if( !Abc_NtkIsStrash( pNtk ) )
1328 printf(
"The input network was not strashed, strashing....\n");
1358 if( Aig_ManRegNum(pAigNew) != 0 )
1359 printf(
"A new circuit is produced with\n\t2 POs - one for safety and one for liveness.\n\tone additional input is added (due to Biere's nondeterminism)\n\tshadow flops are not created if the original circuit is combinational\n\tnon-property POs are suppressed\n");
1371 if( Aig_ManRegNum(pAigNew) != 0 )
1372 printf(
"A new circuit is produced with\n\t2 POs - one for safety and one for liveness.\n\tone additional input is added (due to Biere's nondeterminism)\n\tshadow flops are not created\n\tnon-property POs are suppressed\n");
1384 if( Aig_ManRegNum(pAigNew) != 0 )
1385 printf(
"A new circuit is produced with\n\t1 PO - only for safety property; liveness properties are ignored, if any.\n\tno additional input is added (due to Biere's nondeterminism)\n\tshadow flops are not created\n\tnon-property POs are suppressed\n");
1397 if( Aig_ManRegNum(pAigNew) != 0 )
1398 printf(
"A new circuit is produced with\n\t1 PO - only for liveness property; safety properties are ignored, if any.\n\tone additional input is added (due to Biere's nondeterminism)\n\tshadow flops are not created if the original circuit is combinational\n\tnon-property POs are suppressed\n");
1410 if( Aig_ManRegNum(pAigNew) != 0 )
1411 printf(
"New circuit is produced ignoring safety outputs!\nOnly liveness and fairness outputs are considered.\nShadow registers are not created\n");
1420 if( Aig_ManRegNum(pAigNew) != 0 )
1421 printf(
"New circuit is produced considering all safety, liveness and fairness outputs.\nBiere's logic is created\n");
1431 fprintf( pErr,
"Empty network.\n" );
1434 if( !Abc_NtkIsStrash( pNtk ) )
1436 printf(
"The input network was not strashed, strashing....\n");
1460 fprintf( pErr,
"Empty network.\n" );
1463 if( !Abc_NtkIsStrash( pNtk ) )
1465 printf(
"The input network was not strashed, strashing....\n");
1484 if( Aig_ManRegNum(pAigNew) != 0 )
1485 printf(
"New circuit is produced ignoring liveness outputs!\nOnly safety outputs are kept.\nBiere's logic is not created\n");
1491 fprintf( pErr,
"Empty network.\n" );
1495 if( !Abc_NtkIsStrash( pNtk ) )
1497 printf(
"The input network was not strashed, strashing....\n");
1516 if( Aig_ManRegNum(pAigNew) != 0 )
1517 printf(
"New circuit is produced ignoring safety outputs!\nOnly liveness and fairness outputs are considered.\nBiere's logic is created\n");
1528 printf(
"\nDetail statistics*************************************\n");
1529 printf(
"Number of true primary inputs = %d\n", Saig_ManPiNum( pAigNew ));
1530 printf(
"Number of true primary outputs = %d\n", Saig_ManPoNum( pAigNew ));
1531 printf(
"Number of true latch outputs = %d\n", Saig_ManCiNum( pAigNew ) - Saig_ManPiNum( pAigNew ));
1532 printf(
"Number of true latch inputs = %d\n", Saig_ManCoNum( pAigNew ) - Saig_ManPoNum( pAigNew ));
1533 printf(
"Numer of registers = %d\n", Saig_ManRegNum( pAigNew ) );
1534 printf(
"\n*******************************************************\n");
1538 pNtkNew->
pName = Abc_UtilStrsav( pAigNew->pName );
1541 fprintf( stdout,
"Abc_NtkCreateCone(): Network check has failed.\n" );
1547#ifndef DUPLICATE_CKT_DEBUG
1560 fprintf( stdout,
"usage: l2s [-1lsh]\n" );
1561 fprintf( stdout,
"\t performs Armin Biere's live-to-safe transformation\n" );
1562 fprintf( stdout,
"\t-1 : no shadow logic, presume all loops are self loops\n");
1563 fprintf( stdout,
"\t-l : ignore liveness and fairness outputs\n");
1564 fprintf( stdout,
"\t-s : ignore safety assertions and assumptions\n");
1565 fprintf( stdout,
"\t-h : print command usage\n");
1601 FILE * pOut, * pErr;
1602 Abc_Ntk_t * pNtk, * pNtkTemp, *pNtkNew, *pNtkOld;
1605 Vec_Ptr_t * vLive, * vFair, *vAssertSafety, *vAssumeSafety;
1615 assert( directive == -1 );
1626 if( directive == -1 )
1638 if( directive == -1 )
1649 if( directive == -1 )
1669 fprintf( pErr,
"Empty network.\n" );
1672 if( !Abc_NtkIsStrash( pNtk ) )
1674 printf(
"The input network was not strashed, strashing....\n");
1693 vFlops =
prepareFlopVector( pAig, Aig_ManRegNum(pAig)%2 == 0? Aig_ManRegNum(pAig)/2 : (Aig_ManRegNum(pAig)-1)/2);
1708 if( Aig_ManRegNum(pAigNew) != 0 )
1709 printf(
"A new circuit is produced with\n\t2 POs - one for safety and one for liveness.\n\tone additional input is added (due to Biere's nondeterminism)\n\tshadow flops are not created if the original circuit is combinational\n\tnon-property POs are suppressed\n");
1721 if( Aig_ManRegNum(pAigNew) != 0 )
1722 printf(
"A new circuit is produced with\n\t2 POs - one for safety and one for liveness.\n\tone additional input is added (due to Biere's nondeterminism)\n\tshadow flops are not created\n\tnon-property POs are suppressed\n");
1734 if( Aig_ManRegNum(pAigNew) != 0 )
1735 printf(
"A new circuit is produced with\n\t1 PO - only for safety property; liveness properties are ignored, if any.\n\tno additional input is added (due to Biere's nondeterminism)\n\tshadow flops are not created\n\tnon-property POs are suppressed\n");
1747 if( Aig_ManRegNum(pAigNew) != 0 )
1748 printf(
"A new circuit is produced with\n\t1 PO - only for liveness property; safety properties are ignored, if any.\n\tone additional input is added (due to Biere's nondeterminism)\n\tshadow flops are not created if the original circuit is combinational\n\tnon-property POs are suppressed\n");
1760 if( Aig_ManRegNum(pAigNew) != 0 )
1761 printf(
"New circuit is produced ignoring safety outputs!\nOnly liveness and fairness outputs are considered.\nShadow registers are not created\n");
1767 pNtkNew->
pName = Abc_UtilStrsav( pAigNew->pName );
1770 fprintf( stdout,
"Abc_NtkCreateCone(): Network check has failed.\n" );
1776#ifndef DUPLICATE_CKT_DEBUG
1789 fprintf( stdout,
"usage: l2s [-1lsh]\n" );
1790 fprintf( stdout,
"\t performs Armin Biere's live-to-safe transformation\n" );
1791 fprintf( stdout,
"\t-1 : no shadow logic, presume all loops are self loops\n");
1792 fprintf( stdout,
"\t-l : ignore liveness and fairness outputs\n");
1793 fprintf( stdout,
"\t-s : ignore safety assertions and assumptions\n");
1794 fprintf( stdout,
"\t-h : print command usage\n");
1800 int *numLtlProcessed,
Vec_Ptr_t *ltlBuffer )
1803 int i, ii, iii, nRegCount;
1805 Aig_Obj_t *pObjSavedLo = NULL, *pObjSavedLi = NULL;
1807 Aig_Obj_t *pObjSaveOrSaved = NULL, *pObjSaveAndNotSaved = NULL, *pObjSavedLoAndEquality;
1808 Aig_Obj_t *pObjShadowLo, *pObjShadowLi, *pObjShadowLiDriver;
1809 Aig_Obj_t *pObjXor, *pObjXnor, *pObjAndAcc;
1812 Aig_Obj_t *pObjOriginalSafetyPropertyOutput;
1813 Aig_Obj_t *pDriverImage, *pArgument, *collectiveAssertSafety, *collectiveAssumeSafety;
1814 Aig_Obj_t *pNegatedSafetyConjunction = NULL;
1816 char *nodeName, *pFormula;
1817 int piCopied = 0, liCopied = 0, loCopied = 0, liCreated = 0, loCreated = 0, liveLatch = 0;
1818 Vec_Ptr_t *vSignal, *vTopASTNodeArray = NULL;
1820 ltlNode *topNodeOfAST, *tempTopASTNode;
1822 Vec_Ptr_t *vSignalMemory, *vGFFlopMemory, *vPoForLtlProps = NULL;
1825 vecPis = Vec_PtrAlloc( Saig_ManPiNum(
p ) + 1);
1826 vecPiNames = Vec_PtrAlloc( Saig_ManPiNum(
p ) + 1);
1828 vecLos = Vec_PtrAlloc( Saig_ManRegNum(
p )*2 + 1 + Vec_PtrSize( vLive ) + Vec_PtrSize( vFair ) );
1829 vecLoNames = Vec_PtrAlloc( Saig_ManRegNum(
p )*2 + 1 + Vec_PtrSize( vLive ) + Vec_PtrSize( vFair ) );
1838#ifdef MULTIPLE_LTL_FORMULA
1848 *numLtlProcessed = 0;
1853 vecInputLtlFormulae = ltlBuffer;
1855 if( vecInputLtlFormulae )
1857 vTopASTNodeArray = Vec_PtrAlloc( Vec_PtrSize( vecInputLtlFormulae ) );
1863 if( tempTopASTNode )
1865 printf(
"Formula %d: AST is created, ", i+1);
1867 printf(
"Well-formedness check PASSED, ");
1870 printf(
"Well-formedness check FAILED!!\n");
1871 printf(
"AST will be ignored for formula %d, no extra logic will be added for this formula\n", i+1 );
1876 printf(
"Signal check PASSED\n");
1879 printf(
"Signal check FAILED!!");
1880 printf(
"AST will be ignored for formula %d, no extra logic will be added for this formula\n", i+1 );
1884 Vec_PtrPush( vTopASTNodeArray, tempTopASTNode );
1885 (*numLtlProcessed)++;
1888 printf(
"\nNo AST has been created for formula %d, no extra logic will be added\n", i+1 );
1892 if( Vec_PtrSize( vTopASTNodeArray ) == 0 )
1895 printf(
"\nCurrently aborting, need to take care when Vec_PtrSize( vTopASTNodeArray ) == 0\n");
1913 pObj = Aig_ManConst1(
p );
1924 nodeName = Abc_UtilStrsav(
Abc_ObjName( Abc_NtkPi( pNtk, i ) ));
1934 nodeName =
"SAVE_BIERE",
1946 nodeName = Abc_UtilStrsav(
Abc_ObjName( Abc_NtkCi( pNtk, Abc_NtkPiNum(pNtk) + i ) ));
1957 Vec_PtrPush(
vecLos, pObjSavedLo );
1958 nodeName =
"SAVED_LO";
1967 pObjSaveOrSaved =
Aig_Or( pNew, pObjSavePi, pObjSavedLo );
1968 pObjSaveAndNotSaved =
Aig_And( pNew, pObjSavePi, Aig_Not(pObjSavedLo) );
1985 assert( pNegatedSafetyConjunction == NULL );
1988 if( Vec_PtrSize( vAssertSafety ) != 0 && Vec_PtrSize( vAssumeSafety ) == 0 )
1990 pObjAndAcc = Aig_ManConst1( pNew );
1993 pArgument = Aig_NotCond( (
Aig_Obj_t *)Aig_ObjFanin0(
pObj)->pData, Aig_ObjFaninC0(
pObj ) );
1994 pObjAndAcc =
Aig_And( pNew, pArgument, pObjAndAcc );
1996 pNegatedSafetyConjunction = Aig_Not(pObjAndAcc);
1998 pObjOriginalSafetyPropertyOutput =
Aig_ObjCreateCo( pNew, Aig_Not(pObjAndAcc) );
2000 else if( Vec_PtrSize( vAssertSafety ) != 0 && Vec_PtrSize( vAssumeSafety ) != 0 )
2002 pObjAndAcc = Aig_ManConst1( pNew );
2005 pArgument = Aig_NotCond( (
Aig_Obj_t *)Aig_ObjFanin0(
pObj)->pData, Aig_ObjFaninC0(
pObj ) );
2006 pObjAndAcc =
Aig_And( pNew, pArgument, pObjAndAcc );
2008 collectiveAssertSafety = pObjAndAcc;
2010 pObjAndAcc = Aig_ManConst1( pNew );
2013 pArgument = Aig_NotCond( (
Aig_Obj_t *)Aig_ObjFanin0(
pObj)->pData, Aig_ObjFaninC0(
pObj ) );
2014 pObjAndAcc =
Aig_And( pNew, pArgument, pObjAndAcc );
2016 collectiveAssumeSafety = pObjAndAcc;
2017 pNegatedSafetyConjunction =
Aig_And( pNew, Aig_Not(collectiveAssertSafety), collectiveAssumeSafety );
2019 pObjOriginalSafetyPropertyOutput =
Aig_ObjCreateCo( pNew,
Aig_And( pNew, Aig_Not(collectiveAssertSafety), collectiveAssumeSafety ) );
2023 printf(
"WARNING!! No safety property is found, a new (negated) constant 1 output is created\n");
2024 pNegatedSafetyConjunction = Aig_Not( Aig_ManConst1(pNew) );
2026 pObjOriginalSafetyPropertyOutput =
Aig_ObjCreateCo( pNew, Aig_Not( Aig_ManConst1(pNew) ) );
2029 assert( pNegatedSafetyConjunction != NULL );
2037 vPoForLtlProps = Vec_PtrAlloc( Vec_PtrSize( vTopASTNodeArray ) );
2038 if( Vec_PtrSize( vTopASTNodeArray ) )
2043 for( i=0; i<Vec_PtrSize( vTopASTNodeArray ); i++ )
2046 Vec_PtrPush( vPoForLtlProps, pObjSafetyPropertyOutput );
2060 pMatch = Saig_ObjLoToLi(
p,
pObj );
2071 #ifndef DUPLICATE_CKT_DEBUG
2076 pObjAndAcc = Aig_ManConst1( pNew );
2092 #ifdef PROPAGATE_NAMES
2093 Vec_PtrPush(
vecLos, pObjShadowLo );
2095 sprintf( nodeName,
"%s__%s",
Abc_ObjName( Abc_NtkCi( pNtk, Abc_NtkPiNum(pNtk) + i ) ),
"SHADOW" );
2103 loCreated++; liCreated++;
2106 pObjXnor = Aig_Not( pObjXor );
2108 pObjAndAcc =
Aig_And( pNew, pObjXnor, pObjAndAcc );
2113 pObjSavedLoAndEquality =
Aig_And( pNew, pObjSavedLo, pObjAndAcc );
2139 vSignalMemory = Vec_PtrAlloc(10);
2140 vGFFlopMemory = Vec_PtrAlloc(10);
2144 vSignal = Vec_PtrAlloc( 10 );
2145 vAigGFMap = Vec_VecAlloc( 10 );
2173 if( Vec_PtrFind( vSignalMemory,
pObj ) == -1 )
2177 pDriverImage =
pObj;
2179 pObjShadowLiDriver =
Aig_Or( pNew, pObjShadowLo,
Aig_And( pNew, pDriverImage, pObjSaveOrSaved ) );
2183 loCreated++; liCreated++;
2185 Vec_PtrPush( vSignalMemory,
pObj );
2186 Vec_PtrPush( vGFFlopMemory, pObjShadowLo );
2189 #ifdef PROPAGATE_NAMES
2190 Vec_PtrPush(
vecLos, pObjShadowLo );
2193 nodeName = (
char *)
malloc( 20 );
2194 sprintf( nodeName,
"n%d__%s", Aig_ObjId(pObjShadowLo),
"GF_flop" );
2200 pObjShadowLo = (
Aig_Obj_t *)Vec_PtrEntry( vGFFlopMemory, Vec_PtrFind( vSignalMemory,
pObj ) );
2229 pObjSafetyGate =
Aig_And( pNew, pObjSavedLoAndEquality, Aig_Not(pObjLive) );
2230 #ifdef ALLOW_SAFETY_PROPERTIES
2231 printf(
"liveness output is conjoined with safety assertions\n");
2232 pObjSafetyAndLiveToSafety =
Aig_Or( pNew, pObjSafetyGate, pNegatedSafetyConjunction );
2233 pObjSafetyPropertyOutput = (
Aig_Obj_t *)Vec_PtrEntry( vPoForLtlProps, iii );
2236 pObjSafetyPropertyOutput = Vec_PtrEntry( vPoForLtlProps, iii );
2240 Vec_PtrFree( vSignal );
2241 Vec_VecFree( vAigGFMap );
2259 assert((
Aig_Obj_t *)Vec_PtrEntry(pNew->vCos, Saig_ManPoNum(pNew)+Aig_ObjCioId(pObjSavedLo)-Saig_ManPiNum(
p)-1) == pObjSavedLi);
2260 assert( Saig_ManPiNum(
p ) + 1 == Saig_ManPiNum( pNew ) );
2270 FILE * pOut, * pErr;
2271 Abc_Ntk_t * pNtk, * pNtkTemp, *pNtkNew, *pNtkOld;
2274 Vec_Ptr_t * vLive, * vFair, *vAssertSafety, *vAssumeSafety;
2277 int numOfLtlPropOutput;
2286 assert( directive == -1 );
2297 if( directive == -1 )
2309 if( directive == -1 )
2320 if( directive == -1 )
2345 printf(
"\nILLEGAL FLAG: aborting....\n");
2358 fprintf( pErr,
"Empty network.\n" );
2361 if( !Abc_NtkIsStrash( pNtk ) )
2363 printf(
"The input network was not strashed, strashing....\n");
2382 if( pAbc->vLTLProperties_global != NULL )
2383 ltlBuffer = pAbc->vLTLProperties_global;
2391 if( Aig_ManRegNum(pAigNew) != 0 )
2392 printf(
"A new circuit is produced with\n\t%d POs - one for safety and %d for liveness.\n\tone additional input is added (due to Biere's nondeterminism)\n\tshadow flops are not created if the original circuit is combinational\n\tnon-property POs are suppressed\n", numOfLtlPropOutput+1, numOfLtlPropOutput);
2397 if( Aig_ManRegNum(pAigNew) != 0 )
2398 printf(
"A new circuit is produced with\n\t2 POs - one for safety and one for liveness.\n\tone additional input is added (due to Biere's nondeterminism)\n\tshadow flops are not created\n\tnon-property POs are suppressed\n");
2403 assert( numOfLtlPropOutput == 0 );
2404 if( Aig_ManRegNum(pAigNew) != 0 )
2405 printf(
"A new circuit is produced with\n\t1 PO - only for safety property; liveness properties are ignored, if any.\n\tno additional input is added (due to Biere's nondeterminism)\n\tshadow flops are not created\n\tnon-property POs are suppressed\n");
2410 if( Aig_ManRegNum(pAigNew) != 0 )
2411 printf(
"A new circuit is produced with\n\t%d PO - only for liveness property; safety properties are ignored, if any.\n\tone additional input is added (due to Biere's nondeterminism)\n\tshadow flops are not created if the original circuit is combinational\n\tnon-property POs are suppressed\n", numOfLtlPropOutput);
2416 if( Aig_ManRegNum(pAigNew) != 0 )
2417 printf(
"New circuit is produced ignoring safety outputs!\nOnly liveness and fairness outputs are considered.\nShadow registers are not created\n");
2425 if( Aig_ManRegNum(pAigNew) != 0 )
2426 printf(
"New circuit is produced considering all safety, liveness and fairness outputs.\nBiere's logic is created\n");
2436 fprintf( pErr,
"Empty network.\n" );
2439 if( !Abc_NtkIsStrash( pNtk ) )
2441 printf(
"The input network was not strashed, strashing....\n");
2465 fprintf( pErr,
"Empty network.\n" );
2468 if( !Abc_NtkIsStrash( pNtk ) )
2470 printf(
"The input network was not strashed, strashing....\n");
2489 if( Aig_ManRegNum(pAigNew) != 0 )
2490 printf(
"New circuit is produced ignoring liveness outputs!\nOnly safety outputs are kept.\nBiere's logic is not created\n");
2496 fprintf( pErr,
"Empty network.\n" );
2500 if( !Abc_NtkIsStrash( pNtk ) )
2502 printf(
"The input network was not strashed, strashing....\n");
2521 if( Aig_ManRegNum(pAigNew) != 0 )
2522 printf(
"New circuit is produced ignoring safety outputs!\nOnly liveness and fairness outputs are considered.\nBiere's logic is created\n");
2533 printf(
"\nDetail statistics*************************************\n");
2534 printf(
"Number of true primary inputs = %d\n", Saig_ManPiNum( pAigNew ));
2535 printf(
"Number of true primary outputs = %d\n", Saig_ManPoNum( pAigNew ));
2536 printf(
"Number of true latch outputs = %d\n", Saig_ManCiNum( pAigNew ) - Saig_ManPiNum( pAigNew ));
2537 printf(
"Number of true latch inputs = %d\n", Saig_ManCoNum( pAigNew ) - Saig_ManPoNum( pAigNew ));
2538 printf(
"Numer of registers = %d\n", Saig_ManRegNum( pAigNew ) );
2539 printf(
"\n*******************************************************\n");
2543 pNtkNew->
pName = Abc_UtilStrsav( pAigNew->pName );
2546 fprintf( stdout,
"Abc_NtkCreateCone(): Network check has failed.\n" );
2552#ifndef DUPLICATE_CKT_DEBUG
2565 fprintf( stdout,
"usage: l3s [-1lsh]\n" );
2566 fprintf( stdout,
"\t performs Armin Biere's live-to-safe transformation\n" );
2567 fprintf( stdout,
"\t-1 : no shadow logic, presume all loops are self loops\n");
2568 fprintf( stdout,
"\t-l : ignore liveness and fairness outputs\n");
2569 fprintf( stdout,
"\t-s : ignore safety assertions and assumptions\n");
2570 fprintf( stdout,
"\t-h : print command usage\n");