ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
kitten.h File Reference
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include "global.h"
Include dependency graph for kitten.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Typedefs

typedef typedefABC_NAMESPACE_HEADER_START struct kitten kitten
 

Functions

kittenkitten_init (void)
 
void kitten_clear (kitten *)
 
void kitten_release (kitten *)
 
void kitten_track_antecedents (kitten *)
 
void kitten_shuffle_clauses (kitten *)
 
void kitten_flip_phases (kitten *)
 
void kitten_randomize_phases (kitten *)
 
void kitten_assume (kitten *, unsigned lit)
 
void kitten_clause (kitten *, size_t size, unsigned *)
 
void kitten_unit (kitten *, unsigned)
 
void kitten_binary (kitten *, unsigned, unsigned)
 
void kitten_clause_with_id_and_exception (kitten *, unsigned id, size_t size, const unsigned *, unsigned except)
 
void kitten_no_ticks_limit (kitten *)
 
void kitten_set_ticks_limit (kitten *, uint64_t)
 
int kitten_solve (kitten *)
 
int kitten_status (kitten *)
 
signed char kitten_value (kitten *, unsigned)
 
signed char kitten_fixed (kitten *, unsigned)
 
bool kitten_failed (kitten *, unsigned)
 
bool kitten_flip_literal (kitten *, unsigned)
 
unsigned kitten_compute_clausal_core (kitten *, uint64_t *learned)
 
void kitten_shrink_to_clausal_core (kitten *)
 
void kitten_traverse_core_ids (kitten *, void *state, void(*traverse)(void *state, unsigned id))
 
void kitten_traverse_core_clauses (kitten *, void *state, void(*traverse)(void *state, bool learned, size_t, const unsigned *))
 
kittenkitten_embedded (struct kissat *)
 

Typedef Documentation

◆ kitten

typedef typedefABC_NAMESPACE_HEADER_START struct kitten kitten

Definition at line 11 of file kitten.h.

Function Documentation

◆ kitten_assume()

void kitten_assume ( kitten * kitten,
unsigned lit )

Definition at line 1763 of file kitten.c.

1763 {
1765 if (kitten->status)
1766 reset_incremental (kitten);
1767 const unsigned ilit = import_literal (kitten, elit);
1768 LOG ("registering assumption %u", ilit);
1769 PUSH_STACK (kitten->assumptions, ilit);
1770}
#define PUSH_STACK(S, E)
Definition stack.h:39
#define REQUIRE_INITIALIZED()
Definition kitten.c:628
#define LOG(...)
Definition kitten.c:422
unsigneds assumptions
Definition kitten.c:259
int status
Definition kitten.c:216

◆ kitten_binary()

void kitten_binary ( kitten * kitten,
unsigned a,
unsigned b )

Definition at line 1809 of file kitten.c.

1809 {
1810 unsigned clause[2] = {a, b};
1812}
void kitten_clause(kitten *kitten, size_t size, unsigned *elits)
Definition kitten.c:1800
Here is the call graph for this function:

◆ kitten_clause()

void kitten_clause ( kitten * kitten,
size_t size,
unsigned * elits )

Definition at line 1800 of file kitten.c.

1800 {
1802 INVALID);
1803}
#define INVALID
void kitten_clause_with_id_and_exception(kitten *kitten, unsigned id, size_t size, const unsigned *elits, unsigned except)
Definition kitten.c:1772
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kitten_clause_with_id_and_exception()

void kitten_clause_with_id_and_exception ( kitten * kitten,
unsigned id,
size_t size,
const unsigned * elits,
unsigned except )

Definition at line 1772 of file kitten.c.

1775 {
1777 if (kitten->status)
1778 reset_incremental (kitten);
1780 const unsigned *const end = elits + size;
1781 for (const unsigned *p = elits; p != end; p++) {
1782 const unsigned elit = *p;
1783 if (elit == except)
1784 continue;
1785 const unsigned ilit = import_literal (kitten, elit);
1786 KISSAT_assert (ilit < kitten->lits);
1787 const unsigned iidx = ilit / 2;
1788 if (kitten->marks[iidx])
1789 INVALID_API_USAGE ("variable '%u' of literal '%u' occurs twice",
1790 elit / 2, elit);
1791 kitten->marks[iidx] = true;
1792 PUSH_STACK (kitten->klause, ilit);
1793 }
1794 for (unsigned *p = kitten->klause.begin; p != kitten->klause.end; p++)
1795 kitten->marks[*p / 2] = false;
1796 new_original_klause (kitten, id);
1798}
#define EMPTY_STACK(S)
Definition stack.h:18
#define CLEAR_STACK(S)
Definition stack.h:50
Cube * p
Definition exorList.c:222
#define KISSAT_assert(ignore)
Definition global.h:13
#define INVALID_API_USAGE(...)
Definition kitten.c:626
unsigned long long size
Definition giaNewBdd.h:39
unsigneds klause
Definition kitten.c:263
value * marks
Definition kitten.c:251
Here is the caller graph for this function:

◆ kitten_clear()

void kitten_clear ( kitten * kitten)

Definition at line 986 of file kitten.c.

986 {
987 LOG ("clear kitten of size %zu", kitten->size);
988
993
1000
1001 for (all_kits (kit))
1002 CLEAR_STACK (KATCHES (kit));
1003
1004 while (!EMPTY_STACK (kitten->export_))
1006
1007 const size_t lits = kitten->size;
1008 const unsigned vars = lits / 2;
1009
1010#ifndef KISSAT_NDEBUG
1011 for (unsigned i = 0; i < vars; i++)
1012 KISSAT_assert (!kitten->marks[i]);
1013#endif
1014
1015 if (vars) {
1016 memset (kitten->phases, 0, vars);
1017 memset (kitten->vars, 0, vars);
1018 }
1019
1020 if (lits) {
1021 memset (kitten->values, 0, lits);
1022 memset (kitten->failed, 0, lits);
1023 }
1024
1025 clear_kitten (kitten);
1026}
#define POP_STACK(S)
Definition stack.h:37
#define KATCHES(KIT)
#define all_kits(KIT)
kar * vars
Definition kitten.c:249
unsigned * import
Definition kitten.c:255
value * values
Definition kitten.c:252
unsigneds core
Definition kitten.c:260
unsigneds analyzed
Definition kitten.c:258
unsigneds units
Definition kitten.c:267
unsigneds export_
Definition kitten.c:262
unsigneds eclause
Definition kitten.c:261
bool * failed
Definition kitten.c:253
unsigneds trail
Definition kitten.c:266
unsigneds resolved
Definition kitten.c:265
size_t size
Definition kitten.c:246
unsigned char * phases
Definition kitten.c:254
unsigneds klauses
Definition kitten.c:264
char * memset()
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kitten_compute_clausal_core()

unsigned kitten_compute_clausal_core ( kitten * kitten,
uint64_t * learned )

Definition at line 1872 of file kitten.c.

1873 {
1874 REQUIRE_STATUS (20);
1875
1876 if (!kitten->antecedents)
1877 INVALID_API_USAGE ("antecedents not tracked");
1878
1879 LOG ("computing clausal core");
1880
1881 unsigneds *resolved = &kitten->resolved;
1882 KISSAT_assert (EMPTY_STACK (*resolved));
1883
1884 unsigned original = 0;
1885 uint64_t learned = 0;
1886
1887 unsigned reason_ref = kitten->inconsistent;
1888
1889 if (reason_ref == INVALID) {
1891 reason_ref = kitten->failing;
1892 if (reason_ref == INVALID) {
1893 LOG ("assumptions mutually inconsistent");
1894
1895
1896 // goto DONE;
1897 if (learned_ptr)
1898 *learned_ptr = learned;
1899
1900 LOG ("clausal core of %u original clauses", original);
1901 LOG ("clausal core of %" PRIu64 " learned clauses", learned);
1902#ifdef STAND_ALONE_KITTEN
1903 kitten->statistics.original = original;
1904 kitten->statistics.learned = 0;
1905#endif
1906 UPDATE_STATUS (21);
1907
1908 return original;
1909
1910
1911 }
1912 }
1913
1914 PUSH_STACK (*resolved, reason_ref);
1915 unsigneds *core = &kitten->core;
1916 KISSAT_assert (EMPTY_STACK (*core));
1917
1918 while (!EMPTY_STACK (*resolved)) {
1919 const unsigned c_ref = POP_STACK (*resolved);
1920 if (c_ref == INVALID) {
1921 const unsigned d_ref = POP_STACK (*resolved);
1922 ROG (d_ref, "core[%zu]", SIZE_STACK (*core));
1923 PUSH_STACK (*core, d_ref);
1924 klause *d = dereference_klause (kitten, d_ref);
1925 KISSAT_assert (!is_core_klause (d));
1926 set_core_klause (d);
1927 if (is_learned_klause (d))
1928 learned++;
1929 else
1930 original++;
1931 } else {
1932 klause *c = dereference_klause (kitten, c_ref);
1933 if (is_core_klause (c))
1934 continue;
1935 PUSH_STACK (*resolved, c_ref);
1936 PUSH_STACK (*resolved, INVALID);
1937 ROG (c_ref, "analyzing antecedent core");
1938 if (!is_learned_klause (c))
1939 continue;
1940 for (all_antecedents (d_ref, c)) {
1941 klause *d = dereference_klause (kitten, d_ref);
1942 if (!is_core_klause (d))
1943 PUSH_STACK (*resolved, d_ref);
1944 }
1945 }
1946 }
1947
1948 //DONE:
1949
1950 if (learned_ptr)
1951 *learned_ptr = learned;
1952
1953 LOG ("clausal core of %u original clauses", original);
1954 LOG ("clausal core of %" PRIu64 " learned clauses", learned);
1955#ifdef STAND_ALONE_KITTEN
1956 kitten->statistics.original = original;
1957 kitten->statistics.learned = 0;
1958#endif
1959 UPDATE_STATUS (21);
1960
1961 return original;
1962}
#define SIZE_STACK(S)
Definition stack.h:19
#define all_antecedents(REF, C)
#define ROG(...)
Definition kitten.c:425
#define REQUIRE_STATUS(EXPECTED)
Definition kitten.c:634
#define UPDATE_STATUS(STATUS)
Definition kitten.c:643
unsigned inconsistent
Definition kitten.c:227
unsigned failing
Definition kitten.c:228
bool learned
Definition kitten.c:222
bool antecedents
Definition kitten.c:221
Here is the caller graph for this function:

◆ kitten_embedded()

kitten * kitten_embedded ( struct kissat * kissat)

Definition at line 664 of file kitten.c.

664 {
665 if (!kissat)
666 INVALID_API_USAGE ("'kissat' argument zero");
667
668 kitten *kitten;
669 struct kitten dummy;
670 dummy.kissat = kissat;
671 kitten = &dummy;
672 CALLOC (struct kitten, kitten, 1);
674 initialize_kitten (kitten);
675 return kitten;
676}
#define CALLOC(T, P, N)
struct kissat * kissat
Definition kitten.c:210

◆ kitten_failed()

bool kitten_failed ( kitten * kitten,
unsigned elit )

Definition at line 2137 of file kitten.c.

2137 {
2138 REQUIRE_STATUS (20);
2139 const unsigned eidx = elit / 2;
2140 if (eidx >= kitten->evars)
2141 return false;
2142 unsigned iidx = kitten->import[eidx];
2143 if (!iidx)
2144 return false;
2145 const unsigned ilit = 2 * (iidx - 1) + (elit & 1);
2146 return kitten->failed[ilit];
2147}
size_t evars
Definition kitten.c:233

◆ kitten_fixed()

signed char kitten_fixed ( kitten * kitten,
unsigned elit )

Definition at line 2107 of file kitten.c.

2107 {
2108 const unsigned eidx = elit / 2;
2109 if (eidx >= kitten->evars)
2110 return 0;
2111 unsigned iidx = kitten->import[eidx];
2112 if (!iidx)
2113 return 0;
2114 iidx--;
2115 const unsigned ilit = 2 * iidx + (elit & 1);
2116 signed char res = kitten->values[ilit];
2117 if (!res)
2118 return 0;
2119 kar *v = kitten->vars + iidx;
2120 if (v->level)
2121 return 0;
2122 return res;
2123}
struct kar kar

◆ kitten_flip_literal()

bool kitten_flip_literal ( kitten * kitten,
unsigned elit )

Definition at line 2125 of file kitten.c.

2125 {
2126 REQUIRE_STATUS (10);
2127 const unsigned eidx = elit / 2;
2128 if (eidx >= kitten->evars)
2129 return false;
2130 unsigned iidx = kitten->import[eidx];
2131 if (!iidx)
2132 return false;
2133 const unsigned ilit = 2 * (iidx - 1) + (elit & 1);
2134 return flip_literal (kitten, ilit);
2135}

◆ kitten_flip_phases()

