48static inline Vec_Int_t * Eso_ManCube(
Eso_Man_t *
p,
int iCube ) {
assert( iCube >= 0 );
return Hsh_VecReadEntry(
p->pHash, iCube); }
70 p->nVars = Gia_ManCiNum(pGia);
72 p->vEsops = Vec_WecStart( Gia_ManObjNum(pGia) );
73 p->pHash = Hsh_VecManStart( 1000 );
74 p->vCubes = Vec_WecStart(Gia_ManCiNum(pGia)+1);
75 p->vCube1 = Vec_IntAlloc(Gia_ManCiNum(pGia));
76 p->vCube2 = Vec_IntAlloc(Gia_ManCiNum(pGia));
77 p->vCube = Vec_IntAlloc(Gia_ManCiNum(pGia));
80 for ( n = 0; n < 2; n++ )
82 Vec_IntFill(
p->vCube, 1, Abc_Var2Lit(i, n) );
83 Hsh_VecManAdd(
p->pHash,
p->vCube );
85 Vec_IntPush( Vec_WecEntry(
p->vEsops, Id), Abc_Var2Lit(i, 0) );
91 Vec_WecFree(
p->vEsops );
92 Hsh_VecManStop(
p->pHash );
93 Vec_WecFree(
p->vCubes );
94 Vec_IntFree(
p->vCube1 );
95 Vec_IntFree(
p->vCube2 );
96 Vec_IntFree(
p->vCube );
117 if ( Vec_IntSize(vEsop) == 0 )
119 printf(
"Const 0\n" );
122 vStr = Vec_StrAlloc(
p->nVars + 4 );
123 Vec_StrFill( vStr,
p->nVars,
'-' );
124 Vec_StrPush( vStr,
' ' );
125 Vec_StrPush( vStr,
'1' );
126 Vec_StrPush( vStr,
'\n' );
127 Vec_StrPush( vStr,
'\0' );
128 assert( Vec_IntSize(vEsop) > 0 );
131 if (
Cube ==
p->Cube1 )
132 printf(
"%s", Vec_StrArray(vStr) );
135 vCube = Eso_ManCube(
p,
Cube );
137 Vec_StrWriteEntry( vStr, Abc_Lit2Var(Lit), (
char)(Abc_LitIsCompl(Lit)?
'0':
'1') );
138 printf(
"%s", Vec_StrArray(vStr) );
140 Vec_StrWriteEntry( vStr, Abc_Lit2Var(Lit),
'-' );
150 vRes = Vec_WecAlloc( Vec_VecSizeSize((
Vec_Vec_t *)vCover) );
153 if ( Vec_IntSize(vEsop) > 0 )
158 vLevel = Vec_WecPushLevel( vRes );
159 if (
Cube !=
p->Cube1 )
164 Vec_IntPush( vLevel, Lit );
166 Vec_IntPush( vLevel, -i-1 );
179 pNew->
pName = Abc_UtilStrsav(
p->pGia->pName );
180 pNew->
pSpec = Abc_UtilStrsav(
p->pGia->pSpec );
182 Gia_ManConst0(
p->pGia)->Value = 0;
184 pObj->
Value = Gia_ManAppendCi(pNew);
187 if ( Vec_IntSize(vEsop) > 0 )
189 int c,
Cube, iRoot = 0;
192 int k, Lit, iAnd = 1;
193 if (
Cube !=
p->Cube1 )
201 Gia_ManAppendCo( pNew, iRoot );
204 Gia_ManAppendCo( pNew, 0 );
226 for ( i = 0; i < nLits; i++ )
227 if ( pCube1[i] != pCube2[i] )
231 if ( Abc_Lit2Var(pCube1[i]) != Abc_Lit2Var(pCube2[i]) )
239 int i, k, iDiff = -1;
240 for ( i = k = 0; i < nLits; i++, k++ )
241 if ( pCube1[i] != pCube2[k] )
256 int * pCube2, * pCube = (
Cube ==
p->Cube1) ? NULL : Vec_IntArray(vCube);
257 int Cube2, nLits = (
Cube ==
p->Cube1) ? 0 : Vec_IntSize(vCube);
258 Vec_Int_t * vLevel = Vec_WecEntry(
p->vCubes, nLits );
259 int c, k, iLit, iPlace = Vec_IntFind( vLevel,
Cube );
262 Vec_IntDrop( vLevel, iPlace );
265 if (
Cube ==
p->Cube1 )
267 assert( Vec_IntSize(vLevel) == 0 );
268 Vec_IntPush( vLevel,
Cube );
272 if ( fMimimize && nLits < p->nVars - 1 )
274 Vec_Int_t * vLevel = Vec_WecEntry(
p->vCubes, nLits+1 );
277 pCube2 = Hsh_VecReadArray(
p->pHash, Cube2 );
282 Vec_IntDrop( vLevel, c );
284 Vec_IntClear(
p->vCube );
285 for ( k = 0; k <= nLits; k++ )
286 Vec_IntPush(
p->vCube, Abc_LitNotCond(pCube2[k], k == iLit) );
287 Cube = Hsh_VecManAdd(
p->pHash,
p->vCube );
298 pCube2 = Hsh_VecReadArray(
p->pHash, Cube2 );
303 Vec_IntDrop( vLevel, c );
305 Vec_IntClear(
p->vCube );
306 for ( k = 0; k < nLits; k++ )
308 Vec_IntPush(
p->vCube, pCube[k] );
309 if ( Vec_IntSize(
p->vCube) == 0 )
312 Cube = Hsh_VecManAdd(
p->pHash,
p->vCube );
319 if ( fMimimize && nLits > 0 )
322 Vec_Int_t * vLevel = Vec_WecEntry(
p->vCubes, nLits-1 );
324 if ( nLits == 1 && Vec_IntSize(vLevel) == 1 )
326 Vec_IntDrop( vLevel, 0 );
332 pCube2 = Hsh_VecReadArray(
p->pHash, Cube2 );
337 Vec_IntDrop( vLevel, c );
339 Vec_IntClear(
p->vCube );
340 for ( k = 0; k < nLits; k++ )
341 Vec_IntPush(
p->vCube, Abc_LitNotCond(pCube[k], k == iLit) );
342 Cube = Hsh_VecManAdd(
p->pHash,
p->vCube );
349 Vec_IntPush( vLevel,
Cube );
356 Vec_IntClear( vEsop );
359 Vec_IntAppend( vEsop, vLevel );
366 Vec_IntClear( vLevel );
383 int * pBeg = vCube->pArray;
384 int * pBeg1 = vCube1->pArray;
385 int * pBeg2 = vCube2->pArray;
386 int * pEnd1 = vCube1->pArray + vCube1->nSize;
387 int * pEnd2 = vCube2->pArray + vCube2->nSize;
388 while ( pBeg1 < pEnd1 && pBeg2 < pEnd2 )
390 if ( *pBeg1 == *pBeg2 )
391 *pBeg++ = *pBeg1++, pBeg2++;
392 else if ( Abc_Lit2Var(*pBeg1) == Abc_Lit2Var(*pBeg2) )
394 else if ( *pBeg1 < *pBeg2 )
399 while ( pBeg1 < pEnd1 )
401 while ( pBeg2 < pEnd2 )
403 vCube->nSize = pBeg - vCube->pArray;
404 assert( vCube->nSize <= vCube->nCap );
405 assert( vCube->nSize >= vCube1->nSize );
406 assert( vCube->nSize >= vCube2->nSize );
407 return Hsh_VecManAdd(
p->pHash, vCube );
412 int i, k, Cube1, Cube2,
Cube;
413 Vec_IntClear( vEsop );
414 if ( Vec_IntSize(vEsop1) == 0 || Vec_IntSize(vEsop2) == 0 )
416 Cube1 = Vec_IntEntry(vEsop1, 0);
417 Cube2 = Vec_IntEntry(vEsop2, 0);
420 if ( Cube1 ==
p->Cube1 )
428 if ( Cube2 ==
p->Cube1 )
433 vCube1 = *Hsh_VecReadEntry(
p->pHash, Cube1 );
434 vCube2 = *Hsh_VecReadEntry(
p->pHash, Cube2 );
456 int i,
Cube, Start = 0;
457 Vec_IntClear( vRes );
460 if ( Vec_IntSize(vEsop) == 0 )
461 Vec_IntPush( vRes,
p->Cube1 );
464 Cube = Vec_IntEntry(vEsop, 0);
465 if (
Cube ==
p->Cube1 )
468 Vec_IntPush( vRes, Abc_LitNot(
Cube) ), Start = 1;
470 Vec_IntPush( vRes,
p->Cube1 );
474 Vec_IntPush( vRes,
Cube );
495 int i, nCubes = 0, nCubesUsed = 0;
500 vEsop1 = Vec_WecEntry(
p->vEsops, Gia_ObjFaninId0(pObj, i) );
501 vEsop2 = Vec_WecEntry(
p->vEsops, Gia_ObjFaninId1(pObj, i) );
504 vEsop = Vec_WecEntry(
p->vEsops, i );
506 nCubes += Vec_IntSize(vEsop);
508 vCover = Vec_PtrAlloc( Gia_ManCoNum(pGia) );
511 vEsop1 = Vec_WecEntry(
p->vEsops, Gia_ObjFaninId0p(pGia, pObj) );
514 printf(
"Output %3d: ESOP has %5d cubes\n", i, Vec_IntSize(vEsop1) );
517 Vec_PtrPush( vCover, Vec_IntDup(vEsop1) );
518 nCubesUsed += Vec_IntSize(vEsop1);
522 printf(
"Outs = %d. Cubes = %d. Used = %d. Hashed = %d. ",
523 Gia_ManCoNum(pGia), nCubes, nCubesUsed, Hsh_VecSize(
p->pHash) );
524 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
struct Vec_Str_t_ Vec_Str_t
typedefABC_NAMESPACE_IMPL_START struct Eso_Man_t_ Eso_Man_t
DECLARATIONS ///.
void Eso_ManMinimizeAdd(Eso_Man_t *p, int Cube)
int Eso_ManFindDistOneLitNotEqual(int *pCube1, int *pCube2, int nLits)
int Eso_ManComputeAnd(Eso_Man_t *p, Vec_Int_t *vCube1, Vec_Int_t *vCube2, Vec_Int_t *vCube)
Gia_Man_t * Eso_ManCompute(Gia_Man_t *pGia, int fVerbose, Vec_Wec_t **pvRes)
void Eso_ManComputeOne(Eso_Man_t *p, Vec_Int_t *vEsop1, Vec_Int_t *vEsop2, Vec_Int_t *vEsop)
int Eso_ManFindDistOneLitEqual(int *pCube1, int *pCube2, int nLits)
Vec_Int_t * Eso_ManTransformOne(Eso_Man_t *p, Vec_Int_t *vEsop, int fCompl, Vec_Int_t *vRes)
void Eso_ManCoverPrint(Eso_Man_t *p, Vec_Int_t *vEsop)
Gia_Man_t * Eso_ManCoverConvert(Eso_Man_t *p, Vec_Ptr_t *vCover)
void Eso_ManStop(Eso_Man_t *p)
void Eso_ManMinimizeCopy(Eso_Man_t *p, Vec_Int_t *vEsop)
Vec_Wec_t * Eso_ManCoverDerive(Eso_Man_t *p, Vec_Ptr_t *vCover)
Eso_Man_t * Eso_ManAlloc(Gia_Man_t *pGia)
FUNCTION DEFINITIONS ///.
void Gia_ManStop(Gia_Man_t *p)
#define Gia_ManForEachAnd(p, pObj, i)
void Gia_ManHashAlloc(Gia_Man_t *p)
Gia_Man_t * Gia_ManStart(int nObjsMax)
FUNCTION DEFINITIONS ///.
struct Gia_Obj_t_ Gia_Obj_t
int Gia_ManHashXor(Gia_Man_t *p, int iLit0, int iLit1)
struct Gia_Man_t_ Gia_Man_t
Gia_Man_t * Gia_ManCleanup(Gia_Man_t *p)
int Gia_ManHashAnd(Gia_Man_t *p, int iLit0, int iLit1)
#define Gia_ManForEachCo(p, pObj, i)
#define Gia_ManForEachCi(p, pObj, i)
#define Gia_ManForEachCiId(p, Id, i)
struct Hsh_VecMan_t_ Hsh_VecMan_t
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_IntForEachEntryStart(vVec, Entry, i, Start)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.
#define Vec_WecForEachLevel(vGlob, vVec, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.