mirror of https://github.com/YosysHQ/abc.git
159 lines
5.5 KiB
C
159 lines
5.5 KiB
C
/**************************************************************************************************
|
|
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 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
|