Add "mode live" support
authorClifford Wolf <clifford@clifford.at>
Wed, 1 Mar 2017 10:09:14 +0000 (11:09 +0100)
committerClifford Wolf <clifford@clifford.at>
Wed, 1 Mar 2017 10:12:23 +0000 (11:12 +0100)
sbysrc/sby_core.py
sbysrc/sby_engine_aiger.py
sbysrc/sby_mode_live.py [new file with mode: 0644]

index 015f17208e9004f33c32c7f1359c7c7f18b6b5e9..3a1ba62f9a510d0ca7d4fb89fe58a68ddef86d99 100644 (file)
@@ -330,6 +330,13 @@ class SbyJob:
                 print("# running in %s/src/" % self.workdir, file=f)
                 for cmd in self.script:
                     print(cmd, file=f)
+                if self.opt_mode in ["bmc", "prove"]:
+                    print("chformal -live -fair -cover -remove", file=f)
+                if self.opt_mode == "cover":
+                    print("chformal -live -fair -remove", file=f)
+                if self.opt_mode == "live":
+                    print("chformal -assert2assume", file=f)
+                    print("chformal -cover -remove", file=f)
                 print("opt_clean", file=f)
                 print("write_ilang ../model/design.il", file=f)
 
@@ -422,7 +429,7 @@ class SbyJob:
 
     def run(self):
         self.handle_str_option("mode", None)
-        assert self.opt_mode in ["bmc", "prove", "cover"]
+        assert self.opt_mode in ["bmc", "prove", "cover", "live"]
 
         self.expect = ["PASS"]
         if "expect" in self.options:
@@ -451,6 +458,10 @@ class SbyJob:
             import sby_mode_prove
             sby_mode_prove.run(self)
 
+        elif self.opt_mode == "live":
+            import sby_mode_live
+            sby_mode_live.run(self)
+
         elif self.opt_mode == "cover":
             import sby_mode_cover
             sby_mode_cover.run(self)
index d8f634dcfab517baed1737612ceaf894bff9b1dc..e5e8311ba5862f96b68f8c6e013b9499add4b94b 100644 (file)
@@ -27,6 +27,8 @@ def run(mode, job, engine_idx, engine):
         assert False
 
     if solver_args[0] == "suprove":
+        if mode == "live" and (len(solver_args) == 1 or solver_args[1][0] != "+"):
+            solver_args.insert(1, "+simple_liveness")
         solver_cmd = " ".join([job.exe_paths["suprove"]] + solver_args[1:])
 
     elif solver_args[0] == "avy":
diff --git a/sbysrc/sby_mode_live.py b/sbysrc/sby_mode_live.py
new file mode 100644 (file)
index 0000000..dd81ffa
--- /dev/null
@@ -0,0 +1,40 @@
+#
+# SymbiYosys (sby) -- Front-end for Yosys-based formal verification flows
+#
+# Copyright (C) 2016  Clifford Wolf <clifford@clifford.at>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+import re, os, getopt
+from sby_core import SbyTask
+
+def run(job):
+    job.handle_str_option("aigsmt", "z3")
+
+    job.status = "UNKNOWN"
+
+    for engine_idx in range(len(job.engines)):
+        engine = job.engines[engine_idx]
+        assert len(engine) > 0
+
+        job.log("engine_%d: %s" % (engine_idx, " ".join(engine)))
+        os.makedirs("%s/engine_%d" % (job.workdir, engine_idx))
+
+        if engine[0] == "aiger":
+            import sby_engine_aiger
+            sby_engine_aiger.run("live", job, engine_idx, engine)
+
+        else:
+            assert False
+