void kitten_flip_phases ( kitten * kitten)

Definition at line 722 of file kitten.c.

722 {
724
725 LOG ("flipping phases");
726
727 unsigned char *phases = kitten->phases;
728 const unsigned vars = kitten->size / 2;
729
730 unsigned i = 0;
731 const unsigned rest = vars & ~7u;
732
733 while (i != rest) {
734 uint64_t *p = (uint64_t *) (phases + i);
735 *p ^= 0x0101010101010101;
736 i += 8;
737 }
738
739 while (i != vars)
740 phases[i++] ^= 1;
741}

◆ kitten_init()

kitten * kitten_init ( void )

◆ kitten_no_ticks_limit()

void kitten_no_ticks_limit ( kitten * kitten)

Definition at line 743 of file kitten.c.

743 {
745 LOG ("forcing no ticks limit");
746 kitten->limits.ticks = UINT64_MAX;
747}
uint64_t ticks
kimits limits
Definition kitten.c:269

◆ kitten_randomize_phases()

void kitten_randomize_phases ( kitten * kitten)

Definition at line 690 of file kitten.c.

690 {
692
693 LOG ("randomizing phases");
694
695 unsigned char *phases = kitten->phases;
696 const unsigned vars = kitten->size / 2;
697
698 uint64_t random = kissat_next_random64 (&kitten->generator);
699
700 unsigned i = 0;
701 const unsigned rest = vars & ~63u;
702
703 while (i != rest) {
704 uint64_t *p = (uint64_t *) (phases + i);
705 p[0] = (random >> 0) & 0x0101010101010101;
706 p[1] = (random >> 1) & 0x0101010101010101;
707 p[2] = (random >> 2) & 0x0101010101010101;
708 p[3] = (random >> 3) & 0x0101010101010101;
709 p[4] = (random >> 4) & 0x0101010101010101;
710 p[5] = (random >> 5) & 0x0101010101010101;
711 p[6] = (random >> 6) & 0x0101010101010101;
712 p[7] = (random >> 7) & 0x0101010101010101;
713 random = kissat_next_random64 (&kitten->generator);
714 i += 64;
715 }
716
717 unsigned shift = 0;
718 while (i != vars)
719 phases[i++] = (random >> shift++) & 1;
720}
uint64_t generator
Definition kitten.c:230
long random()
Here is the call graph for this function:

◆ kitten_release()

void kitten_release ( kitten * kitten)

Definition at line 1028 of file kitten.c.

1028 {
1039
1040 for (size_t lit = 0; lit < kitten->size; lit++)
1042
1043#ifndef STAND_ALONE_KITTEN
1044 const size_t lits = kitten->size;
1045 const unsigned vars = lits / 2;
1046#endif
1047 DEALLOC (kitten->marks, vars);
1048 DEALLOC (kitten->phases, vars);
1049 DEALLOC (kitten->values, lits);
1050 DEALLOC (kitten->failed, lits);
1051 DEALLOC (kitten->vars, vars);
1052 DEALLOC (kitten->links, vars);
1053 DEALLOC (kitten->watches, lits);
1055#ifdef STAND_ALONE_KITTEN
1056 free (kitten);
1057#else
1058 kissat_free (kitten->kissat, kitten, sizeof *kitten);
1059#endif
1060}
void kissat_free(kissat *solver, void *ptr, size_t bytes)
Definition allocate.c:61
#define RELEASE_STACK(S)
Definition stack.h:71
#define DEALLOC(P, N)
int lit
Definition satVec.h:130
katches * watches
Definition kitten.c:256
kink * links
Definition kitten.c:250
size_t esize
Definition kitten.c:247
VOID_HACK free()
Here is the call graph for this function:

◆ kitten_set_ticks_limit()

void kitten_set_ticks_limit ( kitten * kitten,
uint64_t delta )

Definition at line 749 of file kitten.c.

749 {
751 const uint64_t current = KITTEN_TICKS;
752 uint64_t limit;
753 if (UINT64_MAX - delta <= current) {
754 LOG ("forcing unlimited ticks limit");
755 limit = UINT64_MAX;
756 } else {
757 limit = current + delta;
758 LOG ("new limit of %" PRIu64 " ticks after %" PRIu64, limit, delta);
759 }
760
761 kitten->limits.ticks = limit;
762}
#define KITTEN_TICKS
Here is the caller graph for this function:

