summaryrefslogtreecommitdiffstats
path: root/scripts/niklas.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/niklas.py')
-rw-r--r--scripts/niklas.py191
1 files changed, 0 insertions, 191 deletions
diff --git a/scripts/niklas.py b/scripts/niklas.py
deleted file mode 100644
index 882bd0a7..00000000
--- a/scripts/niklas.py
+++ /dev/null
@@ -1,191 +0,0 @@
-import os
-import sys
-import time
-import tempfile
-import subprocess
-
-from contextlib import contextmanager
-
-import pyabc
-import pyabc_split
-
-@contextmanager
-def temp_file_names(N, suffix=""):
-
- files = []
-
- try:
-
- for i in xrange(N):
- files.append( tempfile.NamedTemporaryFile(suffix=suffix) )
-
- yield [ f.name for f in files ]
-
- finally:
- for f in files:
- f.close()
-
-def parse_bip_status(status):
-
- res = {}
-
- for line in open(status, 'r'):
-
- line = line.strip()
-
- colon = line.find(':')
-
- if colon < 0:
- continue
-
- field = line[:colon]
- data = line[colon+2:]
-
- res[field] = data
-
- return res
-
-def run_bip(args, aiger):
-
- import redirect
- with redirect.redirect():
-
- with temp_file_names(1) as tmpnames:
-
- args = [
- 'bip',
- '-abc',
- '-input=%s'%aiger,
- '-output=%s'%tmpnames[0],
- ] + args;
-
- rc = subprocess.call(args, preexec_fn=pyabc._set_death_signal)
-
- if rc!=0:
- return None
-
- return parse_bip_status(tmpnames[0])
-
-from pyaig import AIG, read_aiger, write_aiger, utils
-
-def run_niklas_single(aiger, simplify, report_result, timeout=None):
-
- orig_args = [
- [ ',live', '-k=l2s', '-eng=treb-abs' ],
- [ ',live', '-k=inc' ],
- [ ',live', '-k=l2s', '-eng=bmc' ],
- ]
-
- simplified_args = [
- [ ',live', '-k=inc' ],
- [ ',live', '-k=l2s', '-eng=bmc' ],
- [ ',live', '-k=l2s', '-eng=treb' ],
- ]
-
- with temp_file_names(1, suffix='.aig') as simple_aiger:
-
- orig_funcs = [ pyabc_split.defer(run_bip)(a, aiger) for a in orig_args ]
- simplified_funcs = [ pyabc_split.defer(run_bip)(a, simple_aiger[0]) for a in simplified_args ]
-
- with pyabc_split.make_splitter() as splitter:
-
- sleep_id = splitter.fork_one( lambda : time.sleep(timeout ) ) if timeout else None
-
- ids = splitter.fork_all( orig_funcs )
- kill_if_simplified = ids[1:]
-
- simplifier_id = splitter.fork_one( pyabc_split.defer(simplify)(aiger, simple_aiger[0]) )
-
- for id, res in splitter:
-
- print 'NIKLAS: process %d finished with'%id, res
-
- if id == sleep_id:
- print 'NIKLAS: timeout'
- return False
-
- elif id == simplifier_id:
- print 'NIKLAS: simplify ended'
- if not res:
- continue
- print 'NIKLAS: killing'
- splitter.kill(kill_if_simplified)
- splitter.fork_all( simplified_funcs )
- continue
-
- elif report_result(res):
- print 'NIKLAS: RESULT'
- return True
-
- return False
-
-def run_niklas_multi(aiger, simplify, report_result):
-
- with open(aiger, 'r') as fin:
- aig = read_aiger( fin )
-
- n_j_pos = aig.n_justice()
- assert n_j_pos > 0
-
- if n_j_pos==1:
- return run_niklas_single( aiger, simplify, report_result=lambda res: report_result(0, res) )
-
- with temp_file_names(n_j_pos, suffix='.aig') as single_aiger:
-
- def extract(j_po):
- with open(single_aiger[j_po], 'w') as fout:
- write_aiger(utils.extract_justice_po(aig, j_po), fout)
-
- for _ in pyabc_split.split_all_full( [pyabc_split.defer(extract)(i) for i in xrange(n_j_pos) ] ):
- pass
-
- unsolved = set( xrange(n_j_pos) )
-
- timeout = 1
-
- while unsolved:
- for j_po in sorted(unsolved):
- if run_niklas_single( single_aiger[j_po], simplify, report_result=lambda res: report_result(j_po, res), timeout=timeout ):
- unsolved.remove(j_po)
- timeout *= 2
-
- return not unsolved
-
-if __name__ == "__main__":
-
- def simplify(aiger_in, aiger_out):
-
- with temp_file_names(2, suffix='.aig') as tmp:
-
- saved = utils.save_po_info(aiger_in, tmp[0])
-
- pyabc.run_command( 'read_aiger %s'%tmp[0] )
- pyabc.run_command( 'dc2 ; dc2 ; dc2 ; dc2' )
- pyabc.run_command( 'write_aiger %s'%tmp[1] )
-
- utils.restore_po_info( saved, tmp[1], aiger_out )
-
- return True
-
- def report_result(id, res):
-
- if res and 'result' in res:
- result = res['result']
- if result=='proved':
- print "PROVED: ", id
- return True
- elif result=='failed':
- print "FAILED:", id
- return True
-
- return False
-
- aiger = "test.aig"
-
- while True:
- try:
- run_niklas_multi(aiger, simplify=simplify, report_result=report_result)
- except:
- import traceback
- traceback.print_exc()
-