diff --git a/.gitignore b/.gitignore index 5efbc5c..d67ff1f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,14 +2,12 @@ *.log *.iml *.class -*.cmake *.so *.cbp /c/CMakeFiles */.idea *.txt -!CMakeLists.txt -/c/Makefile -/java/target !'.git' +/.idea/ +/target/ diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index a3a89ea..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "c/boolector"] - path = c/boolector - url = https://github.com/boolector/boolector diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b4168cf --- /dev/null +++ b/Makefile @@ -0,0 +1,45 @@ +BASE_DIR=$(shell pwd) + +PREFIX=/usr + +CC=gcc +CFLAGS=-c -Wall -fPIC -I/usr/lib/jvm/default/include -I/usr/lib/jvm/default/include/linux -I/usr/include/boolector -I/usr/include/boolector-java +LDFLAGS=-fPIC -shared -lboolector + +SOURCES_DIR=${BASE_DIR}/src/main/c +OBJECTS_DIR=${BASE_DIR}/target/c +TARGET_DIR=${BASE_DIR}/lib +EXECUTABLE_NAME=libboolector-java.so +EXECUTABLE=${TARGET_DIR}/$(EXECUTABLE_NAME) + +SOURCES=$(shell find '$(SOURCES_DIR)' -type f -name '*.c') +OBJECTS=$(SOURCES:$(SOURCES_DIR)/%.c=$(OBJECTS_DIR)/%.o) + +all: $(EXECUTABLE) + +$(EXECUTABLE): $(OBJECTS) headers + mkdir -p $(TARGET_DIR) + $(CC) $(LDFLAGS) $(OBJECTS) -o $@ + +$(OBJECTS): $(SOURCES) + mkdir -p $(OBJECTS_DIR) + $(CC) $(CFLAGS) $< -o $@ + +headers: + javah -d $(SOURCES_DIR) -classpath $(BASE_DIR)/src/main/java -force org.jetbrains.research.boolector.Native + +clean: + rm -rfi $(OBJECTS_DIR) $(EXECUTABLE) + +.PHONY: install +install: + mkdir -p $(DESTDIR)$(PREFIX)/lib + mkdir -p $(DESTDIR)$(PREFIX)/include/boolector-java + cp $(EXECUTABLE) $(DESTDIR)$(PREFIX)/lib/$(EXECUTABLE_NAME) + cp $(SOURCES_DIR)/*.h $(DESTDIR)$(PREFIX)/include/boolector-java + +.PHONY: uninstall +uninstall: + rm -f $(DESTDIR)$(PREFIX)/lib/$(EXECUTABLE_NAME) + rm -rf $(DESTDIR)$(PREFIX)/include/boolector-java + diff --git a/README.md b/README.md index 90538b5..f56de14 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,40 @@ -# JavaBoolector +JavaBoolector +=============================================================================== -JavaBoolector allows you to call [Boolector](https://github.com/boolector/boolector/tree/0dba411bebb9ac70fd03de68f984ccb5bd3e1a03) from Java. +Java bindings for [Boolector](https://github.com/boolector/boolector) SMT solver -*We are using Boolector version 3.2.1* +Dependencies +------------------------------------------------------------------------------- +[Boolector](https://github.com/boolector/boolector) version 3.2.0 should be +installed in the system -## Build +For running on Arch Linux you need to install [boolector](https://aur.archlinux.org/packages/boolector/) +package from AUR. -Build jar with all the dependencies: +Build +------------------------------------------------------------------------------- +Build and install native libraries: +``` +make +make install +``` -```shell -$ mvn clean package +Build java bindings library: +``` +mvn clean package ``` -## Adding new bindings +Build jar with sources: +``` +mvn sources:jar +``` - 1) Add your native method to the Native class - - 2) Generate JavaBoolector.h: -```shell -$ cd JavaBoolector/java -$ ./gen_native_h.sh +Build tar.gz with sources: +``` +mvn clean assembly:assembly ``` - 3) And implement your method in JavaBoolector.c + +Install +------------------------------------------------------------------------------- + +You can install [boolector-java](https://aur.archlinux.org/packages/boolector-java/) package from AUR. diff --git a/assembly.xml b/assembly.xml new file mode 100644 index 0000000..6d84757 --- /dev/null +++ b/assembly.xml @@ -0,0 +1,17 @@ + + sources + + tar.gz + + true + + + ${project.basedir} + + target/** + lib/** + .idea/** + + + + \ No newline at end of file diff --git a/c/CMakeLists.txt b/c/CMakeLists.txt deleted file mode 100644 index cfc7865..0000000 --- a/c/CMakeLists.txt +++ /dev/null @@ -1,28 +0,0 @@ -cmake_minimum_required(VERSION 3.5.1) -set(PROJECT_NAME JavaBoolectorC) -project(${PROJECT_NAME}) -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib) - -find_package(JNI REQUIRED) -include_directories(${JNI_INCLUDE_DIRS}) - -set(BOOLECTOR_DIR ${PROJECT_SOURCE_DIR}/boolector) -set(BOOLECTOR_INCLUDE_DIRS ${BOOLECTOR_DIR}/src) -set(BOOLECTOR_INCLUDE_LIB ${BOOLECTOR_DIR}/build/lib) -include_directories(${BOOLECTOR_INCLUDE_DIRS}) -link_directories(${BOOLECTOR_INCLUDE_LIB}) - -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3") - -set(SOURCES JavaBoolector.c) -set(HEADERS JavaBoolector.h) -add_library(JavaBoolector SHARED ${HEADER} ${SOURCES}) - -set_target_properties(JavaBoolector PROPERTIES LINKER_LANGUAGE C) -target_link_libraries(JavaBoolector boolector) - - - - - - diff --git a/c/boolector b/c/boolector deleted file mode 160000 index 0dba411..0000000 --- a/c/boolector +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0dba411bebb9ac70fd03de68f984ccb5bd3e1a03 diff --git a/c/lib_in_resources.sh b/c/lib_in_resources.sh deleted file mode 100755 index 4dc05ca..0000000 --- a/c/lib_in_resources.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -cmake . -make -c=$(pwd) -lib=$c/lib/libJavaBoolector.so -resources=$c/../java/src/main/resources - -if [ ! -d $resources ] -then mkdir $resources -fi - -cp $lib $resources/ diff --git a/java/build.xml b/java/build.xml deleted file mode 100644 index b9bc2d7..0000000 --- a/java/build.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/gen_native_h.sh b/java/gen_native_h.sh deleted file mode 100755 index 9747728..0000000 --- a/java/gen_native_h.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -java=$(pwd) -c=$java/../c -javac -h $c $java/src/main/java/org/jetbrains/research/boolector/Native.java -native=$c/org_jetbrains_research_boolector_Native.h - -if [ -f $native ] -then - mv $native $c/JavaBoolector.h -else - echo "Header not generated" -fi diff --git a/java/pom.xml b/java/pom.xml deleted file mode 100644 index 0327003..0000000 --- a/java/pom.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - 4.0.0 - - org.jetbrains.research - boolector - 1.1 - - - ${project.basedir}/../c - - - - - org.apache.maven.plugins - maven-antrun-plugin - 1.7 - - - initialize - - run - - - - - - - - - - default-cli - pre-clean - - run - - - - - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 8 - 8 - - - - - - - - junit - junit - 4.13.1 - compile - - - - diff --git a/java/src/main/java/org/jetbrains/research/boolector/ArrayNode.java b/java/src/main/java/org/jetbrains/research/boolector/ArrayNode.java deleted file mode 100644 index c1a99e9..0000000 --- a/java/src/main/java/org/jetbrains/research/boolector/ArrayNode.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.jetbrains.research.boolector; - -public class ArrayNode extends BoolectorNode { - - ArrayNode(long ref,String name,Integer width) { - super(ref, name, width, TypeNode.ARRAYNODE); - } - - public static ArrayNode arrayNode(ArraySort sort, String name) { - name = name + "!" + numberOfNames++; - return new ArrayNode(Native.array(sort.ref, name),name, sort.getWidth());//sfdjfsdjffffffffffffffff - } - - public static ArrayNode constArrayNode(BitvecSort indexSort, BitvecNode element) { - BitvecSort elementsSort= element.getSort().toBitvecSort(); - ArraySort arraySort = ArraySort.arraySort(indexSort,elementsSort); - return new ArrayNode(Native.constArray(arraySort.ref,indexSort.ref, element.ref),null, element.getWidth()); - } - - public int getIndexWidth() { - return Native.getIndexWidth(ref); - } - - public BitvecNode read(BitvecNode index) { - return new BitvecNode(Native.read(ref, index.ref),null, null); - } - - public ArrayNode write(BitvecNode index, BitvecNode value) { - int widthIndex = getIndexWidth(); - int widthElement = getWidth(); - if (index.getWidth() != widthIndex) index.toBitvecNode(widthIndex); - if (value.getWidth() != widthElement) value.toBitvecNode(widthElement); - return new ArrayNode(Native.write(ref, index.ref, value.ref),null, widthElement); - } -} diff --git a/java/src/main/java/org/jetbrains/research/boolector/ArraySort.java b/java/src/main/java/org/jetbrains/research/boolector/ArraySort.java deleted file mode 100644 index 735d222..0000000 --- a/java/src/main/java/org/jetbrains/research/boolector/ArraySort.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.jetbrains.research.boolector; - -public class ArraySort extends BoolectorSort { - - ArraySort(long ref, Integer width) { - super(ref, width); - } - - public static ArraySort arraySort(BoolectorSort index, BoolectorSort element) { - return new ArraySort(Native.arraySort(index.ref, element.ref), element.getWidth()); - } -} diff --git a/java/src/main/java/org/jetbrains/research/boolector/BitvecNode.java b/java/src/main/java/org/jetbrains/research/boolector/BitvecNode.java deleted file mode 100644 index ce75c74..0000000 --- a/java/src/main/java/org/jetbrains/research/boolector/BitvecNode.java +++ /dev/null @@ -1,155 +0,0 @@ -package org.jetbrains.research.boolector; - -import java.util.HashSet; -import java.util.Set; - -public class BitvecNode extends BoolectorNode { - - private static Set setConstName = new HashSet<>(); // мб HashMap и без matchNodeByName - - static void setConstNameClear() { - setConstName.clear(); - } - - BitvecNode(long ref, String name, Integer width) { - super(ref, name, width, TypeNode.BITVECNODE); - } - - public static BitvecNode var(BitvecSort sort, String name, boolean fresh) { - if (fresh) { - name = name + "!" + numberOfNames++; - return new BitvecNode(Native.var(sort.ref, name), name, sort.getWidth()); - } else if (setConstName.contains(name)) return matchNodeByName(name); - else { - setConstName.add(name); - return new BitvecNode(Native.var(sort.ref, name), name, sort.getWidth()); - } - } - - public static BitvecNode matchNodeByName(String name) { - return new BitvecNode(Native.matchNodeByName(name), name, null); - } - - public static BitvecNode zero(BitvecSort sort) { - return new BitvecNode(Native.zero(sort.ref), null, sort.getWidth()); - } - - public static BitvecNode constBitvec(String bits) { - return new BitvecNode(Native.constBitvec(bits), null, bits.length()); - } - - public static BitvecNode constInt(int value, BitvecSort sort) { - return new BitvecNode(Native.constInt(value, sort.ref), null, sort.getWidth()); - } - - public static BitvecNode constLong(long value, BitvecSort sort) { - return new BitvecNode(Native.constLong(String.valueOf(value), sort.ref), null, sort.getWidth()); - } - - public BitvecNode sext(int width) { - int curSize = getWidth(); - return new BitvecNode(Native.sext(ref, width - curSize), null, width); - } - - public BitvecNode uext(int width) { - int curSize = getWidth(); - return new BitvecNode(Native.uext(ref, width - curSize), null, width); - } - - public BitvecNode slice(int upper, int lower) { - return new BitvecNode(Native.slice(ref, upper, lower), null, upper - lower + 1); - } - - public BitvecNode not() { - return new BitvecNode(Native.not(ref), null, getWidth()); - } - - public BitvecNode add(BitvecNode bvNode) { - return new BitvecNode(Native.add(ref, bvNode.ref), null, getWidth()); - } - - public BitvecNode and(BitvecNode bvNode) { - return new BitvecNode(Native.and(ref, bvNode.ref), null, getWidth()); - } - - public BitvecNode or(BitvecNode bvNode) { - return new BitvecNode(Native.or(ref, bvNode.ref), null, getWidth()); - } - - public BitvecNode xor(BitvecNode bvNode) { - return new BitvecNode(Native.xor(ref, bvNode.ref), null, getWidth()); - } - - public BitvecNode neg() { - return new BitvecNode(Native.neg(ref), null, getWidth()); - } - - public BitvecNode sub(BitvecNode bvNode) { - return new BitvecNode(Native.sub(ref, bvNode.ref), null, getWidth()); - } - - public BitvecNode mul(BitvecNode bvNode) { - return new BitvecNode(Native.mul(ref, bvNode.ref), null, getWidth()); - } - - public BitvecNode sdiv(BitvecNode bvNode) { - return new BitvecNode(Native.sdiv(ref, bvNode.ref), null, getWidth()); - } - - public BitvecNode udiv(BitvecNode bvNode) { - return new BitvecNode(Native.udiv(ref, bvNode.ref), null, getWidth()); - } - - public BitvecNode smod(BitvecNode bvNode) { - return new BitvecNode(Native.smod(ref, bvNode.ref), null, getWidth()); - } - - public BitvecNode urem(BitvecNode bvNode) { - return new BitvecNode(Native.urem(ref, bvNode.ref), null, getWidth()); - } - - public BoolNode sgt(BitvecNode bvNode) { - return new BoolNode(Native.sgt(ref, bvNode.ref)); - } - - public BoolNode ugt(BitvecNode bvNode) { - return new BoolNode(Native.ugt(ref, bvNode.ref)); - } - - public BoolNode sgte(BitvecNode bvNode) { - return new BoolNode(Native.sgte(ref, bvNode.ref)); - } - - public BoolNode slt(BitvecNode bvNode) { - return new BoolNode(Native.slt(ref, bvNode.ref)); - } - - public BoolNode slte(BitvecNode bvNode) { - return new BoolNode(Native.slte(ref, bvNode.ref)); - } - - public BitvecNode sll(BitvecNode bvNode) { - return new BitvecNode(Native.sll(ref, bvNode.ref), null, getWidth()); - } - - public BitvecNode srl(BitvecNode bvNode) { - return new BitvecNode(Native.srl(ref, bvNode.ref), null, getWidth()); - } - - public BitvecNode sra(BitvecNode bvNode) { - return new BitvecNode(Native.sra(ref, bvNode.ref), null, getWidth()); - } - - public BitvecNode concat(BitvecNode bvNode) { - int width = getWidth() + bvNode.getWidth(); - return new BitvecNode(Native.concat(ref, bvNode.ref), null, width); - } - - public String getBits() { - return Native.getBits(ref); - } - - public long assignment() { - return Native.bitvecAssignment(ref); - } -} diff --git a/java/src/main/java/org/jetbrains/research/boolector/BitvecSort.java b/java/src/main/java/org/jetbrains/research/boolector/BitvecSort.java deleted file mode 100644 index 27d892c..0000000 --- a/java/src/main/java/org/jetbrains/research/boolector/BitvecSort.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.jetbrains.research.boolector; - -public class BitvecSort extends BoolectorSort { - - BitvecSort(long ref, int width) { - super(ref, width); - } - - public static BitvecSort bitvecSort(int width) { - return new BitvecSort(Native.bitvecSort(width), width); - } -} diff --git a/java/src/main/java/org/jetbrains/research/boolector/BoolNode.java b/java/src/main/java/org/jetbrains/research/boolector/BoolNode.java deleted file mode 100644 index 14fd0de..0000000 --- a/java/src/main/java/org/jetbrains/research/boolector/BoolNode.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.jetbrains.research.boolector; - -public class BoolNode extends BoolectorNode { - BoolNode(long ref) { - super(ref,null, 1, TypeNode.BOOLNODE); - } - - public static BoolNode constBool(boolean bool) { - return new BoolNode(bool ? Native.constNodeTrue() : Native.constNodeFalse()); - } - - public BoolNode and(BoolNode boolNode) { - return new BoolNode(Native.and(ref, boolNode.ref)); - } - - public BoolNode or(BoolNode boolNode) { - return new BoolNode(Native.or(ref, boolNode.ref)); - } - - public BoolNode xor(BoolNode boolNode) { - return new BoolNode(Native.xor(ref, boolNode.ref)); - } - - public BoolNode not() { - return new BoolNode(Native.not(ref)); - } - - public BoolNode implies(BoolNode boolNode) { - return new BoolNode(Native.implies(ref, boolNode.ref)); - } - - public BoolNode iff(BoolNode boolNode) { - return new BoolNode(Native.iff(ref, boolNode.ref)); - } - - public Boolean assigment() { - return this.toBitvecNode().assignment()==1; - } - -} diff --git a/java/src/main/java/org/jetbrains/research/boolector/BoolSort.java b/java/src/main/java/org/jetbrains/research/boolector/BoolSort.java deleted file mode 100644 index 335e6b7..0000000 --- a/java/src/main/java/org/jetbrains/research/boolector/BoolSort.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.jetbrains.research.boolector; - -public class BoolSort extends BoolectorSort { - BoolSort(long ref) { - super(ref, 1); - } - - public static BoolSort boolSort() { - return new BoolSort(Native.bitvecSort(1)); - } -} diff --git a/java/src/main/java/org/jetbrains/research/boolector/BoolectorFun.java b/java/src/main/java/org/jetbrains/research/boolector/BoolectorFun.java deleted file mode 100644 index 98ae3d3..0000000 --- a/java/src/main/java/org/jetbrains/research/boolector/BoolectorFun.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.jetbrains.research.boolector; - -public class BoolectorFun extends BoolectorObject { - - BoolectorFun(long ref) { - super(ref); - } - - public void release() { - Native.releaseNode(ref); - } - - public static class FuncParam extends BoolectorFun { - FuncParam(long ref) { - super(ref); - } - - public static FuncParam param(BoolectorSort sort, String name) { - if (name == null ) return new FuncParam(Native.param(sort.ref, "nullInC")); - else return new FuncParam(Native.param(sort.ref, name)); - } - } -} diff --git a/java/src/main/java/org/jetbrains/research/boolector/BoolectorNode.java b/java/src/main/java/org/jetbrains/research/boolector/BoolectorNode.java deleted file mode 100644 index 95ddfd7..0000000 --- a/java/src/main/java/org/jetbrains/research/boolector/BoolectorNode.java +++ /dev/null @@ -1,136 +0,0 @@ -package org.jetbrains.research.boolector; - -public class BoolectorNode extends BoolectorObject { - - BoolectorNode(long ref) { - super(ref); - } - BoolectorNode(long ref, String name, Integer width, TypeNode type) { - super(ref); - this.name = name; - this.width = width; - kind = type; - } - - private String name; - - private TypeNode kind = TypeNode.UNKNOWN; //jdkgjdflkgjkfjglkdfjgklfdjgkljfdkgjfdklgjdfjglkdgjkldfjkgljfkl - - protected static int numberOfNames; - - private Integer width; - - public int getWidth() { - if (width == null) width = getWidthSort(); - return width; - } - - protected void setWidth(Integer newWidth) { - width = newWidth; - } - - public void release() { - Native.releaseNode(ref); - } - - public BoolectorNode copy() { - return new BoolectorNode(Native.copy(ref), name, width, kind); - } - - public BoolNode eq(BoolectorNode node) { - return new BoolNode(Native.eq(ref, node.ref)); - } - - public BoolectorNode ite(BoolNode cond, BoolectorNode elseNode) { - return new BoolectorNode(Native.cond(cond.ref, ref, elseNode.ref)); //fdjfksdjfkldsjfksdjfkljdskfjsdkfsjklfsfkdsfjklds - } - - public BoolectorSort getSort() {//если уже изменялся все сломается - return new BoolectorSort(Native.getSort(ref), getWidth()); - } - - public int getID() { - return Native.getId(ref); - } - - public String getSymbol() { - if (name == null) name = Native.getSymbol(ref); - return name; - } - - private int getWidthSort() { - return Native.getWidthNode(ref); - } - - public void assertForm() { - Native.assertForm(ref); - } - - public void assume() { - Native.assume(ref); - } - - //dsfjsklxfjksdljfklsdjfklsdjfklsjfkls - public BitvecNode toBitvecNode() { - if (isArrayNode()) throw new ClassCastException(); - return new BitvecNode(ref, null, getWidth()); - } - - public BitvecNode toBitvecNode(int castSize) { - BitvecNode node = toBitvecNode(); - int curSize = getWidth(); - if (curSize == castSize) return node; - else if (curSize < castSize) return node.sext(castSize); - else return node.slice(castSize, 0); - } - - public BoolNode toBoolNode() { - if (isBoolNode() || (isBitvecNode() && width==1)) return new BoolNode(ref); - else throw new ClassCastException(); - } - - public ArrayNode toArrayNode() { - if (isArrayNode()) return new ArrayNode(ref,name, width); - else throw new ClassCastException(); - } - - public boolean isArrayNode() { - if (kind == TypeNode.ARRAYNODE) return true; - if (kind == TypeNode.UNKNOWN) return kindNode() == TypeNode.ARRAYNODE; - else return false; - } - - public boolean isBoolNode() { - if (kind == TypeNode.BOOLNODE || (isBitvecNode() && width==1)) return true; - if (kind == TypeNode.UNKNOWN) return kindNode() == TypeNode.BOOLNODE; - else return false; - } - - public boolean isBitvecNode() { - if (kind == TypeNode.BITVECNODE) return true; - if (kind == TypeNode.UNKNOWN) return kindNode() == TypeNode.BITVECNODE; - else return false; - } - - private TypeNode kindNode() { - int kindObj = Native.kindNode(ref); - switch (kindObj) { - case 0: - case 3: - kind = TypeNode.BOOLNODE; - return kind; - case 1: - case 4: - kind = TypeNode.BITVECNODE; - return kind; - case 2: - kind = TypeNode.ARRAYNODE; - return kind; - default: - kind = TypeNode.UNKNOWN; - return kind; - } - } -} - - diff --git a/java/src/main/java/org/jetbrains/research/boolector/BoolectorSat.java b/java/src/main/java/org/jetbrains/research/boolector/BoolectorSat.java deleted file mode 100644 index 261922f..0000000 --- a/java/src/main/java/org/jetbrains/research/boolector/BoolectorSat.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.jetbrains.research.boolector; - -public class BoolectorSat { - - public enum Status { - SAT(10), - UNSAT(20), - UNKNOWN(0); - - private final int intValue; - - Status(int intValue) { - this.intValue = intValue; - } - - public static Status fromInt(int i) { - if (SAT.toInt() == i ) return SAT; - if (UNSAT.toInt() == i) return UNSAT; - return UNKNOWN; - } - - public final int toInt() { - return this.intValue; - } - } - - public static int simplify() { - return Native.simplify(); - } - - public static Status getBoolectorSat() { - return Status.fromInt(Native.getSat()); - } - -} - diff --git a/java/src/main/java/org/jetbrains/research/boolector/BoolectorSort.java b/java/src/main/java/org/jetbrains/research/boolector/BoolectorSort.java deleted file mode 100644 index dc0e50a..0000000 --- a/java/src/main/java/org/jetbrains/research/boolector/BoolectorSort.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.jetbrains.research.boolector; - -public class BoolectorSort extends BoolectorObject { - - BoolectorSort(long ref, Integer width) { - super(ref); - this.width = width; - } - - private Integer width; - - public int getWidth() { - return width; - } - - public boolean isBitvecSort() { - return Native.isBitvecSort(ref); - } - - public boolean isBoolSort() { - return (isBitvecSort() && width==1); - } - - public boolean isArraySort() { - return Native.isArraySort(ref); - } - - public BitvecSort toBitvecSort() { - if (isArraySort()) throw new ClassCastException(); - else return new BitvecSort(ref, width); - } - - public BoolSort toBooleSort() { - if (isBoolSort()) return new BoolSort(ref); - else throw new ClassCastException(); - } - - public ArraySort toArraySort() { - if (isArraySort()) return new ArraySort(ref, width); - else throw new ClassCastException(); - } - - public void release() { - Native.releaseSort(ref); - } -} diff --git a/java/src/main/java/org/jetbrains/research/boolector/Btor.java b/java/src/main/java/org/jetbrains/research/boolector/Btor.java deleted file mode 100644 index 31100bd..0000000 --- a/java/src/main/java/org/jetbrains/research/boolector/Btor.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.jetbrains.research.boolector; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.List; - -public class Btor { - public Btor() { - Native.btor(); - } - - static { - try { - NativeUtils.loadLibraryFromJar("/libJavaBoolector.so"); - } catch (IOException e) { - // This is probably not the best way to handle exception :-) - e.printStackTrace(); - } - } - - public void btorRelease() { - BitvecNode.setConstNameClear(); - Native.btorRelease(); - } - - public String dumpSmt2() { - return Native.dumpSmt2(); - } - - public String printModel() { - return Native.printModel(); - } - -} diff --git a/java/src/main/java/org/jetbrains/research/boolector/Function.java b/java/src/main/java/org/jetbrains/research/boolector/Function.java deleted file mode 100644 index 86e18e8..0000000 --- a/java/src/main/java/org/jetbrains/research/boolector/Function.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.jetbrains.research.boolector; - -import java.util.List; - -public class Function extends BoolectorFun { - final private long[] params; - - private Function(long ref, long[] params) { - super(ref); - this.params = params; - } - - public BoolectorNode apply(List argNodesFunc) { - long[] argNodes = toLong(argNodesFunc.toArray(new BoolectorNode[0])); - return new BoolectorNode(Native.apply(argNodes, argNodes.length, ref)); - } - - public long[] getParams() { - return params; - } - - public static Function func(BoolectorNode nodeBody, List func_params) { - long[] params = toLong(func_params.toArray(new FuncParam[0])); - return new Function(Native.fun(params, params.length, nodeBody.ref), params); - } - - public static Function forAll(BoolectorNode nodeBody, List func_params) { - long[] params = toLong(func_params.toArray(new FuncParam[0])); - return new Function(Native.forAll(params, params.length, nodeBody.ref), params); - } -} diff --git a/java/src/main/java/org/jetbrains/research/boolector/Native.java b/java/src/main/java/org/jetbrains/research/boolector/Native.java deleted file mode 100644 index 1a37900..0000000 --- a/java/src/main/java/org/jetbrains/research/boolector/Native.java +++ /dev/null @@ -1,144 +0,0 @@ -package org.jetbrains.research.boolector; - -public final class Native { - - static native void btor(); - - static native void btorRelease(); - - static native long var(long ref, String name); - - static native void releaseNode(long ref); - - public static native long bitvecSort(int width); - - static native void releaseSort(long ref); - - static native boolean isBitvecSort(long ref); - - static native boolean isArraySort(long ref); - - static native int getWidth(long ref); - - static native long not(long ref); - - static native long add(long firstRef, long secondRef); - - public static native long and(long firstRef, long secondRef); - - static native long or(long firstRef, long secondRef); - - static native long xor(long firstRef, long secondRef); - - static native long neg(long ref); - - static native long eq(long firstRef, long secondRef); - - static native long copy(long ref); - - static native void assertForm(long ref); - - static native int getSat(); - - static native long sub(long firstRef, long secondRef); - - static native long mul(long firstRef, long secondRef); - - static native long sdiv(long firstRef, long secondRef); - - static native long udiv(long firstRef, long secondRef); - - static native long smod(long firstRef, long secondRef); - - static native long urem(long firstRef, long secondRef); - - static native long sgt(long firstRef, long secondRef); - - static native long sgte(long firstRef, long secondRef); - - static native long slt(long firstRef, long secondRef); - - static native long slte(long firstRef, long secondRef); - - static native long sll(long firstRef, long secondRef); - - static native long srl(long firstRef, long secondRef); - - static native long sra(long firstRef, long secondRef); - - static native long implies(long firstRef, long secondRef); - - static native long iff(long firstRef, long secondRef); - - static native long concat(long firstRef, long secondRef); - - static native long cond(long condRef, long firstRef, long secondRef); - - static native long zero(long ref); - - static native long constBitvec(String bits); - - static native boolean isBoolSort(long ref); - - static native long constNodeTrue(); - - static native long constNodeFalse(); - - static native long getSort(long ref); - - static native int getId(long ref); - - static native String getSymbol(long ref); - - static native int simplify(); - - static native long constInt(int value, long ref); - - static native long sext(long ref, int width); - - static native long uext(long ref, int width); - - static native long slice(long ref, int upper, int lower); - - static native long arraySort(long indexSortRef, long elementSortRef); - - static native long array(long ref, String name); - - static native long read(long arrayRef, long indexRef); - - static native long write(long arrayRef, long indexRef, long valueRef); - - static native long param(long ref, String name); - - static native long fun(long[] params, int length, long nodeBody); - - static native long apply(long[] argNodes, int length, long ref); - - static native String printModel(); - - static native String getBits(long ref); - - static native long constLong(String value, long sort); - - static native long forAll(long[] params, int length, long ref); - - public static native boolean boolectorAssert(String ans, long ref); - - static native int kindNode(long ref); - - static native long constArray(long array_ref, long index_ref, long element_ref); - - static native int getWidthNode(long ref); - - static native int getIndexWidth(long ref); - - static native String dumpSmt2(); - - static native void assume(long ref); - - static native long bitvecAssignment(long ref); - - static native long matchNodeByName(String name); - - static native long ugt(long firstRef, long secondRef); -} diff --git a/java/src/main/java/org/jetbrains/research/boolector/TypeNode.java b/java/src/main/java/org/jetbrains/research/boolector/TypeNode.java deleted file mode 100644 index 32d14e3..0000000 --- a/java/src/main/java/org/jetbrains/research/boolector/TypeNode.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.jetbrains.research.boolector; - -public enum TypeNode { - ARRAYNODE, - BOOLNODE, - BITVECNODE, - UNKNOWN -} diff --git a/java/src/test/java/org/jetbrains/research/boolector/FunctionTest.java b/java/src/test/java/org/jetbrains/research/boolector/FunctionTest.java deleted file mode 100644 index f1b6400..0000000 --- a/java/src/test/java/org/jetbrains/research/boolector/FunctionTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.jetbrains.research.boolector; - -import org.junit.Test; - -import java.util.Arrays; -import java.util.List; - -import static org.junit.Assert.assertEquals; - -public class FunctionTest { - - @Test - public void testAll() { - Btor btor = new Btor(); - BitvecSort sort = BitvecSort.bitvecSort(8); - BitvecNode x = BitvecNode.var(sort, "nullINc", true); - BitvecNode y = BitvecNode.var(sort, "nullINc", true); - BitvecNode oldX = x.copy().toBitvecNode(); - BitvecNode oldY = y.copy().toBitvecNode(); - BitvecNode a= BitvecNode.constInt(10,sort); - BitvecNode b = BitvecNode.constInt(20, sort); - BitvecNode ab = a.add(b);; - BoolSort boolSort = BoolSort.boolSort(); - BitvecNode temp = x.add(y); - BoolectorFun.FuncParam firstParam = BoolectorFun.FuncParam.param(sort,"nullINc"); - BoolectorFun.FuncParam secondParam = BoolectorFun.FuncParam.param(sort,"nullINc"); - List param = Arrays.asList(firstParam,secondParam); - Function slt = Function.func(temp, param); - List paramX =Arrays.asList(x,y); - BitvecNode first = slt.apply(paramX).toBitvecNode(); - BitvecNode second = slt.apply(paramX).toBitvecNode(); - BoolNode eq = first.eq(second); - assertFormuls(btor,eq); - } - - private static void assertFormuls(Btor btor, BoolNode node) { - BoolNode formula = node.not(); - formula.assertForm(); - BoolectorSat.Status ans = BoolectorSat.getBoolectorSat(); - assertEquals(BoolectorSat.Status.UNSAT, ans); - - btor.btorRelease(); - } - -} \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..5b9b6a9 --- /dev/null +++ b/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + org.jetbrains.research + boolector-java + 3.2.5 + + + UTF-8 + UTF-8 + + + + + junit + junit + 4.12 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + + + + + org.apache.maven.plugins + maven-source-plugin + 3.1.0 + + + attach-sources + + jar + + + + + + + maven-assembly-plugin + 2.5.5 + + + assembly.xml + + + + + + + + + github-vorpal-research-kotlin-maven + vorpal-research-kotlin-maven + https://maven.pkg.github.com/vorpal-research/kotlin-maven + + + \ No newline at end of file diff --git a/c/JavaBoolector.c b/src/main/c/org_jetbrains_research_boolector_Native.c similarity index 52% rename from c/JavaBoolector.c rename to src/main/c/org_jetbrains_research_boolector_Native.c index 4614b79..ac27efd 100644 --- a/c/JavaBoolector.c +++ b/src/main/c/org_jetbrains_research_boolector_Native.c @@ -1,55 +1,58 @@ -#include "JavaBoolector.h" #include #include -#include "boolector.h" -#include "btoropt.h" #include -#include #include #include -Btor *btor; +#include "org_jetbrains_research_boolector_Native.h" +#include "boolector.h" +#include "btoropt.h" + +static jstring readFileContent(JNIEnv *env, FILE* file) { + rewind(file); + fseek(file, 0, SEEK_END); + long size = ftell(file); + rewind(file); -JNIEXPORT void JNICALL Java_org_jetbrains_research_boolector_Native_btor(JNIEnv *env, jobject jobj) { - btor = boolector_new(); + char* fcontent = (char*) malloc(size); + fread(fcontent, 1, size, file); + jstring result = (*env)->NewStringUTF(env, fcontent); + free(fcontent); + return result; +} + +JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_btor(JNIEnv *env, jobject jobj) { + Btor* btor = boolector_new(); boolector_set_opt(btor, BTOR_OPT_MODEL_GEN, 1); boolector_set_opt(btor, BTOR_OPT_INCREMENTAL, 1); + return (jlong) btor; } JNIEXPORT void JNICALL -Java_org_jetbrains_research_boolector_Native_assertForm(JNIEnv *env, jobject jobj, jlong jnode_ref) { +Java_org_jetbrains_research_boolector_Native_assertForm(JNIEnv *env, jobject jobj, jlong btorRef, jlong jnode_ref) { + Btor* btor = (Btor*) btorRef; BoolectorNode *node = (BoolectorNode *) jnode_ref; boolector_assert(btor, node); } -JNIEXPORT void JNICALL Java_org_jetbrains_research_boolector_Native_assume(JNIEnv *env, jobject jobj, jlong jnode_ref) { +JNIEXPORT void JNICALL Java_org_jetbrains_research_boolector_Native_assume(JNIEnv *env, jobject jobj, jlong btorRef, jlong jnode_ref) { + Btor* btor = (Btor*) btorRef; BoolectorNode *node = (BoolectorNode *) jnode_ref; boolector_assume(btor, node); } -JNIEXPORT jint JNICALL Java_org_jetbrains_research_boolector_Native_getSat(JNIEnv *env, jobject jobj) { +JNIEXPORT jint JNICALL Java_org_jetbrains_research_boolector_Native_getSat(JNIEnv *env, jobject jobj, jlong btorRef) { + Btor* btor = (Btor*) btorRef; return (jint) boolector_sat(btor); } -JNIEXPORT jint JNICALL Java_org_jetbrains_research_boolector_Native_simplify(JNIEnv *env, jobject jobj) { +JNIEXPORT jint JNICALL Java_org_jetbrains_research_boolector_Native_simplify(JNIEnv *env, jobject jobj, jlong btorRef) { + Btor* btor = (Btor*) btorRef; return (jint) boolector_simplify(btor); } -static jstring readFileContent(JNIEnv *env, FILE* file) { - rewind(file); - fseek(file, 0, SEEK_END); - long size = ftell(file); - rewind(file); - - char* fcontent = (char*) malloc(size); - fread(fcontent, sizeof(char), size, file); - fcontent[size - 1] = 0; - jstring result = (*env)->NewStringUTF(env, fcontent); - free(fcontent); - return result; -} - -JNIEXPORT jstring JNICALL Java_org_jetbrains_research_boolector_Native_printModel(JNIEnv *env, jobject jobj) { +JNIEXPORT jstring JNICALL Java_org_jetbrains_research_boolector_Native_printModel(JNIEnv *env, jobject jobj, jlong btorRef) { + Btor* btor = (Btor*) btorRef; FILE *tmp_model = tmpfile(); boolector_print_model(btor, "smt2", tmp_model); jstring model = readFileContent(env, tmp_model); @@ -57,7 +60,8 @@ JNIEXPORT jstring JNICALL Java_org_jetbrains_research_boolector_Native_printMode return model; } -JNIEXPORT jstring JNICALL Java_org_jetbrains_research_boolector_Native_dumpSmt2(JNIEnv *env, jobject jobj) { +JNIEXPORT jstring JNICALL Java_org_jetbrains_research_boolector_Native_dumpSmt2(JNIEnv *env, jobject jobj, jlong btorRef) { + Btor* btor = (Btor*) btorRef; FILE *tmp_dump = tmpfile(); boolector_dump_smt2(btor, tmp_dump); jstring model = readFileContent(env, tmp_dump); @@ -65,27 +69,42 @@ JNIEXPORT jstring JNICALL Java_org_jetbrains_research_boolector_Native_dumpSmt2( return model; } -JNIEXPORT void JNICALL Java_org_jetbrains_research_boolector_Native_btorRelease(JNIEnv *env, jobject jobj) { +JNIEXPORT jstring JNICALL Java_org_jetbrains_research_boolector_Native_dumpSmt2Node(JNIEnv *env, jobject jobj, jlong btorRef, jlong nodeRef) { + Btor* btor = (Btor*) btorRef; + BoolectorNode* node = (BoolectorNode*) nodeRef; + FILE *tmp_dump = tmpfile(); + boolector_dump_smt2_node(btor, tmp_dump, node); + jstring model = readFileContent(env, tmp_dump); + fclose(tmp_dump); + return model; +} + +JNIEXPORT void JNICALL Java_org_jetbrains_research_boolector_Native_btorRelease(JNIEnv *env, jobject jobj, jlong btorRef) { + Btor* btor = (Btor*) btorRef; boolector_release_all(btor); assert (boolector_get_refs(btor) == 0); boolector_delete(btor); } JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_var(JNIEnv *env, jobject jobj, jlong jsort_ref, jstring jsymbol) { +Java_org_jetbrains_research_boolector_Native_var(JNIEnv *env, jobject jobj, jlong btorRef, jlong jsort_ref, jstring jsymbol) { + Btor* btor = (Btor*) btorRef; BoolectorNode *node; BoolectorSort sort = (BoolectorSort) jsort_ref; - const char *str = (*env)->GetStringUTFChars(env, jsymbol, 0); - if (strncmp(str, "nullINc", 7) == 0) { + if (jsymbol == NULL) { node = boolector_var(btor, sort, NULL); - } else { node = boolector_var(btor, sort, str); } - (*env)->ReleaseStringUTFChars(env, jsymbol, str); + } else { + const char *str = (*env)->GetStringUTFChars(env, jsymbol, 0); + node = boolector_var(btor, sort, str); + (*env)->ReleaseStringUTFChars(env, jsymbol, str); + } return (jlong) node; } JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_matchNodeByName(JNIEnv *env, jobject jobj, jstring jsymbol) { +Java_org_jetbrains_research_boolector_Native_matchNodeByName(JNIEnv *env, jobject jobj, jlong btorRef, jstring jsymbol) { + Btor* btor = (Btor*) btorRef; const char *str = (*env)->GetStringUTFChars(env, jsymbol, 0); BoolectorNode *node = boolector_match_node_by_symbol(btor, str); (*env)->ReleaseStringUTFChars(env, jsymbol, str); @@ -93,13 +112,15 @@ Java_org_jetbrains_research_boolector_Native_matchNodeByName(JNIEnv *env, jobjec } JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_constInt(JNIEnv *env, jobject jobj, jint num, jlong jsort_ref) { +Java_org_jetbrains_research_boolector_Native_constInt(JNIEnv *env, jobject jobj, jlong btorRef, jint num, jlong jsort_ref) { + Btor* btor = (Btor*) btorRef; BoolectorSort sort = (BoolectorSort) jsort_ref; return (jlong) boolector_int(btor, num, sort); } JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_constBitvec(JNIEnv *env, jobject jobj, jstring jsymbol) { +Java_org_jetbrains_research_boolector_Native_constBitvec(JNIEnv *env, jobject jobj, jlong btorRef, jstring jsymbol) { + Btor* btor = (Btor*) btorRef; const char *bits = (*env)->GetStringUTFChars(env, jsymbol, 0); jlong ans = (jlong) boolector_const(btor, bits); (*env)->ReleaseStringUTFChars(env, jsymbol, bits); @@ -107,7 +128,8 @@ Java_org_jetbrains_research_boolector_Native_constBitvec(JNIEnv *env, jobject jo } JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_constLong(JNIEnv *env, jobject jobj, jstring jsymbol, jlong jsort_ref) { +Java_org_jetbrains_research_boolector_Native_constLong(JNIEnv *env, jobject jobj, jlong btorRef, jstring jsymbol, jlong jsort_ref) { + Btor* btor = (Btor*) btorRef; BoolectorSort sort = (BoolectorSort) jsort_ref; const char *bits = (*env)->GetStringUTFChars(env, jsymbol, 0); jlong ans = (jlong) boolector_constd(btor, sort, bits); @@ -116,15 +138,16 @@ Java_org_jetbrains_research_boolector_Native_constLong(JNIEnv *env, jobject jobj } JNIEXPORT jstring JNICALL -Java_org_jetbrains_research_boolector_Native_getBits(JNIEnv *env, jobject jobj, jlong jnode_ref) { +Java_org_jetbrains_research_boolector_Native_getBits(JNIEnv *env, jobject jobj, jlong btorRef, jlong jnode_ref) { + Btor* btor = (Btor*) btorRef; BoolectorNode *node = (BoolectorNode *) jnode_ref; const char *bits = boolector_get_bits(btor, node); return (*env)->NewStringUTF(env, bits); } JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_bitvecAssignment(JNIEnv *env, jobject jobj, - jlong jnode_ref) { //почему работает с отрицательными числами? +Java_org_jetbrains_research_boolector_Native_bitvecAssignment(JNIEnv *env, jobject jobj, jlong btorRef, jlong jnode_ref) { + Btor* btor = (Btor*) btorRef; BoolectorNode *node = (BoolectorNode *) jnode_ref; int size = boolector_get_width(btor, node); const char *bits = boolector_bv_assignment(btor, node); @@ -134,239 +157,138 @@ Java_org_jetbrains_research_boolector_Native_bitvecAssignment(JNIEnv *env, jobje if (bits[i] == '1') number += power; power *= 2; } - // printf("%s\n%lli\n", bits, number); boolector_free_bv_assignment(btor, bits); return (jlong) number; } -JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_constNodeTrue(JNIEnv *env, jobject jobj) { +JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_constNodeTrue(JNIEnv *env, jobject jobj, jlong btorRef) { + Btor* btor = (Btor*) btorRef; return (jlong) boolector_true(btor); } -JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_constNodeFalse(JNIEnv *env, jobject jobj) { +JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_constNodeFalse(JNIEnv *env, jobject jobj, jlong btorRef) { + Btor* btor = (Btor*) btorRef; return (jlong) boolector_false(btor); } -JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_zero(JNIEnv *env, jobject jobj, jlong jsort_ref) { +JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_zero(JNIEnv *env, jobject jobj, jlong btorRef, jlong jsort_ref) { + Btor* btor = (Btor*) btorRef; BoolectorSort sort = (BoolectorSort) jsort_ref; return (jlong) boolector_zero(btor, sort); } -JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_eq(JNIEnv *env, jobject jobj, jlong jnode_first_ref, - jlong jnode_second_ref) { - BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; - BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; - return (jlong) boolector_eq(btor, first_node, second_node); -} - -JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_not(JNIEnv *env, jobject jobj, jlong jnode_ref) { +JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_not(JNIEnv *env, jobject jobj, jlong btorRef, jlong jnode_ref) { + Btor* btor = (Btor*) btorRef; BoolectorNode *node = (BoolectorNode *) jnode_ref; return (jlong) boolector_not(btor, node); } -JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_add(JNIEnv *env, jobject jobj, jlong jnode_first_ref, - jlong jnode_second_ref) { - BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; - BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; - return (jlong) boolector_add(btor, first_node, second_node); -} - -JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_and(JNIEnv *env, jobject jobj, jlong jnode_first_ref, - jlong jnode_second_ref) { - BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; - BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; - return (jlong) boolector_and(btor, first_node, second_node); -} - -JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_or(JNIEnv *env, jobject jobj, jlong jnode_first_ref, - jlong jnode_second_ref) { - BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; - BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; - return (jlong) boolector_or(btor, first_node, second_node); -} - -JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_xor(JNIEnv *env, jobject jobj, jlong jnode_first_ref, - jlong jnode_second_ref) { - BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; - BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; - return (jlong) boolector_xor(btor, first_node, second_node); -} - -JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_neg(JNIEnv *env, jobject jobj, jlong jnode_ref) { +#define BINARY_OP(opcode) \ + JNIEXPORT jlong JNICALL \ + Java_org_jetbrains_research_boolector_Native_##opcode(JNIEnv *env, jobject jobj, jlong btorRef, jlong jnode_first_ref, \ + jlong jnode_second_ref) { \ + Btor* btor = (Btor*) btorRef; \ + BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; \ + BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; \ + return (jlong) boolector_##opcode(btor, first_node, second_node); \ + } \ + +BINARY_OP(add) +BINARY_OP(sub) +BINARY_OP(mul) +BINARY_OP(sdiv) +BINARY_OP(udiv) +BINARY_OP(smod) +BINARY_OP(urem) + +BINARY_OP(and) +BINARY_OP(or) +BINARY_OP(xor) + +BINARY_OP(eq) +BINARY_OP(sgt) +BINARY_OP(sgte) +BINARY_OP(ugt) +BINARY_OP(slt) +BINARY_OP(slte) +BINARY_OP(sll) +BINARY_OP(srl) +BINARY_OP(sra) + + +BINARY_OP(implies) +BINARY_OP(iff) +BINARY_OP(concat) + +JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_neg(JNIEnv *env, jobject jobj, jlong btorRef, jlong jnode_ref) { + Btor* btor = (Btor*) btorRef; BoolectorNode *node = (BoolectorNode *) jnode_ref; return (jlong) boolector_neg(btor, node); } -JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_copy(JNIEnv *env, jobject jobj, jlong jnode_ref) { +JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_copy(JNIEnv *env, jobject jobj, jlong btorRef, jlong jnode_ref) { + Btor* btor = (Btor*) btorRef; BoolectorNode *node = (BoolectorNode *) jnode_ref; return (jlong) boolector_copy(btor, node); } JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_sub(JNIEnv *env, jobject jobj, jlong jnode_first_ref, - jlong jnode_second_ref) { - BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; - BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; - return (jlong) boolector_sub(btor, first_node, second_node); -} - -JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_mul(JNIEnv *env, jobject jobj, jlong jnode_first_ref, - jlong jnode_second_ref) { - BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; - BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; - return (jlong) boolector_mul(btor, first_node, second_node); -} - -JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_sdiv(JNIEnv *env, jobject jobj, jlong jnode_first_ref, - jlong jnode_second_ref) { - BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; - BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; - return (jlong) boolector_sdiv(btor, first_node, second_node); -} - -JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_udiv(JNIEnv *env, jobject jobj, jlong jnode_first_ref, - jlong jnode_second_ref) { - BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; - BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; - return (jlong) boolector_udiv(btor, first_node, second_node); -} - -JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_smod(JNIEnv *env, jobject jobj, jlong jnode_first_ref, - jlong jnode_second_ref) { - BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; - BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; - return (jlong) boolector_smod(btor, first_node, second_node); -} - -JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_urem(JNIEnv *env, jobject jobj, jlong jnode_first_ref, - jlong jnode_second_ref) { - BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; - BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; - return (jlong) boolector_urem(btor, first_node, second_node); -} - -JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_sgt(JNIEnv *env, jobject jobj, jlong jnode_first_ref, - jlong jnode_second_ref) { - BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; - BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; - return (jlong) boolector_sgt(btor, first_node, second_node); -} - -JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_sgte(JNIEnv *env, jobject jobj, jlong jnode_first_ref, - jlong jnode_second_ref) { - BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; - BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; - return (jlong) boolector_sgte(btor, first_node, second_node); -} - -JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_ugt(JNIEnv *env, jobject jobj, jlong jnode_first_ref, - jlong jnode_second_ref) { - BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; - BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; - return (jlong) boolector_ugt(btor, first_node, second_node); -} - -JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_slt(JNIEnv *env, jobject jobj, jlong jnode_first_ref, - jlong jnode_second_ref) { - BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; - BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; - return (jlong) boolector_slt(btor, first_node, second_node); -} - -JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_slte(JNIEnv *env, jobject jobj, jlong jnode_first_ref, - jlong jnode_second_ref) { - BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; - BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; - return (jlong) boolector_slte(btor, first_node, second_node); -} - -JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_sll(JNIEnv *env, jobject jobj, jlong jnode_first_ref, - jlong jnode_second_ref) { - BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; - BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; - return (jlong) boolector_sll(btor, first_node, second_node); -} - -JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_srl(JNIEnv *env, jobject jobj, jlong jnode_first_ref, - jlong jnode_second_ref) { - BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; - BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; - return (jlong) boolector_srl(btor, first_node, second_node); -} - -JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_sra(JNIEnv *env, jobject jobj, jlong jnode_first_ref, - jlong jnode_second_ref) { - BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; - BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; - return (jlong) boolector_sra(btor, first_node, second_node); -} - -JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_sext(JNIEnv *env, jobject jobj, jlong jnode_ref, jint width) { +Java_org_jetbrains_research_boolector_Native_sext(JNIEnv *env, jobject jobj, jlong btorRef, jlong jnode_ref, jint width) { + Btor* btor = (Btor*) btorRef; BoolectorNode *node = (BoolectorNode *) jnode_ref; return (jlong) boolector_sext(btor, node, (uint32_t) width); } JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_uext(JNIEnv *env, jobject jobj, jlong jnode_ref, jint width) { +Java_org_jetbrains_research_boolector_Native_uext(JNIEnv *env, jobject jobj, jlong btorRef, jlong jnode_ref, jint width) { + Btor* btor = (Btor*) btorRef; BoolectorNode *node = (BoolectorNode *) jnode_ref; return (jlong) boolector_uext(btor, node, (uint32_t) width); } JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_slice(JNIEnv *env, jobject jobj, jlong jnode_ref, jint upper, jint lower) { +Java_org_jetbrains_research_boolector_Native_slice(JNIEnv *env, jobject jobj, jlong btorRef, jlong jnode_ref, jint upper, jint lower) { + Btor* btor = (Btor*) btorRef; BoolectorNode *node = (BoolectorNode *) jnode_ref; return (jlong) boolector_slice(btor, node, (uint32_t) upper, (uint32_t) lower); } JNIEXPORT jint JNICALL -Java_org_jetbrains_research_boolector_Native_getWidthNode(JNIEnv *env, jobject jobj, jlong jnode_ref) { +Java_org_jetbrains_research_boolector_Native_getWidthNode(JNIEnv *env, jobject jobj, jlong btorRef, jlong jnode_ref) { + Btor* btor = (Btor*) btorRef; BoolectorNode *node = (BoolectorNode *) jnode_ref; return (jint) boolector_get_width(btor, node); } JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_array(JNIEnv *env, jobject jobj, jlong jsort_ref, jstring jsymbol) { +Java_org_jetbrains_research_boolector_Native_array(JNIEnv *env, jobject jobj, jlong btorRef, jlong jsort_ref, jstring jsymbol) { + Btor* btor = (Btor*) btorRef; BoolectorSort sort = (BoolectorSort) jsort_ref; - const char *str = (*env)->GetStringUTFChars(env, jsymbol, 0); jlong ans; - if (strncmp(str, "nullINc", 7) == 0) { + if (jsymbol == NULL) { ans = (jlong) boolector_array(btor, sort, NULL); - } else { ans = (jlong) boolector_array(btor, sort, str); } - (*env)->ReleaseStringUTFChars(env, jsymbol, str); + } else { + const char *str = (*env)->GetStringUTFChars(env, jsymbol, 0); + ans = (jlong) boolector_array(btor, sort, str); + (*env)->ReleaseStringUTFChars(env, jsymbol, str); + } return ans; } JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_read(JNIEnv *env, jobject jobj, jlong jnode_array_ref, +Java_org_jetbrains_research_boolector_Native_read(JNIEnv *env, jobject jobj, jlong btorRef, jlong jnode_array_ref, jlong jnode_index_ref) { + Btor* btor = (Btor*) btorRef; BoolectorNode *array = (BoolectorNode *) jnode_array_ref; BoolectorNode *index = (BoolectorNode *) jnode_index_ref; return (jlong) boolector_read(btor, array, index); } JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_write(JNIEnv *env, jobject jobj, jlong jnode_array_ref, +Java_org_jetbrains_research_boolector_Native_write(JNIEnv *env, jobject jobj, jlong btorRef, jlong jnode_array_ref, jlong jnode_index_ref, jlong jnode_value_ref) { + Btor* btor = (Btor*) btorRef; BoolectorNode *array = (BoolectorNode *) jnode_array_ref; BoolectorNode *index = (BoolectorNode *) jnode_index_ref; BoolectorNode *value = (BoolectorNode *) jnode_value_ref; @@ -374,103 +296,99 @@ Java_org_jetbrains_research_boolector_Native_write(JNIEnv *env, jobject jobj, jl } JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_implies(JNIEnv *env, jobject jobj, jlong jnode_first_ref, - jlong jnode_second_ref) { - BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; - BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; - return (jlong) boolector_implies(btor, first_node, second_node); -} - -JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_iff(JNIEnv *env, jobject jobj, jlong jnode_first_ref, - jlong jnode_second_ref) { - BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; - BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; - return (jlong) boolector_iff(btor, first_node, second_node); -} - -JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_concat(JNIEnv *env, jobject jobj, jlong jnode_first_ref, - jlong jnode_second_ref) { - BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; - BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; - return (jlong) boolector_concat(btor, first_node, second_node); -} - -JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_cond(JNIEnv *env, jobject jobj, jlong jnode_cond_ref, +Java_org_jetbrains_research_boolector_Native_cond(JNIEnv *env, jobject jobj, jlong btorRef, jlong jnode_cond_ref, jlong jnode_first_ref, jlong jnode_second_ref) { + Btor* btor = (Btor*) btorRef; BoolectorNode *bool_node = (BoolectorNode *) jnode_cond_ref; BoolectorNode *first_node = (BoolectorNode *) jnode_first_ref; BoolectorNode *second_node = (BoolectorNode *) jnode_second_ref; return (jlong) boolector_cond(btor, bool_node, first_node, second_node); } -JNIEXPORT jint JNICALL Java_org_jetbrains_research_boolector_Native_getId(JNIEnv *env, jobject jobj, jlong jnode_ref) { +JNIEXPORT jint JNICALL Java_org_jetbrains_research_boolector_Native_getId(JNIEnv *env, jobject jobj, jlong btorRef, jlong jnode_ref) { + Btor* btor = (Btor*) btorRef; BoolectorNode *node = (BoolectorNode *) jnode_ref; return (jint) boolector_get_node_id(btor, node); } JNIEXPORT jstring JNICALL -Java_org_jetbrains_research_boolector_Native_getSymbol(JNIEnv *env, jobject jobj, jlong jnode_ref) { +Java_org_jetbrains_research_boolector_Native_getSymbol(JNIEnv *env, jobject jobj, jlong btorRef, jlong jnode_ref) { + Btor* btor = (Btor*) btorRef; BoolectorNode *node = (BoolectorNode *) jnode_ref; const char *symbol = boolector_get_symbol(btor, node); return (symbol != NULL) ? (*env)->NewStringUTF(env, symbol) : NULL; } JNIEXPORT void JNICALL -Java_org_jetbrains_research_boolector_Native_releaseNode(JNIEnv *env, jobject jobj, jlong jnode_ref) { +Java_org_jetbrains_research_boolector_Native_releaseNode(JNIEnv *env, jobject jobj, jlong btorRef, jlong jnode_ref) { + Btor* btor = (Btor*) btorRef; BoolectorNode *node = (BoolectorNode *) jnode_ref; boolector_release(btor, node); } JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_getSort(JNIEnv *env, jobject jobj, jlong jnode_ref) { +Java_org_jetbrains_research_boolector_Native_getSort(JNIEnv *env, jobject jobj, jlong btorRef, jlong jnode_ref) { + Btor* btor = (Btor*) btorRef; BoolectorNode *node = (BoolectorNode *) jnode_ref; return (jlong) boolector_get_sort(btor, node); } -JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_bitvecSort(JNIEnv *env, jobject jobj, jint width) { +JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_bitvecSort(JNIEnv *env, jobject jobj, jlong btorRef, jint width) { + Btor* btor = (Btor*) btorRef; BoolectorSort s = boolector_bitvec_sort(btor, (uint32_t) width); return (jlong) s; } JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_arraySort(JNIEnv *env, jobject jobj, jlong index_sort_ref, +Java_org_jetbrains_research_boolector_Native_arraySort(JNIEnv *env, jobject jobj, jlong btorRef, jlong index_sort_ref, jlong element_sort_ref) { + Btor* btor = (Btor*) btorRef; BoolectorSort index = (BoolectorSort) index_sort_ref; BoolectorSort element = (BoolectorSort) element_sort_ref; return (jlong) boolector_array_sort(btor, index, element); } JNIEXPORT jboolean JNICALL -Java_org_jetbrains_research_boolector_Native_isBitvecSort(JNIEnv *env, jobject jobj, jlong jsort_ref) { +Java_org_jetbrains_research_boolector_Native_isBitvecSort(JNIEnv *env, jobject jobj, jlong btorRef, jlong jsort_ref) { + Btor* btor = (Btor*) btorRef; BoolectorSort s = (BoolectorSort) jsort_ref; return (jboolean) boolector_is_bitvec_sort(btor, s); } JNIEXPORT jboolean JNICALL -Java_org_jetbrains_research_boolector_Native_isArraySort(JNIEnv *env, jobject jobj, jlong jsort_ref) { +Java_org_jetbrains_research_boolector_Native_isArraySort(JNIEnv *env, jobject jobj, jlong btorRef, jlong jsort_ref) { + Btor* btor = (Btor*) btorRef; BoolectorSort s = (BoolectorSort) jsort_ref; return (jboolean) boolector_is_array_sort(btor, s); } +JNIEXPORT jboolean JNICALL +Java_org_jetbrains_research_boolector_Native_isFuncSort(JNIEnv *env, jobject jobj, jlong btorRef, jlong jsort_ref) { + Btor* btor = (Btor*) btorRef; + BoolectorSort s = (BoolectorSort) jsort_ref; + return (jboolean) boolector_is_fun_sort(btor, s); +} + JNIEXPORT void JNICALL -Java_org_jetbrains_research_boolector_Native_releaseSort(JNIEnv *env, jobject jobj, jlong jsort_ref) { +Java_org_jetbrains_research_boolector_Native_releaseSort(JNIEnv *env, jobject jobj, jlong btorRef, jlong jsort_ref) { + Btor* btor = (Btor*) btorRef; BoolectorSort s = (BoolectorSort) jsort_ref; boolector_release_sort(btor, s); } JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_param(JNIEnv *env, jobject jobj, jlong jsort_ref, jstring jsymbol) { +Java_org_jetbrains_research_boolector_Native_param(JNIEnv *env, jobject jobj, jlong btorRef, jlong jsort_ref, jstring jsymbol) { + Btor* btor = (Btor*) btorRef; BoolectorNode *node; BoolectorSort sort = (BoolectorSort) jsort_ref; - const char *str = (*env)->GetStringUTFChars(env, jsymbol, 0); - if (strncmp(str, "nullINc", 7) == 0) { + if (jsymbol == NULL) { node = boolector_param(btor, sort, NULL); - } else { node = boolector_param(btor, sort, str); } - (*env)->ReleaseStringUTFChars(env, jsymbol, str); + } else { + const char *str = (*env)->GetStringUTFChars(env, jsymbol, 0); + node = boolector_param(btor, sort, str); + (*env)->ReleaseStringUTFChars(env, jsymbol, str); + } return (jlong) node; } @@ -482,9 +400,32 @@ BoolectorNode **ref_array_to_type(long *refs, uint32_t size) { return array; } +BoolectorSort* ref_array_to_sorts(long *refs, uint32_t size) { + BoolectorSort *array = malloc(size); + for (int i = 0; i < size; i++) { + array[i] = (BoolectorSort) refs[i]; + } + return array; +} + +JNIEXPORT jlong JNICALL +Java_org_jetbrains_research_boolector_Native_funcSort(JNIEnv *env, jobject jobj, jlong btorRef, jlongArray jparams, jint jlength, + jlong retSortRef) { + Btor* btor = (Btor*) btorRef; + uint32_t size = (uint32_t) jlength; + BoolectorSort retSort = (BoolectorSort) retSortRef; + long *ref_params = (*env)->GetLongArrayElements(env, jparams, 0); + BoolectorSort *params = ref_array_to_sorts(ref_params, size); + jlong ans = (jlong) boolector_fun_sort(btor, params, (uint32_t) size, retSort); + (*env)->ReleaseLongArrayElements(env, jparams, ref_params, 0); + free(params); + return ans; +} + JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_fun(JNIEnv *env, jobject jobj, jlongArray jparams, jint jlength, +Java_org_jetbrains_research_boolector_Native_fun(JNIEnv *env, jobject jobj, jlong btorRef, jlongArray jparams, jint jlength, jlong body_node_ref) { + Btor* btor = (Btor*) btorRef; BoolectorNode *body_node = (BoolectorNode *) body_node_ref; uint32_t size = (uint32_t) jlength; long *ref_params = (*env)->GetLongArrayElements(env, jparams, 0); @@ -496,8 +437,24 @@ Java_org_jetbrains_research_boolector_Native_fun(JNIEnv *env, jobject jobj, jlon } JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_forAll(JNIEnv *env, jobject jobj, jlongArray jparams, jint jlength, +Java_org_jetbrains_research_boolector_Native_uf(JNIEnv *env, jobject jobj, jlong btorRef, jlong sortRef, jstring name) { + Btor* btor = (Btor*) btorRef; + BoolectorSort sort = (BoolectorSort) sortRef; + BoolectorNode *node; + if (name == NULL) { + node = boolector_uf(btor, sort, NULL); + } else { + const char *str = (*env)->GetStringUTFChars(env, name, 0); + node = boolector_uf(btor, sort, str); + (*env)->ReleaseStringUTFChars(env, name, str); + } + return (jlong) node; +} + +JNIEXPORT jlong JNICALL +Java_org_jetbrains_research_boolector_Native_forAll(JNIEnv *env, jobject jobj, jlong btorRef, jlongArray jparams, jint jlength, jlong body_node_ref) { + Btor* btor = (Btor*) btorRef; BoolectorNode *body_node = (BoolectorNode *) body_node_ref; uint32_t size = (uint32_t) jlength; long *ref_params = (*env)->GetLongArrayElements(env, jparams, 0); @@ -510,8 +467,9 @@ Java_org_jetbrains_research_boolector_Native_forAll(JNIEnv *env, jobject jobj, j JNIEXPORT jlong JNICALL -Java_org_jetbrains_research_boolector_Native_apply(JNIEnv *env, jobject jobj, jlongArray jargs, jint jlength, +Java_org_jetbrains_research_boolector_Native_apply(JNIEnv *env, jobject jobj, jlong btorRef, jlongArray jargs, jint jlength, jlong fun_node_ref) { + Btor* btor = (Btor*) btorRef; BoolectorNode *fun_node = (BoolectorNode *) fun_node_ref; uint32_t size = (uint32_t) jlength; long *ref_args = (*env)->GetLongArrayElements(env, jargs, 0); @@ -523,7 +481,8 @@ Java_org_jetbrains_research_boolector_Native_apply(JNIEnv *env, jobject jobj, jl } JNIEXPORT jint JNICALL -Java_org_jetbrains_research_boolector_Native_kindNode(JNIEnv *env, jobject jobj, jlong jnode_ref) { +Java_org_jetbrains_research_boolector_Native_kindNode(JNIEnv *env, jobject jobj, jlong btorRef, jlong jnode_ref) { + Btor* btor = (Btor*) btorRef; BoolectorNode *node = (BoolectorNode *) jnode_ref; BoolectorSort sort = boolector_get_sort(btor, node); bool isBitvecSort = boolector_is_bitvec_sort(btor, sort); @@ -535,10 +494,11 @@ Java_org_jetbrains_research_boolector_Native_kindNode(JNIEnv *env, jobject jobj, return 5; } -JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_constArray(JNIEnv *env, jobject jobj, +JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_constArray(JNIEnv *env, jobject jobj, jlong btorRef, jlong jsort_array_ref, jlong jsort_index_ref, jlong jnode_ref) { + Btor* btor = (Btor*) btorRef; BoolectorSort sort_array = (BoolectorSort) jsort_array_ref; BoolectorNode *array = boolector_array(btor, sort_array, NULL); BoolectorNode *node = (BoolectorNode *) jnode_ref; @@ -553,7 +513,8 @@ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_constArray( } JNIEXPORT jint JNICALL -Java_org_jetbrains_research_boolector_Native_getIndexWidth(JNIEnv *env, jobject jobj, jlong jarray_ref) { +Java_org_jetbrains_research_boolector_Native_getIndexWidth(JNIEnv *env, jobject jobj, jlong btorRef, jlong jarray_ref) { + Btor* btor = (Btor*) btorRef; BoolectorNode *array_node = (BoolectorNode *) jarray_ref; int width_index = boolector_get_index_width(btor, array_node); return width_index; @@ -561,7 +522,8 @@ Java_org_jetbrains_research_boolector_Native_getIndexWidth(JNIEnv *env, jobject JNIEXPORT jboolean JNICALL -Java_org_jetbrains_research_boolector_Native_boolectorAssert(JNIEnv *env, jobject jobj, jstring jans, jlong jnode_ref) { +Java_org_jetbrains_research_boolector_Native_boolectorAssert(JNIEnv *env, jobject jobj, jlong btorRef, jstring jans, jlong jnode_ref) { + Btor* btor = (Btor*) btorRef; BoolectorNode *node = (BoolectorNode *) jnode_ref; const char *ans = (*env)->GetStringUTFChars(env, jans, 0); const char *str = boolector_bv_assignment(btor, node); diff --git a/c/JavaBoolector.h b/src/main/c/org_jetbrains_research_boolector_Native.h similarity index 77% rename from c/JavaBoolector.h rename to src/main/c/org_jetbrains_research_boolector_Native.h index abb0619..d1ff1ab 100644 --- a/c/JavaBoolector.h +++ b/src/main/c/org_jetbrains_research_boolector_Native.h @@ -10,563 +10,595 @@ extern "C" { /* * Class: org_jetbrains_research_boolector_Native * Method: btor - * Signature: ()V + * Signature: ()J */ -JNIEXPORT void JNICALL Java_org_jetbrains_research_boolector_Native_btor +JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_btor (JNIEnv *, jclass); /* * Class: org_jetbrains_research_boolector_Native * Method: btorRelease - * Signature: ()V + * Signature: (J)V */ JNIEXPORT void JNICALL Java_org_jetbrains_research_boolector_Native_btorRelease - (JNIEnv *, jclass); + (JNIEnv *, jclass, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: var - * Signature: (JLjava/lang/String;)J + * Signature: (JJLjava/lang/String;)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_var - (JNIEnv *, jclass, jlong, jstring); + (JNIEnv *, jclass, jlong, jlong, jstring); /* * Class: org_jetbrains_research_boolector_Native * Method: releaseNode - * Signature: (J)V + * Signature: (JJ)V */ JNIEXPORT void JNICALL Java_org_jetbrains_research_boolector_Native_releaseNode - (JNIEnv *, jclass, jlong); + (JNIEnv *, jclass, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: bitvecSort - * Signature: (I)J + * Signature: (JI)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_bitvecSort - (JNIEnv *, jclass, jint); + (JNIEnv *, jclass, jlong, jint); /* * Class: org_jetbrains_research_boolector_Native * Method: releaseSort - * Signature: (J)V + * Signature: (JJ)V */ JNIEXPORT void JNICALL Java_org_jetbrains_research_boolector_Native_releaseSort - (JNIEnv *, jclass, jlong); + (JNIEnv *, jclass, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: isBitvecSort - * Signature: (J)Z + * Signature: (JJ)Z */ JNIEXPORT jboolean JNICALL Java_org_jetbrains_research_boolector_Native_isBitvecSort - (JNIEnv *, jclass, jlong); + (JNIEnv *, jclass, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: isArraySort - * Signature: (J)Z + * Signature: (JJ)Z */ JNIEXPORT jboolean JNICALL Java_org_jetbrains_research_boolector_Native_isArraySort - (JNIEnv *, jclass, jlong); + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_jetbrains_research_boolector_Native + * Method: isFuncSort + * Signature: (JJ)Z + */ +JNIEXPORT jboolean JNICALL Java_org_jetbrains_research_boolector_Native_isFuncSort + (JNIEnv *, jclass, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: getWidth - * Signature: (J)I + * Signature: (JJ)I */ JNIEXPORT jint JNICALL Java_org_jetbrains_research_boolector_Native_getWidth - (JNIEnv *, jclass, jlong); + (JNIEnv *, jclass, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: not - * Signature: (J)J + * Signature: (JJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_not - (JNIEnv *, jclass, jlong); + (JNIEnv *, jclass, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: add - * Signature: (JJ)J + * Signature: (JJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_add - (JNIEnv *, jclass, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: and - * Signature: (JJ)J + * Signature: (JJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_and - (JNIEnv *, jclass, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: or - * Signature: (JJ)J + * Signature: (JJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_or - (JNIEnv *, jclass, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: xor - * Signature: (JJ)J + * Signature: (JJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_xor - (JNIEnv *, jclass, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: neg - * Signature: (J)J + * Signature: (JJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_neg - (JNIEnv *, jclass, jlong); + (JNIEnv *, jclass, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: eq - * Signature: (JJ)J + * Signature: (JJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_eq - (JNIEnv *, jclass, jlong, jlong); - -/* - * Class: org_jetbrains_research_boolector_Native - * Method: copy - * Signature: (J)J - */ -JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_copy - (JNIEnv *, jclass, jlong); - -/* - * Class: org_jetbrains_research_boolector_Native - * Method: assertForm - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_org_jetbrains_research_boolector_Native_assertForm - (JNIEnv *, jclass, jlong); - -/* - * Class: org_jetbrains_research_boolector_Native - * Method: getSat - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_jetbrains_research_boolector_Native_getSat - (JNIEnv *, jclass); + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: sub - * Signature: (JJ)J + * Signature: (JJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_sub - (JNIEnv *, jclass, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: mul - * Signature: (JJ)J + * Signature: (JJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_mul - (JNIEnv *, jclass, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: sdiv - * Signature: (JJ)J + * Signature: (JJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_sdiv - (JNIEnv *, jclass, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: udiv - * Signature: (JJ)J + * Signature: (JJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_udiv - (JNIEnv *, jclass, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: smod - * Signature: (JJ)J + * Signature: (JJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_smod - (JNIEnv *, jclass, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: urem - * Signature: (JJ)J + * Signature: (JJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_urem - (JNIEnv *, jclass, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: sgt - * Signature: (JJ)J + * Signature: (JJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_sgt - (JNIEnv *, jclass, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong); + +/* + * Class: org_jetbrains_research_boolector_Native + * Method: ugt + * Signature: (JJJ)J + */ +JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_ugt + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: sgte - * Signature: (JJ)J + * Signature: (JJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_sgte - (JNIEnv *, jclass, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: slt - * Signature: (JJ)J + * Signature: (JJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_slt - (JNIEnv *, jclass, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: slte - * Signature: (JJ)J + * Signature: (JJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_slte - (JNIEnv *, jclass, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: sll - * Signature: (JJ)J + * Signature: (JJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_sll - (JNIEnv *, jclass, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: srl - * Signature: (JJ)J + * Signature: (JJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_srl - (JNIEnv *, jclass, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: sra - * Signature: (JJ)J + * Signature: (JJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_sra - (JNIEnv *, jclass, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: implies - * Signature: (JJ)J + * Signature: (JJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_implies - (JNIEnv *, jclass, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: iff - * Signature: (JJ)J + * Signature: (JJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_iff - (JNIEnv *, jclass, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: concat - * Signature: (JJ)J + * Signature: (JJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_concat - (JNIEnv *, jclass, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: cond - * Signature: (JJJ)J + * Signature: (JJJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_cond - (JNIEnv *, jclass, jlong, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: zero - * Signature: (J)J + * Signature: (JJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_zero - (JNIEnv *, jclass, jlong); + (JNIEnv *, jclass, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: constBitvec - * Signature: (Ljava/lang/String;)J + * Signature: (JLjava/lang/String;)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_constBitvec - (JNIEnv *, jclass, jstring); + (JNIEnv *, jclass, jlong, jstring); /* * Class: org_jetbrains_research_boolector_Native * Method: isBoolSort - * Signature: (J)Z + * Signature: (JJ)Z */ JNIEXPORT jboolean JNICALL Java_org_jetbrains_research_boolector_Native_isBoolSort - (JNIEnv *, jclass, jlong); + (JNIEnv *, jclass, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: constNodeTrue - * Signature: ()J + * Signature: (J)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_constNodeTrue - (JNIEnv *, jclass); + (JNIEnv *, jclass, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: constNodeFalse - * Signature: ()J + * Signature: (J)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_constNodeFalse - (JNIEnv *, jclass); + (JNIEnv *, jclass, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: getSort - * Signature: (J)J + * Signature: (JJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_getSort - (JNIEnv *, jclass, jlong); + (JNIEnv *, jclass, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: getId - * Signature: (J)I + * Signature: (JJ)I */ JNIEXPORT jint JNICALL Java_org_jetbrains_research_boolector_Native_getId - (JNIEnv *, jclass, jlong); + (JNIEnv *, jclass, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: getSymbol - * Signature: (J)Ljava/lang/String; + * Signature: (JJ)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_org_jetbrains_research_boolector_Native_getSymbol - (JNIEnv *, jclass, jlong); + (JNIEnv *, jclass, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: simplify - * Signature: ()I + * Signature: (J)I */ JNIEXPORT jint JNICALL Java_org_jetbrains_research_boolector_Native_simplify - (JNIEnv *, jclass); + (JNIEnv *, jclass, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: constInt - * Signature: (IJ)J + * Signature: (JIJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_constInt - (JNIEnv *, jclass, jint, jlong); + (JNIEnv *, jclass, jlong, jint, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: sext - * Signature: (JI)J + * Signature: (JJI)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_sext - (JNIEnv *, jclass, jlong, jint); + (JNIEnv *, jclass, jlong, jlong, jint); /* * Class: org_jetbrains_research_boolector_Native * Method: uext - * Signature: (JI)J + * Signature: (JJI)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_uext - (JNIEnv *, jclass, jlong, jint); + (JNIEnv *, jclass, jlong, jlong, jint); /* * Class: org_jetbrains_research_boolector_Native * Method: slice - * Signature: (JII)J + * Signature: (JJII)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_slice - (JNIEnv *, jclass, jlong, jint, jint); + (JNIEnv *, jclass, jlong, jlong, jint, jint); /* * Class: org_jetbrains_research_boolector_Native * Method: arraySort - * Signature: (JJ)J + * Signature: (JJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_arraySort - (JNIEnv *, jclass, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: array - * Signature: (JLjava/lang/String;)J + * Signature: (JJLjava/lang/String;)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_array - (JNIEnv *, jclass, jlong, jstring); + (JNIEnv *, jclass, jlong, jlong, jstring); /* * Class: org_jetbrains_research_boolector_Native * Method: read - * Signature: (JJ)J + * Signature: (JJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_read - (JNIEnv *, jclass, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: write - * Signature: (JJJ)J + * Signature: (JJJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_write - (JNIEnv *, jclass, jlong, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: param - * Signature: (JLjava/lang/String;)J + * Signature: (JJLjava/lang/String;)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_param - (JNIEnv *, jclass, jlong, jstring); + (JNIEnv *, jclass, jlong, jlong, jstring); + +/* + * Class: org_jetbrains_research_boolector_Native + * Method: funcSort + * Signature: (J[JIJ)J + */ +JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_funcSort + (JNIEnv *, jclass, jlong, jlongArray, jint, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: fun - * Signature: ([JIJ)J + * Signature: (J[JIJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_fun - (JNIEnv *, jclass, jlongArray, jint, jlong); + (JNIEnv *, jclass, jlong, jlongArray, jint, jlong); /* * Class: org_jetbrains_research_boolector_Native - * Method: apply - * Signature: ([JIJ)J + * Method: uf + * Signature: (JJLjava/lang/String;)J */ -JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_apply - (JNIEnv *, jclass, jlongArray, jint, jlong); +JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_uf + (JNIEnv *, jclass, jlong, jlong, jstring); /* * Class: org_jetbrains_research_boolector_Native - * Method: printModel - * Signature: ()Ljava/lang/String; + * Method: apply + * Signature: (J[JIJ)J */ -JNIEXPORT jstring JNICALL Java_org_jetbrains_research_boolector_Native_printModel - (JNIEnv *, jclass); +JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_apply + (JNIEnv *, jclass, jlong, jlongArray, jint, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: getBits - * Signature: (J)Ljava/lang/String; + * Signature: (JJ)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_org_jetbrains_research_boolector_Native_getBits - (JNIEnv *, jclass, jlong); + (JNIEnv *, jclass, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: constLong - * Signature: (Ljava/lang/String;J)J + * Signature: (JLjava/lang/String;J)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_constLong - (JNIEnv *, jclass, jstring, jlong); + (JNIEnv *, jclass, jlong, jstring, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: forAll - * Signature: ([JIJ)J + * Signature: (J[JIJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_forAll - (JNIEnv *, jclass, jlongArray, jint, jlong); + (JNIEnv *, jclass, jlong, jlongArray, jint, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: boolectorAssert - * Signature: (Ljava/lang/String;J)Z + * Signature: (JLjava/lang/String;J)Z */ JNIEXPORT jboolean JNICALL Java_org_jetbrains_research_boolector_Native_boolectorAssert - (JNIEnv *, jclass, jstring, jlong); + (JNIEnv *, jclass, jlong, jstring, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: kindNode - * Signature: (J)I + * Signature: (JJ)I */ JNIEXPORT jint JNICALL Java_org_jetbrains_research_boolector_Native_kindNode - (JNIEnv *, jclass, jlong); + (JNIEnv *, jclass, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: constArray - * Signature: (JJJ)J + * Signature: (JJJJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_constArray - (JNIEnv *, jclass, jlong, jlong, jlong); + (JNIEnv *, jclass, jlong, jlong, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: getWidthNode - * Signature: (J)I + * Signature: (JJ)I */ JNIEXPORT jint JNICALL Java_org_jetbrains_research_boolector_Native_getWidthNode - (JNIEnv *, jclass, jlong); + (JNIEnv *, jclass, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: getIndexWidth - * Signature: (J)I + * Signature: (JJ)I */ JNIEXPORT jint JNICALL Java_org_jetbrains_research_boolector_Native_getIndexWidth - (JNIEnv *, jclass, jlong); + (JNIEnv *, jclass, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: dumpSmt2 - * Signature: ()Ljava/lang/String; + * Signature: (J)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_org_jetbrains_research_boolector_Native_dumpSmt2 - (JNIEnv *, jclass); + (JNIEnv *, jclass, jlong); + +/* + * Class: org_jetbrains_research_boolector_Native + * Method: dumpSmt2Node + * Signature: (JJ)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_org_jetbrains_research_boolector_Native_dumpSmt2Node + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_jetbrains_research_boolector_Native + * Method: printModel + * Signature: (J)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_org_jetbrains_research_boolector_Native_printModel + (JNIEnv *, jclass, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: assume - * Signature: (J)V + * Signature: (JJ)V */ JNIEXPORT void JNICALL Java_org_jetbrains_research_boolector_Native_assume - (JNIEnv *, jclass, jlong); + (JNIEnv *, jclass, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: bitvecAssignment - * Signature: (J)J + * Signature: (JJ)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_bitvecAssignment - (JNIEnv *, jclass, jlong); + (JNIEnv *, jclass, jlong, jlong); /* * Class: org_jetbrains_research_boolector_Native * Method: matchNodeByName - * Signature: (Ljava/lang/String;)J + * Signature: (JLjava/lang/String;)J */ JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_matchNodeByName - (JNIEnv *, jclass, jstring); + (JNIEnv *, jclass, jlong, jstring); /* * Class: org_jetbrains_research_boolector_Native - * Method: ugt + * Method: copy * Signature: (JJ)J */ -JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_ugt +JNIEXPORT jlong JNICALL Java_org_jetbrains_research_boolector_Native_copy + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_jetbrains_research_boolector_Native + * Method: assertForm + * Signature: (JJ)V + */ +JNIEXPORT void JNICALL Java_org_jetbrains_research_boolector_Native_assertForm (JNIEnv *, jclass, jlong, jlong); +/* + * Class: org_jetbrains_research_boolector_Native + * Method: getSat + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_org_jetbrains_research_boolector_Native_getSat + (JNIEnv *, jclass, jlong); + #ifdef __cplusplus } #endif diff --git a/src/main/java/org/jetbrains/research/boolector/ArrayNode.java b/src/main/java/org/jetbrains/research/boolector/ArrayNode.java new file mode 100644 index 0000000..af893e7 --- /dev/null +++ b/src/main/java/org/jetbrains/research/boolector/ArrayNode.java @@ -0,0 +1,57 @@ +package org.jetbrains.research.boolector; + +public class ArrayNode extends BoolectorNode { + + ArrayNode(Btor btor, long ref, String name) { + super(btor, ref, name, TypeNode.ARRAYNODE); + } + + public static ArrayNode arrayNode(ArraySort sort, String name) { + Btor btor = sort.getBtor(); + name = name + "!" + numberOfNames++; + return new ArrayNode(btor, Native.array(btor.getRef(), sort.getRef(), name), name); + } + + public static ArrayNode constArrayNode(BitvecSort indexSort, BitvecNode element) { + Btor btor = indexSort.getBtor(); + BitvecSort elementsSort = (BitvecSort) element.getSort(); + ArraySort arraySort = ArraySort.arraySort(indexSort, elementsSort); + return new ArrayNode(btor, + Native.constArray(btor.getRef(), arraySort.getRef(), indexSort.getRef(), element.getRef()), + null); + } + + public int getIndexWidth() { + return Native.getIndexWidth(btor.getRef(), ref); + } + + public BitvecNode read(BitvecNode index) { + return new BitvecNode(btor, Native.read(btor.getRef(), ref, index.getRef()), null); + } + + public ArrayNode write(BitvecNode index, BitvecNode value) { + int widthIndex = getIndexWidth(); + if (index.getWidth() != widthIndex) index.toBitvecNode(widthIndex); + return new ArrayNode(btor, Native.write(btor.getRef(), ref, index.getRef(), value.getRef()), null); + } + + @Override + public BoolNode toBoolNode() { + throw new ClassCastException(); + } + + @Override + public BitvecNode toBitvecNode() { + throw new ClassCastException(); + } + + @Override + public BitvecNode toBitvecNode(int width) { + throw new ClassCastException(); + } + + @Override + public ArrayNode toArrayNode() { + return this; + } +} diff --git a/src/main/java/org/jetbrains/research/boolector/ArraySort.java b/src/main/java/org/jetbrains/research/boolector/ArraySort.java new file mode 100644 index 0000000..cdbe105 --- /dev/null +++ b/src/main/java/org/jetbrains/research/boolector/ArraySort.java @@ -0,0 +1,28 @@ +package org.jetbrains.research.boolector; + +public class ArraySort extends BoolectorSort { + + ArraySort(Btor btor, long ref, Integer width) { + super(btor, ref, width); + } + + @Override + public BitvecSort toBitvecSort() { + throw new ClassCastException(); + } + + @Override + public BoolSort toBoolSort() { + throw new ClassCastException(); + } + + @Override + public ArraySort toArraySort() { + return this; + } + + public static ArraySort arraySort(BoolectorSort index, BoolectorSort element) { + Btor btor = index.getBtor(); + return new ArraySort(btor, Native.arraySort(btor.getRef(), index.getRef(), element.getRef()), element.getWidth()); + } +} diff --git a/src/main/java/org/jetbrains/research/boolector/BitvecNode.java b/src/main/java/org/jetbrains/research/boolector/BitvecNode.java new file mode 100644 index 0000000..320f4c4 --- /dev/null +++ b/src/main/java/org/jetbrains/research/boolector/BitvecNode.java @@ -0,0 +1,184 @@ +package org.jetbrains.research.boolector; + +import java.util.HashSet; +import java.util.Set; + +public class BitvecNode extends BoolectorNode { + + private static Set setConstName = new HashSet<>(); + + BitvecNode(Btor btor, long ref, String name) { + super(btor, ref, name, TypeNode.BITVECNODE); + } + + static void setConstNameClear() { + setConstName.clear(); + } + + public static BitvecNode var(BitvecSort sort, String name, boolean fresh) { + Btor btor = sort.getBtor(); + if (fresh) { + name = name + "!" + numberOfNames++; + return new BitvecNode(btor, Native.var(btor.getRef(), sort.getRef(), name), name); + } else if (setConstName.contains(name)) return matchNodeByName(btor, name); + else { + setConstName.add(name); + return new BitvecNode(btor, Native.var(btor.getRef(), sort.getRef(), name), name); + } + } + + public static BitvecNode matchNodeByName(Btor btor, String name) { + return new BitvecNode(btor, Native.matchNodeByName(btor.getRef(), name), name); + } + + public static BitvecNode zero(BitvecSort sort) { + Btor btor = sort.getBtor(); + return new BitvecNode(btor, Native.zero(btor.getRef(), sort.getRef()), null); + } + + public static BitvecNode constBitvec(Btor btor, String bits) { + return new BitvecNode(btor, Native.constBitvec(btor.getRef(), bits), null); + } + + public static BitvecNode constInt(int value, BitvecSort sort) { + Btor btor = sort.getBtor(); + return new BitvecNode(btor, Native.constInt(btor.getRef(), value, sort.getRef()), null); + } + + public static BitvecNode constLong(long value, BitvecSort sort) { + Btor btor = sort.getBtor(); + return new BitvecNode(btor, Native.constLong(btor.getRef(), String.valueOf(value), sort.getRef()), null); + } + + public BitvecNode sext(int width) { + int curSize = getWidth(); + return new BitvecNode(btor, Native.sext(btor.getRef(), ref, width - curSize), null); + } + + public BitvecNode uext(int width) { + int curSize = getWidth(); + return new BitvecNode(btor, Native.uext(btor.getRef(), ref, width - curSize), null); + } + + public BitvecNode slice(int upper, int lower) { + return new BitvecNode(btor, Native.slice(btor.getRef(), ref, upper, lower), null); + } + + public BitvecNode not() { + return new BitvecNode(btor, Native.not(btor.getRef(), ref), null); + } + + public BitvecNode add(BitvecNode bvNode) { + return new BitvecNode(btor, Native.add(btor.getRef(), ref, bvNode.getRef()), null); + } + + public BitvecNode and(BitvecNode bvNode) { + return new BitvecNode(btor, Native.and(btor.getRef(), ref, bvNode.getRef()), null); + } + + public BitvecNode or(BitvecNode bvNode) { + return new BitvecNode(btor, Native.or(btor.getRef(), ref, bvNode.getRef()), null); + } + + public BitvecNode xor(BitvecNode bvNode) { + return new BitvecNode(btor, Native.xor(btor.getRef(), ref, bvNode.getRef()), null); + } + + public BitvecNode neg() { + return new BitvecNode(btor, Native.neg(btor.getRef(), ref), null); + } + + public BitvecNode sub(BitvecNode bvNode) { + return new BitvecNode(btor, Native.sub(btor.getRef(), ref, bvNode.getRef()), null); + } + + public BitvecNode mul(BitvecNode bvNode) { + return new BitvecNode(btor, Native.mul(btor.getRef(), ref, bvNode.getRef()), null); + } + + public BitvecNode sdiv(BitvecNode bvNode) { + return new BitvecNode(btor, Native.sdiv(btor.getRef(), ref, bvNode.getRef()), null); + } + + public BitvecNode udiv(BitvecNode bvNode) { + return new BitvecNode(btor, Native.udiv(btor.getRef(), ref, bvNode.getRef()), null); + } + + public BitvecNode smod(BitvecNode bvNode) { + return new BitvecNode(btor, Native.smod(btor.getRef(), ref, bvNode.getRef()), null); + } + + public BitvecNode urem(BitvecNode bvNode) { + return new BitvecNode(btor, Native.urem(btor.getRef(), ref, bvNode.getRef()), null); + } + + public BoolNode sgt(BitvecNode bvNode) { + return new BoolNode(btor, Native.sgt(btor.getRef(), ref, bvNode.getRef())); + } + + public BoolNode ugt(BitvecNode bvNode) { + return new BoolNode(btor, Native.ugt(btor.getRef(), ref, bvNode.getRef())); + } + + public BoolNode sgte(BitvecNode bvNode) { + return new BoolNode(btor, Native.sgte(btor.getRef(), ref, bvNode.getRef())); + } + + public BoolNode slt(BitvecNode bvNode) { + return new BoolNode(btor, Native.slt(btor.getRef(), ref, bvNode.getRef())); + } + + public BoolNode slte(BitvecNode bvNode) { + return new BoolNode(btor, Native.slte(btor.getRef(), ref, bvNode.getRef())); + } + + public BitvecNode sll(BitvecNode bvNode) { + return new BitvecNode(btor, Native.sll(btor.getRef(), ref, bvNode.getRef()), null); + } + + public BitvecNode srl(BitvecNode bvNode) { + return new BitvecNode(btor, Native.srl(btor.getRef(), ref, bvNode.getRef()), null); + } + + public BitvecNode sra(BitvecNode bvNode) { + return new BitvecNode(btor, Native.sra(btor.getRef(), ref, bvNode.getRef()), null); + } + + public BitvecNode concat(BitvecNode bvNode) { + return new BitvecNode(btor, Native.concat(btor.getRef(), ref, bvNode.getRef()), null); + } + + public String getBits() { + return Native.getBits(btor.getRef(), ref); + } + + public long assignment() { + return Native.bitvecAssignment(btor.getRef(), ref); + } + + @Override + public BoolNode toBoolNode() { + if (getWidth() == 1) { + return new BoolNode(this.btor, this.ref, this.name); + } + throw new ClassCastException(); + } + + @Override + public BitvecNode toBitvecNode() { + return this; + } + + @Override + public BitvecNode toBitvecNode(int width) { + int curSize = getWidth(); + if (curSize == width) return this; + else if (curSize < width) return this.sext(width); + else return this.slice(width, 0); + } + + @Override + public ArrayNode toArrayNode() { + throw new ClassCastException(); + } +} diff --git a/src/main/java/org/jetbrains/research/boolector/BitvecSort.java b/src/main/java/org/jetbrains/research/boolector/BitvecSort.java new file mode 100644 index 0000000..d028c67 --- /dev/null +++ b/src/main/java/org/jetbrains/research/boolector/BitvecSort.java @@ -0,0 +1,28 @@ +package org.jetbrains.research.boolector; + +public class BitvecSort extends BoolectorSort { + + BitvecSort(Btor btor, long ref, int width) { + super(btor, ref, width); + } + + public static BitvecSort bitvecSort(Btor btor, int width) { + return new BitvecSort(btor, Native.bitvecSort(btor.getRef(), width), width); + } + + @Override + public BitvecSort toBitvecSort() { + return this; + } + + @Override + public BoolSort toBoolSort() { + if (!this.isBoolSort()) throw new ClassCastException(); + return new BoolSort(this.btor, this.ref); + } + + @Override + public ArraySort toArraySort() { + throw new ClassCastException(); + } +} diff --git a/src/main/java/org/jetbrains/research/boolector/BoolNode.java b/src/main/java/org/jetbrains/research/boolector/BoolNode.java new file mode 100644 index 0000000..7b782f3 --- /dev/null +++ b/src/main/java/org/jetbrains/research/boolector/BoolNode.java @@ -0,0 +1,64 @@ +package org.jetbrains.research.boolector; + +public class BoolNode extends BoolectorNode { + BoolNode(Btor btor, long ref) { + this(btor, ref, null); + } + + BoolNode(Btor btor, long ref, String name) { + super(btor, ref, name, TypeNode.BOOLNODE); + } + + public static BoolNode constBool(Btor btor, boolean bool) { + return new BoolNode(btor, bool ? Native.constNodeTrue(btor.getRef()) : Native.constNodeFalse(btor.getRef())); + } + + public BoolNode and(BoolNode boolNode) { + return new BoolNode(btor, Native.and(btor.getRef(), ref, boolNode.getRef())); + } + + public BoolNode or(BoolNode boolNode) { + return new BoolNode(btor, Native.or(btor.getRef(), ref, boolNode.getRef())); + } + + public BoolNode xor(BoolNode boolNode) { + return new BoolNode(btor, Native.xor(btor.getRef(), ref, boolNode.getRef())); + } + + public BoolNode not() { + return new BoolNode(btor, Native.not(btor.getRef(), ref)); + } + + public BoolNode implies(BoolNode boolNode) { + return new BoolNode(btor, Native.implies(btor.getRef(), ref, boolNode.getRef())); + } + + public BoolNode iff(BoolNode boolNode) { + return new BoolNode(btor, Native.iff(btor.getRef(), ref, boolNode.getRef())); + } + + public Boolean assigment() { + return Native.bitvecAssignment(btor.getRef(), ref) == 1; + } + + @Override + public BoolNode toBoolNode() { + return this; + } + + @Override + public BitvecNode toBitvecNode() { + return (BitvecNode) BitvecNode.create(this.btor, this.ref, this.name); + } + + @Override + public BitvecNode toBitvecNode(int width) { + return toBitvecNode().toBitvecNode(width); + } + + @Override + public ArrayNode toArrayNode() { + throw new ClassCastException(); + } + +} diff --git a/src/main/java/org/jetbrains/research/boolector/BoolSort.java b/src/main/java/org/jetbrains/research/boolector/BoolSort.java new file mode 100644 index 0000000..15849b9 --- /dev/null +++ b/src/main/java/org/jetbrains/research/boolector/BoolSort.java @@ -0,0 +1,28 @@ +package org.jetbrains.research.boolector; + +public class BoolSort extends BoolectorSort { + private static final int BOOL_WIDTH = 1; + + BoolSort(Btor btor, long ref) { + super(btor, ref, BOOL_WIDTH); + } + + public static BoolSort boolSort(Btor btor) { + return new BoolSort(btor, Native.bitvecSort(btor.getRef(), BOOL_WIDTH)); + } + + @Override + public BitvecSort toBitvecSort() { + return new BitvecSort(this.btor, this.ref, BOOL_WIDTH); + } + + @Override + public BoolSort toBoolSort() { + return this; + } + + @Override + public ArraySort toArraySort() { + throw new ClassCastException(); + } +} diff --git a/src/main/java/org/jetbrains/research/boolector/BoolectorFunction.java b/src/main/java/org/jetbrains/research/boolector/BoolectorFunction.java new file mode 100644 index 0000000..b76b692 --- /dev/null +++ b/src/main/java/org/jetbrains/research/boolector/BoolectorFunction.java @@ -0,0 +1,19 @@ +package org.jetbrains.research.boolector; + +import java.util.List; + +public abstract class BoolectorFunction extends BoolectorObject { + + protected BoolectorFunction(Btor btor, long ref) { + super(btor, ref); + } + + public void release() { + Native.releaseNode(btor.getRef(), ref); + } + + public BoolectorNode apply(List argNodesFunc) { + long[] argNodes = toLong(argNodesFunc.toArray(new BoolectorNode[0])); + return BoolectorNode.create(btor, Native.apply(btor.getRef(), argNodes, argNodes.length, ref), null); + } +} diff --git a/src/main/java/org/jetbrains/research/boolector/BoolectorNode.java b/src/main/java/org/jetbrains/research/boolector/BoolectorNode.java new file mode 100644 index 0000000..5d833ca --- /dev/null +++ b/src/main/java/org/jetbrains/research/boolector/BoolectorNode.java @@ -0,0 +1,101 @@ +package org.jetbrains.research.boolector; + +public abstract class BoolectorNode extends BoolectorObject { + protected static int numberOfNames; + + protected String name; + private TypeNode kind; + private Integer width; + private BoolectorSort sort; + + BoolectorNode(Btor btor, long ref) { + super(btor, ref); + } + + BoolectorNode(Btor btor, long ref, String name, TypeNode type) { + super(btor, ref); + this.name = name; + this.width = getWidthSort(); + this.kind = type; + this.sort = BoolectorSort.fromSort(btor, Native.getSort(btor.getRef(), ref), getWidth()); + } + + static BoolectorNode create(Btor btor, long ref, String name) { + Integer width = Native.getWidthNode(btor.getRef(), ref); + BoolectorSort sort = BoolectorSort.fromSort(btor, Native.getSort(btor.getRef(), ref), width); + if (sort.isArraySort()) return new ArrayNode(btor, ref, name); + else if (sort.isBitvecSort()) return new BitvecNode(btor, ref, name); + else return new BoolNode(btor, ref); + } + + public int getWidth() { + return width; + } + + public void release() { + Native.releaseNode(btor.getRef(), ref); + } + + public BoolectorNode copy() { + return BoolectorNode.create(btor, Native.copy(btor.getRef(), ref), name); + } + + public BoolNode eq(BoolectorNode node) { + assert this.btor == node.btor; + return new BoolNode(btor, Native.eq(btor.getRef(), ref, node.getRef())); + } + + public BoolectorNode ite(BoolNode cond, BoolectorNode elseNode) { + assert (this.btor == cond.btor && this.btor == elseNode.btor); + return BoolectorNode.create(btor, Native.cond(btor.getRef(), cond.getRef(), ref, elseNode.getRef()), null); + } + + public BoolectorSort getSort() { + return BoolectorSort.fromSort(btor, Native.getSort(btor.getRef(), ref), getWidth()); + } + + public int getID() { + return Native.getId(btor.getRef(), ref); + } + + public String getSymbol() { + if (name == null) name = Native.getSymbol(btor.getRef(), ref); + return name; + } + + public String dumpSmt2() { + return Native.dumpSmt2Node(btor.getRef(), ref); + } + + private int getWidthSort() { + return Native.getWidthNode(btor.getRef(), ref); + } + + public void assertForm() { + Native.assertForm(btor.getRef(), ref); + } + + public void assume() { + Native.assume(btor.getRef(), ref); + } + + public boolean isArrayNode() { + return kind == TypeNode.ARRAYNODE; + } + + public boolean isBoolNode() { + return kind == TypeNode.BOOLNODE || (isBitvecNode() && width == 1); + } + + public boolean isBitvecNode() { + return kind == TypeNode.BITVECNODE; + } + + public abstract BoolNode toBoolNode(); + public abstract BitvecNode toBitvecNode(); + public abstract BitvecNode toBitvecNode(int width); + public abstract ArrayNode toArrayNode(); + +} + + diff --git a/java/src/main/java/org/jetbrains/research/boolector/BoolectorObject.java b/src/main/java/org/jetbrains/research/boolector/BoolectorObject.java similarity index 68% rename from java/src/main/java/org/jetbrains/research/boolector/BoolectorObject.java rename to src/main/java/org/jetbrains/research/boolector/BoolectorObject.java index 04ee892..0bc54d1 100644 --- a/java/src/main/java/org/jetbrains/research/boolector/BoolectorObject.java +++ b/src/main/java/org/jetbrains/research/boolector/BoolectorObject.java @@ -1,17 +1,23 @@ package org.jetbrains.research.boolector; + import java.util.Objects; public abstract class BoolectorObject { + protected final Btor btor; + protected final long ref; - public final long ref; - - BoolectorObject(long ref) { + BoolectorObject(Btor btor, long ref) { + this.btor = btor; this.ref = ref; } abstract public void release(); - static long[] toLong(BoolectorObject[] boolectorObj) { + public Btor getBtor() { return btor; } + + long getRef() { return ref; } + + public static long[] toLong(BoolectorObject[] boolectorObj) { int size = boolectorObj.length; long[] toLong = new long[size]; for (int i = 0; i < size; i++) { @@ -30,6 +36,6 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash(ref); + return Objects.hash(btor, ref); } } diff --git a/src/main/java/org/jetbrains/research/boolector/BoolectorSort.java b/src/main/java/org/jetbrains/research/boolector/BoolectorSort.java new file mode 100644 index 0000000..bc27fc3 --- /dev/null +++ b/src/main/java/org/jetbrains/research/boolector/BoolectorSort.java @@ -0,0 +1,40 @@ +package org.jetbrains.research.boolector; + +public abstract class BoolectorSort extends BoolectorObject { + private Integer width; + + BoolectorSort(Btor btor, long ref, Integer width) { + super(btor, ref); + this.width = width; + } + + static BoolectorSort fromSort(Btor btor, long ref, Integer width) { + if (Native.isArraySort(btor.getRef(), ref)) return new ArraySort(btor, ref, width); + else if (Native.isBitvecSort(btor.getRef(), ref)) return new BitvecSort(btor, ref, width); + else return new BoolSort(btor, ref); + } + + public int getWidth() { + return width; + } + + public boolean isBitvecSort() { + return Native.isBitvecSort(btor.getRef(), ref); + } + + public boolean isBoolSort() { + return (isBitvecSort() && width == 1); + } + + public boolean isArraySort() { + return Native.isArraySort(btor.getRef(), ref); + } + + public void release() { + Native.releaseSort(btor.getRef(), ref); + } + + public abstract BitvecSort toBitvecSort(); + public abstract BoolSort toBoolSort(); + public abstract ArraySort toArraySort(); +} diff --git a/src/main/java/org/jetbrains/research/boolector/Btor.java b/src/main/java/org/jetbrains/research/boolector/Btor.java new file mode 100644 index 0000000..41c6dcb --- /dev/null +++ b/src/main/java/org/jetbrains/research/boolector/Btor.java @@ -0,0 +1,84 @@ +package org.jetbrains.research.boolector; + +import java.io.IOException; +import java.util.Objects; + +public class Btor { + + private long ref; + + public enum Status { + SAT(10), + UNSAT(20), + UNKNOWN(0); + + private final int intValue; + + Status(int intValue) { + this.intValue = intValue; + } + + public static Status fromInt(int i) { + if (SAT.toInt() == i ) return SAT; + if (UNSAT.toInt() == i) return UNSAT; + return UNKNOWN; + } + + public final int toInt() { + return this.intValue; + } + } + + public Btor() { + this.ref = Native.btor(); + } + + static { + try { + NativeUtils.loadLibrary("boolector"); + NativeUtils.loadLibrary("boolector-java"); + } catch (IOException e) { + e.printStackTrace(); + throw new IllegalStateException("Unable to load dynamic libraries"); + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Btor)) return false; + Btor btor = (Btor) o; + return ref == btor.ref; + } + + @Override + public int hashCode() { + return Objects.hash(ref); + } + + public void release() { + BitvecNode.setConstNameClear(); + Native.btorRelease(this.ref); + this.ref = -1; + } + + public String dumpSmt2() { + return Native.dumpSmt2(this.ref); + } + + public String printModel() { + return Native.printModel(this.ref); + } + + public int simplify() { + return Native.simplify(this.ref); + } + + public Status check() { + return Status.fromInt(Native.getSat(this.ref)); + } + + long getRef() { + return ref; + } +} diff --git a/src/main/java/org/jetbrains/research/boolector/FunctionDecl.java b/src/main/java/org/jetbrains/research/boolector/FunctionDecl.java new file mode 100644 index 0000000..f47a36f --- /dev/null +++ b/src/main/java/org/jetbrains/research/boolector/FunctionDecl.java @@ -0,0 +1,43 @@ +package org.jetbrains.research.boolector; + +import java.util.List; + +public class FunctionDecl extends BoolectorFunction { + final private long[] params; + + private FunctionDecl(Btor btor, long ref, long[] params) { + super(btor, ref); + this.params = params; + } + + public static class FunctionParam extends BoolectorObject { + FunctionParam(Btor btor, long ref) { + super(btor, ref); + } + + public void release() { + Native.releaseNode(btor.getRef(), ref); + } + + public static FunctionParam param(BoolectorSort sort, String name) { + Btor btor = sort.getBtor(); + return new FunctionParam(btor, Native.param(btor.getRef(), sort.getRef(), name)); + } + } + + public static FunctionDecl func(BoolectorNode nodeBody, List functionParams) { + Btor btor = nodeBody.getBtor(); + long[] params = toLong(functionParams.toArray(new FunctionParam[0])); + return new FunctionDecl(btor, Native.fun(btor.getRef(), params, params.length, nodeBody.getRef()), params); + } + + protected long[] getParams() { + return params; + } + + public static FunctionDecl forAll(BoolectorNode nodeBody, List functionParams) { + Btor btor = nodeBody.getBtor(); + long[] params = toLong(functionParams.toArray(new FunctionParam[0])); + return new FunctionDecl(btor, Native.forAll(btor.getRef(), params, params.length, nodeBody.getRef()), params); + } +} diff --git a/src/main/java/org/jetbrains/research/boolector/FunctionSort.java b/src/main/java/org/jetbrains/research/boolector/FunctionSort.java new file mode 100644 index 0000000..6e53e64 --- /dev/null +++ b/src/main/java/org/jetbrains/research/boolector/FunctionSort.java @@ -0,0 +1,34 @@ +package org.jetbrains.research.boolector; + +public class FunctionSort extends BoolectorSort { + + FunctionSort(Btor btor, long ref, Integer width) { + super(btor, ref, width); + } + + @Override + public BitvecSort toBitvecSort() { + throw new ClassCastException(); + } + + @Override + public BoolSort toBoolSort() { + throw new ClassCastException(); + } + + @Override + public ArraySort toArraySort() { + throw new ClassCastException(); + } + + public static FunctionSort functionSort(BoolectorSort[] argSorts, BoolectorSort returnSort) { + Btor btor = returnSort.getBtor(); + long[] argSortRefs = new long[argSorts.length]; + for (int i = 0; i < argSorts.length; ++i) { + argSortRefs[i] = argSorts[i].getRef(); + } + return new FunctionSort(btor, + Native.funcSort(btor.getRef(), argSortRefs, argSortRefs.length, returnSort.getRef()), + returnSort.getWidth()); + } +} diff --git a/src/main/java/org/jetbrains/research/boolector/Native.java b/src/main/java/org/jetbrains/research/boolector/Native.java new file mode 100644 index 0000000..6d6e569 --- /dev/null +++ b/src/main/java/org/jetbrains/research/boolector/Native.java @@ -0,0 +1,152 @@ +package org.jetbrains.research.boolector; + +public final class Native { + + static native long btor(); + + static native void btorRelease(long btor); + + static native long var(long btor, long ref, String name); + + static native void releaseNode(long btor, long ref); + + static native long bitvecSort(long btor, int width); + + static native void releaseSort(long btor, long ref); + + static native boolean isBitvecSort(long btor, long ref); + + static native boolean isArraySort(long btor, long ref); + + static native boolean isFuncSort(long btor, long ref); + + static native int getWidth(long btor, long ref); + + static native long not(long btor, long ref); + + static native long add(long btor, long firstRef, long secondRef); + + static native long and(long btor, long firstRef, long secondRef); + + static native long or(long btor, long firstRef, long secondRef); + + static native long xor(long btor, long firstRef, long secondRef); + + static native long neg(long btor, long ref); + + static native long eq(long btor, long firstRef, long secondRef); + + static native long sub(long btor, long firstRef, long secondRef); + + static native long mul(long btor, long firstRef, long secondRef); + + static native long sdiv(long btor, long firstRef, long secondRef); + + static native long udiv(long btor, long firstRef, long secondRef); + + static native long smod(long btor, long firstRef, long secondRef); + + static native long urem(long btor, long firstRef, long secondRef); + + static native long sgt(long btor, long firstRef, long secondRef); + + static native long ugt(long btor, long firstRef, long secondRef); + + static native long sgte(long btor, long firstRef, long secondRef); + + static native long slt(long btor, long firstRef, long secondRef); + + static native long slte(long btor, long firstRef, long secondRef); + + static native long sll(long btor, long firstRef, long secondRef); + + static native long srl(long btor, long firstRef, long secondRef); + + static native long sra(long btor, long firstRef, long secondRef); + + static native long implies(long btor, long firstRef, long secondRef); + + static native long iff(long btor, long firstRef, long secondRef); + + static native long concat(long btor, long firstRef, long secondRef); + + static native long cond(long btor, long condRef, long firstRef, long secondRef); + + static native long zero(long btor, long ref); + + static native long constBitvec(long btor, String bits); + + static native boolean isBoolSort(long btor, long ref); + + static native long constNodeTrue(long btor); + + static native long constNodeFalse(long btor); + + static native long getSort(long btor, long ref); + + static native int getId(long btor, long ref); + + static native String getSymbol(long btor, long ref); + + static native int simplify(long btor); + + static native long constInt(long btor, int value, long ref); + + static native long sext(long btor, long ref, int width); + + static native long uext(long btor, long ref, int width); + + static native long slice(long btor, long ref, int upper, int lower); + + static native long arraySort(long btor, long indexSortRef, long elementSortRef); + + static native long array(long btor, long ref, String name); + + static native long read(long btor, long arrayRef, long indexRef); + + static native long write(long btor, long arrayRef, long indexRef, long valueRef); + + static native long param(long btor, long ref, String name); + + static native long funcSort(long btor, long[] paramSorts, int arity, long retSortRef); + + static native long fun(long btor, long[] params, int length, long nodeBody); + + static native long uf(long btor, long funcSort, String name); + + static native long apply(long btor, long[] argNodes, int length, long ref); + + static native String getBits(long btor, long ref); + + static native long constLong(long btor, String value, long sort); + + static native long forAll(long btor, long[] params, int length, long ref); + + public static native boolean boolectorAssert(long btor, String ans, long ref); + + static native int kindNode(long btor, long ref); + + static native long constArray(long btor, long array_ref, long index_ref, long element_ref); + + static native int getWidthNode(long btor, long ref); + + static native int getIndexWidth(long btor, long ref); + + static native String dumpSmt2(long btor); + + static native String dumpSmt2Node(long btor, long ref); + + static native String printModel(long btor); + + static native void assume(long btor, long ref); + + static native long bitvecAssignment(long btor, long ref); + + static native long matchNodeByName(long btor, String name); + + static native long copy(long btor, long ref); + + static native void assertForm(long btor, long ref); + + static native int getSat(long btor); +} diff --git a/java/src/main/java/org/jetbrains/research/boolector/NativeUtils.java b/src/main/java/org/jetbrains/research/boolector/NativeUtils.java similarity index 76% rename from java/src/main/java/org/jetbrains/research/boolector/NativeUtils.java rename to src/main/java/org/jetbrains/research/boolector/NativeUtils.java index 73c1fdc..41a6e1b 100644 --- a/java/src/main/java/org/jetbrains/research/boolector/NativeUtils.java +++ b/src/main/java/org/jetbrains/research/boolector/NativeUtils.java @@ -25,10 +25,7 @@ */ //package cz.adamh.utils; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.nio.file.*; /** @@ -39,7 +36,7 @@ * @see http://adamheinrich.com/blog/2012/how-to-load-native-jni-library-from-jar * @see https://github.com/adamheinrich/native-utils */ -class NativeUtils { +public class NativeUtils { /** * The minimum length a prefix for a file has to have according to {@link File#createTempFile(String, String)}}. @@ -58,6 +55,44 @@ class NativeUtils { private NativeUtils() { } + /** + * Loads a native shared library. It tries the standard System.loadLibrary + * method first and if it fails, it looks for the library in the current + * class path. It will handle libraries packed within jar files, too. + * + * @param name name of the library to load + * @throws IOException if the library cannot be extracted from a jar file + * into a temporary file + */ + public static void loadLibrary(String name) throws IOException { + try { + System.loadLibrary(name); + } catch (UnsatisfiedLinkError e) { + String filename = System.mapLibraryName(name); + InputStream in = NativeUtils.class.getClassLoader().getResourceAsStream(filename); + if (in == null) + throw new IllegalArgumentException("Library " + name + " is not found"); + + int pos = filename.lastIndexOf('.'); + File file = File.createTempFile(filename.substring(0, pos), filename.substring(pos)); + file.deleteOnExit(); + try { + byte[] buf = new byte[4096]; + try (OutputStream out = new FileOutputStream(file)) { + while (in.available() > 0) { + int len = in.read(buf); + if (len >= 0) { + out.write(buf, 0, len); + } + } + } + } finally { + in.close(); + } + System.load(file.getAbsolutePath()); + } + } + /** * Loads library from current JAR archive *

