//===--- cdb.h --------------------------------------------------------------=== // // satoko: Satisfiability solver // // This file is distributed under the BSD 2-Clause License. // See LICENSE for details. // //===------------------------------------------------------------------------=== #ifndef satoko__cdb_h #define satoko__cdb_h #include "clause.h" #include "misc/util/abc_global.h" ABC_NAMESPACE_HEADER_START /* Clauses DB data structure */ struct cdb { unsigned size; unsigned cap; unsigned wasted; unsigned *data; }; //===------------------------------------------------------------------------=== // Clause DB API //===------------------------------------------------------------------------=== static inline struct clause *cdb_handler(struct cdb *p, unsigned cref) { return cref != 0xFFFFFFFF ? (struct clause *)(p->data + cref) : NULL; } static inline unsigned cdb_cref(struct cdb *p, unsigned *clause) { return (unsigned)(clause - &(p->data[0])); } static inline void cdb_grow(struct cdb *p, unsigned cap) { unsigned prev_cap = p->cap; if (p->cap >= cap) return; while (p->cap < cap) { unsigned delta = ((p->cap >> 1) + (p->cap >> 3) + 2) & (unsigned)(~1); p->cap += delta; assert(p->cap >= prev_cap); } assert(p->cap > 0); p->data = satoko_realloc(unsigned, p->data, p->cap); } static inline struct cdb *cdb_alloc(unsigned cap) { struct cdb *p = satoko_calloc(struct cdb, 1); if (cap <= 0) cap = 1024 * 1024; cdb_grow(p, cap); return p; } static inline void cdb_free(struct cdb *p) { satoko_free(p->data); satoko_free(p); } static inline unsigned cdb_append(struct cdb *p, unsigned size) { unsigned prev_size; assert(size > 0); cdb_grow(p, p->size + size); prev_size = p->size; p->size += size; assert(p->size > prev_size); return prev_size; } static inline void cdb_remove(struct cdb *p, struct clause *clause) { p->wasted += clause->size; } static inline void cdb_clear(struct cdb *p) { p->wasted = 0; p->size = 0; } static inline unsigned cdb_capacity(struct cdb *p) { return p->cap; } static inline unsigned cdb_size(struct cdb *p) { return p->size; } static inline unsigned cdb_wasted(struct cdb *p) { return p->wasted; } ABC_NAMESPACE_HEADER_END #endif /* satoko__cdb_h */