//===--- clause.h -----------------------------------------------------------=== // // satoko: Satisfiability solver // // This file is distributed under the BSD 2-Clause License. // See LICENSE for details. // //===------------------------------------------------------------------------=== #ifndef satoko__clause_h #define satoko__clause_h #include "types.h" #include "misc/util/abc_global.h" ABC_NAMESPACE_HEADER_START struct clause { unsigned f_learnt : 1; unsigned f_mark : 1; unsigned f_reallocd : 1; unsigned f_deletable : 1; unsigned lbd : 28; unsigned size; union { unsigned lit; clause_act_t act; } data[0]; }; //===------------------------------------------------------------------------=== // Clause API //===------------------------------------------------------------------------=== static inline int clause_compare(const void *p1, const void *p2) { const struct clause *c1 = (const struct clause *)p1; const struct clause *c2 = (const struct clause *)p2; if (c1->size > 2 && c2->size == 2) return 1; if (c1->size == 2 && c2->size > 2) return 0; if (c1->size == 2 && c2->size == 2) return 0; if (c1->lbd > c2->lbd) return 1; if (c1->lbd < c2->lbd) return 0; return c1->data[c1->size].act < c2->data[c2->size].act; } static inline void clause_print(struct clause *clause) { unsigned i; printf("{ "); for (i = 0; i < clause->size; i++) printf("%u ", clause->data[i].lit); printf("}\n"); } static inline void clause_dump(FILE *file, struct clause *clause, int no_zero_var) { unsigned i; for (i = 0; i < clause->size; i++) { int var = (clause->data[i].lit >> 1); char pol = (clause->data[i].lit & 1); fprintf(file, "%d ", pol ? -(var + no_zero_var) : (var + no_zero_var)); } if (no_zero_var) fprintf(file, "0\n"); else fprintf(file, "\n"); } ABC_NAMESPACE_HEADER_END #endif /* satoko__clause_h */