cloud-sat/kissat-inc/test/testreferences.c
2023-03-26 19:15:17 +08:00

257 lines
5.7 KiB
C

#include "test.h"
#include "../src/allocate.h"
static void
test_references (void)
{
{
printf ("MAX_REF %08x\n", MAX_REF);
printf ("INVALID_REF %08x\n", INVALID_REF);
printf ("EXTERNAL_MAX_VAR %08x\n", EXTERNAL_MAX_VAR);
printf ("INTERNAL_MAX_VAR %08x\n", INTERNAL_MAX_VAR);
printf ("INTERNAL_MAX_LIT %08x\n", INTERNAL_MAX_LIT);
printf ("ILLEGAL_LIT %08x\n", ILLEGAL_LIT);
printf ("INVALID_LIT %08x\n", INVALID_LIT);
assert (sizeof (watch) == 4);
watch w;
memset (&w, 0, sizeof (w));
assert (!w.type.binary);
assert (!w.binary.binary);
assert (!w.binary.redundant);
assert (!w.binary.lit);
assert (!w.large.binary);
assert (!w.large.ref);
assert (!w.blocking.binary);
assert (!w.blocking.lit);
w.type.binary = true;
assert (w.binary.binary);
assert (!w.binary.redundant);
assert (!w.binary.lit);
assert (w.large.binary);
assert (!w.large.ref);
assert (w.blocking.binary);
assert (!w.blocking.lit);
w.binary.lit = INTERNAL_MAX_LIT;
w.binary.redundant = true;
assert (w.binary.lit == INTERNAL_MAX_LIT);
assert (w.blocking.lit == INTERNAL_MAX_LIT);
assert (w.raw != INVALID_REF);
assert (w.raw != INVALID_VECTOR_ELEMENT);
printf ("(true,true,INTERNAL_MAX_LIT) %08x\n", w.raw);
w.type.binary = false;
w.type.lit = 42;
assert (w.binary.lit == 42);
assert (w.blocking.lit == 42);
w.large.ref = MAX_REF;
assert (!w.type.binary);
assert (w.large.ref == MAX_REF);
assert (w.raw == MAX_REF);
assert (w.raw != INVALID_REF);
assert (w.raw != INVALID_VECTOR_ELEMENT);
w.raw = MAX_REF;
assert (!w.type.binary);
assert (w.large.ref == MAX_REF);
assert (w.raw != INVALID_REF);
assert (w.raw != INVALID_VECTOR_ELEMENT);
w.raw = INVALID_REF;
assert (w.type.binary);
assert (w.binary.redundant);
assert (w.binary.lit > INTERNAL_MAX_LIT);
printf ("w.large.ref (INVALID_REF) %08x\n", w.large.ref);
printf ("w.binary.lit (INVALID_REF) %08x\n", w.binary.lit);
printf ("w.blocking.lit (INVALID_REF) %08x\n", w.blocking.lit);
}
{
DECLARE_AND_INIT_SOLVER (solver);
watches watches;
memset (&watches, 0, sizeof watches);
bool refs[2];
bool found[6];
#define SETUP_FOUND_AND_CLAUSES() \
do { \
memset (found, 0, sizeof found); \
memset (refs, 0, sizeof refs); \
} while (0)
kissat_push_binary_watch (solver, &watches, true, false, 0);
kissat_push_blocking_watch (solver, &watches, 1, 0);
kissat_push_binary_watch (solver, &watches, false, false, 2);
kissat_push_blocking_watch (solver, &watches, 3, 1);
kissat_push_binary_watch (solver, &watches, true, false, 4);
kissat_push_binary_watch (solver, &watches, false, false, 5);
SETUP_FOUND_AND_CLAUSES ();
int binary = 0, blocking = 0, redundant = 0, count = 0;
{
reference ref;
for (all_binary_blocking_watch_ref (watch, ref, watches))
{
count++;
if (watch.type.binary)
{
binary++;
if (watch.binary.redundant)
redundant++;
assert (ref == INVALID_REF);
}
else
{
blocking++;
assert (ref < 2);
assert (!refs[ref]);
refs[ref] = true;
}
assert (watch.type.lit < 6);
assert (!found[watch.type.lit]);
found[watch.type.lit] = true;
}
}
assert (count == 6);
assert (binary == 4);
assert (blocking == 2);
assert (redundant == 2);
for (int i = 0; i < 6; i++)
assert (found[i]);
for (int i = 0; i < 2; i++)
assert (refs[i]);
{
watch *q = BEGIN_WATCHES (watches);
for (all_binary_blocking_watches (watch, watches))
if (watch.type.binary)
*q++ = watch;
SET_END_OF_WATCHES (watches, q);
}
SETUP_FOUND_AND_CLAUSES ();
count = binary = redundant = 0;
{
reference ref;
for (all_binary_blocking_watch_ref (watch, ref, watches))
{
count++;
assert (watch.type.binary);
binary++;
if (watch.binary.redundant)
redundant++;
assert (ref == INVALID_REF);
assert (watch.type.lit < 6);
assert (!found[watch.type.lit]);
found[watch.type.lit] = true;
}
}
assert (count == 4);
assert (binary == 4);
assert (redundant == 2);
for (int i = 0; i < 2; i++)
assert (!refs[i]);
assert (found[0]);
assert (!found[1]);
assert (found[2]);
assert (!found[3]);
assert (found[4]);
assert (found[5]);
assert (!refs[0]);
assert (!refs[1]);
solver->watching = false;
kissat_push_large_watch (solver, &watches, 0);
kissat_push_large_watch (solver, &watches, 1);
SETUP_FOUND_AND_CLAUSES ();
int large = 0;
count = binary = redundant = 0;
for (all_binary_large_watches (watch, watches))
{
count++;
if (watch.type.binary)
{
binary++;
if (watch.binary.redundant)
redundant++;
assert (watch.binary.lit < 6);
assert (!found[watch.binary.lit]);
found[watch.binary.lit] = true;
}
else
{
large++;
assert (watch.large.ref < 2);
assert (!refs[watch.large.ref]);
refs[watch.large.ref] = true;
}
}
assert (count == 6);
assert (binary == 4);
assert (redundant == 2);
assert (large == 2);
assert (found[0]);
assert (!found[1]);
assert (found[2]);
assert (!found[3]);
assert (found[4]);
assert (found[5]);
assert (refs[0]);
assert (refs[1]);
RELEASE_WATCHES (watches);
RELEASE_STACK (solver->vectors.stack);
#ifndef NMETRICS
assert (!solver->statistics.allocated_current);
#endif
}
#undef SETUP_FOUND_AND_CLAUSES
#undef PUSH_WATCHS
}
void
tissat_schedule_references (void)
{
SCHEDULE_FUNCTION (test_references);
}