diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/python/module.make | 4 | ||||
-rw-r--r-- | src/python/package.py | 5 | ||||
-rw-r--r-- | src/python/reachx_cmd.py | 108 | ||||
-rw-r--r-- | src/python/setup.py | 2 |
4 files changed, 114 insertions, 5 deletions
diff --git a/src/python/module.make b/src/python/module.make index 3f48bbaf..09e2de3f 100644 --- a/src/python/module.make +++ b/src/python/module.make @@ -57,7 +57,7 @@ pyabc.tgz : $(PROG) $(ABC_PYTHON_SRC:_wrap.c=.py) $(ABC_PYTHON_FILES_PREFIX)/abc $(ABC_PYTHON) $(ABC_PYTHON_FILES_PREFIX)/package.py \ --abc=$(PROG) \ --abc_sh=$(ABC_PYTHON_FILES_PREFIX)/abc.sh \ - --pyabc=$(ABC_PYTHON_SRC:_wrap.c=.py) \ + --pyabc=$(ABC_PYTHON_FILES_PREFIX) \ --out=$@ \ $(ABC_PYTHON_OPTIONS) @@ -66,8 +66,6 @@ PYABC_INSTALL_TARGET := $(PYABC_INSTALL_TARGET) PYABC_INSTALL_DIR ?= /hd/common/pyabc/builds/pyabc_builds/ -.PHONY: zzz - pyabc_install_target: pyabc_extension_bdist mkdir -p "$(PYABC_INSTALL_DIR)/$(PYABC_INSTALL_TARGET)" tar \ diff --git a/src/python/package.py b/src/python/package.py index 9c79a944..1764ab6f 100644 --- a/src/python/package.py +++ b/src/python/package.py @@ -70,7 +70,10 @@ def package(abc_exe, abc_sh, pyabc, ofname, scripts_dir, use_sys): add_file( tf, fullname, os.path.join("pyabc/scripts", fn), 0666, mtime) add_dir(tf, "pyabc/lib", mtime) - add_file( tf, pyabc, "pyabc/lib/pyabc.py", 0666, mtime) + + for entry in os.listdir(pyabc): + if entry.endswith('.py'): + add_file( tf, os.path.join(pyabc, entry), os.path.join("pyabc/lib", entry), 0666, mtime) if not use_sys: # ZIP standard library diff --git a/src/python/reachx_cmd.py b/src/python/reachx_cmd.py new file mode 100644 index 00000000..8461cb1d --- /dev/null +++ b/src/python/reachx_cmd.py @@ -0,0 +1,108 @@ +# You can use 'from pyabc import *' and then not need the pyabc. prefix everywhere + +import sys +import optparse +import subprocess +import tempfile +import threading +import os +import os.path +from contextlib import contextmanager, nested + +import pyabc + + +def popen_and_wait_with_timeout(timeout,cmd, *args, **kwargs): + """ Wait for a subprocess.Popen object to terminate, or until timeout (in seconds) expires. """ + + p = None + t = None + + try: + p = subprocess.Popen(cmd, *args, **kwargs) + + if timeout <= 0: + timeout = None + + t = threading.Thread(target=lambda: p.communicate()) + t.start() + + t.join(timeout) + + finally: + + if p is not None and p.poll() is None: + p.kill() + + if t is not None and t.is_alive(): + t.join() + + if p is not None: + return p.returncode + + return -1 + +@contextmanager +def temp_file_name(suffix=""): + file = tempfile.NamedTemporaryFile(delete=False, suffix=suffix) + name = file.name + file.close() + + try: + yield name + finally: + os.unlink(name) + +def cygpath(path): + if sys.platform == "win32": + if os.path.isabs(path): + drive, tail = os.path.splitdrive(path) + drive = drive.lower() + tail = tail.split(os.path.sep) + return '/cygdrive/%s'%drive[0] + '/'.join(tail) + else: + path = path.split(os.path.sep) + return "/".join(path) + return path + +def run_reachx_cmd(effort, timeout): + with nested(temp_file_name(suffix=".aig"), temp_file_name()) as (tmpaig_name, tmplog_name): + pyabc.run_command("write %s"%tmpaig_name) + + cmdline = [ + 'read %s'%cygpath(tmpaig_name), + 'qua_ffix -effort %d -L %s'%(effort, cygpath(tmplog_name)), + 'quit' + ] + + cmd = ["jabc", "-c", " ; ".join(cmdline)] + + rc = popen_and_wait_with_timeout(timeout, cmd, shell=False, stdout=sys.stdout, stderr=sys.stderr) + + if rc != 0: + # jabc failed or stopped. Write a status file to update the status to unknown + with open(tmplog_name, "w") as f: + f.write('snl_UNK -1 unknown\n') + f.write('NULL\n') + f.write('NULL\n') + + pyabc.run_command("read_status %s"%tmplog_name) + + return rc + +def reachx_cmd(argv): + usage = "usage: %prog [options]" + + parser = optparse.OptionParser(usage, prog="reachx") + + parser.add_option("-e", "--effort", dest="effort", type=int, default=0, help="effort level. [default=0, means unlimited]") + parser.add_option("-t", "--timeout", dest="timeout", type=int, default=0, help="timeout in seconds [default=0, unlimited]") + + options, args = parser.parse_args(argv) + + rc = run_reachx_cmd(options.effort, options.timeout) + print "%s command: jabc returned: %d"%(argv[0], rc) + + return 0 + +pyabc.add_abc_command(reachx_cmd, "Verification", "reachx", 0) diff --git a/src/python/setup.py b/src/python/setup.py index 3ef006af..68a4adae 100644 --- a/src/python/setup.py +++ b/src/python/setup.py @@ -63,5 +63,5 @@ setup( name='pyabc', version='1.0', ext_modules=[ext], - py_modules=['pyabc','getch','pyabc_split','redirect'] + py_modules=['pyabc','getch','pyabc_split','redirect', 'reachx_cmd'] ) |