mirror of
				https://github.com/YosysHQ/sby.git
				synced 2025-11-04 06:39:11 +00:00 
			
		
		
		
	Added prove mode support via "abc pdr"
This commit is contained in:
		
							parent
							
								
									6b23046d3f
								
							
						
					
					
						commit
						5125128bbd
					
				
					 4 changed files with 75 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -332,6 +332,10 @@ class SbyJob:
 | 
			
		|||
            import sby_mode_bmc
 | 
			
		||||
            sby_mode_bmc.run(self)
 | 
			
		||||
 | 
			
		||||
        if self.options["mode"] == "prove":
 | 
			
		||||
            import sby_mode_prove
 | 
			
		||||
            sby_mode_prove.run(self)
 | 
			
		||||
 | 
			
		||||
        else:
 | 
			
		||||
            assert False
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,11 +20,20 @@ import re, os, getopt
 | 
			
		|||
from sby_core import SbyTask
 | 
			
		||||
 | 
			
		||||
def run(mode, job, engine_idx, engine):
 | 
			
		||||
    assert engine == ["abc", "bmc3"]
 | 
			
		||||
    if mode == "bmc":
 | 
			
		||||
        assert engine == ["abc", "bmc3"]
 | 
			
		||||
        abc_command = "bmc3 -F %d -v" % job.opt_depth
 | 
			
		||||
 | 
			
		||||
    elif mode == "prove":
 | 
			
		||||
        assert engine == ["abc", "pdr"]
 | 
			
		||||
        abc_command = "pdr"
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        assert False
 | 
			
		||||
 | 
			
		||||
    task = SbyTask(job, "engine_%d" % engine_idx, job.model("aig"),
 | 
			
		||||
            ("cd %s; yosys-abc -c 'read_aiger model/design_aiger.aig; fold; strash; bmc3 -F %d -v; " +
 | 
			
		||||
             "undc -c; write_cex -a engine_%d/trace.aiw'") % (job.workdir, job.opt_depth, engine_idx),
 | 
			
		||||
            ("cd %s; yosys-abc -c 'read_aiger model/design_aiger.aig; fold; strash; %s; " +
 | 
			
		||||
             "write_cex -a engine_%d/trace.aiw'") % (job.workdir, abc_command, engine_idx),
 | 
			
		||||
            logfile=open("%s/engine_%d/logfile.txt" % (job.workdir, engine_idx), "w"))
 | 
			
		||||
 | 
			
		||||
    task_status = None
 | 
			
		||||
| 
						 | 
				
			
			@ -41,6 +50,9 @@ def run(mode, job, engine_idx, engine):
 | 
			
		|||
        match = re.match(r"^No output asserted in [0-9]+ frames.", line)
 | 
			
		||||
        if match: task_status = "PASS"
 | 
			
		||||
 | 
			
		||||
        match = re.match(r"^Property proved.", line)
 | 
			
		||||
        if match: task_status = "PASS"
 | 
			
		||||
 | 
			
		||||
    def exit_callback(retcode):
 | 
			
		||||
        assert retcode == 0
 | 
			
		||||
        assert task_status is not None
 | 
			
		||||
| 
						 | 
				
			
			@ -53,9 +65,9 @@ def run(mode, job, engine_idx, engine):
 | 
			
		|||
 | 
			
		||||
        if job.status == "FAIL":
 | 
			
		||||
            task2 = SbyTask(job, "engine_%d" % engine_idx, job.model("smt2"),
 | 
			
		||||
                    ("cd %s; yosys-smtbmc --noprogress -t %d --dump-vcd engine_%d/trace.vcd --dump-vlogtb engine_%d/trace_tb.v " +
 | 
			
		||||
                    ("cd %s; yosys-smtbmc --noprogress --dump-vcd engine_%d/trace.vcd --dump-vlogtb engine_%d/trace_tb.v " +
 | 
			
		||||
                     "--dump-smtc engine_%d/trace.smtc --aig model/design_aiger.aim:engine_%d/trace.aiw --aig-noheader model/design_smt2.smt2") %
 | 
			
		||||
                            (job.workdir, job.opt_depth, engine_idx, engine_idx, engine_idx, engine_idx),
 | 
			
		||||
                            (job.workdir, engine_idx, engine_idx, engine_idx, engine_idx),
 | 
			
		||||
                    logfile=open("%s/engine_%d/logfile2.txt" % (job.workdir, engine_idx), "w"))
 | 
			
		||||
 | 
			
		||||
            task2_status = None
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,6 +20,8 @@ import re, os, getopt
 | 
			
		|||
from sby_core import SbyTask
 | 
			
		||||
 | 
			
		||||
def run(mode, job, engine_idx, engine):
 | 
			
		||||
    assert mode == "bmc"
 | 
			
		||||
 | 
			
		||||
    smtbmc_opts = []
 | 
			
		||||
    nomem_opt = False
 | 
			
		||||
    syn_opt = False
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										52
									
								
								sbysrc/sby_mode_prove.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								sbysrc/sby_mode_prove.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,52 @@
 | 
			
		|||
#
 | 
			
		||||
# 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.opt_depth = 20
 | 
			
		||||
 | 
			
		||||
    if "depth" in job.options:
 | 
			
		||||
        job.opt_depth = int(job.options["depth"])
 | 
			
		||||
 | 
			
		||||
    job.basecase_done = False
 | 
			
		||||
    job.induction_done = False
 | 
			
		||||
    job.basecase_tasks = list()
 | 
			
		||||
    job.induction_tasks = list()
 | 
			
		||||
 | 
			
		||||
    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] == "smtbmc":
 | 
			
		||||
            import sby_engine_smtbmc
 | 
			
		||||
            sby_engine_smtbmc.run("prove", job, engine_idx, engine)
 | 
			
		||||
 | 
			
		||||
        elif engine[0] == "abc":
 | 
			
		||||
            import sby_engine_abc
 | 
			
		||||
            sby_engine_abc.run("prove", job, engine_idx, engine)
 | 
			
		||||
 | 
			
		||||
        else:
 | 
			
		||||
            assert False
 | 
			
		||||
 | 
			
		||||
    job.taskloop()
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue