31static inline int Abc_InfoGet2Bits(
Vec_Int_t * vData,
int nWords,
int iFrame,
int iObj )
33 unsigned * pInfo = (
unsigned *)Vec_IntEntryP( vData,
nWords * iFrame );
34 return 3 & (pInfo[iObj >> 4] >> ((iObj & 15) << 1));
36static inline void Abc_InfoSet2Bits(
Vec_Int_t * vData,
int nWords,
int iFrame,
int iObj,
int Value )
38 unsigned * pInfo = (
unsigned *)Vec_IntEntryP( vData,
nWords * iFrame );
39 Value ^= (3 & (pInfo[iObj >> 4] >> ((iObj & 15) << 1)));
40 pInfo[iObj >> 4] ^= (Value << ((iObj & 15) << 1));
42static inline void Abc_InfoAdd2Bits(
Vec_Int_t * vData,
int nWords,
int iFrame,
int iObj,
int Value )
44 unsigned * pInfo = (
unsigned *)Vec_IntEntryP( vData,
nWords * iFrame );
45 pInfo[iObj >> 4] |= (Value << ((iObj & 15) << 1));
48static inline int Gia_ManGetTwo(
Gia_Man_t *
p,
int iFrame,
Gia_Obj_t * pObj ) {
return Abc_InfoGet2Bits(
p->vTruths,
p->nTtWords, iFrame, Gia_ObjId(
p, pObj) ); }
49static inline void Gia_ManSetTwo(
Gia_Man_t *
p,
int iFrame,
Gia_Obj_t * pObj,
int Value ) { Abc_InfoSet2Bits(
p->vTruths,
p->nTtWords, iFrame, Gia_ObjId(
p, pObj), Value ); }
50static inline void Gia_ManAddTwo(
Gia_Man_t *
p,
int iFrame,
Gia_Obj_t * pObj,
int Value ) { Abc_InfoAdd2Bits(
p->vTruths,
p->nTtWords, iFrame, Gia_ObjId(
p, pObj), Value ); }
75 int RetValue, f, k, Value, Value0, Value1, iBit;
78 p->nTtWords = Abc_BitWordNum( 2 * Gia_ManObjNum(
p) );
79 p->vTruths = Vec_IntStart( (pCex->iFrame + 1) *
p->nTtWords );
82 for ( f = 0, iBit = pCex->nRegs; f <= pCex->iFrame; f++ )
85 if ( (pObj->
fMark0 = Abc_InfoHasBit(pCex->pData, iBit++)) )
86 Gia_ManAddTwo(
p, f, pObj, 1 );
88 if ( (pObj->
fMark0 = (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) & (Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj))) )
89 Gia_ManAddTwo(
p, f, pObj, 1 );
91 if ( (pObj->
fMark0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) )
92 Gia_ManAddTwo(
p, f, pObj, 1 );
93 if ( f == pCex->iFrame )
97 Gia_ManAddTwo(
p, f+1, pObjRo, 1 );
99 assert( iBit == pCex->nBits );
101 RetValue = Gia_ManPo(
p, pCex->iPo)->fMark0;
103 printf(
"Counter-example is invalid.\n" );
106 pObj = Gia_ManPo(
p, pCex->iPo);
108 Gia_ManAddTwo(
p, pCex->iFrame, pObj, 2 );
109 for ( f = pCex->iFrame; f >= 0; f-- )
113 if ( (Gia_ObjFanin0(pObj)->fMark0 = pObj->
fMark0) )
116 Gia_ManAddTwo(
p, f, Gia_ObjFanin0(pObj), 2 );
124 Value = (1 & Gia_ManGetTwo(
p, f, pObj));
125 Value0 = (1 & Gia_ManGetTwo(
p, f, Gia_ObjFanin0(pObj))) ^ Gia_ObjFaninC0(pObj);
126 Value1 = (1 & Gia_ManGetTwo(
p, f, Gia_ObjFanin1(pObj))) ^ Gia_ObjFaninC1(pObj);
127 if ( Value0 == Value1 )
129 assert( Value == (Value0 & Value1) );
130 if ( fJustMax || Value == 1 )
132 Gia_ObjFanin0(pObj)->fMark0 = Gia_ObjFanin1(pObj)->fMark0 = 1;
133 Gia_ManAddTwo(
p, f, Gia_ObjFanin0(pObj), 2 );
134 Gia_ManAddTwo(
p, f, Gia_ObjFanin1(pObj), 2 );
138 Gia_ObjFanin0(pObj)->fMark0 = 1;
139 Gia_ManAddTwo(
p, f, Gia_ObjFanin0(pObj), 2 );
142 else if ( Value0 == 0 )
145 Gia_ObjFanin0(pObj)->fMark0 = 1;
146 Gia_ManAddTwo(
p, f, Gia_ObjFanin0(pObj), 2 );
148 else if ( Value1 == 0 )
151 Gia_ObjFanin1(pObj)->fMark0 = 1;
152 Gia_ManAddTwo(
p, f, Gia_ObjFanin1(pObj), 2 );
165 Gia_ManAddTwo(
p, f-1, pObjRi, 2 );
188 assert( iFrame >= 0 && iFrame <= pCex->iFrame );
190 pNew->
pName = Abc_UtilStrsav(
"unate" );
197 if ( fUseAllObjects )
199 int Value = Gia_ManAppendCi(pNew);
200 if ( (Gia_ManGetTwo(
p, iFrame, pObj) >> 1) )
203 else if ( (Gia_ManGetTwo(
p, iFrame, pObj) >> 1) )
204 pObj->
Value = Gia_ManAppendCi(pNew);
210 pObj->
Value = (Gia_ManGetTwo(
p, iFrame, pObj) >> 1);
213 for ( f = iFrame; f <= pCex->iFrame; f++ )
222 pObj = Gia_ManConst0(
p);
223 pObj->
Value = (Gia_ManGetTwo(
p, f, pObj) >> 1);
228 pObj->
Value = (Gia_ManGetTwo(
p, f, pObj) >> 1);
234 pObj->
Value = (Gia_ManGetTwo(
p, f, pObj) >> 1);
237 if ( fUseAllObjects )
239 int Value = Gia_ManAppendCi(pNew);
240 if ( (Gia_ManGetTwo(
p, f, pObj) >> 1) )
243 else if ( (Gia_ManGetTwo(
p, f, pObj) >> 1) )
244 pObj->
Value = Gia_ManAppendCi(pNew);
252 Value = Gia_ManGetTwo(
p, f, pObj);
255 if ( Gia_ObjFanin0(pObj)->Value && Gia_ObjFanin1(pObj)->Value )
257 if ( 1 & Gia_ManGetTwo(
p, f, pObj) )
259 if ( Gia_ObjFanin0(pObj)->Value > 1 && Gia_ObjFanin1(pObj)->Value > 1 )
260 pObj->
Value =
Gia_ManHashAnd( pNew, Gia_ObjFanin0(pObj)->Value, Gia_ObjFanin1(pObj)->Value );
261 else if ( Gia_ObjFanin0(pObj)->Value > 1 )
262 pObj->
Value = Gia_ObjFanin0(pObj)->Value;
263 else if ( Gia_ObjFanin1(pObj)->Value > 1 )
264 pObj->
Value = Gia_ObjFanin1(pObj)->Value;
270 if ( Gia_ObjFanin0(pObj)->Value > 1 && Gia_ObjFanin1(pObj)->Value > 1 )
271 pObj->
Value =
Gia_ManHashOr( pNew, Gia_ObjFanin0(pObj)->Value, Gia_ObjFanin1(pObj)->Value );
272 else if ( Gia_ObjFanin0(pObj)->Value > 1 )
273 pObj->
Value = Gia_ObjFanin0(pObj)->Value;
274 else if ( Gia_ObjFanin1(pObj)->Value > 1 )
275 pObj->
Value = Gia_ObjFanin1(pObj)->Value;
280 else if ( Gia_ObjFanin0(pObj)->Value )
281 pObj->
Value = Gia_ObjFanin0(pObj)->Value;
282 else if ( Gia_ObjFanin1(pObj)->Value )
283 pObj->
Value = Gia_ObjFanin1(pObj)->Value;
287 pObj->
Value = Gia_ObjFanin0(pObj)->Value;
288 if ( f == pCex->iFrame )
295 pObj = Gia_ManPo(
p, pCex->iPo);
296 assert( (Gia_ManGetTwo(
p, pCex->iFrame, pObj) >> 1) );
298 Gia_ManAppendCo( pNew, pObj->
Value );
322 assert( pCex->nPis == Gia_ManPiNum(
p) );
324 assert( pCex->iPo < Gia_ManPoNum(
p) );
326 assert( iFrameStart >= 0 && iFrameStart <= pCex->iFrame );
328 assert( nRealPis < Gia_ManPiNum(
p) );
334 printf(
"%3d : ", iFrameStart );
342 for ( f = pCex->iFrame; f >= iFrameStart; f-- )
345 printf(
"%3d : ", f );
352 Vec_IntFreeP( &
p->vTruths );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Gia_Man_t * Gia_ManCreateUnate(Gia_Man_t *p, Abc_Cex_t *pCex, int iFrame, int nRealPis, int fUseAllObjects)
Abc_Cex_t * Gia_ManCexMin(Gia_Man_t *p, Abc_Cex_t *pCex, int iFrameStart, int nRealPis, int fJustMax, int fUseAll, int fVerbose)
int Gia_ManAnnotateUnrolling(Gia_Man_t *p, Abc_Cex_t *pCex, int fJustMax)
FUNCTION DEFINITIONS ///.
void Gia_ManStop(Gia_Man_t *p)
#define Gia_ManForEachRo(p, pObj, i)
#define Gia_ManForEachAnd(p, pObj, i)
#define Gia_ManForEachAndReverse(p, pObj, i)
void Gia_ManHashAlloc(Gia_Man_t *p)
#define Gia_ManForEachPi(p, pObj, i)
Gia_Man_t * Gia_ManStart(int nObjsMax)
FUNCTION DEFINITIONS ///.
int Gia_ManHashOr(Gia_Man_t *p, int iLit0, int iLit1)
struct Gia_Obj_t_ Gia_Obj_t
struct Gia_Man_t_ Gia_Man_t
void Gia_ManCleanValue(Gia_Man_t *p)
Gia_Man_t * Gia_ManCleanup(Gia_Man_t *p)
void Gia_ManCleanMark0(Gia_Man_t *p)
int Gia_ManHashAnd(Gia_Man_t *p, int iLit0, int iLit1)
#define Gia_ManForEachCo(p, pObj, i)
#define Gia_ManForEachRiRo(p, pObjRi, pObjRo, i)
void Gia_ManHashStop(Gia_Man_t *p)
void Gia_ManPrintStats(Gia_Man_t *p, Gps_Par_t *pPars)
void Gia_AigerWrite(Gia_Man_t *p, char *pFileName, int fWriteSymbols, int fCompact, int fWriteNewLine)
typedefABC_NAMESPACE_HEADER_START struct Abc_Cex_t_ Abc_Cex_t
INCLUDES ///.