ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
CGlucoseCore.h
Go to the documentation of this file.
1// The code in this file was developed by He-Teng Zhang (National Taiwan University)
2
3#ifndef Glucose_CGlucoseCore_h
4#define Glucose_CGlucoseCore_h
5
6/*
7 * justification for glucose
8 */
9
11#include "sat/glucose2/Solver.h"
12
14
15namespace Gluco2 {
16inline int Solver::justUsage() const { return jftr; }
17
18inline Lit Solver::gateJustFanin(Var v) const {
19 assert(v < nVars());
20 assert(isJReason(v));
21
22
23 lbool val0, val1;
24 val0 = value(getFaninLit0(v));
25 val1 = value(getFaninLit1(v));
26
27 if(isAND(v)){
28 // should be handled by conflict analysis before entering here
29 assert( value(v) != l_False || l_True != val0 || l_True != val1 );
30
31 if(val0 == l_False || val1 == l_False)
32 return lit_Undef;
33
34 // branch
35 if(val0 == l_True)
36 return ~getFaninLit1(v);
37 if(val1 == l_True)
38 return ~getFaninLit0(v);
39
40 //assert( jdata[v].act_fanin == activity[getFaninVar0(v)] || jdata[v].act_fanin == activity[getFaninVar1(v)] );
41 //assert( jdata[v].act_fanin == (jdata[v].adir? activity[getFaninVar1(v)]: activity[getFaninVar0(v)]) );
42 return maxActiveLit( ~getFaninLit0(v), ~getFaninLit1(v) );
43 //return jdata[v].adir? ~getFaninLit1(v): ~getFaninLit0(v);
44 } else { // xor scope
45 // should be handled by conflict analysis before entering here
46 assert( value(v) == l_Undef || value(v) != l_False || val0 == val1 );
47
48 // both are assigned
49 if( l_Undef != val0 && l_Undef != val1 )
50 return lit_Undef;
51
52 // should be handled by propagation before entering here
53 assert( l_Undef == val0 && l_Undef == val1 );
54 return maxActiveLit( getFaninPlt0(v), getFaninPlt1(v) );
55 }
56}
57
58
59// a var should at most be enqueued one time
60inline void Solver::pushJustQueue(Var v, int index){
61 assert(v < nVars());
62 assert(isJReason(v));
63
64 if( ! isRoundWatch(v) )\
65 return;
66
67 var2NodeData[v].now = true;
68
69
71 jheap.update( JustKey( activity[getFaninVar1(v)], v, index ) );
72 else
73 jheap.update( JustKey( activity[getFaninVar0(v)], v, index ) );
74}
75
77{
78 //assert( isRoundWatch(var(p)) ); // inplace sorting guarantee this
79 assert(value(p) == l_Undef);
80 assigns[var(p)] = lbool(!sign(p));
81 vardata[var(p)] = mkVarData(from, decisionLevel());
82 trail.push_(p);
83}
84
85inline void Solver::ResetJustData(bool fCleanMemory){
86 jhead = 0;
87 jheap .clear_( fCleanMemory );
88}
89
90inline Lit Solver::pickJustLit( int& index ){
91 Var next = var_Undef;
92 Lit jlit = lit_Undef;
93
94 for( ; jhead < trail.size() ; jhead++ ){
95 Var x = var(trail[jhead]);
96 if( !decisionLevel() && !isRoundWatch(x) ) continue;
97 if( isJReason(x) && l_Undef == value( getFaninVar0(x) ) && l_Undef == value( getFaninVar1(x) ) )
99 }
100
101 while( ! jheap.empty() ){
102 next = jheap.removeMin(index);
103 if( ! var2NodeData[next].now )
104 continue;
105
106 assert(isJReason(next));
107 if( lit_Undef != (jlit = gateJustFanin(next)) ){
108 //assert( jheap.prev.key() == activity[getFaninVar0(next)] || jheap.prev.key() == activity[getFaninVar1(next)] );
109 break;
110 }
111 gateAddJwatch(next,index);
112 }
113
114 return jlit;
115}
116
117
118inline void Solver::gateAddJwatch(Var v,int index){
119 assert(v < nVars());
120 assert(isJReason(v));
121
122 lbool val0, val1;
123 Var var0, var1;
124 var0 = getFaninVar0(v);
125 var1 = getFaninVar1(v);
126 val0 = value(getFaninLit0(v));
127 val1 = value(getFaninLit1(v));
128
129 assert( !isAND(v) || l_False == val0 || l_False == val1 );
130 assert( isAND(v) || (l_Undef != val0 && l_Undef != val1) );
131
132 if( (val0 == l_False && val1 == l_False) || !isAND(v) ){
133 addJwatch(vardata[var0].level < vardata[var1].level? var0: var1, v, index);
134 return;
135 }
136
137 addJwatch(l_False == val0? var0: var1, v, index);
138
139 return;
140}
141
143 if( ! var2NodeData[v].sort )
144 inplace_sort(v);
145
146 int nFanout = 0;
147 for(Lit lfo = var2Fanout0[ v ]; nFanout < var2NodeData[v].sort; lfo = var2FanoutN[ toInt(lfo) ], nFanout ++ ){
148 Var x = var(lfo);
149 if( var2NodeData[x].now && jheap.inHeap(x) ){
151 jheap.update( JustKey( activity[getFaninVar1(x)], x, jheap.data_attr(x) ) );
152 else
153 jheap.update( JustKey( activity[getFaninVar0(x)], x, jheap.data_attr(x) ) );
154 }
155 }
156}
157
158
159inline void Solver::addJwatch( Var host, Var member, int index ){
160 assert(level(host) >= level(member));
161 jnext[index] = jlevel[level(host)];
162 jlevel[level(host)] = index;
163}
164
165/*
166 * circuit propagation
167 */
168
169inline void Solver::justCheck(){
170 Lit lit;
171 int i, nJustFail = 0;
172 for(i=0; i<trail.size(); i++){
173 Var x = var(trail[i]);
174 if( ! isRoundWatch(x) )
175 continue;
176 if( !isJReason(x) )
177 continue;
178 if( lit_Undef != (lit = gateJustFanin(x)) ){
179 printf("\t%8d is not justified (value=%d, level=%3d)\n", x, l_True == value(x)? 1: 0, vardata[x].level), nJustFail ++ ;
180
181 assert(false);
182 }
183 }
184 if( nJustFail )
185 printf("%d just-fails\n", nJustFail);
186}
187
244inline void Solver::setVarFaninLits( Var v, Lit lit1, Lit lit2 ){
245 assert( var(lit1) != var(lit2) );
246 int mincap = var(lit1) < var(lit2)? var(lit2): var(lit1);
247 mincap = (v < mincap? mincap: v) + 1;
248
249 var2NodeData[ v ].lit0 = lit1;
250 var2NodeData[ v ].lit1 = lit2;
251
252
253 assert( toLit(~0) != lit1 && toLit(~0) != lit2 );
254
255 var2FanoutN[ (v<<1) + 0 ] = var2Fanout0[ var(lit1) ];
256 var2FanoutN[ (v<<1) + 1 ] = var2Fanout0[ var(lit2) ];
257 var2Fanout0[ var(lit1) ] = toLit( (v<<1) + 0 );
258 var2Fanout0[ var(lit2) ] = toLit( (v<<1) + 1 );
259
260 //if( toLit(~0) != var2FanoutN[ (v<<1) + 0 ] )
261 // var2FanoutP[ toInt(var2FanoutN[ (v<<1) + 0 ]) ] = toLit((v<<1) + 0);
262
263 //if( toLit(~0) != var2FanoutN[ (v<<1) + 1 ] )
264 // var2FanoutP[ toInt(var2FanoutN[ (v<<1) + 1 ]) ] = toLit((v<<1) + 1);
265}
266
267
268inline bool Solver::isTwoFanin( Var v ) const {
269 Lit lit0 = var2NodeData[ v ].lit0;
270 Lit lit1 = var2NodeData[ v ].lit1;
271 assert( toLit(~0) == lit0 || var(lit0) < nVars() );
272 assert( toLit(~0) == lit1 || var(lit1) < nVars() );
273 lit0.x = lit1.x = 0; // suppress the warning - alanmi
274 return toLit(~0) != var2NodeData[ v ].lit0 && toLit(~0) != var2NodeData[ v ].lit1;
275}
276
277// this implementation return the last conflict encountered
278// which follows minisat concept
280 CRef confl = CRef_Undef, stats;
281 if( justUsage() < 2 )
282 return CRef_Undef;
283
284 if( ! isRoundWatch(var(p)) )
285 return CRef_Undef;
286
287 if( ! isTwoFanin( var(p) ) )
288 goto check_fanout;
289
290
291 // check fanin consistency
292 if( CRef_Undef != (stats = gatePropagateCheckThis( var(p) )) ){
293 confl = stats;
294 if( l_True == value(var(p)) )
295 return confl;
296 }
297
298 // check fanout consistency
299check_fanout:
300 assert( var(p) < var2Fanout0.size() );
301
302 if( ! var2NodeData[var(p)].sort )
304
305 int nFanout = 0;
306 for( Lit lfo = var2Fanout0[ var(p) ]; nFanout < var2NodeData[var(p)].sort; lfo = var2FanoutN[ toInt(lfo) ], nFanout ++ )
307 {
308 if( CRef_Undef != (stats = gatePropagateCheckFanout( var(p), lfo )) ){
309 confl = stats;
310 if( l_True == value(var(lfo)) )
311 return confl;
312 }
313 }
314
315 return confl;
316}
317
319 Lit faninLit = sign(lfo)? getFaninLit1(var(lfo)): getFaninLit0(var(lfo));
320 assert( var(faninLit) == v );
321 if( isAND(var(lfo)) ){
322 if( l_False == value(faninLit) )
323 {
324 if( l_False == value(var(lfo)) )
325 return CRef_Undef;
326
327 if( l_True == value(var(lfo)) )
328 return Var2CRef(var(lfo));
329
330 var2NodeData[var(lfo)].dir = sign(lfo);
331 uncheckedEnqueue2(~mkLit(var(lfo)), Var2CRef( var(lfo) ) );
332 } else {
333 assert( l_True == value(faninLit) );
334
335 if( l_True == value(var(lfo)) )
336 return CRef_Undef;
337
338 // check value of the other fanin
339 Lit faninLitP = sign(lfo)? getFaninLit0(var(lfo)): getFaninLit1(var(lfo));
340 if( l_False == value(var(lfo)) ){
341
342 if( l_False == value(faninLitP) )
343 return CRef_Undef;
344
345 if( l_True == value(faninLitP) )
346 return Var2CRef(var(lfo));
347
348 uncheckedEnqueue2( ~faninLitP, Var2CRef( var(lfo) ) );
349 }
350 else
351 if( l_True == value(faninLitP) )
352 uncheckedEnqueue2( mkLit(var(lfo)), Var2CRef( var(lfo) ) );
353 }
354 } else { // xor scope
355 // check value of the other fanin
356 Lit faninLitP = sign(lfo)? getFaninLit0(var(lfo)): getFaninLit1(var(lfo));
357
358 lbool val0, val1, valo;
359 val0 = value(faninLit );
360 val1 = value(faninLitP);
361 valo = value(var(lfo));
362
363 if( l_Undef == val1 && l_Undef == valo )
364 return CRef_Undef;
365 else
366 if( l_Undef == val1 )
367 uncheckedEnqueue2( ~faninLitP ^ ( (l_True == val0) ^ (l_True == valo) ), Var2CRef( var(lfo) ) );
368 else
369 if( l_Undef == valo )
370 uncheckedEnqueue2( ~mkLit( var(lfo), (l_True == val0) ^ (l_True == val1) ), Var2CRef( var(lfo) ) );
371 else
372 if( l_False == (valo ^ (val0 == val1)) )
373 return Var2CRef(var(lfo));
374
375 }
376
377 return CRef_Undef;
378}
379
381 CRef confl = CRef_Undef;
382 if( isAND(v) ){
383 if( l_False == value(v) ){
384 if( l_True == value(getFaninLit0(v)) && l_True == value(getFaninLit1(v)) )
385 return Var2CRef(v);
386
387 if( l_False == value(getFaninLit0(v)) || l_False == value(getFaninLit1(v)) )
388 return CRef_Undef;
389
390 if( l_True == value(getFaninLit0(v)) )
392 if( l_True == value(getFaninLit1(v)) )
394 } else {
395 assert( l_True == value(v) );
396 if( l_False == value(getFaninLit0(v)) || l_False == value(getFaninLit1(v)) )
397 confl = Var2CRef(v);
398
399 if( l_Undef == value( getFaninLit0( v )) )
401
402 if( l_Undef == value( getFaninLit1( v )) )
404
405 }
406 } else { // xor scope
407 lbool val0, val1, valo;
408 val0 = value(getFaninLit0(v));
409 val1 = value(getFaninLit1(v));
410 valo = value(v);
411 if( l_Undef == val0 && l_Undef == val1 )
412 return CRef_Undef;
413 if( l_Undef == val0 )
414 uncheckedEnqueue2(~getFaninLit0( v ) ^ ( (l_True == val1) ^ (l_True == valo) ), Var2CRef( v ) );
415 else
416 if( l_Undef == val1 )
417 uncheckedEnqueue2(~getFaninLit1( v ) ^ ( (l_True == val0) ^ (l_True == valo) ), Var2CRef( v ) );
418 else
419 if( l_False == (valo ^ (val0 == val1)) )
420 return Var2CRef(v);
421 }
422
423 return confl;
424}
425
427 if( !isGateCRef(r) )
428 return r;
429 Var v = CRef2Var(r);
430 assert( isTwoFanin(v) );
431
432 if(isAND(v)){
433 if( l_False == value(v) ){
434 setItpcSize(3);
435 Clause& c = ca[itpc];
436 c[0] = mkLit(v);
437 c[1] = ~getFaninLit0( v );
438 c[2] = ~getFaninLit1( v );
439 } else {
440 setItpcSize(2);
441 Clause& c = ca[itpc];
442 c[0] = ~mkLit(v);
443
444 lbool val0 = value(getFaninLit0(v));
445 lbool val1 = value(getFaninLit1(v));
446
447 if( l_False == val0 && l_False == val1 )
448 c[1] = level(getFaninVar0(v)) < level(getFaninVar1(v))? getFaninLit0( v ): getFaninLit1( v );
449 else
450 if( l_False == val0 )
451 c[1] = getFaninLit0( v );
452 else
453 c[1] = getFaninLit1( v );
454 }
455 } else { // xor scope
456 setItpcSize(3);
457 Clause& c = ca[itpc];
458 c[0] = mkLit(v, l_True == value(v));
459 c[1] = mkLit(getFaninVar0(v), l_True == value(getFaninVar0(v)));
460 c[2] = mkLit(getFaninVar1(v), l_True == value(getFaninVar1(v)));
461 }
462
463
464 return itpc;
465}
466
467inline void Solver::setItpcSize( int sz ){
468 assert( 3 >= sz );
469 assert( CRef_Undef != itpc );
470 ca[itpc].header.size = sz;
471}
472
474{ // get gate-clause on implication graph
475 assert( isTwoFanin(v) );
476
477 lbool val0, val1, valo;
478 Var var0, var1;
479 var0 = getFaninVar0( v );
480 var1 = getFaninVar1( v );
481 val0 = value(var0);
482 val1 = value(var1);
483 valo = value( v );
484
485 // phased values
486 if(l_Undef != val0) val0 = val0 ^ getFaninC0( v );
487 if(l_Undef != val1) val1 = val1 ^ getFaninC1( v );
488
489
490 if( isAND(v) ){
491 if( v == t ){ // tracing output
492 if( l_False == valo ){
493 setItpcSize(2);
494 Clause& c = ca[itpc];
495 c[0] = ~mkLit(v);
496
497 c[1] = var2NodeData[v].dir ? getFaninLit1( v ): getFaninLit0( v );
498 } else {
499 setItpcSize(3);
500 Clause& c = ca[itpc];
501 c[0] = mkLit(v);
502 c[1] = ~getFaninLit0( v );
503 c[2] = ~getFaninLit1( v );
504 }
505 } else {
506 assert( t == var0 || t == var1 );
507 if( l_False == valo ){
508 setItpcSize(3);
509 Clause& c = ca[itpc];
510 c[0] = ~getFaninLit0( v );
511 c[1] = ~getFaninLit1( v );
512 c[2] = mkLit(v);
513 if( t == var1 )
514 c[1].x ^= c[0].x, c[0].x ^= c[1].x, c[1].x ^= c[0].x;
515 } else {
516 setItpcSize(2);
517 Clause& c = ca[itpc];
518 c[0] = t == var0? getFaninLit0( v ): getFaninLit1( v );
519 c[1] = ~mkLit(v);
520 }
521 }
522 } else { // xor scope
523 setItpcSize(3);
524 Clause& c = ca[itpc];
525 if( v == t ){
526 c[0] = mkLit(v, l_False == value(v));
527 c[1] = mkLit(var0, l_True == value(var0));
528 c[2] = mkLit(var1, l_True == value(var1));
529 } else {
530 if( t == var0)
531 c[0] = mkLit(var0, l_False == value(var0)), c[1] = mkLit(var1, l_True == value(var1));
532 else
533 c[1] = mkLit(var0, l_True == value(var0)), c[0] = mkLit(var1, l_False == value(var1));
534 c[2] = mkLit(v, l_True == value(v));
535 }
536 }
537
538 return itpc;
539}
540
542 CRef cr = reason( var(p) );
543 if( CRef_Undef == cr )
544 return cr;
545 if( ! isGateCRef(cr) )
546 return cr;
547 Var v = CRef2Var(cr);
548 return interpret(v,var(p));
549}
550
551inline void Solver::markCone( Var v ){
552 if( var2TravId[v] >= travId )
553 return;
554 var2TravId[v] = travId;
555 var2NodeData[v].sort = 0;
556 Var var0, var1;
557 var0 = getFaninVar0(v);
558 var1 = getFaninVar1(v);
559 if( !isTwoFanin(v) )
560 return;
561 markCone( var0 );
562 markCone( var1 );
563}
564
565inline void Solver::inplace_sort( Var v ){
566 Lit w, next, prev;
567 prev= var2Fanout0[v];
568
569 if( toLit(~0) == prev ) return;
570
571 if( isRoundWatch(var(prev)) )
572 var2NodeData[v].sort ++ ;
573
574 if( toLit(~0) == (w = var2FanoutN[toInt(prev)]) )
575 return;
576
577 while( toLit(~0) != w ){
578 next = var2FanoutN[toInt(w)];
579 if( isRoundWatch(var(w)) )
580 var2NodeData[v].sort ++ ;
581 if( isRoundWatch(var(w)) && !isRoundWatch(var(prev)) ){
583 var2Fanout0[v] = w;
584 var2FanoutN[toInt(prev)] = next;
585 } else
586 prev = w;
587 w = next;
588 }
589}
590
591inline void Solver::prelocate( int base_var_num ){
592 if( justUsage() ){
593 var2FanoutN .prelocate( base_var_num << 1 );
594 var2Fanout0 .prelocate( base_var_num );
595 var2NodeData.prelocate( base_var_num );
596 var2TravId .prelocate( base_var_num );
597 jheap .prelocate( base_var_num );
598 jlevel .prelocate( base_var_num );
599 jnext .prelocate( base_var_num );
600 }
601 watches .prelocate( base_var_num << 1 );
602 watchesBin .prelocate( base_var_num << 1 );
603
604 decision .prelocate( base_var_num );
605 trail .prelocate( base_var_num );
606 assigns .prelocate( base_var_num );
607 vardata .prelocate( base_var_num );
608 activity .prelocate( base_var_num );
609
610
611 seen .prelocate( base_var_num );
612 permDiff .prelocate( base_var_num );
613 polarity .prelocate( base_var_num );
614}
615
616
617inline void Solver::markTill( Var v, int nlim ){
618 if( var2TravId[v] == travId )
619 return;
620
621 vMarked.push(v);
622
623 if( vMarked.size() >= nlim )
624 return;
625 if( var2TravId[v] == travId-1 || !isTwoFanin(v) )
626 goto finalize;
627
628 markTill( getFaninVar0(v), nlim );
629 markTill( getFaninVar1(v), nlim );
630finalize:
631 var2TravId[v] = travId;
632}
633
634inline void Solver::markApprox( Var v0, Var v1, int nlim ){
635 int i;
636 if( travId <= 1 || nSkipMark>=4 || 0 == nlim )
637 goto finalize;
638
639 vMarked.shrink_( vMarked.size() );
640 travId ++ ; // travId = t+1
641 assert(travId>1);
642
643 markTill(v0, nlim);
644 if( vMarked.size() >= nlim )
645 goto finalize;
646
647 markTill(v1, nlim);
648 if( vMarked.size() >= nlim )
649 goto finalize;
650
651 travId -- ; // travId = t
652 for(i = 0; i < vMarked.size(); i ++){
653 var2TravId [ vMarked[i] ] = travId; // set new nodes to time t
654 var2NodeData[ vMarked[i] ].sort = 0;
655 }
656 nSkipMark ++ ;
657 return;
658finalize:
659
660 travId ++ ;
661 nSkipMark = 0;
662 markCone(v0);
663 markCone(v1);
664}
665
666inline void Solver::loadJust_rec( Var v ){
667 //assert( value(v) != l_Undef );
668 if( var2TravId[v] == travId || value(v) == l_Undef )
669 return;
670 assert( var2TravId[v] == travId-1 );
671 var2TravId[v] = travId;
672 vMarked.push(v);
673
674 if( !isTwoFanin(v) ){
675 JustModel.push( mkLit( v, value(v) == l_False ) );
676 return;
677 }
680}
681inline void Solver::loadJust(){
682 int i;
683 travId ++ ;
684 JustModel.shrink_(JustModel.size());
685 vMarked.shrink_(vMarked.size());
686 JustModel.push(toLit(0));
687 for(i = 0; i < assumptions.size(); i ++)
689 JustModel[0] = toLit( JustModel.size()-1 );
690 travId -- ;
691 for(i = 0; i < vMarked.size(); i ++)
692 var2TravId[ vMarked[i] ] = travId;
693}
694
695};
696
698
699#endif
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define l_True
Definition bmcBmcS.c:35
#define l_Undef
Definition bmcBmcS.c:34
#define l_False
Definition bmcBmcS.c:36
#define var_Undef
Definition SolverTypes.h:45
ABC_NAMESPACE_IMPL_START typedef signed char value
CRef interpret(Var v, Var t)
vec< double > activity
Definition Solver.h:237
OccLists< Lit, vec< Watcher >, WatcherDeleted > watchesBin
Definition Solver.h:242
Lit pickJustLit(int &index)
CRef gatePropagateCheckFanout(Var v, Lit lfo)
vec< Lit > JustModel
Definition Solver.h:481
bool isGateCRef(CRef cr) const
Definition Solver.h:423
vec< Lit > trail
Definition Solver.h:249
void inplace_sort(Var v)
static VarData mkVarData(CRef cr, int l)
Definition Solver.h:208
vec< unsigned int > permDiff
Definition Solver.h:260
void addJwatch(Var host, Var member, int index)
void markApprox(Var v0, Var v1, int nlim)
Var getFaninVar1(Var v) const
Definition Solver.h:394
vec< Lit > var2FanoutN
Definition Solver.h:382
int justUsage() const
vec< unsigned > var2TravId
Definition Solver.h:381
vec< char > polarity
Definition Solver.h:247
Lit maxActiveLit(Lit lit0, Lit lit1) const
Definition Solver.h:397
vec< VarData > vardata
Definition Solver.h:252
vec< char > decision
Definition Solver.h:248
OccLists< Lit, vec< Watcher >, WatcherDeleted > watches
Definition Solver.h:240
ClauseAllocator ca
Definition Solver.h:267
CRef gatePropagateCheckThis(Var v)
void ResetJustData(bool fCleanMemory)
int level(Var x) const
Definition Solver.h:492
void setItpcSize(int sz)
int nVars() const
Definition Solver.h:569
CRef getConfClause(CRef r)
void prelocate(int var_num)
vec< Var > vMarked
Definition Solver.h:460
vec< int > jlevel
Definition Solver.h:454
int decisionLevel() const
Definition Solver.h:560
void markTill(Var v0, int nlim)
vec< int > jnext
Definition Solver.h:455
unsigned travId
Definition Solver.h:425
Var CRef2Var(CRef cr) const
Definition Solver.h:422
Heap2< JustOrderLt2, JustKey > jheap
Definition Solver.h:453
void loadJust_rec(Var v)
vec< lbool > assigns
Definition Solver.h:246
Var getFaninVar0(Var v) const
Definition Solver.h:393
CRef castCRef(Lit p)
CRef reason(Var x) const
Definition Solver.h:491
CRef Var2CRef(Var v) const
Definition Solver.h:421
bool isJReason(Var v) const
Definition Solver.h:388
void markCone(Var v)
Lit getFaninPlt0(Var v) const
Definition Solver.h:395
vec< Lit > var2Fanout0
Definition Solver.h:382
CRef gatePropagate(Lit p)
void pushJustQueue(Var v, int index)
void uncheckedEnqueue2(Lit p, CRef from=CRef_Undef)
bool isAND(Var v) const
Definition Solver.h:387
void setVarFaninLits(Var v, Lit lit1, Lit lit2)
vec< char > seen
Definition Solver.h:279
Lit getFaninLit1(Var v) const
Definition Solver.h:390
bool isTwoFanin(Var v) const
bool isRoundWatch(Var v) const
Definition Solver.h:473
vec< Lit > assumptions
Definition Solver.h:256
bool getFaninC1(Var v) const
Definition Solver.h:392
Lit gateJustFanin(Var v) const
Lit getFaninPlt1(Var v) const
Definition Solver.h:396
vec< NodeData > var2NodeData
Definition Solver.h:379
void updateJustActivity(Var v)
bool getFaninC0(Var v) const
Definition Solver.h:391
void gateAddJwatch(Var v, int index)
Lit getFaninLit0(Var v) const
Definition Solver.h:389
Cube * p
Definition exorList.c:222
Definition Alg.h:28
Lit mkLit(Var var, bool sign=false)
Definition SolverTypes.h:69
bool sign(Lit p)
Definition SolverTypes.h:72
int var(Lit p)
Definition SolverTypes.h:73
const CRef CRef_Undef
void sort(T *array, int size, LessThan lt)
Definition Sort.h:58
int Var
Definition SolverTypes.h:54
const Lit lit_Undef
Definition SolverTypes.h:83
RegionAllocator< uint32_t >::Ref CRef
int toInt(Var v)
Definition SolverTypes.h:76
Lit toLit(int i)
Definition SolverTypes.h:78
int lit
Definition satVec.h:130
signed char lbool
Definition satVec.h:135
#define assert(ex)
Definition util_old.h:213