◆ kitten_shrink_to_clausal_core()

void kitten_shrink_to_clausal_core ( kitten * kitten)

Definition at line 2022 of file kitten.c.

2022 {
2023 REQUIRE_STATUS (21);
2024
2025 LOG ("shrinking formula to core of original clauses");
2026
2028
2029 kitten->unassigned = kitten->lits / 2;
2030 kitten->propagated = 0;
2031 kitten->level = 0;
2032
2033 update_search (kitten, kitten->queue.last);
2034
2035 memset (kitten->values, 0, kitten->lits);
2036
2037 for (all_kits (lit))
2039
2041 klause *inconsistent = dereference_klause (kitten, kitten->inconsistent);
2042 if (is_learned_klause (inconsistent) || inconsistent->size) {
2043 ROG (kitten->inconsistent, "resetting inconsistent");
2045 } else
2046 ROG (kitten->inconsistent, "keeping inconsistent");
2047
2049
2050 klause *begin = begin_klauses (kitten), *q = begin;
2051 klause const *const end = end_original_klauses (kitten);
2052#ifdef LOGGING
2053 unsigned original = 0;
2054#endif
2055 for (klause *c = begin, *next; c != end; c = next) {
2056 next = next_klause (kitten, c);
2057 KISSAT_assert (!is_learned_klause (c));
2058 if (is_learned_klause (c))
2059 continue;
2060 if (!is_core_klause (c))
2061 continue;
2062 unset_core_klause (c);
2063 const unsigned dst = (unsigned *) q - (unsigned *) begin;
2064 const unsigned size = c->size;
2065 if (!size) {
2066 if (!kitten->inconsistent)
2067 kitten->inconsistent = dst;
2068 } else if (size == 1)
2069 PUSH_STACK (kitten->units, dst);
2070 else {
2071 watch_klause (kitten, c->lits[0], c, dst);
2072 watch_klause (kitten, c->lits[1], c, dst);
2073 }
2074 if (c == q)
2075 q = next;
2076 else {
2077 const size_t bytes = (char *) next - (char *) c;
2078 memmove (q, c, bytes);
2079 q = (klause *) ((char *) q + bytes);
2080 }
2081#ifdef LOGGING
2082 original++;
2083#endif
2084 }
2085 SET_END_OF_STACK (kitten->klauses, (unsigned *) q);
2087 LOG ("end of original clauses at %zu", kitten->end_original_ref);
2088 LOG ("%u original clauses left", original);
2089
2091
2092 UPDATE_STATUS (0);
2093}
#define SET_END_OF_STACK(S, P)
Definition stack.h:62
size_t lits
Definition kitten.c:232
unsigned propagated
Definition kitten.c:225
unsigned level
Definition kitten.c:224
struct kitten::@051124040274372165372010377332320121035140324322 queue
unsigned last
Definition kitten.c:238
unsigned unassigned
Definition kitten.c:226
size_t end_original_ref
Definition kitten.c:235
char * memmove()
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kitten_shuffle_clauses()

void kitten_shuffle_clauses ( kitten * kitten)

Definition at line 825 of file kitten.c.

825 {
826 REQUIRE_STATUS (0);
827 shuffle_queue (kitten);
828 shuffle_katches (kitten);
829 shuffle_units (kitten);
830}
Here is the caller graph for this function:

◆ kitten_solve()

int kitten_solve ( kitten * kitten)

Definition at line 1818 of file kitten.c.

