ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
msatOrderH.c
Go to the documentation of this file.
1
20
21#include "msatInt.h"
22
24
25
29
30// the variable package data structure
32{
33 Msat_Solver_t * pSat; // the SAT solver
34 Msat_IntVec_t * vIndex; // the heap
35 Msat_IntVec_t * vHeap; // the mapping of var num into its heap num
36};
37
38//The solver can communicate to the variable order the following parts:
39//- the array of current assignments (pSat->pAssigns)
40//- the array of variable activities (pSat->pdActivity)
41//- the array of variables currently in the cone (pSat->vConeVars)
42//- the array of arrays of variables adjucent to each(pSat->vAdjacents)
43
44#define HLEFT(i) ((i)<<1)
45#define HRIGHT(i) (((i)<<1)+1)
46#define HPARENT(i) ((i)>>1)
47#define HCOMPARE(p, i, j) ((p)->pSat->pdActivity[i] > (p)->pSat->pdActivity[j])
48#define HHEAP(p, i) ((p)->vHeap->pArray[i])
49#define HSIZE(p) ((p)->vHeap->nSize)
50#define HOKAY(p, i) ((i) >= 0 && (i) < (p)->vIndex->nSize)
51#define HINHEAP(p, i) (HOKAY(p, i) && (p)->vIndex->pArray[i] != 0)
52#define HEMPTY(p) (HSIZE(p) == 1)
53
54static int Msat_HeapCheck_rec( Msat_Order_t * p, int i );
55static int Msat_HeapGetTop( Msat_Order_t * p );
56static void Msat_HeapInsert( Msat_Order_t * p, int n );
57static void Msat_HeapIncrease( Msat_Order_t * p, int n );
58static void Msat_HeapPercolateUp( Msat_Order_t * p, int i );
59static void Msat_HeapPercolateDown( Msat_Order_t * p, int i );
60
61extern abctime timeSelect;
62
66
79{
81 p = ABC_ALLOC( Msat_Order_t, 1 );
82 memset( p, 0, sizeof(Msat_Order_t) );
83 p->pSat = pSat;
84 p->vIndex = Msat_IntVecAlloc( 0 );
85 p->vHeap = Msat_IntVecAlloc( 0 );
86 Msat_OrderSetBounds( p, pSat->nVarsAlloc );
87 return p;
88}
89
101void Msat_OrderSetBounds( Msat_Order_t * p, int nVarsMax )
102{
103 Msat_IntVecGrow( p->vIndex, nVarsMax );
104 Msat_IntVecGrow( p->vHeap, nVarsMax + 1 );
105 p->vIndex->nSize = nVarsMax;
106 p->vHeap->nSize = 0;
107}
108
121{
122 int i;
123 for ( i = 0; i < p->vIndex->nSize; i++ )
124 p->vIndex->pArray[i] = 0;
125 for ( i = 0; i < vCone->nSize; i++ )
126 {
127 assert( i+1 < p->vHeap->nCap );
128 p->vHeap->pArray[i+1] = vCone->pArray[i];
129
130 assert( vCone->pArray[i] < p->vIndex->nSize );
131 p->vIndex->pArray[vCone->pArray[i]] = i+1;
132 }
133 p->vHeap->nSize = vCone->nSize + 1;
134}
135
148{
149 return Msat_HeapCheck_rec( p, 1 );
150}
151
164{
165 Msat_IntVecFree( p->vHeap );
166 Msat_IntVecFree( p->vIndex );
167 ABC_FREE( p );
168}
169
170
171
184{
185 // Activity based decision:
186// while (!heap.empty()){
187// Var next = heap.getmin();
188// if (toLbool(assigns[next]) == l_Undef)
189// return next;
190// }
191// return var_Undef;
192
193 int Var;
194 abctime clk = Abc_Clock();
195
196 while ( !HEMPTY(p) )
197 {
198 Var = Msat_HeapGetTop(p);
199 if ( (p)->pSat->pAssigns[Var] == MSAT_VAR_UNASSIGNED )
200 {
201//assert( Msat_OrderCheck(p) );
202timeSelect += Abc_Clock() - clk;
203 return Var;
204 }
205 }
206 return MSAT_ORDER_UNKNOWN;
207}
208
221{
222}
223
236{
237// if (!heap.inHeap(x))
238// heap.insert(x);
239
240 abctime clk = Abc_Clock();
241 if ( !HINHEAP(p,Var) )
242 Msat_HeapInsert( p, Var );
243timeSelect += Abc_Clock() - clk;
244}
245
258{
259// if (heap.inHeap(x))
260// heap.increase(x);
261
262 abctime clk = Abc_Clock();
263 if ( HINHEAP(p,Var) )
264 Msat_HeapIncrease( p, Var );
265timeSelect += Abc_Clock() - clk;
266}
267
268
269
270
282int Msat_HeapCheck_rec( Msat_Order_t * p, int i )
283{
284 return i >= HSIZE(p) ||
285 (
286 ( HPARENT(i) == 0 || !HCOMPARE(p, HHEAP(p, i), HHEAP(p, HPARENT(i))) ) &&
287
288 Msat_HeapCheck_rec( p, HLEFT(i) ) &&
289
290 Msat_HeapCheck_rec( p, HRIGHT(i) )
291 );
292}
293
305int Msat_HeapGetTop( Msat_Order_t * p )
306{
307 int Result, NewTop;
308 Result = HHEAP(p, 1);
309 NewTop = Msat_IntVecPop( p->vHeap );
310 p->vHeap->pArray[1] = NewTop;
311 p->vIndex->pArray[NewTop] = 1;
312 p->vIndex->pArray[Result] = 0;
313 if ( p->vHeap->nSize > 1 )
314 Msat_HeapPercolateDown( p, 1 );
315 return Result;
316}
317
329void Msat_HeapInsert( Msat_Order_t * p, int n )
330{
331 assert( HOKAY(p, n) );
332 p->vIndex->pArray[n] = HSIZE(p);
333 Msat_IntVecPush( p->vHeap, n );
334 Msat_HeapPercolateUp( p, p->vIndex->pArray[n] );
335}
336
348void Msat_HeapIncrease( Msat_Order_t * p, int n )
349{
350 Msat_HeapPercolateUp( p, p->vIndex->pArray[n] );
351}
352
364void Msat_HeapPercolateUp( Msat_Order_t * p, int i )
365{
366 int x = HHEAP(p, i);
367 while ( HPARENT(i) != 0 && HCOMPARE(p, x, HHEAP(p, HPARENT(i))) )
368 {
369 p->vHeap->pArray[i] = HHEAP(p, HPARENT(i));
370 p->vIndex->pArray[HHEAP(p, i)] = i;
371 i = HPARENT(i);
372 }
373 p->vHeap->pArray[i] = x;
374 p->vIndex->pArray[x] = i;
375}
376
388void Msat_HeapPercolateDown( Msat_Order_t * p, int i )
389{
390 int x = HHEAP(p, i);
391 int Child;
392 while ( HLEFT(i) < HSIZE(p) )
393 {
394 if ( HRIGHT(i) < HSIZE(p) && HCOMPARE(p, HHEAP(p, HRIGHT(i)), HHEAP(p, HLEFT(i))) )
395 Child = HRIGHT(i);
396 else
397 Child = HLEFT(i);
398 if ( !HCOMPARE(p, HHEAP(p, Child), x) )
399 break;
400 p->vHeap->pArray[i] = HHEAP(p, Child);
401 p->vIndex->pArray[HHEAP(p, i)] = i;
402 i = Child;
403 }
404 p->vHeap->pArray[i] = x;
405 p->vIndex->pArray[x] = i;
406}
407
408
412
413
415
ABC_INT64_T abctime
Definition abc_global.h:332
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
Cube * p
Definition exorList.c:222
int Var
Definition exorList.c:228
ABC_NAMESPACE_IMPL_START abctime timeSelect
DECLARATIONS ///.
Definition fraigMan.c:28
#define MSAT_VAR_UNASSIGNED
Definition msatInt.h:68
struct Msat_Order_t_ Msat_Order_t
Definition msatInt.h:59
#define MSAT_ORDER_UNKNOWN
Definition msatInt.h:70
#define HOKAY(p, i)
Definition msatOrderH.c:50
#define HHEAP(p, i)
Definition msatOrderH.c:48
#define HCOMPARE(p, i, j)
Definition msatOrderH.c:47
#define HEMPTY(p)
Definition msatOrderH.c:52
#define HRIGHT(i)
Definition msatOrderH.c:45
void Msat_OrderClean(Msat_Order_t *p, Msat_IntVec_t *vCone)
Definition msatOrderH.c:120
Msat_Order_t * Msat_OrderAlloc(Msat_Solver_t *pSat)
FUNCTION DEFINITIONS ///.
Definition msatOrderH.c:78
void Msat_OrderVarUnassigned(Msat_Order_t *p, int Var)
Definition msatOrderH.c:235
void Msat_OrderVarAssigned(Msat_Order_t *p, int Var)
Definition msatOrderH.c:220
#define HLEFT(i)
Definition msatOrderH.c:44
#define HSIZE(p)
Definition msatOrderH.c:49
int Msat_OrderVarSelect(Msat_Order_t *p)
Definition msatOrderH.c:183
#define HPARENT(i)
Definition msatOrderH.c:46
void Msat_OrderFree(Msat_Order_t *p)
Definition msatOrderH.c:163
#define HINHEAP(p, i)
Definition msatOrderH.c:51
int Msat_OrderCheck(Msat_Order_t *p)
Definition msatOrderH.c:147
void Msat_OrderSetBounds(Msat_Order_t *p, int nVarsMax)
Definition msatOrderH.c:101
void Msat_OrderUpdate(Msat_Order_t *p, int Var)
Definition msatOrderH.c:257
void Msat_IntVecGrow(Msat_IntVec_t *p, int nCapMin)
Definition msatVec.c:299
int Msat_IntVecPop(Msat_IntVec_t *p)
Definition msatVec.c:425
struct Msat_IntVec_t_ Msat_IntVec_t
Definition msat.h:45
typedefABC_NAMESPACE_HEADER_START struct Msat_Solver_t_ Msat_Solver_t
INCLUDES ///.
Definition msat.h:42
Msat_IntVec_t * Msat_IntVecAlloc(int nCap)
FUNCTION DEFINITIONS ///.
Definition msatVec.c:48
void Msat_IntVecFree(Msat_IntVec_t *p)
Definition msatVec.c:160
void Msat_IntVecPush(Msat_IntVec_t *p, int Entry)
Definition msatVec.c:351
DECLARATIONS ///.
Definition msatOrderH.c:32
Msat_Solver_t * pSat
Definition msatOrderH.c:33
Msat_IntVec_t * vHeap
Definition msatOrderH.c:35
Msat_IntVec_t * vIndex
Definition msatOrderH.c:34
#define assert(ex)
Definition util_old.h:213
char * memset()