| /************************************************************************************************** |
| MiniSat -- Copyright (c) 2005, Niklas Sorensson |
| http://www.cs.chalmers.se/Cs/Research/FormalMethods/MiniSat/ |
| |
| Permission is hereby granted, free of charge, to any person obtaining a copy of this software and |
| associated documentation files (the "Software"), to deal in the Software without restriction, |
| including without limitation the rights to use, copy, modify, merge, publish, distribute, |
| sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is |
| furnished to do so, subject to the following conditions: |
| |
| The above copyright notice and this permission notice shall be included in all copies or |
| substantial portions of the Software. |
| |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT |
| NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
| DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT |
| OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| **************************************************************************************************/ |
| // Modified to compile with MS Visual Studio 6.0 by Alan Mishchenko |
| |
| #ifndef ABC__sat__bsat__satVec_h |
| #define ABC__sat__bsat__satVec_h |
| |
| #include "misc/util/abc_global.h" |
| |
| ABC_NAMESPACE_HEADER_START |
| |
| |
| // vector of 32-bit intergers (added for 64-bit portability) |
| struct veci_t { |
| int cap; |
| int size; |
| int* ptr; |
| }; |
| typedef struct veci_t veci; |
| |
| static inline void veci_new (veci* v) { |
| v->cap = 4; |
| v->size = 0; |
| v->ptr = (int*)ABC_ALLOC( char, sizeof(int)*v->cap); |
| } |
| |
| static inline void veci_delete (veci* v) { ABC_FREE(v->ptr); } |
| static inline int* veci_begin (veci* v) { return v->ptr; } |
| static inline int veci_size (veci* v) { return v->size; } |
| static inline void veci_resize (veci* v, int k) { |
| assert(k <= v->size); |
| // memset( veci_begin(v) + k, -1, sizeof(int) * (veci_size(v) - k) ); |
| v->size = k; |
| } // only safe to shrink !! |
| static inline int veci_pop (veci* v) { assert(v->size); return v->ptr[--v->size]; } |
| static inline void veci_push (veci* v, int e) |
| { |
| if (v->size == v->cap) { |
| // int newsize = v->cap * 2;//+1; |
| int newsize = (v->cap < 4) ? v->cap * 2 : (v->cap / 2) * 3; |
| v->ptr = ABC_REALLOC( int, v->ptr, newsize ); |
| if ( v->ptr == NULL ) |
| { |
| printf( "Failed to realloc memory from %.1f MB to %.1f MB.\n", |
| 1.0 * v->cap / (1<<20), 1.0 * newsize / (1<<20) ); |
| fflush( stdout ); |
| } |
| v->cap = newsize; } |
| v->ptr[v->size++] = e; |
| } |
| static inline void veci_remove(veci* v, int e) |
| { |
| int * ws = (int*)veci_begin(v); |
| int j = 0; |
| for (; ws[j] != e ; j++); |
| assert(j < veci_size(v)); |
| for (; j < veci_size(v)-1; j++) ws[j] = ws[j+1]; |
| veci_resize(v,veci_size(v)-1); |
| } |
| |
| |
| // vector of 32- or 64-bit pointers |
| struct vecp_t { |
| int cap; |
| int size; |
| void** ptr; |
| }; |
| typedef struct vecp_t vecp; |
| |
| static inline void vecp_new (vecp* v) { |
| v->size = 0; |
| v->cap = 4; |
| v->ptr = (void**)ABC_ALLOC( char, sizeof(void*)*v->cap); |
| } |
| |
| static inline void vecp_delete (vecp* v) { ABC_FREE(v->ptr); } |
| static inline void** vecp_begin (vecp* v) { return v->ptr; } |
| static inline int vecp_size (vecp* v) { return v->size; } |
| static inline void vecp_resize (vecp* v, int k) { assert(k <= v->size); v->size = k; } // only safe to shrink !! |
| static inline void vecp_push (vecp* v, void* e) |
| { |
| if (v->size == v->cap) { |
| // int newsize = v->cap * 2;//+1; |
| int newsize = (v->cap < 4) ? v->cap * 2 : (v->cap / 2) * 3; |
| v->ptr = ABC_REALLOC( void*, v->ptr, newsize ); |
| v->cap = newsize; } |
| v->ptr[v->size++] = e; |
| } |
| static inline void vecp_remove(vecp* v, void* e) |
| { |
| void** ws = vecp_begin(v); |
| int j = 0; |
| for (; ws[j] != e ; j++); |
| assert(j < vecp_size(v)); |
| for (; j < vecp_size(v)-1; j++) ws[j] = ws[j+1]; |
| vecp_resize(v,vecp_size(v)-1); |
| } |
| |
| |
| |
| //================================================================================================= |
| // Simple types: |
| |
| #ifndef __cplusplus |
| #ifndef false |
| # define false 0 |
| #endif |
| #ifndef true |
| # define true 1 |
| #endif |
| #endif |
| |
| typedef int lit; |
| typedef int cla; |
| |
| typedef char lbool; |
| |
| static const int var_Undef = -1; |
| static const lit lit_Undef = -2; |
| |
| static const lbool l_Undef = 0; |
| static const lbool l_True = 1; |
| static const lbool l_False = -1; |
| |
| static inline lit toLit (int v) { return v + v; } |
| static inline lit toLitCond(int v, int c) { return v + v + (c != 0); } |
| static inline lit lit_neg (lit l) { return l ^ 1; } |
| static inline int lit_var (lit l) { return l >> 1; } |
| static inline int lit_sign (lit l) { return l & 1; } |
| static inline int lit_print(lit l) { return lit_sign(l)? -lit_var(l)-1 : lit_var(l)+1; } |
| static inline lit lit_read (int s) { return s > 0 ? toLit(s-1) : lit_neg(toLit(-s-1)); } |
| static inline int lit_check(lit l, int n) { return l >= 0 && lit_var(l) < n; } |
| |
| struct stats_t |
| { |
| unsigned starts, clauses, learnts; |
| ABC_INT64_T decisions, propagations, inspects, conflicts; |
| ABC_INT64_T clauses_literals, learnts_literals, tot_literals; |
| }; |
| typedef struct stats_t stats_t; |
| |
| ABC_NAMESPACE_HEADER_END |
| |
| #endif |