1818 {
1820 if (kitten->status)
1821 reset_incremental (kitten);
1822 else if (kitten->level)
1824
1825 LOG ("starting solving under %zu assumptions",
1827
1828 INC (kitten_solved);
1829
1830 int res = propagate_units (kitten);
1831 while (!res) {
1832 const unsigned conflict = propagate (kitten);
1833 if (conflict != INVALID) {
1834 if (kitten->level)
1835 analyze (kitten, conflict);
1836 else {
1837 inconsistent (kitten, conflict);
1838 res = 20;
1839 }
1840 } else
1841#ifdef STAND_ALONE_KITTEN
1842 if (time_limit_hit) {
1843 time_limit_hit = false;
1844 break;
1845 } else
1846#endif
1847 res = decide (kitten);
1848 }
1849
1850 if (res < 0)
1851 res = 0;
1852
1853 if (!res && !EMPTY_STACK (kitten->assumptions))
1854 reset_assumptions (kitten);
1855
1856 UPDATE_STATUS (res);
1857
1858 if (res == 10)
1859 INC (kitten_sat);
1860 else if (res == 20)
1861 INC (kitten_unsat);
1862 else
1863 INC (kitten_unknown);
1864
1865 LOG ("finished solving with result %d", res);
1866
1867 return res;
1868}
#define INC(NAME)
void completely_backtrack_to_root_level(kitten *kitten)
Definition kitten.c:1260
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kitten_status()

int kitten_status ( kitten * kitten)

Definition at line 1870 of file kitten.c.

1870{ return kitten->status; }

◆ kitten_track_antecedents()

void kitten_track_antecedents ( kitten * kitten)

Definition at line 680 of file kitten.c.

680 {
681 REQUIRE_STATUS (0);
682
683 if (kitten->learned)
684 INVALID_API_USAGE ("can not start tracking antecedents after learning");
685
686 LOG ("enabling antecedents tracking");
687 kitten->antecedents = true;
688}
Here is the caller graph for this function:

◆ kitten_traverse_core_clauses()

void kitten_traverse_core_clauses ( kitten * kitten,
void * state,
void(* traverse )(void *state, bool learned, size_t, const unsigned *) )

Definition at line 1989 of file kitten.c.

1991 {
1992 REQUIRE_STATUS (21);
1993
1994 LOG ("traversing clausal core");
1995
1996 unsigned traversed = 0;
1997
1998 for (all_stack (unsigned, c_ref, kitten->core)) {
1999 klause *c = dereference_klause (kitten, c_ref);
2000 KISSAT_assert (is_core_klause (c));
2001 const bool learned = is_learned_klause (c);
2002 unsigneds *eclause = &kitten->eclause;
2003 KISSAT_assert (EMPTY_STACK (*eclause));
2004 for (all_literals_in_klause (ilit, c)) {
2005 const unsigned elit = export_literal (kitten, ilit);
2006 PUSH_STACK (*eclause, elit);
2007 }
2008 const size_t size = SIZE_STACK (*eclause);
2009 const unsigned *elits = eclause->begin;
2010 ROG (reference_klause (kitten, c), "traversing");
2011 traverse (state, learned, size, elits);
2012 CLEAR_STACK (*eclause);
2013 traversed++;
2014 }
2015
2016 LOG ("traversed %u core clauses", traversed);
2017 (void) traversed;
2018
2019 KISSAT_assert (kitten->status == 21);
2020}
#define all_stack(T, E, S)
Definition stack.h:94
#define all_literals_in_klause(KIT, C)
Here is the caller graph for this function:

◆ kitten_traverse_core_ids()

void kitten_traverse_core_ids ( kitten * kitten,
void * state,
void(* traverse )(void *state, unsigned id) )

Definition at line 1964 of file kitten.c.

1965 {
1966 REQUIRE_STATUS (21);
1967
1968 LOG ("traversing core of original clauses");
1969
1970 unsigned traversed = 0;
1971
1972 for (all_original_klauses (c)) {
1973 KISSAT_assert (!is_learned_klause (c));
1974 if (is_learned_klause (c))
1975 continue;
1976 if (!is_core_klause (c))
1977 continue;
1978 ROG (reference_klause (kitten, c), "traversing");
1979 traverse (state, c->aux);
1980 traversed++;
1981 }
1982
1983 LOG ("traversed %u original core clauses", traversed);
1984 (void) traversed;
1985
1986 KISSAT_assert (kitten->status == 21);
1987}
#define all_original_klauses(C)
Here is the caller graph for this function:

◆ kitten_unit()

void kitten_unit ( kitten * kitten,
unsigned lit )

Definition at line 1805 of file kitten.c.

1805 {
1806 kitten_clause (kitten, 1, &lit);
1807}
Here is the call graph for this function:

◆ kitten_value()

signed char kitten_value ( kitten * kitten,
unsigned elit )

Definition at line 2095 of file kitten.c.

2095 {
2096 REQUIRE_STATUS (10);
2097 const unsigned eidx = elit / 2;
2098 if (eidx >= kitten->evars)
2099 return 0;
2100 unsigned iidx = kitten->import[eidx];
2101 if (!iidx)
2102 return 0;
2103 const unsigned ilit = 2 * (iidx - 1) + (elit & 1);
2104 return kitten->values[ilit];
2105}