117 assert( f >= 0 && f <= p->pCex->iFrame );
118 return p->pObjs + f *
p->nObjsFrame + pObj->
Value;
123 return p->pvVecs + Gia_ObjId(
p->pGia, pObj);
129 return (
unsigned *)Vec_IntArray(Rf2_ObjVec(
p, pObj));
133 return (
unsigned *)Vec_IntArray(Rf2_ObjVec(
p, pObj)) +
p->nMapWords;
137 Vec_IntFill( Rf2_ObjVec(
p, pObj), 2*
p->nMapWords, 0 );
143 Vec_IntClear( vVec );
144 for ( w = 0; w <
p->nMapWords; w++ )
145 Vec_IntPush( vVec, 0 );
146 for ( w = 0; w <
p->nMapWords; w++ )
147 Vec_IntPush( vVec, ~0 );
148 Abc_InfoSetBit( Rf2_ObjA(
p, pObj), i );
149 Abc_InfoXorBit( Rf2_ObjN(
p, pObj), i );
153 assert( Vec_IntSize(Rf2_ObjVec(
p, pObj)) == 2*
p->nMapWords );
154 memcpy( Rf2_ObjA(
p, pObj), Rf2_ObjA(
p, pFanin),
sizeof(
unsigned) * 2 *
p->nMapWords );
158 unsigned * pInfo, * pInfo0, * pInfo1;
160 assert( Gia_ObjIsAnd(pObj) );
162 assert( One == (
int)(Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) );
163 assert( One == (
int)(Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj)) );
164 assert( Vec_IntSize(Rf2_ObjVec(
p, pObj)) == 2*
p->nMapWords );
166 pInfo = Rf2_ObjA(
p, pObj );
167 pInfo0 = Rf2_ObjA(
p, Gia_ObjFanin0(pObj) );
168 pInfo1 = Rf2_ObjA(
p, Gia_ObjFanin1(pObj) );
169 for ( i = 0; i <
p->nMapWords; i++ )
170 pInfo[i] = One ? (pInfo0[i] & pInfo1[i]) : (pInfo0[i] | pInfo1[i]);
172 pInfo = Rf2_ObjN(
p, pObj );
173 pInfo0 = Rf2_ObjN(
p, Gia_ObjFanin0(pObj) );
174 pInfo1 = Rf2_ObjN(
p, Gia_ObjFanin1(pObj) );
175 for ( i = 0; i <
p->nMapWords; i++ )
176 pInfo[i] = One ? (pInfo0[i] | pInfo1[i]) : (pInfo0[i] & pInfo1[i]);
183 pInfo = Rf2_ObjA(
p, pRoot );
185 if ( !Gia_ObjIsPi(
p->pGia, pObj) )
186 printf(
"%d", Abc_InfoHasBit(pInfo, i) );
188 pInfo = Rf2_ObjN(
p, pRoot );
190 if ( !Gia_ObjIsPi(
p->pGia, pObj) )
191 printf(
"%d", !Abc_InfoHasBit(pInfo, i) );
214 assert( Gia_ManPoNum(pGia) == 1 );
217 p->vObjs = Vec_IntAlloc( 1000 );
218 p->vFanins = Vec_IntAlloc( 1000 );
220 p->vGrp2Ppi = Vec_VecStart( 100 );
229 if ( fProfile &&
p->nCalls )
231 double MemGia =
sizeof(
Gia_Man_t) +
sizeof(
Gia_Obj_t) *
p->pGia->nObjsAlloc +
sizeof(int) *
p->pGia->nTravIdsAlloc;
232 double MemOther =
sizeof(
Rf2_Man_t) +
sizeof(
Rf2_Obj_t) *
p->nObjsAlloc +
sizeof(int) * Vec_IntCap(
p->vObjs);
233 clock_t
timeOther =
p->timeTotal -
p->timeFwd -
p->timeBwd -
p->timeVer;
234 printf(
"Abstraction refinement runtime statistics:\n" );
235 ABC_PRTP(
"Sensetization",
p->timeFwd,
p->timeTotal );
236 ABC_PRTP(
"Justification",
p->timeBwd,
p->timeTotal );
237 ABC_PRTP(
"Verification ",
p->timeVer,
p->timeTotal );
239 ABC_PRTP(
"TOTAL ",
p->timeTotal,
p->timeTotal );
240 printf(
"Total calls = %d. Average refine = %.1f. GIA mem = %.3f MB. Other mem = %.3f MB.\n",
241 p->nCalls, 1.0*
p->nRefines/
p->nCalls, MemGia/(1<<20), MemOther/(1<<20) );
243 Vec_IntFree(
p->vObjs );
244 Vec_IntFree(
p->vFanins );
245 Vec_VecFree(
p->vGrp2Ppi );
268 if ( Gia_ObjIsTravIdCurrent(
p, pObj) )
270 Gia_ObjSetTravIdCurrent(
p, pObj);
271 if ( Gia_ObjIsCo(pObj) )
273 else if ( Gia_ObjIsAnd(pObj) )
278 else if ( !Gia_ObjIsRo(
p, pObj) )
280 Vec_IntPush( vObjs, Gia_ObjId(
p, pObj) );
288 Gia_ObjSetTravIdCurrent(
p->pGia, Gia_ManConst0(
p->pGia) );
291 assert( Gia_ObjIsCi(pObj) || Gia_ObjIsAnd(pObj) );
292 Gia_ObjSetTravIdCurrent(
p->pGia, pObj );
295 Vec_IntClear(
p->vObjs );
298 if ( Gia_ObjIsRo(
p->pGia, pObj) )
301 assert( Gia_ObjIsCo(pObj) );
319 int f, i, iBit =
p->pCex->nRegs;
321 for ( f = 0; f <=
p->pCex->iFrame; f++, iBit +=
p->pCex->nPis )
325 assert( Gia_ObjIsCi(pObj) || Gia_ObjIsAnd(pObj) );
326 pRnm = Rf2_ManObj(
p, pObj, f );
327 pRnm->Value = Abc_InfoHasBit(
p->pCex->pData, iBit + i );
328 if ( !Gia_ObjIsPi(
p->pGia, pObj) )
331 pRnm->Prio = pObj->
Value;
337 assert( Gia_ObjIsRo(
p->pGia, pObj) || Gia_ObjIsAnd(pObj) || Gia_ObjIsCo(pObj) );
338 pRnm = Rf2_ManObj(
p, pObj, f );
340 if ( Gia_ObjIsRo(
p->pGia, pObj) )
344 pRnm0 = Rf2_ManObj(
p, Gia_ObjRoToRi(
p->pGia, pObj), f-1 );
345 pRnm->Value = pRnm0->Value;
346 pRnm->Prio = pRnm0->Prio;
349 if ( Gia_ObjIsCo(pObj) )
351 pRnm0 = Rf2_ManObj(
p, Gia_ObjFanin0(pObj), f );
352 pRnm->Value = (pRnm0->Value ^ Gia_ObjFaninC0(pObj));
353 pRnm->Prio = pRnm0->Prio;
356 assert( Gia_ObjIsAnd(pObj) );
357 pRnm0 = Rf2_ManObj(
p, Gia_ObjFanin0(pObj), f );
358 pRnm1 = Rf2_ManObj(
p, Gia_ObjFanin1(pObj), f );
359 pRnm->Value = (pRnm0->Value ^ Gia_ObjFaninC0(pObj)) & (pRnm1->Value ^ Gia_ObjFaninC1(pObj));
360 if ( pRnm->Value == 1 )
361 pRnm->Prio = Abc_MaxInt( pRnm0->Prio, pRnm1->Prio );
362 else if ( (pRnm0->Value ^ Gia_ObjFaninC0(pObj)) == 0 && (pRnm1->Value ^ Gia_ObjFaninC1(pObj)) == 0 )
363 pRnm->Prio = Abc_MinInt( pRnm0->Prio, pRnm1->Prio );
364 else if ( (pRnm0->Value ^ Gia_ObjFaninC0(pObj)) == 0 )
365 pRnm->Prio = pRnm0->Prio;
367 pRnm->Prio = pRnm1->Prio;
370 assert( iBit ==
p->pCex->nBits );
371 pRnm = Rf2_ManObj(
p, Gia_ManPo(
p->pGia, 0),
p->pCex->iFrame );
372 if ( pRnm->Value != 1 )
373 printf(
"Output value is incorrect.\n" );
393 int i, f, iBit = pCex->nRegs;
394 Gia_ObjTerSimSet0( Gia_ManConst0(
p) );
395 for ( f = 0; f <= pCex->iFrame; f++, iBit += pCex->nPis )
399 pObj->
Value = Abc_InfoHasBit( pCex->pData, iBit + i );
400 if ( !Gia_ObjIsPi(
p, pObj) )
401 Gia_ObjTerSimSetX( pObj );
402 else if ( pObj->
Value )
403 Gia_ObjTerSimSet1( pObj );
405 Gia_ObjTerSimSet0( pObj );
410 Gia_ObjTerSimSet1( pObj );
412 Gia_ObjTerSimSet0( pObj );
416 if ( Gia_ObjIsCo(pObj) )
417 Gia_ObjTerSimCo( pObj );
418 else if ( Gia_ObjIsAnd(pObj) )
419 Gia_ObjTerSimAnd( pObj );
421 Gia_ObjTerSimSet0( pObj );
423 Gia_ObjTerSimRo(
p, pObj );
428 pObj = Gia_ManPo(
p, 0 );
429 if ( !Gia_ObjTerSimGet1(pObj) )
430 Abc_Print( 1,
"\nRefinement verification has failed!!!\n" );
446 if ( Gia_ObjIsTravIdCurrent(
p->pGia, pObj) )
448 Gia_ObjSetTravIdCurrent(
p->pGia, pObj);
449 if ( pObj->
fPhase && !fFirst )
454 if ( Vec_IntSize(vVec) == 0 )
455 Vec_IntPush( vFanins, Gia_ObjId(
p->pGia, pObj) );
456 Vec_IntPushUnique( vVec, RootId );
460 if ( Gia_ObjIsPi(
p->pGia, pObj) || Gia_ObjIsConst0(pObj) )
462 if ( Gia_ObjIsRo(
p->pGia, pObj) )
465 pObj = Gia_ObjRoToRi(
p->pGia, pObj);
468 else if ( Gia_ObjIsAnd(pObj) )
484 vVec = Rf2_ObjVec(
p, pObj );
485 assert( Vec_IntSize(vVec) == 0 );
486 Vec_IntPush( vVec, 0 );
489 Vec_IntClear(
p->vFanins );
492 if ( Gia_ObjIsPi(
p->pGia, pObj) )
498 vUsed = Vec_IntStart( Vec_IntSize(
p->vMap) );
501 printf(
"\nMap (%d): ", Vec_IntSize(
p->vMap) );
504 vVec = Rf2_ObjVec(
p, pObj );
505 if ( Vec_IntSize(vVec) > 1 )
506 printf(
"%d=%d ", i, Vec_IntSize(vVec) - 1 );
508 Vec_IntAddToEntry( vUsed, Entry, 1 );
509 Vec_IntClear( vVec );
513 printf(
"Int (%d): ", Vec_IntSize(
p->vFanins) );
516 vVec = Rf2_ObjVec(
p, pObj );
517 if ( Vec_IntSize(vVec) > 1 )
518 printf(
"%d=%d ", i, Vec_IntSize(vVec) );
519 if ( Vec_IntSize(vVec) > 1 )
521 Vec_IntAddToEntry( vUsed, Entry, 1 );
522 Vec_IntClear( vVec );
527 printf(
"%d ", Entry );
530 Vec_IntFree( vUsed );
545static inline int Rf2_ManCountPpis(
Rf2_Man_t *
p )
550 if ( !Gia_ObjIsPi(
p->pGia, pObj) )
566static inline void Rf2_ManPrintVector(
Vec_Int_t *
p,
int Num )
571 for ( k = 0; k < Num; k++ )
572 printf(
"%c",
'0' + ((Entry>>k) & 1) );
588static inline void Rf2_ManProcessVector(
Vec_Int_t *
p,
int Limit )
592 int i, j, k, Entry, Entry2;
596 printf(
"Before: \n" );
597 Rf2_ManPrintVector(
p, 31 );
602 if ( Gia_WordCountOnes((
unsigned)Entry) <= Limit )
603 Vec_IntWriteEntry(
p, k++, Entry );
604 Vec_IntShrink(
p, k );
610 if ( (Entry2 & Entry) == Entry2 )
613 Vec_IntWriteEntry(
p, k++, Entry );
615 Vec_IntShrink(
p, k );
619 printf(
"After: \n" );
620 Rf2_ManPrintVector(
p, 31 );
639 int nPpis = Rf2_ManCountPpis(
p );
640 int nGroupSize = (nPpis / 30) + (nPpis % 30 > 0);
642 Vec_VecClear(
p->vGrp2Ppi );
644 if ( !Gia_ObjIsPi(
p->pGia, pObj) )
645 Vec_VecPushInt(
p->vGrp2Ppi, (k++ / nGroupSize), i );
646 printf(
"Considering %d PPIs combined into %d groups of size %d.\n", k, (k-1)/nGroupSize+1, nGroupSize );
647 return (k-1)/nGroupSize+1;
664 int nPpis = Rf2_ManCountPpis(
p );
665 int nGroupSize = (nPpis / 30) + (nPpis % 30 > 0);
666 int s, i, k, Entry, Counter;
674 if ( !Gia_ObjIsPi(
p->pGia, pObj) )
676 if ( (Entry >> (k++ / nGroupSize)) & 1 )
677 printf(
"1" ), Counter++;
684 printf(
" %3d \n", Counter );
703 int f, i, k, j, Entry, Entry2, iBit =
p->pCex->nRegs;
705 pObj = Gia_ManConst0(
p->pGia);
707 Vec_IntFill( Rf2_ObjVec(
p, pObj), 1, 0 );
709 for ( f = 0; f <=
p->pCex->iFrame; f++, iBit +=
p->pCex->nPis )
714 assert( Gia_ObjIsCi(pObj) || Gia_ObjIsAnd(pObj) );
715 pObj->
fMark0 = Abc_InfoHasBit(
p->pCex->pData, iBit + i );
716 Vec_IntFill( Rf2_ObjVec(
p, pObj), 1, 0 );
723 pObj = Gia_ManObj(
p->pGia, Vec_IntEntry(
p->vMap, Entry) );
724 assert( Vec_IntSize(Rf2_ObjVec(
p, pObj)) == 1 );
725 Vec_IntAddToEntry( Rf2_ObjVec(
p, pObj), 0, (1 << i) );
731 vVec = Rf2_ObjVec(
p, pObj);
732 Vec_IntClear( vVec );
733 if ( Gia_ObjIsRo(
p->pGia, pObj) )
737 Vec_IntPush( vVec, 0 );
740 pObj->
fMark0 = Gia_ObjRoToRi(
p->pGia, pObj)->fMark0;
741 vVec0 = Rf2_ObjVec(
p, Gia_ObjRoToRi(
p->pGia, pObj) );
742 Vec_IntAppend( vVec, vVec0 );
745 if ( Gia_ObjIsCo(pObj) )
747 pObj->
fMark0 = (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj));
748 vVec0 = Rf2_ObjVec(
p, Gia_ObjFanin0(pObj) );
749 Vec_IntAppend( vVec, vVec0 );
752 assert( Gia_ObjIsAnd(pObj) );
753 vVec0 = Rf2_ObjVec(
p, Gia_ObjFanin0(pObj));
754 vVec1 = Rf2_ObjVec(
p, Gia_ObjFanin1(pObj));
755 pObj->
fMark0 = (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) & (Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj));
760 Vec_IntPush( vVec, Entry | Entry2 );
761 Rf2_ManProcessVector( vVec, Limit );
763 else if ( (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) == 0 && (Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj)) == 0 )
765 Vec_IntAppend( vVec, vVec0 );
766 Vec_IntAppend( vVec, vVec1 );
767 Rf2_ManProcessVector( vVec, Limit );
769 else if ( (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) == 0 )
770 Vec_IntAppend( vVec, vVec0 );
772 Vec_IntAppend( vVec, vVec1 );
775 assert( iBit ==
p->pCex->nBits );
776 if ( Gia_ManPo(
p->pGia, 0)->fMark0 != 1 )
777 printf(
"Output value is incorrect.\n" );
778 return Rf2_ObjVec(
p, Gia_ManPo(
p->pGia, 0));
795 int f, i, iBit =
p->pCex->nRegs;
797 pObj = Gia_ManConst0(
p->pGia);
799 Rf2_ObjStart(
p, pObj, Vec_IntSize(
p->vMap) + Vec_IntSize(
p->vObjs) );
801 for ( f = 0; f <=
p->pCex->iFrame; f++, iBit +=
p->pCex->nPis )
806 assert( Gia_ObjIsCi(pObj) || Gia_ObjIsAnd(pObj) );
807 pObj->
fMark0 = Abc_InfoHasBit(
p->pCex->pData, iBit + i );
808 Rf2_ObjStart(
p, pObj, i );
814 Rf2_ObjClear(
p, pObj );
815 if ( Gia_ObjIsRo(
p->pGia, pObj) )
819 Rf2_ObjStart(
p, pObj, Vec_IntSize(
p->vMap) + i );
822 pObj->
fMark0 = Gia_ObjRoToRi(
p->pGia, pObj)->fMark0;
823 Rf2_ObjCopy(
p, pObj, Gia_ObjRoToRi(
p->pGia, pObj) );
826 if ( Gia_ObjIsCo(pObj) )
828 pObj->
fMark0 = (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj));
829 Rf2_ObjCopy(
p, pObj, Gia_ObjFanin0(pObj) );
832 assert( Gia_ObjIsAnd(pObj) );
833 pObj->
fMark0 = (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) & (Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj));
835 Rf2_ObjDeriveAnd(
p, pObj, 1 );
836 else if ( (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) == 0 && (Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj)) == 0 )
837 Rf2_ObjDeriveAnd(
p, pObj, 0 );
838 else if ( (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) == 0 )
839 Rf2_ObjCopy(
p, pObj, Gia_ObjFanin0(pObj) );
841 Rf2_ObjCopy(
p, pObj, Gia_ObjFanin1(pObj) );
844 assert( iBit ==
p->pCex->nBits );
845 if ( Gia_ManPo(
p->pGia, 0)->fMark0 != 1 )
846 printf(
"Output value is incorrect.\n" );
848 printf(
"Bounds: \n" );
849 Rf2_ObjPrint(
p, Gia_ManPo(
p->pGia, 0) );
868 clock_t clk, clk2 = clock();
874 p->fPropFanout = fPropFanout;
875 p->fVerbose = fVerbose;
886 Rf2_ManPrintVectorSpecial(
p, vJusts );
887 if ( Vec_IntSize(vJusts) == 0 )
889 printf(
"Empty set of justifying subsets.\n" );
904 p->timeVer += clock() - clk;
905 p->timeTotal += clock() - clk2;
#define ABC_PRTP(a, t, T)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Rf2_ManBounds(Rf2_Man_t *p)
typedefABC_NAMESPACE_IMPL_START struct Rf2_Obj_t_ Rf2_Obj_t
DECLARATIONS ///.
Vec_Int_t * Rf2_ManRefine(Rf2_Man_t *p, Abc_Cex_t *pCex, Vec_Int_t *vMap, int fPropFanout, int fVerbose)
Vec_Int_t * Rf2_ManPropagate(Rf2_Man_t *p, int Limit)
Rf2_Man_t * Rf2_ManStart(Gia_Man_t *pGia)
FUNCTION DEFINITIONS ///.
void Rf2_ManCollect_rec(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vObjs)
void Rf2_ManGatherFanins(Rf2_Man_t *p, int Depth)
int Rf2_ManAssignJustIds(Rf2_Man_t *p)
int Rf2_ManSensitize(Rf2_Man_t *p)
void Rf2_ManStop(Rf2_Man_t *p, int fProfile)
void Rf2_ManVerifyUsingTerSim(Gia_Man_t *p, Abc_Cex_t *pCex, Vec_Int_t *vMap, Vec_Int_t *vObjs, Vec_Int_t *vRes)
void Rf2_ManGatherFanins_rec(Rf2_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vFanins, int Depth, int RootId, int fFirst)
void Rf2_ManCollect(Rf2_Man_t *p)
double Rf2_ManMemoryUsage(Rf2_Man_t *p)
typedefABC_NAMESPACE_HEADER_START struct Rf2_Man_t_ Rf2_Man_t
INCLUDES ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
struct Gia_Obj_t_ Gia_Obj_t
struct Gia_Man_t_ Gia_Man_t
#define Gia_ManForEachObjVec(vVec, p, pObj, i)
void Gia_ManCleanMark0(Gia_Man_t *p)
void Gia_ManIncrementTravId(Gia_Man_t *p)
void Gia_ManCleanMark1(Gia_Man_t *p)
typedefABC_NAMESPACE_HEADER_START struct Abc_Cex_t_ Abc_Cex_t
INCLUDES ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_IntForEachEntryStop(vVec, Entry, i, Stop)
#define Vec_IntForEachEntryStart(vVec, Entry, i, Start)
#define Vec_VecForEachLevelInt(vGlob, vVec, i)
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.