@@ -72,7 +107,7 @@ private NativeUtils() { * (restriction of {@link File#createTempFile(java.lang.String, java.lang.String)}). * @throws FileNotFoundException If the file could not be found inside the JAR. */ - static void loadLibraryFromJar(String path) throws IOException { + public static void loadLibraryFromJar(String path) throws IOException { if (null == path || !path.startsWith("/")) { throw new IllegalArgumentException("The path has to be absolute (start with '/')."); diff --git a/src/main/java/org/jetbrains/research/boolector/TypeNode.java b/src/main/java/org/jetbrains/research/boolector/TypeNode.java new file mode 100644 index 0000000..6b39c1e --- /dev/null +++ b/src/main/java/org/jetbrains/research/boolector/TypeNode.java @@ -0,0 +1,7 @@ +package org.jetbrains.research.boolector; + +public enum TypeNode { + ARRAYNODE, + BOOLNODE, + BITVECNODE +} \ No newline at end of file diff --git a/src/main/java/org/jetbrains/research/boolector/UninterpretedFunction.java b/src/main/java/org/jetbrains/research/boolector/UninterpretedFunction.java new file mode 100644 index 0000000..6046ccb --- /dev/null +++ b/src/main/java/org/jetbrains/research/boolector/UninterpretedFunction.java @@ -0,0 +1,19 @@ +package org.jetbrains.research.boolector; + +public class UninterpretedFunction extends BoolectorFunction { + private final String name; + + private UninterpretedFunction(Btor btor, long ref, String name) { + super(btor, ref); + this.name = name; + } + + public String getName() { + return name; + } + + public static UninterpretedFunction func(String name, BoolectorSort sort) { + Btor btor = sort.getBtor(); + return new UninterpretedFunction(btor, Native.uf(btor.getRef(), sort.ref, name), name); + } +} diff --git a/java/src/test/java/org/jetbrains/research/boolector/BitvecSortTest.java b/src/test/java/org/jetbrains/research/boolector/BitvecSortTest.java similarity index 71% rename from java/src/test/java/org/jetbrains/research/boolector/BitvecSortTest.java rename to src/test/java/org/jetbrains/research/boolector/BitvecSortTest.java index 8c2b970..80dcc35 100644 --- a/java/src/test/java/org/jetbrains/research/boolector/BitvecSortTest.java +++ b/src/test/java/org/jetbrains/research/boolector/BitvecSortTest.java @@ -10,9 +10,9 @@ public class BitvecSortTest { @Test public void bitvecSort() { Btor btor = new Btor(); - BitvecSort sort = BitvecSort.bitvecSort(8); + BitvecSort sort = BitvecSort.bitvecSort(btor, 8); assertTrue(sort.isBitvecSort()); - assertEquals(8,sort.getWidth()); - btor.btorRelease(); + assertEquals(8, sort.getWidth()); + btor.release(); } } \ No newline at end of file diff --git a/java/src/test/java/org/jetbrains/research/boolector/BoolectorNodeTest.java b/src/test/java/org/jetbrains/research/boolector/BoolectorNodeTest.java similarity index 53% rename from java/src/test/java/org/jetbrains/research/boolector/BoolectorNodeTest.java rename to src/test/java/org/jetbrains/research/boolector/BoolectorNodeTest.java index 6edddd8..a9e4449 100644 --- a/java/src/test/java/org/jetbrains/research/boolector/BoolectorNodeTest.java +++ b/src/test/java/org/jetbrains/research/boolector/BoolectorNodeTest.java @@ -2,8 +2,6 @@ import org.junit.Test; -import java.util.List; - import static org.junit.Assert.*; public class BoolectorNodeTest { @@ -11,17 +9,17 @@ public class BoolectorNodeTest { @Test public void bitvecNodeFirst() { Btor btor = new Btor(); - BitvecSort sort = BitvecSort.bitvecSort(8); + BitvecSort sort = BitvecSort.bitvecSort(btor, 8); BitvecNode x = BitvecNode.var(sort, "nullINc", true); BitvecNode y = BitvecNode.var(sort, "nullINc", true); BitvecNode ansXor = x.xor(y); BitvecNode ansOr = andNot(x, y).or(andNot(y, x)); - BoolNode eq = ansXor.eq(ansOr); //fdskfdjsfkjdsklfjdskfjkldsjfkl + BoolNode eq = ansXor.eq(ansOr); BoolNode formula = eq.not(); formula.assertForm(); - BoolectorSat.Status result = BoolectorSat.getBoolectorSat(); - assertEquals(BoolectorSat.Status.UNSAT, result); - btor.btorRelease(); + Btor.Status result = btor.check(); + assertEquals(Btor.Status.UNSAT, result); + btor.release(); } private BitvecNode andNot(BitvecNode x, BitvecNode y) { @@ -31,7 +29,7 @@ private BitvecNode andNot(BitvecNode x, BitvecNode y) { @Test public void bitvecNodeSecond() { Btor btor = new Btor(); - BitvecSort sort = BitvecSort.bitvecSort(8); + BitvecSort sort = BitvecSort.bitvecSort(btor, 8); BitvecNode x = BitvecNode.var(sort, "nullINc", true); BitvecNode y = BitvecNode.var(sort, "nullINc", true); BitvecNode zero = BitvecNode.zero(sort); @@ -39,52 +37,50 @@ public void bitvecNodeSecond() { BoolNode ySgtZero = y.sgt(zero); BoolNode varsSgtZero = xSgtZero.and(ySgtZero); - BitvecNode add = x.add(y); // saddo??? + BitvecNode add = x.add(y); BoolNode addSgtZero = add.sgt(zero); BoolNode overflow = add.sgt(x); BoolNode varsSgt = varsSgtZero.and(overflow); BoolNode ans = varsSgt.implies(addSgtZero); - BoolectorSat.simplify(); - assertFormuls(btor, ans); + btor.simplify(); + assertFormulae(btor, ans); } @Test public void BitveNodeTest() { Btor btor = new Btor(); - BitvecNode x, y, longConst, sext, uext, slice, neg, add, sub, mul, sdiv, udiv, smod, urem, sll, srl, sra, concat; - BoolNode sgt, sgte, slt, slte; - x = BitvecNode.constBitvec("000101"); - y = BitvecNode.constBitvec("000011"); - BitvecSort long_sort = BitvecSort.bitvecSort(64); - longConst = BitvecNode.constLong(3000000000L, long_sort); - - - sext = x.sext(10); - uext = x.uext(10); - slice = x.slice(2, 0); - neg = x.neg(); - add = x.add(y); - sub = x.sub(y); - mul = x.mul(y); - sdiv = x.sdiv(y); - udiv = x.udiv(y); - smod = x.smod(y); - urem = x.urem(y); - sgt = x.sgt(y); - sgte = x.sgte(y); - slt = x.slt(y); - slte = x.slte(y); - sll = x.sll(y); - srl = x.srl(y); - sra = x.sra(y); - concat = x.concat(y); - BitvecNode var = BitvecNode.var(long_sort, "test", false); - BitvecNode noFresh = BitvecNode.var(long_sort, "test", false); - x = BitvecNode.constInt(-5, long_sort); - BoolectorSat.getBoolectorSat(); + BitvecNode x = BitvecNode.constBitvec(btor, "000101"); + BitvecNode y = BitvecNode.constBitvec(btor, "000011"); + BitvecSort longSort = BitvecSort.bitvecSort(btor, 64); + BitvecNode longConst = BitvecNode.constLong(3000000000L, longSort); + + + BitvecNode sext = x.sext(10); + BitvecNode uext = x.uext(10); + BitvecNode slice = x.slice(2, 0); + BitvecNode neg = x.neg(); + BitvecNode add = x.add(y); + BitvecNode sub = x.sub(y); + BitvecNode mul = x.mul(y); + BitvecNode sdiv = x.sdiv(y); + BitvecNode udiv = x.udiv(y); + BitvecNode smod = x.smod(y); + BitvecNode urem = x.urem(y); + BoolNode sgt = x.sgt(y); + BoolNode sgte = x.sgte(y); + BoolNode slt = x.slt(y); + BoolNode slte = x.slte(y); + BitvecNode sll = x.sll(y); + BitvecNode srl = x.srl(y); + BitvecNode sra = x.sra(y); + BitvecNode concat = x.concat(y); + BitvecNode var = BitvecNode.var(longSort, "test", false); + BitvecNode noFresh = BitvecNode.var(longSort, "test", false); + x = BitvecNode.constInt(-5, longSort); + btor.check(); long assignment = x.assignment(); - BoolNode test = BoolNode.constBool(true); + BoolNode test = BoolNode.constBool(btor, true); boolectorAssert("0000000000000000000000000000000010110010110100000101111000000000", longConst); boolectorAssert("0000000101", sext); boolectorAssert("0000000101", uext); @@ -108,96 +104,82 @@ public void BitveNodeTest() { assertEquals(-5, assignment); assertEquals(var.ref, noFresh.ref); assertTrue(test.assigment()); - btor.btorRelease(); + btor.release(); } @Test public void BoolNodeTest() { Btor btor = new Btor(); - BoolNode x, y, or, xor, iff; - x = BoolNode.constBool(true); - y = BoolNode.constBool(false); - or = x.or(y); - xor = x.xor(y); - iff = x.iff(y); - BoolectorSat.getBoolectorSat(); + BoolNode x = BoolNode.constBool(btor, true); + BoolNode y = BoolNode.constBool(btor, false); + BoolNode or = x.or(y); + BoolNode xor = x.xor(y); + BoolNode iff = x.iff(y); + btor.check(); boolectorAssert("1", or); boolectorAssert("1", xor); boolectorAssert("0", iff); - btor.btorRelease(); + btor.release(); } @Test public void boolectorNodeTest() { Btor btor = new Btor(); - BoolectorNode x, y, bool, bitvec, ite; - x = BitvecNode.constBitvec("000101"); - y = BitvecNode.constBitvec("000011"); + BoolectorNode x = BitvecNode.constBitvec(btor, "000101"); + BoolectorNode y = BitvecNode.constBitvec(btor, "000011"); - bool = BitvecNode.constBitvec("1"); - ite = x.ite(bool.toBoolNode(), y); - BoolectorSort getSort = x.getSort(); - bitvec = BitvecNode.var(getSort.toBitvecSort(), "test", false); + BoolNode bool = BoolNode.constBool(btor, true); + BoolectorNode ite = x.ite(bool, y); + BoolectorNode bitvec = BitvecNode.var((BitvecSort) x.getSort(), "test", false); x.getID(); - BoolectorSat.getBoolectorSat(); + btor.check(); boolectorAssert("000101", ite); assertEquals("test", bitvec.getSymbol()); assertFalse(x.isBoolNode()); assertTrue(bitvec.isBitvecNode()); - int i = 0; - try { - bitvec.toArrayNode(); - } catch (ClassCastException e) { - ++i; - } - assertEquals(1, i); - - btor.btorRelease(); + btor.release(); } @Test - public void printerTest() { + public void tempFiles() { Btor btor = new Btor(); - BoolNode x = BoolNode.constBool(true); + BoolNode x = BoolNode.constBool(btor, true); x.assertForm(); - BoolectorSat.getBoolectorSat(); - assertEquals("(\n)", btor.printModel()); + btor.check(); + assertEquals("(model )\n", btor.printModel()); assertEquals("(set-logic QF_BV)\n" + "(assert true)\n" + "(check-sat)\n" + - "(exit)", btor.dumpSmt2()); - btor.btorRelease(); + "(exit)\n", btor.dumpSmt2()); + btor.release(); } @Test public void arrayNodeTest() { Btor btor = new Btor(); - BitvecNode x, i, j; - ArrayNode arrayConst, array; - BitvecSort index; - x = BitvecNode.constBitvec("000101"); - i = BitvecNode.constBitvec("000000"); - j = BitvecNode.constBitvec("100000"); + BitvecNode x = BitvecNode.constBitvec(btor, "000101"); + BitvecNode i = BitvecNode.constBitvec(btor, "000000"); + BitvecNode j = BitvecNode.constBitvec(btor, "100000"); - index = x.getSort().toBitvecSort(); + BitvecSort index = (BitvecSort) x.getSort(); ArraySort sort = ArraySort.arraySort(index, index); - array = ArrayNode.arrayNode(sort, "Temp"); + ArrayNode array = ArrayNode.arrayNode(sort, "Temp"); - arrayConst = ArrayNode.constArrayNode(index, x); + ArrayNode arrayConst = ArrayNode.constArrayNode(index, x); BoolNode eq = arrayConst.read(i).eq(arrayConst.read(j)); - BoolectorSat.getBoolectorSat(); + btor.check(); boolectorAssert("1", eq); - btor.btorRelease(); + btor.release(); } @Test public void arrayNodeTest1() { Btor btor = new Btor(); - BitvecSort sortIndex = BitvecSort.bitvecSort(3); - BitvecSort sortElem = BitvecSort.bitvecSort(8); + BitvecSort sortIndex = BitvecSort.bitvecSort(btor, 3); + BitvecSort sortElem = BitvecSort.bitvecSort(btor, 8); ArraySort sortArray = ArraySort.arraySort(sortIndex, sortElem); BitvecNode[] indices = new BitvecNode[8]; @@ -211,7 +193,7 @@ public void arrayNodeTest1() { for (int i = 1; i < 8; i++) { read = array.read(indices[i]); BoolNode ugt = read.ugt(max); - BitvecNode temp = read.ite(ugt, max).toBitvecNode(); + BitvecNode temp = (BitvecNode) read.ite(ugt, max); max.release(); max = temp; read.release(); @@ -223,17 +205,17 @@ public void arrayNodeTest1() { BoolNode formula = read.ugt(max); formula.assertForm(); - BoolectorSat.Status result = BoolectorSat.getBoolectorSat(); - assertEquals(BoolectorSat.Status.UNSAT, result); - btor.btorRelease(); + Btor.Status result = btor.check(); + assertEquals(Btor.Status.UNSAT, result); + btor.release(); } @Test public void arrayNodeTest2() { Btor btor = new Btor(); - BitvecSort sortIndex = BitvecSort.bitvecSort(1); - BitvecSort sortElem = BitvecSort.bitvecSort(8); + BitvecSort sortIndex = BitvecSort.bitvecSort(btor, 1); + BitvecSort sortElem = BitvecSort.bitvecSort(btor, 8); ArraySort sortArray = ArraySort.arraySort(sortIndex, sortElem); ArrayNode array = ArrayNode.arrayNode(sortArray, null); @@ -244,25 +226,25 @@ public void arrayNodeTest2() { BoolectorNode eq = index1.eq(index2); BoolectorNode ne = read1.eq(read2).not(); eq.assertForm(); - BoolectorSat.Status result = BoolectorSat.getBoolectorSat(); - assertEquals(BoolectorSat.Status.SAT, result); + Btor.Status result = btor.check(); + assertEquals(Btor.Status.SAT, result); ne.assume(); - result = BoolectorSat.getBoolectorSat(); - assertEquals(BoolectorSat.Status.UNSAT, result); - result = BoolectorSat.getBoolectorSat(); - assertEquals(BoolectorSat.Status.SAT, result); - btor.btorRelease(); + result = btor.check(); + assertEquals(Btor.Status.UNSAT, result); + result = btor.check(); + assertEquals(Btor.Status.SAT, result); + btor.release(); } - private static void assertFormuls(Btor btor, BoolNode node) { + private static void assertFormulae(Btor btor, BoolNode node) { BoolNode formula = node.not(); formula.assertForm(); - BoolectorSat.Status ans = BoolectorSat.getBoolectorSat(); - assertEquals(BoolectorSat.Status.UNSAT, ans); - btor.btorRelease(); + Btor.Status ans = btor.check(); + assertEquals(Btor.Status.UNSAT, ans); + btor.release(); } private static void boolectorAssert(String ans, BoolectorNode node) { - assertTrue(Native.boolectorAssert(ans, node.ref)); + assertTrue(Native.boolectorAssert(node.getBtor().getRef(), ans, node.ref)); } -} +} \ No newline at end of file diff --git a/src/test/java/org/jetbrains/research/boolector/FunctionDeclTest.java b/src/test/java/org/jetbrains/research/boolector/FunctionDeclTest.java new file mode 100644 index 0000000..84a7171 --- /dev/null +++ b/src/test/java/org/jetbrains/research/boolector/FunctionDeclTest.java @@ -0,0 +1,42 @@ +package org.jetbrains.research.boolector; + +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +import static junit.framework.TestCase.assertEquals; + +public class FunctionDeclTest { + + @Test + public void testAll() { + Btor btor = new Btor(); + BitvecSort sort = BitvecSort.bitvecSort(btor, 8); + BitvecNode x = BitvecNode.var(sort, "x", true); + BitvecNode y = BitvecNode.var(sort, "y", true); + BitvecNode a = BitvecNode.constInt(10, sort); + BitvecNode b = BitvecNode.constInt(20, sort); + a.add(b); + + BitvecNode temp = x.add(y); + FunctionDecl.FunctionParam firstParam = FunctionDecl.FunctionParam.param(sort, null); + FunctionDecl.FunctionParam secondParam = FunctionDecl.FunctionParam.param(sort, null); + List param = Arrays.asList(firstParam, secondParam); + FunctionDecl slt = FunctionDecl.func(temp, param); + List paramX = Arrays.asList(x, y); + BitvecNode first = (BitvecNode) slt.apply(paramX); + BitvecNode second = (BitvecNode) slt.apply(paramX); + BoolNode eq = first.eq(second); + assertFormulae(btor, eq); + } + + private static void assertFormulae(Btor btor, BoolNode node) { + BoolNode formula = node.not(); + formula.assertForm(); + Btor.Status ans = btor.check(); + assertEquals(Btor.Status.UNSAT, ans); + + btor.release(); + } +} \ No newline at end of file diff --git a/src/test/java/org/jetbrains/research/boolector/UninterpretedFunctionTest.java b/src/test/java/org/jetbrains/research/boolector/UninterpretedFunctionTest.java new file mode 100644 index 0000000..c0bc468 --- /dev/null +++ b/src/test/java/org/jetbrains/research/boolector/UninterpretedFunctionTest.java @@ -0,0 +1,36 @@ +package org.jetbrains.research.boolector; + +import org.junit.Test; + +import java.util.Collections; + +import static org.junit.Assert.assertEquals; + +public class UninterpretedFunctionTest { + + @Test + public void testUf() { + Btor btor = new Btor(); + BitvecSort intSort = BitvecSort.bitvecSort(btor, 32); + BoolectorSort[] array = { intSort }; + FunctionSort functionSort = FunctionSort.functionSort(array, intSort); + + BitvecNode a = BitvecNode.var(intSort, "a", true); + BitvecNode b = BitvecNode.var(intSort, "b", true); + UninterpretedFunction f = UninterpretedFunction.func("f", functionSort); + + BitvecNode const20 = BitvecNode.constInt(20, intSort); + BitvecNode const10 = BitvecNode.constInt(10, intSort); + BitvecNode const1 = BitvecNode.constInt(1, intSort); + + BoolectorNode res = f.apply(Collections.singletonList(const10)); + + BoolNode result = a.ugt(const20); + result = result.and(b.ugt(a)); + result = result.and(res.eq(const1)); + + result.assertForm(); + Btor.Status r = btor.check(); + assertEquals(Btor.Status.SAT, r); + } +}