21#ifndef ABC__sat__bsat__satMem_h
22#define ABC__sat__bsat__satMem_h
37#define LEARNT_MAX_START_DEFAULT 10000
38#define LEARNT_MAX_INCRE_DEFAULT 1000
39#define LEARNT_MAX_RATIO_DEFAULT 50
84static inline int Sat_MemLimit(
int *
p ) {
return p[0]; }
85static inline int Sat_MemIncLimit(
int *
p,
int nInts ) {
return p[0] += nInts; }
86static inline void Sat_MemWriteLimit(
int *
p,
int nInts ) {
p[0] = nInts; }
88static inline int Sat_MemHandPage(
Sat_Mem_t *
p,
cla h ) {
return h >>
p->nPageSize; }
89static inline int Sat_MemHandShift(
Sat_Mem_t *
p,
cla h ) {
return h &
p->uPageMask; }
92static inline int Sat_MemIntSize(
int size,
int lrn ) {
return 2*((
size + 2 + lrn)/2); }
93static inline int Sat_MemClauseSize(
clause *
p ) {
return Sat_MemIntSize(
p->size,
p->lrn); }
94static inline int Sat_MemClauseSize2(
clause *
p ) {
return Sat_MemIntSize(
p->size, 1); }
99static inline clause * Sat_MemClauseHand(
Sat_Mem_t *
p,
cla h ) {
return h ? Sat_MemClause(
p, Sat_MemHandPage(
p, h), Sat_MemHandShift(
p, h) ) : NULL; }
100static inline int Sat_MemEntryNum(
Sat_Mem_t *
p,
int lrn ) {
return p->nEntries[lrn]; }
102static inline cla Sat_MemHand(
Sat_Mem_t *
p,
int i,
int k ) {
return (i <<
p->nPageSize) | k; }
103static inline cla Sat_MemHandCurrent(
Sat_Mem_t *
p,
int lrn ) {
return (
p->iPage[lrn] <<
p->nPageSize) | Sat_MemLimit(
p->pPages[
p->iPage[lrn]] ); }
105static inline int Sat_MemClauseUsed(
Sat_Mem_t *
p,
cla h ) {
return h <
p->BookMarkH[(h &
p->uLearnedMask) > 0]; }
107static inline double Sat_MemMemoryHand(
Sat_Mem_t *
p,
cla h ) {
return 1.0 * ((Sat_MemHandPage(
p, h) + 2)/2 * (1 << (
p->nPageSize+2)) + Sat_MemHandShift(
p, h) * 4); }
108static inline double Sat_MemMemoryUsed(
Sat_Mem_t *
p,
int lrn ) {
return Sat_MemMemoryHand(
p, Sat_MemHandCurrent(
p, lrn) ); }
109static inline double Sat_MemMemoryAllUsed(
Sat_Mem_t *
p ) {
return Sat_MemMemoryUsed(
p, 0 ) + Sat_MemMemoryUsed(
p, 1 ); }
110static inline double Sat_MemMemoryAll(
Sat_Mem_t *
p ) {
return 1.0 * (
p->iPage[0] +
p->iPage[1] + 2) * (1 << (
p->nPageSize+2)); }
118#define Sat_MemForEachClause( p, c, i, k ) \
119 for ( i = 0; i <= p->iPage[0]; i += 2 ) \
120 for ( k = 2; k < Sat_MemLimit(p->pPages[i]) && ((c) = Sat_MemClause( p, i, k )); k += Sat_MemClauseSize(c) ) if ( i == 0 && k == 2 ) {} else
123#define Sat_MemForEachClause2( p, c, i, k ) \
124 for ( i = 0; i <= p->iPage[0]; i += 2 ) \
125 for ( k = 2; k < Sat_MemLimit(p->pPages[i]) && ((c) = Sat_MemClause( p, i, k )); k += Sat_MemClauseSize2(c) ) if ( i == 0 && k == 2 ) {} else
127#define Sat_MemForEachLearned( p, c, i, k ) \
128 for ( i = 1; i <= p->iPage[1]; i += 2 ) \
129 for ( k = 2; k < Sat_MemLimit(p->pPages[i]) && ((c) = Sat_MemClause( p, i, k )); k += Sat_MemClauseSize(c) )
139static inline int clause_from_lit(
lit l ) {
return l + l + 1; }
140static inline int clause_is_lit(
cla h ) {
return (h & 1); }
141static inline lit clause_read_lit(
cla h ) {
return (
lit)(h >> 1); }
143static inline int clause_learnt_h(
Sat_Mem_t *
p,
cla h ) {
return (h &
p->uLearnedMask) > 0; }
144static inline int clause_learnt(
clause * c ) {
return c->lrn; }
145static inline int clause_id(
clause * c ) {
return c->
lits[c->
size]; }
146static inline void clause_set_id(
clause * c,
int id ) { c->
lits[c->
size] = id; }
147static inline int clause_size(
clause * c ) {
return c->
size; }
148static inline lit * clause_begin(
clause * c ) {
return c->
lits; }
150static inline void clause_print_(
clause * c )
154 for ( i = 0; i < clause_size(c); i++ )
155 printf(
"%d ", (clause_begin(c)[i] & 1)? -(clause_begin(c)[i] >> 1) : clause_begin(c)[i] >> 1 );
174static inline int Sat_MemCountL(
Sat_Mem_t *
p )
194static inline void Sat_MemAlloc_(
Sat_Mem_t *
p,
int nPageSize )
196 assert( nPageSize > 8 && nPageSize < 32 );
198 p->nPageSize = nPageSize;
199 p->uLearnedMask = (unsigned)(1 << nPageSize);
200 p->uPageMask = (unsigned)((1 << nPageSize) - 1);
201 p->nPagesAlloc = 256;
207 Sat_MemWriteLimit(
p->pPages[0], 2 );
208 Sat_MemWriteLimit(
p->pPages[1], 2 );
210static inline Sat_Mem_t * Sat_MemAlloc(
int nPageSize )
214 Sat_MemAlloc_(
p, nPageSize );
229static inline void Sat_MemRestart(
Sat_Mem_t *
p )
235 Sat_MemWriteLimit(
p->pPages[0], 2 );
236 Sat_MemWriteLimit(
p->pPages[1], 2 );
250static inline void Sat_MemBookMark(
Sat_Mem_t *
p )
252 p->BookMarkE[0] =
p->nEntries[0];
253 p->BookMarkE[1] =
p->nEntries[1];
254 p->BookMarkH[0] = Sat_MemHandCurrent(
p, 0 );
255 p->BookMarkH[1] = Sat_MemHandCurrent(
p, 1 );
257static inline void Sat_MemRollBack(
Sat_Mem_t *
p )
259 p->nEntries[0] =
p->BookMarkE[0];
260 p->nEntries[1] =
p->BookMarkE[1];
261 p->iPage[0] = Sat_MemHandPage(
p,
p->BookMarkH[0] );
262 p->iPage[1] = Sat_MemHandPage(
p,
p->BookMarkH[1] );
263 Sat_MemWriteLimit(
p->pPages[
p->iPage[0]], Sat_MemHandShift(
p,
p->BookMarkH[0] ) );
264 Sat_MemWriteLimit(
p->pPages[
p->iPage[1]], Sat_MemHandShift(
p,
p->BookMarkH[1] ) );
278static inline void Sat_MemFree_(
Sat_Mem_t *
p )
281 for ( i = 0; i <
p->nPagesAlloc; i++ )
285static inline void Sat_MemFree(
Sat_Mem_t *
p )
302static inline int Sat_MemAppend(
Sat_Mem_t *
p,
int * pArray,
int nSize,
int lrn,
int fPlus1 )
305 int * pPage =
p->pPages[
p->iPage[lrn]];
306 int nInts = Sat_MemIntSize( nSize, lrn | fPlus1 );
307 assert( nInts + 3 < (1 <<
p->nPageSize) );
309 if ( Sat_MemLimit(pPage) + nInts + 2 >= (1 <<
p->nPageSize) )
312 if (
p->iPage[lrn] >=
p->nPagesAlloc )
315 memset(
p->pPages +
p->nPagesAlloc, 0,
sizeof(
int *) *
p->nPagesAlloc );
318 if (
p->pPages[
p->iPage[lrn]] == NULL )
319 p->pPages[
p->iPage[lrn]] =
ABC_ALLOC(
int, (
int)(((
word)1) <<
p->nPageSize) );
320 pPage =
p->pPages[
p->iPage[lrn]];
321 Sat_MemWriteLimit( pPage, 2 );
323 pPage[Sat_MemLimit(pPage)] = 0;
324 c = (
clause *)(pPage + Sat_MemLimit(pPage));
328 memcpy( c->
lits, pArray,
sizeof(
int) * nSize );
332 Sat_MemIncLimit( pPage, nInts );
333 return Sat_MemHandCurrent(
p, lrn) - nInts;
347static inline void Sat_MemShrink(
Sat_Mem_t *
p,
int h,
int lrn )
349 assert( clause_learnt_h(
p, h) == lrn );
350 assert( h && h <= Sat_MemHandCurrent(
p, lrn) );
351 p->iPage[lrn] = Sat_MemHandPage(
p, h);
352 Sat_MemWriteLimit(
p->pPages[
p->iPage[lrn]], Sat_MemHandShift(
p, h) );
367static inline int Sat_MemCompactLearned(
Sat_Mem_t *
p,
int fDoMove )
369 clause * c, * cPivot = NULL;
370 int i, k, iNew = 1, kNew = 2, nInts, fStartLooking, Counter = 0;
371 int hLimit = Sat_MemHandCurrent(
p, 1);
372 if ( hLimit == Sat_MemHand(
p, 1, 2) )
374 if ( fDoMove &&
p->BookMarkH[1] )
377 assert(
p->BookMarkH[1] >= Sat_MemHand(
p, 1, 2) &&
p->BookMarkH[1] <= hLimit );
379 cPivot = Sat_MemClauseHand(
p,
p->BookMarkH[1] );
380 if (
p->BookMarkH[1] < hLimit && !cPivot->mark )
382 p->BookMarkH[1] = cPivot->
lits[cPivot->
size];
396 if ( cPivot && cPivot == c )
410 nInts = Sat_MemClauseSize(c);
413 if ( kNew + nInts >= (1 <<
p->nPageSize) )
417 Sat_MemWriteLimit(
p->pPages[iNew], kNew );
427 if ( i != iNew || k != kNew )
429 memmove(
p->pPages[iNew] + kNew, c,
sizeof(
int) * nInts );
431 c = (
clause *)(
p->pPages[iNew] + kNew);
432 assert( nInts == Sat_MemClauseSize(c) );
438 c->
lits[c->
size] = Sat_MemHand(
p, iNew, kNew);
441 assert( iNew <= i && kNew < (1 <<
p->nPageSize) );
448 p->nEntries[1] = Counter;
452 Sat_MemWriteLimit(
p->pPages[iNew], kNew );
454 if (
p->BookMarkH[1] )
458 p->BookMarkH[1] = Sat_MemHandCurrent(
p, 1);
459 p->BookMarkE[1] =
p->nEntries[1];
462 p->BookMarkE[1] = clause_id(Sat_MemClauseHand(
p,
p->BookMarkH[1] ));
#define ABC_ALLOC(type, num)
#define ABC_REALLOC(type, obj, num)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
unsigned __int64 word
DECLARATIONS ///.
#define Sat_MemForEachLearned(p, c, i, k)
struct Sat_Mem_t_ Sat_Mem_t