aboutsummaryrefslogtreecommitdiffstats
path: root/libs/ezsat/demo_bit.cc
blob: c7b11246cdf600ccfe551f497693c495d8819f11 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/*
 *  ezSAT -- A simple and easy to use CNF generator for SAT solvers
 *
 *  Copyright (C) 2013  Clifford Wolf <clifford@clifford.at>
 *
 *  Permission to use, copy, modify, and/or distribute this software for any
 *  purpose with or without fee is hereby granted, provided that the above
 *  copyright notice and this permission notice appear in all copies.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 */

#include "ezminisat.h"
#include <stdio.h>

void print_results(bool satisfiable, const std::vector<bool> &modelValues)
{
	if (!satisfiable) {
		printf("not satisfiable.\n\n");
	} else {
		printf("satisfiable:");
		for (auto val : modelValues)
			printf(" %d", val ? 1 : 0);
		printf("\n\n");
	}
}

int main()
{
	ezMiniSAT sat;

	// 3 input AOI-Gate
	// 'pos_active' encodes the condition under which the pullup path of the gate is active
	// 'neg_active' encodes the condition under which the pulldown path of the gate is active
	// 'impossible' encodes the condition that both or none of the above paths is active
	int pos_active = sat.AND(sat.NOT("A"), sat.OR(sat.NOT("B"), sat.NOT("C")));
	int neg_active = sat.OR("A", sat.AND("B", "C"));
	int impossible = sat.IFF(pos_active, neg_active);

	std::vector<int> modelVars;
	std::vector<bool> modelValues;
	bool satisfiable;

	modelVars.push_back(sat.VAR("A"));
	modelVars.push_back(sat.VAR("B"));
	modelVars.push_back(sat.VAR("C"));

	printf("\n");

	printf("pos_active: %s\n", sat.to_string(pos_active).c_str());
	satisfiable = sat.solve(modelVars, modelValues, pos_active);
	print_results(satisfiable, modelValues);

	printf("neg_active: %s\n", sat.to_string(neg_active).c_str());
	satisfiable = sat.solve(modelVars, modelValues, neg_active);
	print_results(satisfiable, modelValues);

	printf("impossible: %s\n", sat.to_string(impossible).c_str());
	satisfiable = sat.solve(modelVars, modelValues, impossible);
	print_results(satisfiable, modelValues);

	return 0;
}
Unit (FPU) or a kernel FPU emulator, but you still wish to support floating point functions, then everything will need to be compiled with soft floating point support (-msoft-float). Most people will answer N. config USE_MIPS16 bool "Build packages with MIPS16 instructions" if TARGET_OPTIONS depends on HAS_MIPS16 depends on !GCC_VERSION_4_6 default y help If your target CPU does support the MIPS16 instruction set and you want to use it for packages, enable this option. MIPS16 produces smaller binaries thus reducing pressure on caches and TLB. Most people will answer N. menuconfig EXTERNAL_TOOLCHAIN bool prompt "Use external toolchain" if DEVEL help If enabled, OpenWrt will compile using an existing toolchain instead of compiling one. config NATIVE_TOOLCHAIN bool prompt "Use host's toolchain" if DEVEL depends on EXTERNAL_TOOLCHAIN select NO_STRIP help If enabled, OpenWrt will compile using the native toolchain for your host instead of compiling one. config TARGET_NAME string prompt "Target name" if DEVEL depends on EXTERNAL_TOOLCHAIN && !NATIVE_TOOLCHAIN default "aarch64-unknown-linux-gnu" if aarch64 default "aarch64_be-unknown-linux-gnu" if aarch64_be default "arm-unknown-linux-gnu" if arm default "armeb-unknown-linux-gnu" if armeb default "i486-unknown-linux-gnu" if i386 default "mips-unknown-linux-gnu" if mips default "mipsel-unknown-linux-gnu" if mipsel default "powerpc-unknown-linux-gnu" if powerpc default "x86_64-unknown-linux-gnu" if x86_64 config TOOLCHAIN_PREFIX string prompt "Toolchain prefix" if DEVEL depends on EXTERNAL_TOOLCHAIN && !NATIVE_TOOLCHAIN default "aarch64-unknown-linux-gnu" if aarch64 default "aarch64_be-unknown-linux-gnu" if aarch64_be default "arm-unknown-linux-gnu-" if arm default "armeb-unknown-linux-gnu-" if armeb default "i486-unknown-linux-gnu-" if i386 default "mips-unknown-linux-gnu-" if mips default "mipsel-unknown-linux-gnu-" if mipsel default "powerpc-unknown-linux-gnu-" if powerpc default "x86_64-unknown-linux-gnu-" if x86_64 config TOOLCHAIN_ROOT string prompt "Toolchain root" if DEVEL depends on EXTERNAL_TOOLCHAIN && !NATIVE_TOOLCHAIN default "/opt/cross/aarch64-unknown-linux-gnu" if aarch64 default "/opt/cross/aarch64_be-unknown-linux-gnu" if aarch64_be default "/opt/cross/arm-unknown-linux-gnu" if arm default "/opt/cross/armeb-unknown-linux-gnu" if armeb default "/opt/cross/i486-unknown-linux-gnu" if i386 default "/opt/cross/mips-unknown-linux-gnu" if mips default "/opt/cross/mipsel-unknown-linux-gnu" if mipsel default "/opt/cross/powerpc-unknown-linux-gnu" if powerpc default "/opt/cross/x86_64-unknown-linux-gnu" if x86_64 config TOOLCHAIN_LIBC string prompt "Toolchain libc" if DEVEL depends on EXTERNAL_TOOLCHAIN && !NATIVE_TOOLCHAIN default "uclibc" help Specify the libc type used by the external toolchain. The given value is passed as -m flag to all gcc and g++ invocations. This is mainly intended for multilib toolchains which support glibc and uclibc at the same time. If no value is specified, no -m flag is passed. config TOOLCHAIN_BIN_PATH string prompt "Toolchain program path" if DEVEL depends on EXTERNAL_TOOLCHAIN && !NATIVE_TOOLCHAIN default "./usr/bin ./bin" help Specify additional directories searched for toolchain binaries (override PATH). Use ./DIR for directories relative to the root above. config TOOLCHAIN_INC_PATH string prompt "Toolchain include path" if DEVEL depends on EXTERNAL_TOOLCHAIN && !NATIVE_TOOLCHAIN default "./usr/include ./include" help Specify additional directories searched for header files (override CPPFLAGS). Use ./DIR for directories relative to the root above. config TOOLCHAIN_LIB_PATH string prompt "Toolchain library path" if DEVEL depends on EXTERNAL_TOOLCHAIN && !NATIVE_TOOLCHAIN default "./usr/lib ./lib" help Specify additional directories searched for libraries (override LDFLAGS). Use ./DIR for directories relative to the root above. config NEED_TOOLCHAIN bool depends on DEVEL default y if !EXTERNAL_TOOLCHAIN menuconfig TOOLCHAINOPTS bool "Toolchain Options" if DEVEL depends on NEED_TOOLCHAIN menuconfig EXTRA_TARGET_ARCH bool prompt "Enable an extra toolchain target architecture" if TOOLCHAINOPTS depends on !sparc default y if powerpc64 default n help Some builds may require a 'biarch' toolchain. This option allows you to specify an additional target arch. Most people will answer N here. config EXTRA_TARGET_ARCH_NAME string default "powerpc64" if powerpc64 prompt "Extra architecture name" if EXTRA_TARGET_ARCH help Specify the cpu name (eg powerpc64 or x86_64) of the additional target architecture. config EXTRA_TARGET_ARCH_OPTS string default "-m64" if powerpc64 prompt "Extra architecture compiler options" if EXTRA_TARGET_ARCH help If you're specifying an addition target architecture, you'll probably need to also provide options to make the compiler use this alternate arch. For example, if you're building a compiler that can build both powerpc and powerpc64 binaries, you'll need to specify -m64 here. choice prompt "MIPS64 user-land ABI" if TOOLCHAINOPTS && (mips64 || mips64el) default MIPS64_ABI_N64 help MIPS64 supports 3 different user-land ABIs: o32 (legacy), n32 and n64. config MIPS64_ABI_N64 bool "n64" config MIPS64_ABI_N32 bool "n32" config MIPS64_ABI_O32 bool "o32" endchoice comment "Binary tools" depends on TOOLCHAINOPTS source "toolchain/binutils/Config.in" comment "Compiler" depends on TOOLCHAINOPTS source "toolchain/gcc/Config.in" comment "C Library" depends on TOOLCHAINOPTS choice prompt "C Library implementation" if TOOLCHAINOPTS default LIBC_USE_EGLIBC if (aarch64 || aarch64_be) default LIBC_USE_UCLIBC help Select the C library implementation. config LIBC_USE_EGLIBC bool "Use eglibc" select USE_EGLIBC depends on !avr32 config LIBC_USE_UCLIBC select USE_UCLIBC bool "Use uClibc" depends on !(aarch64 || aarch64_be) config LIBC_USE_MUSL select USE_MUSL bool "Use musl" depends on !(mips64 || mips64el || aarch64 || aarch64_be) endchoice source "toolchain/eglibc/Config.in" source "toolchain/uClibc/Config.in" source "toolchain/musl/Config.in" comment "Debuggers" depends on TOOLCHAINOPTS config GDB bool depends on !(avr32 || aarch64 || aarch64_be) prompt "Build gdb" if TOOLCHAINOPTS default y if !EXTERNAL_TOOLCHAIN help Enable if you want to build the gdb. config INSIGHT bool prompt "Build insight-gdb" if TOOLCHAINOPTS select GDB default n help Enable if you want to build insight-gdb. config USE_EGLIBC bool default y if !TOOLCHAINOPTS && !EXTERNAL_TOOLCHAIN && !NATIVE_TOOLCHAIN && (aarch64 || aarch64_be || octeon) config USE_UCLIBC bool default y if !TOOLCHAINOPTS && !EXTERNAL_TOOLCHAIN && !NATIVE_TOOLCHAIN && !(aarch64 || aarch64_be || octeon) config USE_MUSL bool config USE_EXTERNAL_LIBC bool default y if EXTERNAL_TOOLCHAIN || NATIVE_TOOLCHAIN source "toolchain/gcc/Config.version" source "toolchain/eglibc/Config.version" source "toolchain/uClibc/Config.version" source "toolchain/musl/Config.version" config LIBC string default "eglibc" if USE_EGLIBC default "uClibc" if USE_UCLIBC default "musl" if USE_MUSL config LIBC_VERSION string default EGLIBC_VERSION if USE_EGLIBC default UCLIBC_VERSION if USE_UCLIBC default MUSL_VERSION if USE_MUSL config TARGET_SUFFIX string default "gnueabi" if USE_EGLIBC && (arm || armeb) default "gnu" if USE_EGLIBC && !(arm || armeb) default "uclibcgnueabi" if USE_UCLIBC && (arm || armeb) default "uclibc" if USE_UCLIBC && !(arm || armeb) default "muslgnueabi" if USE_MUSL && (arm || armeb) default "musl" if USE_MUSL && !(arm || armeb) config MIPS64_ABI depends on mips64 || mips64el string default "64" if MIPS64_ABI_N64 default "n32" if MIPS64_ABI_N32 default "32" if MIPS64_ABI_O32 default "64"